⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_tdbpack.py

📁 samba服务器!
💻 PY
字号:
#! /usr/bin/env python2.2__doc__ = """test case for samba.tdbpack functionstdbpack provides a means of pickling values into binary formatscompatible with that used by the samba tdbpack()/tdbunpack()functions.Numbers are always stored in little-endian format; strings are storedin either DOS or Unix codepage as appropriate.The format for any particular element is encoded as a short ASCIIstring, with one character per field."""# Copyright (C) 2002 Hewlett-Packard.__author__ = 'Martin Pool <mbp@sourcefrog.net>'import unittestimport oldtdbutilimport samba.tdbpackboth_unpackers = (samba.tdbpack.unpack, oldtdbutil.unpack)both_packers = (samba.tdbpack.pack, oldtdbutil.pack)# #             ('B', [10, 'hello'], '\x0a\0\0\0hello'),#              ('BB', [11, 'hello\0world', 3, 'now'],#               '\x0b\0\0\0hello\0world\x03\0\0\0now'),#              ('pd', [1, 10], '\x01\0\0\0\x0a\0\0\0'),#              ('BBB', [5, 'hello', 0, '', 5, 'world'],#               '\x05\0\0\0hello\0\0\0\0\x05\0\0\0world'),             # strings are sequences in Python, there's no getting away             # from it#             ('ffff', 'evil', 'e\0v\0i\0l\0'),#              ('BBBB', 'evil',                   #               '\x01\0\0\0e'#               '\x01\0\0\0v'#               '\x01\0\0\0i'#               '\x01\0\0\0l'),#              ('', [], ''),#              # exercise some long strings#              ('PP', ['hello' * 255, 'world' * 255],#               'hello' * 255 + '\0' + 'world' * 255 + '\0'),#              ('PP', ['hello' * 40000, 'world' * 50000],#               'hello' * 40000 + '\0' + 'world' * 50000 + '\0'),#              ('B', [(5*51), 'hello' * 51], '\xff\0\0\0' + 'hello' * 51),#              ('BB', [(5 * 40000), 'hello' * 40000,#                      (5 * 50000), 'world' * 50000],#               '\x40\x0d\x03\0' + 'hello' * 40000 + '\x90\xd0\x03\x00' + 'world' * 50000),    class PackTests(unittest.TestCase):    symm_cases = [             ('w', [42], '\x2a\0'),             ('www', [42, 2, 69], '\x2a\0\x02\0\x45\0'),             ('wd', [42, 256], '\x2a\0\0\x01\0\0'),             ('w', [0], '\0\0'),             ('w', [255], '\xff\0'),             ('w', [256], '\0\x01'),             ('w', [0xdead], '\xad\xde'),             ('w', [0xffff], '\xff\xff'),             ('p', [0], '\0\0\0\0'),             ('p', [1], '\x01\0\0\0'),             ('d', [0x01020304], '\x04\x03\x02\x01'),             ('d', [0x7fffffff], '\xff\xff\xff\x7f'),             ('d', [0x80000000L], '\x00\x00\x00\x80'),             ('d', [0x80000069L], '\x69\x00\x00\x80'),             ('d', [0xffffffffL], '\xff\xff\xff\xff'),             ('d', [0xffffff00L], '\x00\xff\xff\xff'),             ('ddd', [1, 10, 50], '\x01\0\0\0\x0a\0\0\0\x32\0\0\0'),             ('ff', ['hello', 'world'], 'hello\0world\0'),             ('fP', ['hello', 'world'], 'hello\0world\0'),             ('PP', ['hello', 'world'], 'hello\0world\0'),             ('B', [0, ''], '\0\0\0\0'),# old implementation is wierd when string is not the right length             #             ('B', [2, 'hello'], '\x0a\0\0\0hello'),             ('B', [5, 'hello'], '\x05\0\0\0hello'),             ]    def test_symmetric(self):        """Cookbook of symmetric pack/unpack tests        """        for packer in [samba.tdbpack.pack]: # both_packers:            for unpacker in both_unpackers:                for format, values, expected in self.symm_cases:                    out_packed = packer(format, values)                    self.assertEquals(out_packed, expected)                    out, rest = unpacker(format, expected)                    self.assertEquals(rest, '')                    self.assertEquals(list(values), list(out))    def test_large(self):        """Test large pack/unpack strings"""        large_cases = [('w' * 1000, xrange(1000)), ]        for packer in both_packers:            for unpacker in both_unpackers:                for format, values in large_cases:                    packed = packer(format, values)                    out, rest = unpacker(format, packed)                    self.assertEquals(rest, '')                    self.assertEquals(list(values), list(out))                        def test_pack(self):        """Cookbook of expected pack values        These can't be used for the symmetric test because the unpacked value is        not "canonical".        """        cases = [('w', (42,), '\x2a\0'),                 ]        for packer in both_packers:            for format, values, expected in cases:                self.assertEquals(packer(format, values), expected)    def test_unpack_extra(self):        # Test leftover data        for unpacker in both_unpackers:            for format, values, packed in self.symm_cases:                out, rest = unpacker(format, packed + 'hello sailor!')                self.assertEquals(rest, 'hello sailor!')                self.assertEquals(list(values), list(out))    def test_pack_extra(self):        """Leftover values when packing"""        cases = [            ('d', [10, 20], [10]),            ('d', [10, 'hello'], [10]),            ('ff', ['hello', 'world', 'sailor'], ['hello', 'world']),            ]        for unpacker in both_unpackers:            for packer in both_packers:                for format, values, chopped in cases:                    bin = packer(format, values)                    out, rest = unpacker(format, bin)                    self.assertEquals(list(out), list(chopped))                    self.assertEquals(rest, '')    def test_unpack(self):        """Cookbook of tricky unpack tests"""        cases = [                 # Apparently I couldn't think of any tests that weren't                 # symmetric :-/                 ]        for unpacker in both_unpackers:            for format, values, expected in cases:                out, rest = unpacker(format, expected)                self.assertEquals(rest, '')                self.assertEquals(list(values), list(out))    def test_pack_failures(self):        """Expected errors for incorrect packing"""        cases = [('w', []),#                 ('w', ()),#                 ('w', {}),                 ('ww', [2]),                 ('w', 2),#                  ('w', None),                 ('wwwwwwwwwwww', []),#                 ('w', [0x60A15EC5L]),#                 ('w', [None]),                 ('d', []),                 ('p', []),                 ('f', [2]),                 ('P', [None]),                 ('P', ()),                 ('f', [hex]),                 ('fw', ['hello']),#                  ('f', [u'hello']),                 ('B', [2]),                 (None, [2, 3, 4]),                 (ord('f'), [20]),                 # old code doesn't distinguish string from seq-of-char#                 (['w', 'w'], [2, 2]),                 # old code just ignores invalid characters#                 ('Q', [2]),#                 ('fQ', ['2', 3]),#                 ('fQ', ['2']),                 (2, [2]),                 # old code doesn't typecheck format#                 ({}, {})                 ]        for packer in both_packers:            for format, values in cases:                try:                    packer(format, values)                except StandardError:                    pass                else:                    raise AssertionError("didn't get exception: format %s, values %s, packer %s"                                         % (`format`, `values`, `packer`))    def test_unpack_failures(self):        """Expected errors for incorrect unpacking"""        cases = [# This ought to be illegal, but the old code doesn't prohibit it#                ('$', '', ValueError),#                ('Q', '', ValueError),#                ('Q$', '', ValueError),                 ('f', '', IndexError),                 ('d', '', IndexError),# This is an illegal packing, but the old code doesn't trap                 #                 ('d', '2', IndexError),#                 ('d', '22', IndexError),#                 ('d', '222', IndexError),#                 ('p', '\x01\0', IndexError),#                ('w', '2', IndexError),#                ('B', '\xff\0\0\0hello', IndexError),#                  ('B', '\xff\0', IndexError),                 ('w', '', IndexError),                 ('f', 'hello', IndexError),                 ('f', '', IndexError),#                ('B', '\x01\0\0\0', IndexError),#                 ('B', '\x05\0\0\0hell', IndexError),                 ('B', '\xff\xff\xff\xff', ValueError),#                 ('B', 'foobar', IndexError),#                 ('BB', '\x01\0\0\0a\x01', IndexError),                 ]        for unpacker in both_unpackers:            for format, values, throwable_class in cases:                try:                    unpacker(format, values)                except StandardError:                    pass                else:                    raise AssertionError("didn't get exception: format %s, values %s, unpacker %s"                                         % (`format`, `values`, `unpacker`))    def test_unpack_repeated(self):        cases = [(('df$',                  '\x00\x00\x00\x00HP C LaserJet 4500-PS\x00Windows 4.0\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.HLP\x00\x00RAW\x00\\print$\\WIN40\\0\\readme.wri\x00\\print$\\WIN40\\0\\pscript.drv\x00\\print$\\WIN40\\0\\pscript.hlp\x00'),                 ([0L, 'HP C LaserJet 4500-PS', 'Windows 4.0', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.HLP', '', 'RAW', '\\print$\\WIN40\\0\\readme.wri', '\\print$\\WIN40\\0\\pscript.drv', '\\print$\\WIN40\\0\\pscript.hlp'], ''))]        for unpacker in both_unpackers:            for input, expected in cases:                result = apply(unpacker, input)                if result != expected:                    raise AssertionError("%s:\n     input: %s\n    output: %s\n  expected: %s" % (`unpacker`, `input`, `result`, `expected`))        if __name__ == '__main__':    unittest.main()    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -