r25598: Add missing become_root/unbecome_root around calls of add_aliases.
[samba.git] / source / python / examples / tdbpack / test_tdbpack.py
index 36fed881e33416466f410dc1896f0fa6d9a7f64a..af2ba2b296dadf5ae9d3036c7d26caf650900107 100755 (executable)
@@ -1,6 +1,6 @@
-#! /usr/bin/env python2.2
+#! /usr/bin/env python
 
-__doc__ = """test case for samba.tdbkpack functions
+__doc__ = """test case for samba.tdbpack functions
 
 tdbpack provides a means of pickling values into binary formats
 compatible with that used by the samba tdbpack()/tdbunpack()
@@ -17,15 +17,45 @@ string, with one character per field."""
 __author__ = 'Martin Pool <mbp@sourcefrog.net>'
 
 import unittest
-# import tdbutil
+import oldtdbutil
 import samba.tdbpack
 
-packer = samba.tdbpack.pack
-unpacker = samba.tdbpack.unpack
+both_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 = [('B', ['hello' * 51], '\xff\0\0\0' + 'hello' * 51),
+    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'),
@@ -38,53 +68,44 @@ class PackTests(unittest.TestCase):
              ('p', [1], '\x01\0\0\0'),
              ('d', [0x01020304], '\x04\x03\x02\x01'),
              ('d', [0x7fffffff], '\xff\xff\xff\x7f'),
-             ('d', [0x80000000], '\x00\x00\x00\x80'),
-             ('d', [-1], '\xff\xff\xff\xff'),
-             ('d', [-255], '\x01\xff\xff\xff'),
-             ('d', [-256], '\x00\xff\xff\xff'),
+             ('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'),
-             ('B', ['hello'], '\x05\0\0\0hello'),
-             ('BB', ['hello\0world', 'now'],
-              '\x0b\0\0\0hello\0world\x03\0\0\0now'),
-             ('pd', [1, 10], '\x01\0\0\0\x0a\0\0\0'),
-             ('BBB', ['hello', '', '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', ['hello' * 51], '\xff\0\0\0' + 'hello' * 51),
-             ('BB', ['hello' * 40000, 'world' * 50000],
-              '\x40\x0d\x03\0' + 'hello' * 40000 + '\x90\xd0\x03\x00' + 'world' * 50000),
+             ('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 format, values, expected in self.symm_cases:
-            self.assertEquals(packer(format, values), expected)
-            out, rest = unpacker(format, expected)
-            self.assertEquals(rest, '')
-            self.assertEquals(list(values), list(out))
-        
-    
+        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
 
@@ -92,102 +113,139 @@ class PackTests(unittest.TestCase):
         not "canonical".
         """
         cases = [('w', (42,), '\x2a\0'),
-                 ('p', [None], '\0\0\0\0'),
-                 ('p', ['true'], '\x01\0\0\0'),
-
-                 ('w', {1: 'fruit'}, '\x01\0'),
-                 # passing a dictionary is dodgy, but it gets coerced to keys
-                 # as if you called list()
                  ]
 
-        for format, values, expected in cases:
-            self.assertEquals(packer(format, values), expected)
+        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 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))
-        
+        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 format, values, expected in cases:
-            out, rest = unpacker(format, expected)
-            self.assertEquals(rest, '')
-            self.assertEquals(list(values), list(out))
+        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', [], IndexError),
-                 ('w', (), IndexError),
-                 ('w', {}, IndexError),
-                 ('ww', [2], IndexError),
-                 ('w', 2, TypeError),
-                 ('', [1, 2, 3], IndexError),
-                 ('w', None, TypeError),
-                 ('wwwwwwwwwwww', [], IndexError),
-                 ('w', [2, 3], IndexError),
-                 ('w', [0x60A15EC5L], TypeError),
-                 ('w', [None], TypeError),
-                 ('w', xrange(10000), IndexError),
-                 ('d', [], IndexError),
-                 ('d', [0L], TypeError),
-                 ('p', [], IndexError),
-                 ('f', [2], TypeError),
-                 ('P', [None], TypeError),
-                 ('P', (), IndexError),
-                 ('f', [packer], TypeError),
-                 ('fw', ['hello'], IndexError),
-                 ('f', [u'hello'], TypeError),
-                 ('B', [2], TypeError),
-                 (None, [2, 3, 4], TypeError),
-                 (ord('f'), [20], TypeError),
-                 (['w', 'w'], [2, 2], TypeError),
-                 ('Q', [2], ValueError),
-                 ('fQ', ['2', 3], ValueError),
-                 ('fQ', ['2'], IndexError),
-                 (2, [2], TypeError),
-                 ({}, {}, TypeError)]
-        for format, values, throwable_class in cases:
-            def do_pack():
-                packer(format, values)
-            self.assertRaises(throwable_class, do_pack)
+        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 = [('$', '', ValueError),
-                 ('Q', '', ValueError),
-                 ('Q$', '', ValueError),
+        cases = [
+# This ought to be illegal, but the old code doesn't prohibit it
+#                ('$', '', ValueError),
+#                ('Q', '', ValueError),
+#                ('Q$', '', ValueError),
                  ('f', '', IndexError),
                  ('d', '', IndexError),
-                 ('d', '2', IndexError),
-                 ('d', '22', IndexError),
-                 ('d', '222', 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),
-                 ('w', '2', IndexError),
                  ('f', 'hello', IndexError),
                  ('f', '', IndexError),
-                 ('p', '\x01\0', IndexError),
-                 ('B', '\xff\0\0\0hello', IndexError),
-                 ('B', '\xff\0', IndexError),
-                 ('B', '\x01\0\0\0', IndexError),
-                 ('B', '\x05\0\0\0hell', 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),
+#                 ('B', 'foobar', IndexError),
+#                 ('BB', '\x01\0\0\0a\x01', IndexError),
                  ]
-        
-        for format, values, throwable_class in cases:
-            def do_unpack():
-                unpacker(format, values)
-            self.assertRaises(throwable_class, do_unpack)
 
+        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__':