[Python-checkins] CVS: python/dist/src/Lib/test pickletester.py,1.8,1.9 test_cpickle.py,1.7,1.8 test_pickle.py,1.6,1.7

Jeremy Hylton jhylton@users.sourceforge.net
Mon, 15 Oct 2001 14:38:58 -0700


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

Modified Files:
	pickletester.py test_cpickle.py test_pickle.py 
Log Message:
Covert pickle tests to use unittest.

Extend tests to cover a few more cases.  For cPickle, test several of
the undocumented features.



Index: pickletester.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/pickletester.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** pickletester.py	2001/08/28 22:21:18	1.8
--- pickletester.py	2001/10/15 21:38:56	1.9
***************
*** 1,8 ****
! # test_pickle and test_cpickle both use this.
! 
  from test_support import TestFailed, have_unicode
- import sys
  
! # break into multiple strings to please font-lock-mode
  DATA = """(lp1
  I0
--- 1,26 ----
! import unittest
  from test_support import TestFailed, have_unicode
  
! class C:
!     def __cmp__(self, other):
!         return cmp(self.__dict__, other.__dict__)
! 
! import __main__
! __main__.C = C
! C.__module__ = "__main__"
! 
! class myint(int):
!     def __init__(self, x):
!         self.str = str(x)
! 
! class initarg(C):
!     def __init__(self, a, b):
!         self.a = a
!         self.b = b
! 
!     def __getinitargs__(self):
!         return self.a, self.b
! 
! # break into multiple strings to avoid confusing font-lock-mode
  DATA = """(lp1
  I0
***************
*** 58,73 ****
            'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \
            '\x06tq\nh\nK\x05e.'
! 
! class C:
!     def __cmp__(self, other):
!         return cmp(self.__dict__, other.__dict__)
! 
! import __main__
! __main__.C = C
! C.__module__ = "__main__"
! 
! # Call this with the module to be tested (pickle or cPickle).
! 
! def dotest(pickle):
      c = C()
      c.foo = 1
--- 76,81 ----
            'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \
            '\x06tq\nh\nK\x05e.'
!     
! def create_data():
      c = C()
      c.foo = 1
***************
*** 87,238 ****
      x.append(y)
      x.append(5)
!     r = []
!     r.append(r)
  
!     print "dumps()"
!     s = pickle.dumps(x)
  
!     print "loads()"
!     x2 = pickle.loads(s)
!     if x2 == x:
!         print "ok"
!     else:
!         print "bad"
  
!     print "loads() DATA"
!     x2 = pickle.loads(DATA)
!     if x2 == x:
!         print "ok"
!     else:
!         print "bad"
  
!     print "dumps() binary"
!     s = pickle.dumps(x, 1)
  
!     print "loads() binary"
!     x2 = pickle.loads(s)
!     if x2 == x:
!         print "ok"
!     else:
!         print "bad"
  
!     print "loads() BINDATA"
!     x2 = pickle.loads(BINDATA)
!     if x2 == x:
!         print "ok"
!     else:
!         print "bad"
  
!     print "dumps() RECURSIVE"
!     s = pickle.dumps(r)
!     x2 = pickle.loads(s)
!     if x2 == r:
!         print "ok"
!     else:
!         print "bad"
  
!     # don't create cyclic garbage
!     del x2[0]
!     del r[0]
  
!     # Test protection against closed files
!     import tempfile, os
!     fn = tempfile.mktemp()
!     f = open(fn, "w")
!     f.close()
!     try:
!         pickle.dump(123, f)
!     except ValueError:
!         pass
!     else:
!         print "dump to closed file should raise ValueError"
  
!     f = open(fn, "r")
!     f.close()
!     try:
!         pickle.load(f)
!     except ValueError:
!         pass
!     else:
!         print "load from closed file should raise ValueError"
!     os.remove(fn)
  
!     # Test specific bad cases
!     for i in range(10):
!         try:
!             x = pickle.loads('garyp')
!         except KeyError, y:
!             # pickle
!             del y
!         except pickle.BadPickleGet, y:
!             # cPickle
!             del y
!         else:
!             print "unexpected success!"
!             break
  
!     # Test insecure strings
!     insecure = ["abc", "2 + 2", # not quoted
!                 "'abc' + 'def'", # not a single quoted string
!                 "'abc", # quote is not closed
!                 "'abc\"", # open quote and close quote don't match
!                 "'abc'   ?", # junk after close quote
!                 # some tests of the quoting rules
!                 "'abc\"\''",
!                 "'\\\\a\'\'\'\\\'\\\\\''",
!                 ]
!     for s in insecure:
!         buf = "S" + s + "\012p0\012."
!         try:
!             x = pickle.loads(buf)
!         except ValueError:
!             pass
!         else:
!             print "accepted insecure string: %s" % repr(buf)
  
!     # Test some Unicode end cases
      if have_unicode:
!         endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'),
!                     unicode('<\n>'),  unicode('<\\>')]
!     else:
!         endcases = []
!     for u in endcases:
!         try:
!             u2 = pickle.loads(pickle.dumps(u))
!         except Exception, msg:
!             print "Endcase exception: %s => %s(%s)" % \
!                   (`u`, msg.__class__.__name__, str(msg))
!         else:
!             if u2 != u:
!                 print "Endcase failure: %s => %s" % (`u`, `u2`)
  
!     # Test the full range of Python ints.
!     n = sys.maxint
!     while n:
!         for expected in (-n, n):
!             for binary_mode in (0, 1):
!                 s = pickle.dumps(expected, binary_mode)
!                 got = pickle.loads(s)
!                 if expected != got:
!                     raise TestFailed("for %s-mode pickle of %d, pickle "
!                                      "string is %s, loaded back as %s" % (
!                                      binary_mode and "binary" or "text",
!                                      expected,
!                                      repr(s),
!                                      got))
!         n = n >> 1
  
!     # Fake a pickle from a sizeof(long)==8 box.
!     maxint64 = (1L << 63) - 1
!     data = 'I' + str(maxint64) + '\n.'
!     got = pickle.loads(data)
!     if maxint64 != got:
!         raise TestFailed("maxint64 test failed %r %r" % (maxint64, got))
!     # Try too with a bogus literal.
!     data = 'I' + str(maxint64) + 'JUNK\n.'
!     try:
!         got = pickle.loads(data)
!     except ValueError:
          pass
!     else:
!         raise TestFailed("should have raised error on bogus INT literal")
--- 95,252 ----
      x.append(y)
      x.append(5)
!     return x
  
! class AbstractPickleTests(unittest.TestCase):
  
!     _testdata = create_data()
  
!     def setUp(self):
!         # subclass must define self.dumps, self.loads, self.error
!         pass
  
!     def test_misc(self):
!         # test various datatypes not tested by testdata
!         x = myint(4)
!         s = self.dumps(x)
!         y = self.loads(s)
!         self.assertEqual(x, y)
  
!         x = (1, ())
!         s = self.dumps(x)
!         y = self.loads(s)
!         self.assertEqual(x, y)
  
!         x = initarg(1, x)
!         s = self.dumps(x)
!         y = self.loads(s)
!         self.assertEqual(x, y)
  
!         # XXX test __reduce__ protocol?
  
!     def test_identity(self):
!         s = self.dumps(self._testdata)
!         x = self.loads(s)
!         self.assertEqual(x, self._testdata)
  
!     def test_constant(self):
!         x = self.loads(DATA)
!         self.assertEqual(x, self._testdata)
!         x = self.loads(BINDATA)
!         self.assertEqual(x, self._testdata)
  
!     def test_binary(self):
!         s = self.dumps(self._testdata, 1)
!         x = self.loads(s)
!         self.assertEqual(x, self._testdata)
  
!     def test_recursive_list(self):
!         l = []
!         l.append(l)
!         s = self.dumps(l)
!         x = self.loads(s)
!         self.assertEqual(x, l)
!         self.assertEqual(x, x[0])
!         self.assertEqual(id(x), id(x[0]))
  
!     def test_recursive_dict(self):
!         d = {}
!         d[1] = d
!         s = self.dumps(d)
!         x = self.loads(s)
!         self.assertEqual(x, d)
!         self.assertEqual(x[1], x)
!         self.assertEqual(id(x[1]), id(x))
  
!     def test_recursive_inst(self):
!         i = C()
!         i.attr = i
!         s = self.dumps(i)
!         x = self.loads(s)
!         self.assertEqual(x, i)
!         self.assertEqual(x.attr, x)
!         self.assertEqual(id(x.attr), id(x))
! 
!     def test_recursive_multi(self):
!         l = []
!         d = {1:l}
!         i = C()
!         i.attr = d
!         l.append(i)
!         s = self.dumps(l)
!         x = self.loads(s)
!         self.assertEqual(x, l)
!         self.assertEqual(x[0], i)
!         self.assertEqual(x[0].attr, d)
!         self.assertEqual(x[0].attr[1], x)
!         self.assertEqual(x[0].attr[1][0], i)
!         self.assertEqual(x[0].attr[1][0].attr, d)
! 
!     def test_garyp(self):
!         self.assertRaises(self.error, self.loads, 'garyp')
! 
!     def test_insecure_strings(self):
!         insecure = ["abc", "2 + 2", # not quoted
!                     "'abc' + 'def'", # not a single quoted string
!                     "'abc", # quote is not closed
!                     "'abc\"", # open quote and close quote don't match
!                     "'abc'   ?", # junk after close quote
!                     # some tests of the quoting rules
!                     "'abc\"\''",
!                     "'\\\\a\'\'\'\\\'\\\\\''",
!                     ]
!         for s in insecure:
!             buf = "S" + s + "\012p0\012."
!             self.assertRaises(ValueError, self.loads, buf)
! 
      if have_unicode:
!         def test_unicode(self):
!             endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'),
!                         unicode('<\n>'),  unicode('<\\>')]
!             for u in endcases:
!                 p = self.dumps(u)
!                 u2 = self.loads(p)
!                 self.assertEqual(u2, u)
  
!     def test_ints(self):
!         import sys
!         n = sys.maxint
!         while n:
!             for expected in (-n, n):
!                 s = self.dumps(expected)
!                 n2 = self.loads(s)
!                 self.assertEqual(expected, n2)
!             n = n >> 1
  
!     def test_maxint64(self):
!         maxint64 = (1L << 63) - 1
!         data = 'I' + str(maxint64) + '\n.'
!         got = self.loads(data)
!         self.assertEqual(got, maxint64)
! 
!         # Try too with a bogus literal.
!         data = 'I' + str(maxint64) + 'JUNK\n.'
!         self.assertRaises(ValueError, self.loads, data)
! 
!     def test_reduce(self):
          pass
! 
!     def test_getinitargs(self):
!         pass
! 
! class AbstractPickleModuleTests(unittest.TestCase):
! 
!     def test_dump_closed_file(self):
!         import tempfile, os
!         fn = tempfile.mktemp()
!         f = open(fn, "w")
!         f.close()
!         self.assertRaises(ValueError, self.module.dump, 123, f)
!         os.remove(fn)
! 
!     def test_load_closed_file(self):
!         import tempfile, os
!         fn = tempfile.mktemp()
!         f = open(fn, "w")
!         f.close()
!         self.assertRaises(ValueError, self.module.dump, 123, f)
!         os.remove(fn)

Index: test_cpickle.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_cpickle.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** test_cpickle.py	2001/01/22 22:05:20	1.7
--- test_cpickle.py	2001/10/15 21:38:56	1.8
***************
*** 1,3 ****
  import cPickle
