##// END OF EJS Templates
shelve: use matcher to restrict prefetch to just the modified files...
shelve: use matcher to restrict prefetch to just the modified files Shelve currently operates by: - make a temp commit - identify all the bases necessary to shelve, put them in the bundle - use exportfile to export the temp commit to the bundle ('file' here means "export to this fd", not "export this file") - remove the temp commit exportfile calls prefetchfiles, and prefetchfiles uses a matcher to restrict what files it's going to prefetch; if it's not provided, it's alwaysmatcher. This means that `hg shelve` in a remotefilelog repo can possibly download the file contents of everything in the repository, even when it doesn't need to. It luckily is restricted to the narrowspec (if there is one), but this is still a lot of downloading that's just unnecessary, especially if there's a "smart" VCS-aware filesystem involved. exportfile is called with exactly one revision to emit, so we're just restricting it to prefetching the files from that revision. The base revisions having separate files should not be a concern since they're handled already; example: commit 10 is draft and modifies foo/a.txt and foo/b.txt commit 11 is draft and modifies foo/a.txt my working directory that I'm shelving modifies foo/b.txt By the time we get to exportfile, commit 10 and 11 are already handled, so the matcher only specifying foo/b.txt does not cause any problems. I verified this by doing an `hg unbundle` on the bundle that shelve produces, and getting the full contents of those commits back out, instead of just the files that were modified in the shelve. Differential Revision: https://phab.mercurial-scm.org/D5268

File last commit:

