[Python-checkins] python/dist/src/Lib/test pickletester.py,1.43,1.44 test_copy_reg.py,1.6,1.7

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Tue, 04 Feb 2003 13:48:18 -0800


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1:/tmp/cvs-serv31627/Lib/test

Modified Files:
	pickletester.py test_copy_reg.py 
Log Message:
cPickle:  exempt two_tuple from GC -- it's a speed hack, and doesn't
guarantee to keep valid pointers in its slots.

tests:  Moved ExtensionSaver from test_copy_reg into pickletester, and
use it both places.  Once extension codes get assigned, it won't be
safe to overwrite them willy nilly in test suites, and ExtensionSaver
does a thorough job of undoing any possible damage.

Beefed up the EXT[124] tests a bit, to check the smallest and largest
codes in each opcode's range too. 


Index: pickletester.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/pickletester.py,v
retrieving revision 1.43
retrieving revision 1.44
diff -C2 -d -r1.43 -r1.44
*** pickletester.py	4 Feb 2003 20:56:08 -0000	1.43
--- pickletester.py	4 Feb 2003 21:47:43 -0000	1.44
***************
*** 2,5 ****
--- 2,6 ----
  import pickle
  import pickletools
+ import copy_reg
  
  from test.test_support import TestFailed, have_unicode, TESTFN
***************
*** 18,21 ****
--- 19,53 ----
      return False
  
+ # We can't very well test the extension registry without putting known stuff
+ # in it, but we have to be careful to restore its original state.  Code
+ # should do this:
+ #
+ #     e = ExtensionSaver(extension_code)
+ #     try:
+ #         fiddle w/ the extension registry's stuff for extension_code
+ #     finally:
+ #         e.restore()
+ 
+ class ExtensionSaver:
+     # Remember current registration for code (if any), and remove it (if
+     # there is one).
+     def __init__(self, code):
+         self.code = code
+         if code in copy_reg._inverted_registry:
+             self.pair = copy_reg._inverted_registry[code]
+             copy_reg.remove_extension(self.pair[0], self.pair[1], code)
+         else:
+             self.pair = None
+ 
+     # Restore previous registration for code.
+     def restore(self):
+         code = self.code
+         curpair = copy_reg._inverted_registry.get(code)
+         if curpair is not None:
+             copy_reg.remove_extension(curpair[0], curpair[1], code)
+         pair = self.pair
+         if pair is not None:
+             copy_reg.add_extension(pair[0], pair[1], code)
+ 
  class C:
      def __cmp__(self, other):
***************
*** 587,594 ****
      # an object of that type.  Check that the resulting pickle uses opcode
      # (EXT[124]) under proto 2, and not in proto 1.
      def produce_global_ext(self, extcode, opcode):
!         import copy_reg
!         copy_reg.add_extension(__name__, "MyList", extcode)
          try:
              x = MyList([1, 2, 3])
              x.foo = 42
--- 619,627 ----
      # an object of that type.  Check that the resulting pickle uses opcode
      # (EXT[124]) under proto 2, and not in proto 1.
+ 
      def produce_global_ext(self, extcode, opcode):
!         e = ExtensionSaver(extcode)
          try:
+             copy_reg.add_extension(__name__, "MyList", extcode)
              x = MyList([1, 2, 3])
              x.foo = 42
***************
*** 597,626 ****
              # Dump using protocol 1 for comparison.
              s1 = self.dumps(x, 1)
              y = self.loads(s1)
              self.assertEqual(list(x), list(y))
              self.assertEqual(x.__dict__, y.__dict__)
-             self.assert_(s1.find(__name__) >= 0)
-             self.assert_(s1.find("MyList") >= 0)
  
              # Dump using protocol 2 for test.
              s2 = self.dumps(x, 2)
!             self.assertEqual(s2.find(__name__), -1)
!             self.assertEqual(s2.find("MyList"), -1)
              y = self.loads(s2)
              self.assertEqual(list(x), list(y))
              self.assertEqual(x.__dict__, y.__dict__)
-             self.assertEqual(opcode_in_pickle(opcode, s2), True)
  
          finally:
!             copy_reg.remove_extension(__name__, "MyList", extcode)
  
      def test_global_ext1(self):
!         self.produce_global_ext(0xf0, pickle.EXT1)
  
      def test_global_ext2(self):
!         self.produce_global_ext(0xfff0, pickle.EXT2)
  
      def test_global_ext4(self):
!         self.produce_global_ext(0xabcdef0, pickle.EXT4)
  
  # XXX Temporary hack, so long as the C implementation of pickle protocol
--- 630,668 ----
              # Dump using protocol 1 for comparison.
              s1 = self.dumps(x, 1)
+             self.assert_(__name__ in s1)
+             self.assert_("MyList" in s1)
+             self.assertEqual(opcode_in_pickle(opcode, s1), False)
+ 
              y = self.loads(s1)
              self.assertEqual(list(x), list(y))
              self.assertEqual(x.__dict__, y.__dict__)
  
              # Dump using protocol 2 for test.
              s2 = self.dumps(x, 2)
!             self.assert_(__name__ not in s2)
!             self.assert_("MyList" not in s2)
!             self.assertEqual(opcode_in_pickle(opcode, s2), True)
! 
              y = self.loads(s2)
              self.assertEqual(list(x), list(y))
              self.assertEqual(x.__dict__, y.__dict__)
  
          finally:
!             e.restore()
  
      def test_global_ext1(self):
!         self.produce_global_ext(0x00000001, pickle.EXT1)  # smallest EXT1 code
!         self.produce_global_ext(0x000000ff, pickle.EXT1)  # largest EXT1 code
  
      def test_global_ext2(self):
!         self.produce_global_ext(0x00000100, pickle.EXT2)  # smallest EXT2 code
!         self.produce_global_ext(0x0000ffff, pickle.EXT2)  # largest EXT2 code
!         self.produce_global_ext(0x0000abcd, pickle.EXT2)  # check endianness
  
      def test_global_ext4(self):
!         self.produce_global_ext(0x00010000, pickle.EXT4)  # smallest EXT4 code
!         self.produce_global_ext(0x7fffffff, pickle.EXT4)  # largest EXT4 code
!         self.produce_global_ext(0x12abcdef, pickle.EXT4)  # check endianness
! 
  
  # XXX Temporary hack, so long as the C implementation of pickle protocol

Index: test_copy_reg.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_copy_reg.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** test_copy_reg.py	4 Feb 2003 17:49:36 -0000	1.6
--- test_copy_reg.py	4 Feb 2003 21:47:43 -0000	1.7
***************
*** 1,31 ****
  import copy_reg
  import unittest
- from test import test_support
  
  
  class C:
      pass
  
- 
- class ExtensionSaver:
-     # Remember current registration for code (if any), and remove it (if
-     # there is one).
-     def __init__(self, code):
-         self.code = code
-         if code in copy_reg._inverted_registry:
-             self.pair = copy_reg._inverted_registry[code]
-             copy_reg.remove_extension(self.pair[0], self.pair[1], code)
-         else:
-             self.pair = None
- 
-     # Restore previous registration for code.
-     def restore(self):
-         code = self.code
-         curpair = copy_reg._inverted_registry.get(code)
-         if curpair is not None:
-             copy_reg.remove_extension(curpair[0], curpair[1], code)
-         pair = self.pair
-         if pair is not None:
-             copy_reg.add_extension(pair[0], pair[1], code)
  
  class CopyRegTestCase(unittest.TestCase):
--- 1,11 ----
  import copy_reg
  import unittest
  
+ from test import test_support
+ from test.pickletester import ExtensionSaver
  
  class C:
      pass
  
  
  class CopyRegTestCase(unittest.TestCase):