! import pickletester
! pickletester.dotest(cPickle)
--- 1,86 ----
  import cPickle
! from cStringIO import StringIO
! from pickletester import AbstractPickleTests, AbstractPickleModuleTests
! from test_support import run_unittest
! 
! class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
!     
!     def setUp(self):
!         self.dumps = cPickle.dumps
!         self.loads = cPickle.loads
! 
!     error = cPickle.BadPickleGet
!     module = cPickle
! 
! class cPicklePicklerTests(AbstractPickleTests):
! 
!     def dumps(self, arg, bin=0):
!         f = StringIO()
!         p = cPickle.Pickler(f, bin)
!         p.dump(arg)
!         f.seek(0)
!         return f.read()
! 
!     def loads(self, buf):
!         f = StringIO(buf)
!         p = cPickle.Unpickler(f)
!         return p.load()
! 
!     error = cPickle.BadPickleGet
! 
! class cPickleListPicklerTests(AbstractPickleTests):
! 
!     def dumps(self, arg, bin=0):
!         p = cPickle.Pickler(bin)
!         p.dump(arg)
!         return p.getvalue()
! 
!     def loads(self, *args):
!         f = StringIO(args[0])
!         p = cPickle.Unpickler(f)
!         return p.load()
! 
!     error = cPickle.BadPickleGet
! 
! class cPickleFastPicklerTests(AbstractPickleTests):
! 
!     def dumps(self, arg, bin=0):
!         f = StringIO()
!         p = cPickle.Pickler(f, bin)
!         p.fast = 1
!         p.dump(arg)
!         f.seek(0)
!         return f.read()
! 
!     def loads(self, *args):
!         f = StringIO(args[0])
!         p = cPickle.Unpickler(f)
!         return p.load()
! 
!     error = cPickle.BadPickleGet
! 
!     def test_recursive_list(self):
!         self.assertRaises(ValueError,
!                           AbstractPickleTests.test_recursive_list,
!                           self)
! 
!     def test_recursive_inst(self):
!         self.assertRaises(ValueError,
!                           AbstractPickleTests.test_recursive_inst,
!                           self)
! 
!     def test_recursive_dict(self):
!         self.assertRaises(ValueError,
!                           AbstractPickleTests.test_recursive_dict,
!                           self)
! 
!     def test_recursive_multi(self):
!         self.assertRaises(ValueError,
!                           AbstractPickleTests.test_recursive_multi,
!                           self)
! 
! if __name__ == "__main__":
!     run_unittest(cPickleTests)
!     run_unittest(cPicklePicklerTests)
!     run_unittest(cPickleListPicklerTests)
!     run_unittest(cPickleFastPicklerTests)

Index: test_pickle.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pickle.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** test_pickle.py	2001/01/22 22:05:20	1.6
--- test_pickle.py	2001/10/15 21:38:56	1.7
***************
*** 1,3 ****
  import pickle
! import pickletester
! pickletester.dotest(pickle)
--- 1,33 ----
  import pickle
! from cStringIO import StringIO
! from pickletester import AbstractPickleTests, AbstractPickleModuleTests
! from test_support import run_unittest
! 
! class PickleTests(AbstractPickleTests, AbstractPickleModuleTests):
! 
!     def setUp(self):
!         self.dumps = pickle.dumps
!         self.loads = pickle.loads
!         
!     module = pickle
!     error = KeyError
! 
! class PicklerTests(AbstractPickleTests):
! 
!     error = KeyError
! 
!     def dumps(self, arg, bin=0):
!         f = StringIO()
!         p = pickle.Pickler(f, bin)
!         p.dump(arg)
!         f.seek(0)
!         return f.read()
! 
!     def loads(self, buf):
!         f = StringIO(buf)
!         u = pickle.Unpickler(f)
!         return u.load()
! 
! if __name__ == "__main__":
!     run_unittest(PickleTests)
!     run_unittest(PicklerTests)