r40635:9eeda719 default
r40662:29e4a77b default
Show More
test-manifest.py
446 lines | 15.9 KiB | text/x-python | PythonLexer
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 from __future__ import absolute_import
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 import binascii
import itertools
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 import silenttestrunner
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 import unittest
Augie Fackler
manifest: make sure there's a filename before bothering to look for newline...
r40635 import zlib
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 from mercurial import (
manifest as manifestmod,
match as matchmod,
)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 EMTPY_MANIFEST = b''
Martin von Zweigbergk
test-manifest: create constant for empty manifest...
r24569
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 HASH_1 = b'1' * 40
Martin von Zweigbergk
test-manifest: extract constants for binary hashes...
r24570 BIN_HASH_1 = binascii.unhexlify(HASH_1)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 HASH_2 = b'f' * 40
Martin von Zweigbergk
test-manifest: extract constants for binary hashes...
r24570 BIN_HASH_2 = binascii.unhexlify(HASH_2)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 HASH_3 = b'1234567890abcdef0987654321deadbeef0fcafe'
Martin von Zweigbergk
test-manifest: extract constants for binary hashes...
r24570 BIN_HASH_3 = binascii.unhexlify(HASH_3)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 A_SHORT_MANIFEST = (
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'bar/baz/qux.py\0%(hash2)s%(flag2)s\n'
b'foo\0%(hash1)s%(flag1)s\n'
) % {b'hash1': HASH_1,
b'flag1': b'',
b'hash2': HASH_2,
b'flag2': b'l',
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 A_DEEPER_MANIFEST = (
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'a/b/c/bar.py\0%(hash3)s%(flag1)s\n'
b'a/b/c/bar.txt\0%(hash1)s%(flag1)s\n'
b'a/b/c/foo.py\0%(hash3)s%(flag1)s\n'
b'a/b/c/foo.txt\0%(hash2)s%(flag2)s\n'
b'a/b/d/baz.py\0%(hash3)s%(flag1)s\n'
b'a/b/d/qux.py\0%(hash1)s%(flag2)s\n'
b'a/b/d/ten.txt\0%(hash3)s%(flag2)s\n'
b'a/b/dog.py\0%(hash3)s%(flag1)s\n'
b'a/b/fish.py\0%(hash2)s%(flag1)s\n'
b'a/c/london.py\0%(hash3)s%(flag2)s\n'
b'a/c/paper.txt\0%(hash2)s%(flag2)s\n'
b'a/c/paris.py\0%(hash2)s%(flag1)s\n'
b'a/d/apple.py\0%(hash3)s%(flag1)s\n'
b'a/d/pizza.py\0%(hash3)s%(flag2)s\n'
b'a/green.py\0%(hash1)s%(flag2)s\n'
b'a/purple.py\0%(hash2)s%(flag1)s\n'
b'app.py\0%(hash3)s%(flag1)s\n'
b'readme.txt\0%(hash2)s%(flag1)s\n'
) % {b'hash1': HASH_1,
b'flag1': b'',
b'hash2': HASH_2,
b'flag2': b'l',
b'hash3': HASH_3,
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 }
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 HUGE_MANIFEST_ENTRIES = 200001
Augie Fackler
tests: make test-manifest finish importing in Python 3...
r32534 izip = getattr(itertools, 'izip', zip)
if 'xrange' not in globals():
xrange = range
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 A_HUGE_MANIFEST = b''.join(sorted(
b'file%d\0%s%s\n' % (i, h, f) for i, h, f in
Augie Fackler
tests: make test-manifest finish importing in Python 3...
r32534 izip(xrange(200001),
itertools.cycle((HASH_1, HASH_2)),
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 itertools.cycle((b'', b'x', b'l')))))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Drew Gottlieb
test-manifest: make manifesttest a base class that is extended...
r24655 class basemanifesttests(object):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 def parsemanifest(self, text):
Drew Gottlieb
test-manifest: make manifesttest a base class that is extended...
r24655 raise NotImplementedError('parsemanifest not implemented by test case')
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testEmptyManifest(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(EMTPY_MANIFEST)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertEqual(0, len(m))
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 self.assertEqual([], list(m))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testManifest(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual([b'bar/baz/qux.py', b'foo'], list(m))
self.assertEqual(BIN_HASH_2, m[b'bar/baz/qux.py'])
self.assertEqual(b'l', m.flags(b'bar/baz/qux.py'))
self.assertEqual(BIN_HASH_1, m[b'foo'])
self.assertEqual(b'', m.flags(b'foo'))
Gregory Szorc
tests: use context manager form of assertRaises...
r32279 with self.assertRaises(KeyError):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'wat']
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testSetItem(self):
Martin von Zweigbergk
test-manifest: extract constants for binary hashes...
r24570 want = BIN_HASH_1
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(EMTPY_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'a'] = want
self.assertIn(b'a', m)
self.assertEqual(want, m[b'a'])
self.assertEqual(b'a\0' + HASH_1 + b'\n', m.text())
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'a'] = want
self.assertEqual(want, m[b'a'])
self.assertEqual(b'a\0' + HASH_1 + b'\n' + A_SHORT_MANIFEST,
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 m.text())
Martin von Zweigbergk
test-manifest.py: separate out test for double-free after copy()...
r24465
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 def testSetFlag(self):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 want = b'x'
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(EMTPY_MANIFEST)
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 # first add a file; a file-less flag makes no sense
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'a'] = BIN_HASH_1
m.setflag(b'a', want)
self.assertEqual(want, m.flags(b'a'))
self.assertEqual(b'a\0' + HASH_1 + want + b'\n', m.text())
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 # first add a file; a file-less flag makes no sense
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'a'] = BIN_HASH_1
m.setflag(b'a', want)
self.assertEqual(want, m.flags(b'a'))
self.assertEqual(b'a\0' + HASH_1 + want + b'\n' + A_SHORT_MANIFEST,
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 m.text())
Martin von Zweigbergk
test-manifest.py: separate out test for double-free after copy()...
r24465 def testCopy(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'a'] = BIN_HASH_1
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 m2 = m.copy()
del m
del m2 # make sure we don't double free() anything
def testCompaction(self):
unhex = binascii.unhexlify
h1, h2 = unhex(HASH_1), unhex(HASH_2)
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'alpha'] = h1
m[b'beta'] = h2
del m[b'foo']
want = b'alpha\0%s\nbar/baz/qux.py\0%sl\nbeta\0%s\n' % (
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 HASH_1, HASH_2, HASH_2)
self.assertEqual(want, m.text())
self.assertEqual(3, len(m))
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual([b'alpha', b'bar/baz/qux.py', b'beta'], list(m))
self.assertEqual(h1, m[b'alpha'])
self.assertEqual(h2, m[b'bar/baz/qux.py'])
self.assertEqual(h2, m[b'beta'])
self.assertEqual(b'', m.flags(b'alpha'))
self.assertEqual(b'l', m.flags(b'bar/baz/qux.py'))
self.assertEqual(b'', m.flags(b'beta'))
Gregory Szorc
tests: use context manager form of assertRaises...
r32279 with self.assertRaises(KeyError):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'foo']
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testSetGetNodeSuffix(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 clean = self.parsemanifest(A_SHORT_MANIFEST)
m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 h = m[b'foo']
f = m.flags(b'foo')
want = h + b'a'
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 # Merge code wants to set 21-byte fake hashes at times
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'foo'] = want
self.assertEqual(want, m[b'foo'])
self.assertEqual([(b'bar/baz/qux.py', BIN_HASH_2),
(b'foo', BIN_HASH_1 + b'a')],
Pulkit Goyal
py3: use dict.items() instead of dict.iteritems() in tests...
r36345 list(m.items()))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 # Sometimes it even tries a 22-byte fake hash, but we can
# return 21 and it'll work out
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'foo'] = want + b'+'
self.assertEqual(want, m[b'foo'])
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 # make sure the suffix survives a copy
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'', b'', [b're:foo'])
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 m2 = m.matches(match)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual(want, m2[b'foo'])
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertEqual(1, len(m2))
m2 = m.copy()
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual(want, m2[b'foo'])
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 # suffix with iteration
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual([(b'bar/baz/qux.py', BIN_HASH_2),
(b'foo', want)],
Pulkit Goyal
py3: use dict.items() instead of dict.iteritems() in tests...
r36345 list(m.items()))
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 # shows up in diff
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.assertEqual({b'foo': ((want, f), (h, b''))}, m.diff(clean))
self.assertEqual({b'foo': ((h, b''), (want, f))}, clean.diff(m))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 def testMatchException(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'', b'', [b're:.*'])
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 def filt(path):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 if path == b'foo':
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 assert False
return True
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 match.matchfn = filt
Gregory Szorc
tests: use context manager form of assertRaises...
r32279 with self.assertRaises(AssertionError):
m.matches(match)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testRemoveItem(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 del m[b'foo']
Gregory Szorc
tests: use context manager form of assertRaises...
r32279 with self.assertRaises(KeyError):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'foo']
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertEqual(1, len(m))
self.assertEqual(1, len(list(m)))
Augie Fackler
lazymanifest: use a binary search to do an insertion...
r24228 # now restore and make sure everything works right
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 m[b'foo'] = b'a' * 20
Augie Fackler
lazymanifest: use a binary search to do an insertion...
r24228 self.assertEqual(2, len(m))
self.assertEqual(2, len(list(m)))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testManifestDiff(self):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 MISSING = (None, b'')
addl = b'z-only-in-left\0' + HASH_1 + b'\n'
addr = b'z-only-in-right\0' + HASH_2 + b'x\n'
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 left = self.parsemanifest(
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 A_SHORT_MANIFEST.replace(HASH_1, HASH_3 + b'x') + addl)
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 right = self.parsemanifest(A_SHORT_MANIFEST + addr)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'foo': ((BIN_HASH_3, b'x'),
(BIN_HASH_1, b'')),
b'z-only-in-left': ((BIN_HASH_1, b''), MISSING),
b'z-only-in-right': (MISSING, (BIN_HASH_2, b'x')),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
self.assertEqual(want, left.diff(right))
want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'bar/baz/qux.py': (MISSING, (BIN_HASH_2, b'l')),
b'foo': (MISSING, (BIN_HASH_3, b'x')),
b'z-only-in-left': (MISSING, (BIN_HASH_1, b'')),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 self.assertEqual(want, self.parsemanifest(EMTPY_MANIFEST).diff(left))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'bar/baz/qux.py': ((BIN_HASH_2, b'l'), MISSING),
b'foo': ((BIN_HASH_3, b'x'), MISSING),
b'z-only-in-left': ((BIN_HASH_1, b''), MISSING),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 self.assertEqual(want, left.diff(self.parsemanifest(EMTPY_MANIFEST)))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 copy = right.copy()
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 del copy[b'z-only-in-right']
del right[b'foo']
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'foo': (MISSING, (BIN_HASH_1, b'')),
b'z-only-in-right': ((BIN_HASH_2, b'x'), MISSING),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
self.assertEqual(want, right.diff(copy))
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 short = self.parsemanifest(A_SHORT_MANIFEST)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 pruned = short.copy()
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 del pruned[b'foo']
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'foo': ((BIN_HASH_1, b''), MISSING),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
self.assertEqual(want, short.diff(pruned))
want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'foo': (MISSING, (BIN_HASH_1, b'')),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
self.assertEqual(want, pruned.diff(short))
want = {
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'bar/baz/qux.py': None,
b'foo': (MISSING, (BIN_HASH_1, b'')),
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 }
Durham Goode
manifest: add match argument to diff and filesnotin...
r31255 self.assertEqual(want, pruned.diff(short, clean=True))
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testReversedLines(self):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 backwards = b''.join(
l + b'\n' for l in reversed(A_SHORT_MANIFEST.split(b'\n')) if l)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 try:
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 self.parsemanifest(backwards)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.fail('Should have raised ValueError')
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except ValueError as v:
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertIn('Manifest lines not in sorted order.', str(v))
def testNoTerminalNewline(self):
try:
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.parsemanifest(A_SHORT_MANIFEST + b'wat')
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.fail('Should have raised ValueError')
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except ValueError as v:
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertIn('Manifest did not end in a newline.', str(v))
def testNoNewLineAtAll(self):
try:
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 self.parsemanifest(b'wat')
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.fail('Should have raised ValueError')
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except ValueError as v:
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertIn('Manifest did not end in a newline.', str(v))
def testHugeManifest(self):
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_HUGE_MANIFEST)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertEqual(HUGE_MANIFEST_ENTRIES, len(m))
self.assertEqual(len(m), len(list(m)))
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 def testMatchesMetadata(self):
'''Tests matches() for a few specific files to make sure that both
the set of files as well as their flags and nodeids are correct in
the resulting manifest.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_HUGE_MANIFEST)
Drew Gottlieb
manifest: make manifest.intersectfiles() internal...
r24495
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'',
[b'file1', b'file200', b'file300'], exact=True)
Drew Gottlieb
manifest: make manifest.intersectfiles() internal...
r24495 m2 = m.matches(match)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 w = (b'file1\0%sx\n'
b'file200\0%sl\n'
b'file300\0%s\n') % (HASH_2, HASH_1, HASH_1)
Augie Fackler
manifest: split manifestdict into high-level and low-level logic...
r24225 self.assertEqual(w, m2.text())
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 def testMatchesNonexistentFile(self):
'''Tests matches() for a small set of specific files, including one
nonexistent file to make sure in only matches against existing files.
'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'',
[b'a/b/c/bar.txt', b'a/b/d/qux.py',
b'readme.txt', b'nonexistent'],
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 exact=True)
m2 = m.matches(match)
self.assertEqual(
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 [b'a/b/c/bar.txt', b'a/b/d/qux.py', b'readme.txt'],
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2.keys())
def testMatchesNonexistentDirectory(self):
'''Tests matches() for a relpath match on a directory that doesn't
actually exist.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b'a/f'], default=b'relpath')
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual([], m2.keys())
def testMatchesExactLarge(self):
'''Tests matches() for files matching a large list of exact files.
'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_HUGE_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
flist = m.keys()[80:300]
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', flist, exact=True)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual(flist, m2.keys())
def testMatchesFull(self):
'''Tests matches() for what should be a full match.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b''])
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual(m.keys(), m2.keys())
def testMatchesDirectory(self):
'''Tests matches() on a relpath match on a directory, which should
match against all files within said directory.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b'a/b'], default=b'relpath')
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual([
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'a/b/c/bar.py', b'a/b/c/bar.txt', b'a/b/c/foo.py',
b'a/b/c/foo.txt',
b'a/b/d/baz.py', b'a/b/d/qux.py', b'a/b/d/ten.txt', b'a/b/dog.py',
b'a/b/fish.py'], m2.keys())
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
def testMatchesExactPath(self):
'''Tests matches() on an exact match on a directory, which should
result in an empty manifest because you can't perform an exact match
against a directory.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b'a/b'], exact=True)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual([], m2.keys())
def testMatchesCwd(self):
'''Tests matches() on a relpath match with the current directory ('.')
when not in the root directory.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'a/b', [b'.'], default=b'relpath')
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual([
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'a/b/c/bar.py', b'a/b/c/bar.txt', b'a/b/c/foo.py',
b'a/b/c/foo.txt', b'a/b/d/baz.py', b'a/b/d/qux.py',
b'a/b/d/ten.txt', b'a/b/dog.py', b'a/b/fish.py'], m2.keys())
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
def testMatchesWithPattern(self):
'''Tests matches() for files matching a pattern that reside
deeper than the specified directory.'''
Drew Gottlieb
test-manifest: move parsemanifest() to be a testmanifest class method...
r24654 m = self.parsemanifest(A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b'a/b/*/*.txt'])
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2 = m.matches(match)
self.assertEqual(
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 [b'a/b/c/bar.txt', b'a/b/c/foo.txt', b'a/b/d/ten.txt'],
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 m2.keys())
Drew Gottlieb
test-manifest: make manifesttest a base class that is extended...
r24655 class testmanifestdict(unittest.TestCase, basemanifesttests):
def parsemanifest(self, text):
return manifestmod.manifestdict(text)
Augie Fackler
manifest: make sure there's a filename before bothering to look for newline...
r40635 def testObviouslyBogusManifest(self):
# This is a 163k manifest that came from oss-fuzz. It was a
# timeout there, but when run normally it doesn't seem to
# present any particular slowness.
data = zlib.decompress(
'x\x9c\xed\xce;\n\x83\x00\x10\x04\xd0\x8deNa\x93~\xf1\x03\xc9q\xf4'
'\x14\xeaU\xbdB\xda\xd4\xe6Cj\xc1FA\xde+\x86\xe9f\xa2\xfci\xbb\xfb'
'\xa3\xef\xea\xba\xca\x7fk\x86q\x9a\xc6\xc8\xcc&\xb3\xcf\xf8\xb8|#'
'\x8a9\x00\xd8\xe6v\xf4\x01N\xe1\n\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\xc0\x8aey\x1d}\x01\xd8\xe0\xb9\xf3\xde\x1b\xcf\x17'
'\xac\xbe')
with self.assertRaises(ValueError):
self.parsemanifest(data)
Drew Gottlieb
test-manifest: add some test coverage for treemanifest...
r24656 class testtreemanifest(unittest.TestCase, basemanifesttests):
def parsemanifest(self, text):
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 return manifestmod.treemanifest(b'', text)
Drew Gottlieb
test-manifest: add some test coverage for treemanifest...
r24656
Durham Goode
treemanifest: add walksubtrees api...
r31876 def testWalkSubtrees(self):
m = self.parsemanifest(A_DEEPER_MANIFEST)
dirs = [s._dir for s in m.walksubtrees()]
self.assertEqual(
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 sorted([
b'', b'a/', b'a/c/', b'a/d/', b'a/b/', b'a/b/c/', b'a/b/d/']),
Durham Goode
treemanifest: add walksubtrees api...
r31876 sorted(dirs)
)
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 match = matchmod.match(b'/', b'', [b'path:a/b/'])
Durham Goode
treemanifest: add walksubtrees api...
r31876 dirs = [s._dir for s in m.walksubtrees(matcher=match)]
self.assertEqual(
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 sorted([b'a/b/', b'a/b/c/', b'a/b/d/']),
Durham Goode
treemanifest: add walksubtrees api...
r31876 sorted(dirs)
)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 if __name__ == '__main__':
silenttestrunner.main(__name__)