tests/test-manifest.py
author Augie Fackler <raf@durin42.com>
Sun, 28 May 2017 21:31:29 -0400
changeset 32551 0ff336a42c39
parent 32534 0048a852b6aa
child 36327 58c1368ab629
permissions -rw-r--r--
tests: make test-manifest.py portable to Python 3 Lots of b prefixes here, and https://bugs.python.org/issue29714 means that this test is still very broken on Python 3.6 and 3.6.1, but 3.6.2 should things (based on testing using tip of the 3.6 branch from git). #cleanup-only
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28929
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     1
from __future__ import absolute_import
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
28929
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     3
import binascii
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     4
import itertools
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
     5
import silenttestrunner
28929
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     6
import unittest
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
28929
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     8
from mercurial import (
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
     9
    manifest as manifestmod,
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
    10
    match as matchmod,
b9ed5a88710c tests: make test-manifest use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
    11
)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    12
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    13
EMTPY_MANIFEST = b''
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    14
EMTPY_MANIFEST_V2 = b'\0\n'
24569
5491248e148a test-manifest: create constant for empty manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 24549
diff changeset
    15
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    16
HASH_1 = b'1' * 40
24570
487245cbf1ab test-manifest: extract constants for binary hashes
Martin von Zweigbergk <martinvonz@google.com>
parents: 24569
diff changeset
    17
BIN_HASH_1 = binascii.unhexlify(HASH_1)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    18
HASH_2 = b'f' * 40
24570
487245cbf1ab test-manifest: extract constants for binary hashes
Martin von Zweigbergk <martinvonz@google.com>
parents: 24569
diff changeset
    19
BIN_HASH_2 = binascii.unhexlify(HASH_2)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    20
HASH_3 = b'1234567890abcdef0987654321deadbeef0fcafe'
24570
487245cbf1ab test-manifest: extract constants for binary hashes
Martin von Zweigbergk <martinvonz@google.com>
parents: 24569
diff changeset
    21
BIN_HASH_3 = binascii.unhexlify(HASH_3)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
A_SHORT_MANIFEST = (
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    23
    b'bar/baz/qux.py\0%(hash2)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    24
    b'foo\0%(hash1)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    25
    ) % {b'hash1': HASH_1,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    26
         b'flag1': b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    27
         b'hash2': HASH_2,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    28
         b'flag2': b'l',
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
         }
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    30
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    31
# Same data as A_SHORT_MANIFEST
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    32
A_SHORT_MANIFEST_V2 = (
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    33
    b'\0\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    34
    b'\x00bar/baz/qux.py\0%(flag2)s\n%(hash2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    35
    b'\x00foo\0%(flag1)s\n%(hash1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    36
    ) % {b'hash1': BIN_HASH_1,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    37
         b'flag1': b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    38
         b'hash2': BIN_HASH_2,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    39
         b'flag2': b'l',
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    40
         }
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    41
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    42
# Same data as A_SHORT_MANIFEST
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    43
A_METADATA_MANIFEST = (
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    44
    b'\0foo\0bar\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    45
    b'\x00bar/baz/qux.py\0%(flag2)s\0foo\0bar\n%(hash2)s\n' # flag and metadata
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    46
    b'\x00foo\0%(flag1)s\0foo\n%(hash1)s\n' # no flag, but metadata
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    47
    ) % {b'hash1': BIN_HASH_1,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    48
         b'flag1': b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    49
         b'hash2': BIN_HASH_2,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    50
         b'flag2': b'l',
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    51
         }
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    52
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    53
A_STEM_COMPRESSED_MANIFEST = (
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    54
    b'\0\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    55
    b'\x00bar/baz/qux.py\0%(flag2)s\n%(hash2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    56
    b'\x04qux/foo.py\0%(flag1)s\n%(hash1)s\n' # simple case of 4 stem chars
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    57
    b'\x0az.py\0%(flag1)s\n%(hash1)s\n' # tricky newline = 10 stem characters
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    58
    b'\x00%(verylongdir)sx/x\0\n%(hash1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    59
    b'\xffx/y\0\n%(hash2)s\n' # more than 255 stem chars
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    60
    ) % {b'hash1': BIN_HASH_1,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    61
         b'flag1': b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    62
         b'hash2': BIN_HASH_2,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    63
         b'flag2': b'l',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    64
         b'verylongdir': 255 * b'x',
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    65
         }
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
    66
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
    67
