##// END OF EJS Templates
tests: use pattern matching to mask `ECONNREFUSED` messages...
tests: use pattern matching to mask `ECONNREFUSED` messages The second and third one of these in `test-http-proxy.t` was failing on Windows. The others were found by grep and by failed tests when output was matched and an attempt was made to emit the mask pattern. The first clonebundles failure on Windows emitted: error fetching bundle: [WinError 10061] $ECONNREFUSED$ We should probably stringify that better to get rid of the "[WinError 10061]" part.

File last commit:

r50182:7fe82a51 default
r52835:73a43fe3 default
Show More
test-manifest.py
458 lines | 15.3 KiB | text/x-python | PythonLexer
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
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 from mercurial.node import sha1nodeconstants
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 from mercurial import (
manifest as manifestmod,
match as matchmod,
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 util,
Pulkit Goyal
tests: make test-manifest use absolute_import
r28929 )
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
formatting: blacken the codebase...
r43346 b'bar/baz/qux.py\0%(hash2)s%(flag2)s\n' b'foo\0%(hash1)s%(flag1)s\n'
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 ) % {
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'
Augie Fackler
formatting: blacken the codebase...
r43346 ) % {
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
formatting: blacken the codebase...
r43346 A_HUGE_MANIFEST = b''.join(
sorted(
b'file%d\0%s%s\n' % (i, h, f)
Manuel Jacob
py3: use `zip()` instead of trying to use `itertools.izip()`
r50182 for i, h, f in zip(
Manuel Jacob
py3: remove xrange() compatibility code...
r50180 range(200001),
Augie Fackler
formatting: blacken the codebase...
r43346 itertools.cycle((HASH_1, HASH_2)),
itertools.cycle((b'', b'x', b'l')),
)
)
)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class basemanifesttests:
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):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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'])
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(b'a\0' + HASH_1 + b'\n' + A_SHORT_MANIFEST, 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
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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'))
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(
b'a\0' + HASH_1 + want + b'\n' + A_SHORT_MANIFEST, m.text()
)
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466
Martin von Zweigbergk
test-manifest.py: separate out test for double-free after copy()...
r24465 def testCopy(self):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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
Augie Fackler
formatting: blacken the codebase...
r43346 del m2 # make sure we don't double free() anything
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testCompaction(self):
unhex = binascii.unhexlify
h1, h2 = unhex(HASH_1), unhex(HASH_2)
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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
formatting: blacken the codebase...
r43346 HASH_1,
HASH_2,
HASH_2,
)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 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
Martin von Zweigbergk
test-manifest.py: rewrite tests in terms of manifestdict...
r24466 def testMatchException(self):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_SHORT_MANIFEST)
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(util.localpath(b'/repo'), b'', [b're:.*'])
Augie Fackler
formatting: blacken the codebase...
r43346
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
Augie Fackler
formatting: blacken the codebase...
r43346
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):
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m._matches(match)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214
def testRemoveItem(self):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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(
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 20, A_SHORT_MANIFEST.replace(HASH_1, HASH_3 + b'x') + addl
Augie Fackler
formatting: blacken the codebase...
r43346 )
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 right = self.parsemanifest(20, A_SHORT_MANIFEST + addr)
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 want = {
Augie Fackler
formatting: blacken the codebase...
r43346 b'foo': ((BIN_HASH_3, b'x'), (BIN_HASH_1, b'')),
Augie Fackler
tests: make test-manifest.py portable to Python 3...
r32551 b'z-only-in-left': ((BIN_HASH_1, b''), MISSING),
b'z-only-in-right': (MISSING, (BIN_HASH_2, b'x')),
Augie Fackler
formatting: blacken the codebase...
r43346 }
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
formatting: blacken the codebase...
r43346 }
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.assertEqual(
want, self.parsemanifest(20, 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
formatting: blacken the codebase...
r43346 }
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.assertEqual(
want, left.diff(self.parsemanifest(20, 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
formatting: blacken the codebase...
r43346 }
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 self.assertEqual(want, right.diff(copy))
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 short = self.parsemanifest(20, 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
formatting: blacken the codebase...
r43346 }
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
formatting: blacken the codebase...
r43346 }
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
formatting: blacken the codebase...
r43346 }
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(
Augie Fackler
formatting: blacken the codebase...
r43346 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:
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.parsemanifest(20, 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:
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.parsemanifest(20, 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:
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.parsemanifest(20, 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):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, 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):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() for a few specific files to make sure that both
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 the set of files as well as their flags and nodeids are correct in
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 the resulting manifest."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_HUGE_MANIFEST)
Drew Gottlieb
manifest: make manifest.intersectfiles() internal...
r24495
Martin von Zweigbergk
match: delete unused root and cwd arguments from {always,never,exact}() (API)...
r41825 match = matchmod.exact([b'file1', b'file200', b'file300'])
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: make manifest.intersectfiles() internal...
r24495
Augie Fackler
formatting: blacken the codebase...
r43346 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):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() for a small set of specific files, including one
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 nonexistent file to make sure in only matches against existing files.
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
formatting: blacken the codebase...
r43346 match = matchmod.exact(
[b'a/b/c/bar.txt', b'a/b/d/qux.py', b'readme.txt', b'nonexistent']
)
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 [b'a/b/c/bar.txt', b'a/b/d/qux.py', b'readme.txt'], m2.keys()
)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
def testMatchesNonexistentDirectory(self):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() for a relpath match on a directory that doesn't
actually exist."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(
util.localpath(b'/repo'), b'', [b'a/f'], default=b'relpath'
)
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual([], m2.keys())
def testMatchesExactLarge(self):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() for files matching a large list of exact files."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_HUGE_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
flist = m.keys()[80:300]
Martin von Zweigbergk
match: delete unused root and cwd arguments from {always,never,exact}() (API)...
r41825 match = matchmod.exact(flist)
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual(flist, m2.keys())
def testMatchesFull(self):
'''Tests matches() for what should be a full match.'''
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(util.localpath(b'/repo'), b'', [b''])
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual(m.keys(), m2.keys())
def testMatchesDirectory(self):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() on a relpath match on a directory, which should
match against all files within said directory."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(
util.localpath(b'/repo'), b'', [b'a/b'], default=b'relpath'
)
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(
[
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):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() on an exact match on a directory, which should
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549 result in an empty manifest because you can't perform an exact match
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 against a directory."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Martin von Zweigbergk
match: delete unused root and cwd arguments from {always,never,exact}() (API)...
r41825 match = matchmod.exact([b'a/b'])
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual([], m2.keys())
def testMatchesCwd(self):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() on a relpath match with the current directory ('.')
when not in the root directory."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(
util.localpath(b'/repo'), b'a/b', [b'.'], default=b'relpath'
)
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(
[
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):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests matches() for files matching a pattern that reside
deeper than the specified directory."""
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(util.localpath(b'/repo'), b'', [b'a/b/*/*.txt'])
Augie Fackler
manifest: move matches method to be outside the interface...
r44826 m2 = m._matches(match)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
self.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 [b'a/b/c/bar.txt', b'a/b/c/foo.txt', b'a/b/d/ten.txt'], m2.keys()
)
Drew Gottlieb
manifest: add some tests for manifest.matches()...
r24549
Drew Gottlieb
test-manifest: make manifesttest a base class that is extended...
r24655 class testmanifestdict(unittest.TestCase, basemanifesttests):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 def parsemanifest(self, nodelen, text):
return manifestmod.manifestdict(nodelen, text)
def testManifestLongHashes(self):
m = self.parsemanifest(32, b'a\0' + b'f' * 64 + b'\n')
self.assertEqual(binascii.unhexlify(b'f' * 64), m[b'a'])
Drew Gottlieb
test-manifest: make manifesttest a base class that is extended...
r24655
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(
Augie Fackler
tests: fix bytes/str issue I introduced when adding this test...
r40663 b'x\x9c\xed\xce;\n\x83\x00\x10\x04\xd0\x8deNa\x93~\xf1\x03\xc9q\xf4'
b'\x14\xeaU\xbdB\xda\xd4\xe6Cj\xc1FA\xde+\x86\xe9f\xa2\xfci\xbb\xfb'
b'\xa3\xef\xea\xba\xca\x7fk\x86q\x9a\xc6\xc8\xcc&\xb3\xcf\xf8\xb8|#'
b'\x8a9\x00\xd8\xe6v\xf4\x01N\xe1\n\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\xc0\x8aey\x1d}\x01\xd8\xe0\xb9\xf3\xde\x1b\xcf\x17'
Augie Fackler
formatting: blacken the codebase...
r43346 b'\xac\xbe'
)
Augie Fackler
manifest: make sure there's a filename before bothering to look for newline...
r40635 with self.assertRaises(ValueError):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 self.parsemanifest(20, data)
Augie Fackler
manifest: make sure there's a filename before bothering to look for newline...
r40635
Augie Fackler
formatting: blacken the codebase...
r43346
Drew Gottlieb
test-manifest: add some test coverage for treemanifest...
r24656 class testtreemanifest(unittest.TestCase, basemanifesttests):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 def parsemanifest(self, nodelen, text):
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 return manifestmod.treemanifest(sha1nodeconstants, b'', text)
Drew Gottlieb
test-manifest: add some test coverage for treemanifest...
r24656
Durham Goode
treemanifest: add walksubtrees api...
r31876 def testWalkSubtrees(self):
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 m = self.parsemanifest(20, A_DEEPER_MANIFEST)
Durham Goode
treemanifest: add walksubtrees api...
r31876
dirs = [s._dir for s in m.walksubtrees()]
self.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 sorted(
[b'', b'a/', b'a/c/', b'a/d/', b'a/b/', b'a/b/c/', b'a/b/d/']
),
sorted(dirs),
Durham Goode
treemanifest: add walksubtrees api...
r31876 )
Matt Harbison
tests: convert the `root` arg of matchmod.match() to local path separators...
r44416 match = matchmod.match(util.localpath(b'/repo'), b'', [b'path:a/b/'])
Durham Goode
treemanifest: add walksubtrees api...
r31876 dirs = [s._dir for s in m.walksubtrees(matcher=match)]
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(sorted([b'a/b/', b'a/b/c/', b'a/b/d/']), sorted(dirs))
Durham Goode
treemanifest: add walksubtrees api...
r31876
Augie Fackler
manifest.c: new extension code to lazily parse manifests...
r24214 if __name__ == '__main__':
silenttestrunner.main(__name__)