test-manifest.py
422 lines
| 14.5 KiB
| text/x-python
|
PythonLexer
/ tests / test-manifest.py
Pulkit Goyal
|
r28929 | from __future__ import absolute_import | ||
Augie Fackler
|
r24214 | |||
Pulkit Goyal
|
r28929 | import binascii | ||
import itertools | ||||
Augie Fackler
|
r24214 | import silenttestrunner | ||
Pulkit Goyal
|
r28929 | import unittest | ||
Augie Fackler
|
r24214 | |||
Pulkit Goyal
|
r28929 | from mercurial import ( | ||
manifest as manifestmod, | ||||
match as matchmod, | ||||
) | ||||
Augie Fackler
|
r24214 | |||
Augie Fackler
|
r32551 | EMTPY_MANIFEST = b'' | ||
Martin von Zweigbergk
|
r24569 | |||
Augie Fackler
|
r32551 | HASH_1 = b'1' * 40 | ||
Martin von Zweigbergk
|
r24570 | BIN_HASH_1 = binascii.unhexlify(HASH_1) | ||
Augie Fackler
|
r32551 | HASH_2 = b'f' * 40 | ||
Martin von Zweigbergk
|
r24570 | BIN_HASH_2 = binascii.unhexlify(HASH_2) | ||
Augie Fackler
|
r32551 | HASH_3 = b'1234567890abcdef0987654321deadbeef0fcafe' | ||
Martin von Zweigbergk
|
r24570 | BIN_HASH_3 = binascii.unhexlify(HASH_3) | ||
Augie Fackler
|
r24214 | A_SHORT_MANIFEST = ( | ||
Augie Fackler
|
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
|
r24214 | } | ||
Drew Gottlieb
|
r24549 | A_DEEPER_MANIFEST = ( | ||
Augie Fackler
|
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
|
r24549 | } | ||
Augie Fackler
|
r24214 | HUGE_MANIFEST_ENTRIES = 200001 | ||
Augie Fackler
|
r32534 | izip = getattr(itertools, 'izip', zip) | ||
if 'xrange' not in globals(): | ||||
xrange = range | ||||
Augie Fackler
|
r32551 | A_HUGE_MANIFEST = b''.join(sorted( | ||
b'file%d\0%s%s\n' % (i, h, f) for i, h, f in | ||||
Augie Fackler
|
r32534 | izip(xrange(200001), | ||
itertools.cycle((HASH_1, HASH_2)), | ||||
Augie Fackler
|
r32551 | itertools.cycle((b'', b'x', b'l'))))) | ||
Augie Fackler
|
r24214 | |||
Drew Gottlieb
|
r24655 | class basemanifesttests(object): | ||
Drew Gottlieb
|
r24654 | def parsemanifest(self, text): | ||
Drew Gottlieb
|
r24655 | raise NotImplementedError('parsemanifest not implemented by test case') | ||
Augie Fackler
|
r24214 | |||
def testEmptyManifest(self): | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(EMTPY_MANIFEST) | ||
Augie Fackler
|
r24214 | self.assertEqual(0, len(m)) | ||
Martin von Zweigbergk
|
r24466 | self.assertEqual([], list(m)) | ||
Augie Fackler
|
r24214 | |||
def testManifest(self): | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
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
|
r32279 | with self.assertRaises(KeyError): | ||
Augie Fackler
|
r32551 | m[b'wat'] | ||
Augie Fackler
|
r24214 | |||
def testSetItem(self): | ||||
Martin von Zweigbergk
|
r24570 | want = BIN_HASH_1 | ||
Augie Fackler
|
r24214 | |||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(EMTPY_MANIFEST) | ||
Augie Fackler
|
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
|
r24214 | |||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
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
|
r24214 | m.text()) | ||
Martin von Zweigbergk
|
r24465 | |||
Martin von Zweigbergk
|
r24466 | def testSetFlag(self): | ||
Augie Fackler
|
r32551 | want = b'x' | ||
Martin von Zweigbergk
|
r24466 | |||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(EMTPY_MANIFEST) | ||
Martin von Zweigbergk
|
r24466 | # first add a file; a file-less flag makes no sense | ||
Augie Fackler
|
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
|
r24466 | |||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Martin von Zweigbergk
|
r24466 | # first add a file; a file-less flag makes no sense | ||
Augie Fackler
|
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
|
r24466 | m.text()) | ||
Martin von Zweigbergk
|
r24465 | def testCopy(self): | ||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
r32551 | m[b'a'] = BIN_HASH_1 | ||
Augie Fackler
|
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
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
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
|
r24214 | HASH_1, HASH_2, HASH_2) | ||
self.assertEqual(want, m.text()) | ||||
self.assertEqual(3, len(m)) | ||||
Augie Fackler
|
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
|
r32279 | with self.assertRaises(KeyError): | ||
Augie Fackler
|
r32551 | m[b'foo'] | ||
Augie Fackler
|
r24214 | |||
def testSetGetNodeSuffix(self): | ||||
Drew Gottlieb
|
r24654 | clean = self.parsemanifest(A_SHORT_MANIFEST) | ||
m = self.parsemanifest(A_SHORT_MANIFEST) | ||||
Augie Fackler
|
r32551 | h = m[b'foo'] | ||
f = m.flags(b'foo') | ||||
want = h + b'a' | ||||
Augie Fackler
|
r24214 | # Merge code wants to set 21-byte fake hashes at times | ||
Augie Fackler
|
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
|
r36345 | list(m.items())) | ||
Augie Fackler
|
r24214 | # Sometimes it even tries a 22-byte fake hash, but we can | ||
# return 21 and it'll work out | ||||
Augie Fackler
|
r32551 | m[b'foo'] = want + b'+' | ||
self.assertEqual(want, m[b'foo']) | ||||
Augie Fackler
|
r24214 | # make sure the suffix survives a copy | ||
Augie Fackler
|
r32551 | match = matchmod.match(b'', b'', [b're:foo']) | ||
Martin von Zweigbergk
|
r24466 | m2 = m.matches(match) | ||
Augie Fackler
|
r32551 | self.assertEqual(want, m2[b'foo']) | ||
Augie Fackler
|
r24214 | self.assertEqual(1, len(m2)) | ||
m2 = m.copy() | ||||
Augie Fackler
|
r32551 | self.assertEqual(want, m2[b'foo']) | ||
Augie Fackler
|
r24214 | # suffix with iteration | ||
Augie Fackler
|
r32551 | self.assertEqual([(b'bar/baz/qux.py', BIN_HASH_2), | ||
(b'foo', want)], | ||||
Pulkit Goyal
|
r36345 | list(m.items())) | ||
Martin von Zweigbergk
|
r24466 | |||
Augie Fackler
|
r24214 | # shows up in diff | ||
Augie Fackler
|
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
|
r24214 | |||
Martin von Zweigbergk
|
r24466 | def testMatchException(self): | ||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
r32551 | match = matchmod.match(b'', b'', [b're:.*']) | ||
Augie Fackler
|
r24214 | def filt(path): | ||
Augie Fackler
|
r32551 | if path == b'foo': | ||
Augie Fackler
|
r24214 | assert False | ||
return True | ||||
Martin von Zweigbergk
|
r24466 | match.matchfn = filt | ||
Gregory Szorc
|
r32279 | with self.assertRaises(AssertionError): | ||
m.matches(match) | ||||
Augie Fackler
|
r24214 | |||
def testRemoveItem(self): | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
r32551 | del m[b'foo'] | ||
Gregory Szorc
|
r32279 | with self.assertRaises(KeyError): | ||
Augie Fackler
|
r32551 | m[b'foo'] | ||
Augie Fackler
|
r24214 | self.assertEqual(1, len(m)) | ||
self.assertEqual(1, len(list(m))) | ||||
Augie Fackler
|
r24228 | # now restore and make sure everything works right | ||
Augie Fackler
|
r32551 | m[b'foo'] = b'a' * 20 | ||
Augie Fackler
|
r24228 | self.assertEqual(2, len(m)) | ||
self.assertEqual(2, len(list(m))) | ||||
Augie Fackler
|
r24214 | |||
def testManifestDiff(self): | ||||
Augie Fackler
|
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
|
r24654 | left = self.parsemanifest( | ||
Augie Fackler
|
r32551 | A_SHORT_MANIFEST.replace(HASH_1, HASH_3 + b'x') + addl) | ||
Drew Gottlieb
|
r24654 | right = self.parsemanifest(A_SHORT_MANIFEST + addr) | ||
Augie Fackler
|
r24214 | want = { | ||
Augie Fackler
|
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
|
r24214 | } | ||
self.assertEqual(want, left.diff(right)) | ||||
want = { | ||||
Augie Fackler
|
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
|
r24214 | } | ||
Drew Gottlieb
|
r24654 | self.assertEqual(want, self.parsemanifest(EMTPY_MANIFEST).diff(left)) | ||
Augie Fackler
|
r24214 | |||
want = { | ||||
Augie Fackler
|
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
|
r24214 | } | ||
Drew Gottlieb
|
r24654 | self.assertEqual(want, left.diff(self.parsemanifest(EMTPY_MANIFEST))) | ||
Augie Fackler
|
r24214 | copy = right.copy() | ||
Augie Fackler
|
r32551 | del copy[b'z-only-in-right'] | ||
del right[b'foo'] | ||||
Augie Fackler
|
r24214 | want = { | ||
Augie Fackler
|
r32551 | b'foo': (MISSING, (BIN_HASH_1, b'')), | ||
b'z-only-in-right': ((BIN_HASH_2, b'x'), MISSING), | ||||
Augie Fackler
|
r24214 | } | ||
self.assertEqual(want, right.diff(copy)) | ||||
Drew Gottlieb
|
r24654 | short = self.parsemanifest(A_SHORT_MANIFEST) | ||
Augie Fackler
|
r24214 | pruned = short.copy() | ||
Augie Fackler
|
r32551 | del pruned[b'foo'] | ||
Augie Fackler
|
r24214 | want = { | ||
Augie Fackler
|
r32551 | b'foo': ((BIN_HASH_1, b''), MISSING), | ||
Augie Fackler
|
r24214 | } | ||
self.assertEqual(want, short.diff(pruned)) | ||||
want = { | ||||
Augie Fackler
|
r32551 | b'foo': (MISSING, (BIN_HASH_1, b'')), | ||
Augie Fackler
|
r24214 | } | ||
self.assertEqual(want, pruned.diff(short)) | ||||
want = { | ||||
Augie Fackler
|
r32551 | b'bar/baz/qux.py': None, | ||
b'foo': (MISSING, (BIN_HASH_1, b'')), | ||||
Augie Fackler
|
r24214 | } | ||
Durham Goode
|
r31255 | self.assertEqual(want, pruned.diff(short, clean=True)) | ||
Augie Fackler
|
r24214 | |||
def testReversedLines(self): | ||||
Augie Fackler
|
r32551 | backwards = b''.join( | ||
l + b'\n' for l in reversed(A_SHORT_MANIFEST.split(b'\n')) if l) | ||||
Augie Fackler
|
r24214 | try: | ||
Drew Gottlieb
|
r24654 | self.parsemanifest(backwards) | ||
Augie Fackler
|
r24214 | self.fail('Should have raised ValueError') | ||
Gregory Szorc
|
r25660 | except ValueError as v: | ||
Augie Fackler
|
r24214 | self.assertIn('Manifest lines not in sorted order.', str(v)) | ||
def testNoTerminalNewline(self): | ||||
try: | ||||
Augie Fackler
|
r32551 | self.parsemanifest(A_SHORT_MANIFEST + b'wat') | ||
Augie Fackler
|
r24214 | self.fail('Should have raised ValueError') | ||
Gregory Szorc
|
r25660 | except ValueError as v: | ||
Augie Fackler
|
r24214 | self.assertIn('Manifest did not end in a newline.', str(v)) | ||
def testNoNewLineAtAll(self): | ||||
try: | ||||
Augie Fackler
|
r32551 | self.parsemanifest(b'wat') | ||
Augie Fackler
|
r24214 | self.fail('Should have raised ValueError') | ||
Gregory Szorc
|
r25660 | except ValueError as v: | ||
Augie Fackler
|
r24214 | self.assertIn('Manifest did not end in a newline.', str(v)) | ||
def testHugeManifest(self): | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_HUGE_MANIFEST) | ||
Augie Fackler
|
r24214 | self.assertEqual(HUGE_MANIFEST_ENTRIES, len(m)) | ||
self.assertEqual(len(m), len(list(m))) | ||||
Drew Gottlieb
|
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
|
r24654 | m = self.parsemanifest(A_HUGE_MANIFEST) | ||
Drew Gottlieb
|
r24495 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', | ||
[b'file1', b'file200', b'file300'], exact=True) | ||||
Drew Gottlieb
|
r24495 | m2 = m.matches(match) | ||
Augie Fackler
|
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
|
r24225 | self.assertEqual(w, m2.text()) | ||
Augie Fackler
|
r24214 | |||
Drew Gottlieb
|
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
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
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
|
r24549 | exact=True) | ||
m2 = m.matches(match) | ||||
self.assertEqual( | ||||
Augie Fackler
|
r32551 | [b'a/b/c/bar.txt', b'a/b/d/qux.py', b'readme.txt'], | ||
Drew Gottlieb
|
r24549 | m2.keys()) | ||
def testMatchesNonexistentDirectory(self): | ||||
'''Tests matches() for a relpath match on a directory that doesn't | ||||
actually exist.''' | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'a/f'], default=b'relpath') | ||
Drew Gottlieb
|
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
|
r24654 | m = self.parsemanifest(A_HUGE_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
flist = m.keys()[80:300] | ||||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', flist, exact=True) | ||
Drew Gottlieb
|
r24549 | m2 = m.matches(match) | ||
self.assertEqual(flist, m2.keys()) | ||||
def testMatchesFull(self): | ||||
'''Tests matches() for what should be a full match.''' | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'']) | ||
Drew Gottlieb
|
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
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'a/b'], default=b'relpath') | ||
Drew Gottlieb
|
r24549 | m2 = m.matches(match) | ||
self.assertEqual([ | ||||
Augie Fackler
|
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
|
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
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'a/b'], exact=True) | ||
Drew Gottlieb
|
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
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'a/b', [b'.'], default=b'relpath') | ||
Drew Gottlieb
|
r24549 | m2 = m.matches(match) | ||
self.assertEqual([ | ||||
Augie Fackler
|
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
|
r24549 | |||
def testMatchesWithPattern(self): | ||||
'''Tests matches() for files matching a pattern that reside | ||||
deeper than the specified directory.''' | ||||
Drew Gottlieb
|
r24654 | m = self.parsemanifest(A_DEEPER_MANIFEST) | ||
Drew Gottlieb
|
r24549 | |||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'a/b/*/*.txt']) | ||
Drew Gottlieb
|
r24549 | m2 = m.matches(match) | ||
self.assertEqual( | ||||
Augie Fackler
|
r32551 | [b'a/b/c/bar.txt', b'a/b/c/foo.txt', b'a/b/d/ten.txt'], | ||
Drew Gottlieb
|
r24549 | m2.keys()) | ||
Drew Gottlieb
|
r24655 | class testmanifestdict(unittest.TestCase, basemanifesttests): | ||
def parsemanifest(self, text): | ||||
return manifestmod.manifestdict(text) | ||||
Drew Gottlieb
|
r24656 | class testtreemanifest(unittest.TestCase, basemanifesttests): | ||
def parsemanifest(self, text): | ||||
Augie Fackler
|
r32551 | return manifestmod.treemanifest(b'', text) | ||
Drew Gottlieb
|
r24656 | |||
Durham Goode
|
r31876 | def testWalkSubtrees(self): | ||
m = self.parsemanifest(A_DEEPER_MANIFEST) | ||||
dirs = [s._dir for s in m.walksubtrees()] | ||||
self.assertEqual( | ||||
Augie Fackler
|
r32551 | sorted([ | ||
b'', b'a/', b'a/c/', b'a/d/', b'a/b/', b'a/b/c/', b'a/b/d/']), | ||||
Durham Goode
|
r31876 | sorted(dirs) | ||
) | ||||
Augie Fackler
|
r32551 | match = matchmod.match(b'/', b'', [b'path:a/b/']) | ||
Durham Goode
|
r31876 | dirs = [s._dir for s in m.walksubtrees(matcher=match)] | ||
self.assertEqual( | ||||
Augie Fackler
|
r32551 | sorted([b'a/b/', b'a/b/c/', b'a/b/d/']), | ||
Durham Goode
|
r31876 | sorted(dirs) | ||
) | ||||
Augie Fackler
|
r24214 | if __name__ == '__main__': | ||
silenttestrunner.main(__name__) | ||||