A_DEEPER_MANIFEST = (
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    68
    b'a/b/c/bar.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    69
    b'a/b/c/bar.txt\0%(hash1)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    70
    b'a/b/c/foo.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    71
    b'a/b/c/foo.txt\0%(hash2)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    72
    b'a/b/d/baz.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    73
    b'a/b/d/qux.py\0%(hash1)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    74
    b'a/b/d/ten.txt\0%(hash3)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    75
    b'a/b/dog.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    76
    b'a/b/fish.py\0%(hash2)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    77
    b'a/c/london.py\0%(hash3)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    78
    b'a/c/paper.txt\0%(hash2)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    79
    b'a/c/paris.py\0%(hash2)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    80
    b'a/d/apple.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    81
    b'a/d/pizza.py\0%(hash3)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    82
    b'a/green.py\0%(hash1)s%(flag2)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    83
    b'a/purple.py\0%(hash2)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    84
    b'app.py\0%(hash3)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    85
    b'readme.txt\0%(hash2)s%(flag1)s\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    86
    ) % {b'hash1': HASH_1,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    87
         b'flag1': b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    88
         b'hash2': HASH_2,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    89
         b'flag2': b'l',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    90
         b'hash3': HASH_3,
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
    91
         }
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
    92
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    93
HUGE_MANIFEST_ENTRIES = 200001
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
    94
32534
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
    95
izip = getattr(itertools, 'izip', zip)
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
    96
if 'xrange' not in globals():
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
    97
    xrange = range
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
    98
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
    99
A_HUGE_MANIFEST = b''.join(sorted(
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   100
    b'file%d\0%s%s\n' % (i, h, f) for i, h, f in
32534
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
   101
    izip(xrange(200001),
0048a852b6aa tests: make test-manifest finish importing in Python 3
Augie Fackler <raf@durin42.com>
parents: 32533
diff changeset
   102
         itertools.cycle((HASH_1, HASH_2)),
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   103
         itertools.cycle((b'', b'x', b'l')))))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   104
24655
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   105
class basemanifesttests(object):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   106
    def parsemanifest(self, text):
24655
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   107
        raise NotImplementedError('parsemanifest not implemented by test case')
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   108
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   109
    def testEmptyManifest(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   110
        m = self.parsemanifest(EMTPY_MANIFEST)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   111
        self.assertEqual(0, len(m))
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   112
        self.assertEqual([], list(m))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   113
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   114
    def testEmptyManifestv2(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   115
        m = self.parsemanifest(EMTPY_MANIFEST_V2)
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   116
        self.assertEqual(0, len(m))
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   117
        self.assertEqual([], list(m))
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   118
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   119
    def testManifest(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   120
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   121
        self.assertEqual([b'bar/baz/qux.py', b'foo'], list(m))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   122
        self.assertEqual(BIN_HASH_2, m[b'bar/baz/qux.py'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   123
        self.assertEqual(b'l', m.flags(b'bar/baz/qux.py'))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   124
        self.assertEqual(BIN_HASH_1, m[b'foo'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   125
        self.assertEqual(b'', m.flags(b'foo'))
32279
68c43a416585 tests: use context manager form of assertRaises
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31876
diff changeset
   126
        with self.assertRaises(KeyError):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   127
            m[b'wat']
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   128
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   129
    def testParseManifestV2(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   130
        m1 = self.parsemanifest(A_SHORT_MANIFEST)
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   131
        m2 = self.parsemanifest(A_SHORT_MANIFEST_V2)
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   132
        # Should have same content as A_SHORT_MANIFEST
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   133
        self.assertEqual(m1.text(), m2.text())
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   134
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   135
    def testParseManifestMetadata(self):
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   136
        # Metadata is for future-proofing and should be accepted but ignored
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   137
        m = self.parsemanifest(A_METADATA_MANIFEST)
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   138
        self.assertEqual(A_SHORT_MANIFEST, m.text())
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   139
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   140
    def testParseManifestStemCompression(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   141
        m = self.parsemanifest(A_STEM_COMPRESSED_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   142
        self.assertIn(b'bar/baz/qux.py', m)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   143
        self.assertIn(b'bar/qux/foo.py', m)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   144
        self.assertIn(b'bar/qux/foz.py', m)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   145
        self.assertIn(256 * b'x' + b'/x', m)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   146
        self.assertIn(256 * b'x' + b'/y', m)
24573
701d3554de0e manifestv2: add support for writing new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24572
diff changeset
   147
        self.assertEqual(A_STEM_COMPRESSED_MANIFEST, m.text(usemanifestv2=True))
701d3554de0e manifestv2: add support for writing new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24572
diff changeset
   148
701d3554de0e manifestv2: add support for writing new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24572
diff changeset
   149
    def testTextV2(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   150
        m1 = self.parsemanifest(A_SHORT_MANIFEST)
24573
701d3554de0e manifestv2: add support for writing new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24572
diff changeset
   151
        v2text = m1.text(usemanifestv2=True)
701d3554de0e manifestv2: add support for writing new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24572
diff changeset
   152
        self.assertEqual(A_SHORT_MANIFEST_V2, v2text)
24572
b83679eb5f86 manifestv2: add support for reading new manifest format
Martin von Zweigbergk <martinvonz@google.com>
parents: 24570
diff changeset
   153
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   154
    def testSetItem(self):
24570
487245cbf1ab test-manifest: extract constants for binary hashes
Martin von Zweigbergk <martinvonz@google.com>
parents: 24569
diff changeset
   155
        want = BIN_HASH_1
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   156
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   157
        m = self.parsemanifest(EMTPY_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   158
        m[b'a'] = want
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   159
        self.assertIn(b'a', m)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   160
        self.assertEqual(want, m[b'a'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   161
        self.assertEqual(b'a\0' + HASH_1 + b'\n', m.text())
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   162
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   163
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   164
        m[b'a'] = want
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   165
        self.assertEqual(want, m[b'a'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   166
        self.assertEqual(b'a\0' + HASH_1 + b'\n' + A_SHORT_MANIFEST,
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   167
                         m.text())
24465
bb8e2b1a0803 test-manifest.py: separate out test for double-free after copy()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24298
diff changeset
   168
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   169
    def testSetFlag(self):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   170
        want = b'x'
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   171
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   172
        m = self.parsemanifest(EMTPY_MANIFEST)
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   173
        # first add a file; a file-less flag makes no sense
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   174
        m[b'a'] = BIN_HASH_1
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   175
        m.setflag(b'a', want)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   176
        self.assertEqual(want, m.flags(b'a'))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   177
        self.assertEqual(b'a\0' + HASH_1 + want + b'\n', m.text())
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   178
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   179
        m = self.parsemanifest(A_SHORT_MANIFEST)
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   180
        # first add a file; a file-less flag makes no sense
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   181
        m[b'a'] = BIN_HASH_1
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   182
        m.setflag(b'a', want)
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   183
        self.assertEqual(want, m.flags(b'a'))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   184
        self.assertEqual(b'a\0' + HASH_1 + want + b'\n' + A_SHORT_MANIFEST,
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   185
                         m.text())
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   186
24465
bb8e2b1a0803 test-manifest.py: separate out test for double-free after copy()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24298
diff changeset
   187
    def testCopy(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   188
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   189
        m[b'a'] = BIN_HASH_1
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   190
        m2 = m.copy()
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   191
        del m
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   192
        del m2 # make sure we don't double free() anything
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   193
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   194
    def testCompaction(self):
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   195
        unhex = binascii.unhexlify
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   196
        h1, h2 = unhex(HASH_1), unhex(HASH_2)
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   197
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   198
        m[b'alpha'] = h1
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   199
        m[b'beta'] = h2
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   200
        del m[b'foo']
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   201
        want = b'alpha\0%s\nbar/baz/qux.py\0%sl\nbeta\0%s\n' % (
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   202
            HASH_1, HASH_2, HASH_2)
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   203
        self.assertEqual(want, m.text())
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   204
        self.assertEqual(3, len(m))
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   205
        self.assertEqual([b'alpha', b'bar/baz/qux.py', b'beta'], list(m))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   206
        self.assertEqual(h1, m[b'alpha'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   207
        self.assertEqual(h2, m[b'bar/baz/qux.py'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   208
        self.assertEqual(h2, m[b'beta'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   209
        self.assertEqual(b'', m.flags(b'alpha'))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   210
        self.assertEqual(b'l', m.flags(b'bar/baz/qux.py'))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   211
        self.assertEqual(b'', m.flags(b'beta'))
32279
68c43a416585 tests: use context manager form of assertRaises
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31876
diff changeset
   212
        with self.assertRaises(KeyError):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   213
            m[b'foo']
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   215
    def testSetGetNodeSuffix(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   216
        clean = self.parsemanifest(A_SHORT_MANIFEST)
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   217
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   218
        h = m[b'foo']
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   219
        f = m.flags(b'foo')
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   220
        want = h + b'a'
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   221
        # Merge code wants to set 21-byte fake hashes at times
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   222
        m[b'foo'] = want
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   223
        self.assertEqual(want, m[b'foo'])
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   224
        self.assertEqual([(b'bar/baz/qux.py', BIN_HASH_2),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   225
                          (b'foo', BIN_HASH_1 + b'a')],
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   226
                         list(m.iteritems()))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   227
        # Sometimes it even tries a 22-byte fake hash, but we can
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   228
        # return 21 and it'll work out
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   229
        m[b'foo'] = want + b'+'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   230
        self.assertEqual(want, m[b'foo'])
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   231
        # make sure the suffix survives a copy
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   232
        match = matchmod.match(b'', b'', [b're:foo'])
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   233
        m2 = m.matches(match)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   234
        self.assertEqual(want, m2[b'foo'])
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   235
        self.assertEqual(1, len(m2))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   236
        m2 = m.copy()
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   237
        self.assertEqual(want, m2[b'foo'])
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   238
        # suffix with iteration
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   239
        self.assertEqual([(b'bar/baz/qux.py', BIN_HASH_2),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   240
                          (b'foo', want)],
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   241
                         list(m.iteritems()))
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   242
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
        # shows up in diff
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   244
        self.assertEqual({b'foo': ((want, f), (h, b''))}, m.diff(clean))
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   245
        self.assertEqual({b'foo': ((h, b''), (want, f))}, clean.diff(m))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   246
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   247
    def testMatchException(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   248
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   249
        match = matchmod.match(b'', b'', [b're:.*'])
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   250
        def filt(path):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   251
            if path == b'foo':
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   252
                assert False
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   253
            return True
24466
f310ca66a704 test-manifest.py: rewrite tests in terms of manifestdict
Martin von Zweigbergk <martinvonz@google.com>
parents: 24465
diff changeset
   254
        match.matchfn = filt
32279
68c43a416585 tests: use context manager form of assertRaises
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31876
diff changeset
   255
        with self.assertRaises(AssertionError):
68c43a416585 tests: use context manager form of assertRaises
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31876
diff changeset
   256
            m.matches(match)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   257
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   258
    def testRemoveItem(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   259
        m = self.parsemanifest(A_SHORT_MANIFEST)
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   260
        del m[b'foo']
32279
68c43a416585 tests: use context manager form of assertRaises
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31876
diff changeset
   261
        with self.assertRaises(KeyError):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   262
            m[b'foo']
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   263
        self.assertEqual(1, len(m))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   264
        self.assertEqual(1, len(list(m)))
24228
542c891274b2 lazymanifest: use a binary search to do an insertion
Augie Fackler <augie@google.com>
parents: 24225
diff changeset
   265
        # now restore and make sure everything works right
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   266
        m[b'foo'] = b'a' * 20
24228
542c891274b2 lazymanifest: use a binary search to do an insertion
Augie Fackler <augie@google.com>
parents: 24225
diff changeset
   267
        self.assertEqual(2, len(m))
542c891274b2 lazymanifest: use a binary search to do an insertion
Augie Fackler <augie@google.com>
parents: 24225
diff changeset
   268
        self.assertEqual(2, len(list(m)))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   269
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   270
    def testManifestDiff(self):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   271
        MISSING = (None, b'')
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   272
        addl = b'z-only-in-left\0' + HASH_1 + b'\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   273
        addr = b'z-only-in-right\0' + HASH_2 + b'x\n'
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   274
        left = self.parsemanifest(
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   275
            A_SHORT_MANIFEST.replace(HASH_1, HASH_3 + b'x') + addl)
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   276
        right = self.parsemanifest(A_SHORT_MANIFEST + addr)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   277
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   278
            b'foo': ((BIN_HASH_3, b'x'),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   279
                     (BIN_HASH_1, b'')),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   280
            b'z-only-in-left': ((BIN_HASH_1, b''), MISSING),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   281
            b'z-only-in-right': (MISSING, (BIN_HASH_2, b'x')),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   282
            }
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   283
        self.assertEqual(want, left.diff(right))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   284
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   285
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   286
            b'bar/baz/qux.py': (MISSING, (BIN_HASH_2, b'l')),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   287
            b'foo': (MISSING, (BIN_HASH_3, b'x')),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   288
            b'z-only-in-left': (MISSING, (BIN_HASH_1, b'')),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   289
            }
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   290
        self.assertEqual(want, self.parsemanifest(EMTPY_MANIFEST).diff(left))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   291
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   292
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   293
            b'bar/baz/qux.py': ((BIN_HASH_2, b'l'), MISSING),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   294
            b'foo': ((BIN_HASH_3, b'x'), MISSING),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   295
            b'z-only-in-left': ((BIN_HASH_1, b''), MISSING),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   296
            }
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   297
        self.assertEqual(want, left.diff(self.parsemanifest(EMTPY_MANIFEST)))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   298
        copy = right.copy()
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   299
        del copy[b'z-only-in-right']
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   300
        del right[b'foo']
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   301
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   302
            b'foo': (MISSING, (BIN_HASH_1, b'')),
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   303
            b'z-only-in-right': ((BIN_HASH_2, b'x'), MISSING),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   304
            }
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   305
        self.assertEqual(want, right.diff(copy))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   306
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   307
        short = self.parsemanifest(A_SHORT_MANIFEST)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   308
        pruned = short.copy()
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   309
        del pruned[b'foo']
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   310
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   311
            b'foo': ((BIN_HASH_1, b''), MISSING),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   312
            }
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   313
        self.assertEqual(want, short.diff(pruned))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   314
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   315
            b'foo': (MISSING, (BIN_HASH_1, b'')),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   316
            }
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   317
        self.assertEqual(want, pruned.diff(short))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   318
        want = {
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   319
            b'bar/baz/qux.py': None,
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   320
            b'foo': (MISSING, (BIN_HASH_1, b'')),
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   321
            }
31255
959ebff3505a manifest: add match argument to diff and filesnotin
Durham Goode <durham@fb.com>
parents: 28929
diff changeset
   322
        self.assertEqual(want, pruned.diff(short, clean=True))
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   323
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   324
    def testReversedLines(self):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   325
        backwards = b''.join(
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   326
            l + b'\n' for l in reversed(A_SHORT_MANIFEST.split(b'\n')) if l)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   327
        try:
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   328
            self.parsemanifest(backwards)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   329
            self.fail('Should have raised ValueError')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24656
diff changeset
   330
        except ValueError as v:
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   331
            self.assertIn('Manifest lines not in sorted order.', str(v))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   332
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   333
    def testNoTerminalNewline(self):
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   334
        try:
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   335
            self.parsemanifest(A_SHORT_MANIFEST + b'wat')
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   336
            self.fail('Should have raised ValueError')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24656
diff changeset
   337
        except ValueError as v:
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   338
            self.assertIn('Manifest did not end in a newline.', str(v))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   339
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   340
    def testNoNewLineAtAll(self):
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   341
        try:
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   342
            self.parsemanifest(b'wat')
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   343
            self.fail('Should have raised ValueError')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24656
diff changeset
   344
        except ValueError as v:
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   345
            self.assertIn('Manifest did not end in a newline.', str(v))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   346
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   347
    def testHugeManifest(self):
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   348
        m = self.parsemanifest(A_HUGE_MANIFEST)
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   349
        self.assertEqual(HUGE_MANIFEST_ENTRIES, len(m))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   350
        self.assertEqual(len(m), len(list(m)))
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   351
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   352
    def testMatchesMetadata(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   353
        '''Tests matches() for a few specific files to make sure that both
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   354
        the set of files as well as their flags and nodeids are correct in
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   355
        the resulting manifest.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   356
        m = self.parsemanifest(A_HUGE_MANIFEST)
24495
d2a3a2808974 manifest: make manifest.intersectfiles() internal
Drew Gottlieb <drgott@google.com>
parents: 24468
diff changeset
   357
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   358
        match = matchmod.match(b'/', b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   359
                [b'file1', b'file200', b'file300'], exact=True)
24495
d2a3a2808974 manifest: make manifest.intersectfiles() internal
Drew Gottlieb <drgott@google.com>
parents: 24468
diff changeset
   360
        m2 = m.matches(match)
d2a3a2808974 manifest: make manifest.intersectfiles() internal
Drew Gottlieb <drgott@google.com>
parents: 24468
diff changeset
   361
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   362
        w = (b'file1\0%sx\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   363
             b'file200\0%sl\n'
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   364
             b'file300\0%s\n') % (HASH_2, HASH_1, HASH_1)
24225
3e5c4af69808 manifest: split manifestdict into high-level and low-level logic
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   365
        self.assertEqual(w, m2.text())
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   366
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   367
    def testMatchesNonexistentFile(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   368
        '''Tests matches() for a small set of specific files, including one
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   369
        nonexistent file to make sure in only matches against existing files.
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   370
        '''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   371
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   372
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   373
        match = matchmod.match(b'/', b'',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   374
                [b'a/b/c/bar.txt', b'a/b/d/qux.py',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   375
                 b'readme.txt', b'nonexistent'],
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   376
                exact=True)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   377
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   378
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   379
        self.assertEqual(
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   380
                [b'a/b/c/bar.txt', b'a/b/d/qux.py', b'readme.txt'],
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   381
                m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   382
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   383
    def testMatchesNonexistentDirectory(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   384
        '''Tests matches() for a relpath match on a directory that doesn't
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   385
        actually exist.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   386
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   387
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   388
        match = matchmod.match(b'/', b'', [b'a/f'], default=b'relpath')
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   389
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   390
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   391
        self.assertEqual([], m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   392
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   393
    def testMatchesExactLarge(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   394
        '''Tests matches() for files matching a large list of exact files.
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   395
        '''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   396
        m = self.parsemanifest(A_HUGE_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   397
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   398
        flist = m.keys()[80:300]
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   399
        match = matchmod.match(b'/', b'', flist, exact=True)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   400
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   401
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   402
        self.assertEqual(flist, m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   403
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   404
    def testMatchesFull(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   405
        '''Tests matches() for what should be a full match.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   406
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   407
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   408
        match = matchmod.match(b'/', b'', [b''])
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   409
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   410
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   411
        self.assertEqual(m.keys(), m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   412
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   413
    def testMatchesDirectory(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   414
        '''Tests matches() on a relpath match on a directory, which should
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   415
        match against all files within said directory.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   416
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   417
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   418
        match = matchmod.match(b'/', b'', [b'a/b'], default=b'relpath')
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   419
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   420
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   421
        self.assertEqual([
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   422
            b'a/b/c/bar.py', b'a/b/c/bar.txt', b'a/b/c/foo.py',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   423
            b'a/b/c/foo.txt',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   424
            b'a/b/d/baz.py', b'a/b/d/qux.py', b'a/b/d/ten.txt', b'a/b/dog.py',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   425
            b'a/b/fish.py'], m2.keys())
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   426
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   427
    def testMatchesExactPath(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   428
        '''Tests matches() on an exact match on a directory, which should
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   429
        result in an empty manifest because you can't perform an exact match
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   430
        against a directory.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   431
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   432
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   433
        match = matchmod.match(b'/', b'', [b'a/b'], exact=True)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   434
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   435
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   436
        self.assertEqual([], m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   437
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   438
    def testMatchesCwd(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   439
        '''Tests matches() on a relpath match with the current directory ('.')
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   440
        when not in the root directory.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   441
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   442
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   443
        match = matchmod.match(b'/', b'a/b', [b'.'], default=b'relpath')
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   444
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   445
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   446
        self.assertEqual([
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   447
            b'a/b/c/bar.py', b'a/b/c/bar.txt', b'a/b/c/foo.py',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   448
            b'a/b/c/foo.txt', b'a/b/d/baz.py', b'a/b/d/qux.py',
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   449
            b'a/b/d/ten.txt', b'a/b/dog.py', b'a/b/fish.py'], m2.keys())
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   450
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   451
    def testMatchesWithPattern(self):
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   452
        '''Tests matches() for files matching a pattern that reside
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   453
        deeper than the specified directory.'''
24654
9d6db63ccf00 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com>
parents: 24573
diff changeset
   454
        m = self.parsemanifest(A_DEEPER_MANIFEST)
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   455
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   456
        match = matchmod.match(b'/', b'', [b'a/b/*/*.txt'])
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   457
        m2 = m.matches(match)
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   458
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   459
        self.assertEqual(
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   460
                [b'a/b/c/bar.txt', b'a/b/c/foo.txt', b'a/b/d/ten.txt'],
24549
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   461
                m2.keys())
bcf0de51326e manifest: add some tests for manifest.matches()
Drew Gottlieb <drgott@google.com>
parents: 24495
diff changeset
   462
24655
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   463
class testmanifestdict(unittest.TestCase, basemanifesttests):
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   464
    def parsemanifest(self, text):
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   465
        return manifestmod.manifestdict(text)
528ace39c85c test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com>
parents: 24654
diff changeset
   466
24656
29c238e4a58a test-manifest: add some test coverage for treemanifest
Drew Gottlieb <drgott@google.com>
parents: 24655
diff changeset
   467
class testtreemanifest(unittest.TestCase, basemanifesttests):
29c238e4a58a test-manifest: add some test coverage for treemanifest
Drew Gottlieb <drgott@google.com>
parents: 24655
diff changeset
   468
    def parsemanifest(self, text):
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   469
        return manifestmod.treemanifest(b'', text)
24656
29c238e4a58a test-manifest: add some test coverage for treemanifest
Drew Gottlieb <drgott@google.com>
parents: 24655
diff changeset
   470
31876
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   471
    def testWalkSubtrees(self):
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   472
        m = self.parsemanifest(A_DEEPER_MANIFEST)
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   473
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   474
        dirs = [s._dir for s in m.walksubtrees()]
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   475
        self.assertEqual(
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   476
            sorted([
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   477
                b'', b'a/', b'a/c/', b'a/d/', b'a/b/', b'a/b/c/', b'a/b/d/']),
31876
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   478
            sorted(dirs)
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   479
        )
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   480
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   481
        match = matchmod.match(b'/', b'', [b'path:a/b/'])
31876
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   482
        dirs = [s._dir for s in m.walksubtrees(matcher=match)]
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   483
        self.assertEqual(
32551
0ff336a42c39 tests: make test-manifest.py portable to Python 3
Augie Fackler <raf@durin42.com>
parents: 32534
diff changeset
   484
            sorted([b'a/b/', b'a/b/c/', b'a/b/d/']),
31876
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   485
            sorted(dirs)
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   486
        )
94c1d3c1aea2 treemanifest: add walksubtrees api
Durham Goode <durham@fb.com>
parents: 31255
diff changeset
   487
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   488
if __name__ == '__main__':
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents:
diff changeset
   489
    silenttestrunner.main(__name__)