home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / webclean / !!!python!!! / BeOpen-Python-2.0.exe / TEST_PICKLE.PY < prev    next >
Encoding:
Text File  |  2000-09-28  |  3.1 KB  |  144 lines

  1. # Test the pickle module
  2.  
  3. # break into multiple strings to please font-lock-mode
  4. DATA = """(lp0
  5. I0
  6. aL1L
  7. aF2.0
  8. ac__builtin__
  9. complex
  10. p1
  11. """ \
  12. """(F3.0
  13. F0.0
  14. tp2
  15. Rp3
  16. a(S'abc'
  17. p4
  18. g4
  19. """ \
  20. """(i__main__
  21. C
  22. p5
  23. """ \
  24. """(dp6
  25. S'foo'
  26. p7
  27. I1
  28. sS'bar'
  29. p8
  30. I2
  31. sbg5
  32. tp9
  33. ag9
  34. aI5
  35. a.
  36. """
  37.  
  38. BINDATA = ']q\000(K\000L1L\012G@\000\000\000\000\000\000\000c__builtin__\012complex\012q\001(G@\010\000\000\000\000\000\000G\000\000\000\000\000\000\000\000tq\002Rq\003(U\003abcq\004h\004(c__main__\012C\012q\005oq\006}q\007(U\003fooq\010K\001U\003barq\011K\002ubh\006tq\012h\012K\005e.'
  39.  
  40. class C:
  41.     def __cmp__(self, other):
  42.         return cmp(self.__dict__, other.__dict__)
  43.  
  44. import __main__
  45. __main__.C = C
  46.  
  47. def dotest(pickle):
  48.     c = C()
  49.     c.foo = 1
  50.     c.bar = 2
  51.     x = [0, 1L, 2.0, 3.0+0j]
  52.     y = ('abc', 'abc', c, c)
  53.     x.append(y)
  54.     x.append(y)
  55.     x.append(5)
  56.     r = []
  57.     r.append(r)
  58.     print "dumps()"
  59.     s = pickle.dumps(x)
  60.     print "loads()"
  61.     x2 = pickle.loads(s)
  62.     if x2 == x: print "ok"
  63.     else: print "bad"
  64.     print "loads() DATA"
  65.     x2 = pickle.loads(DATA)
  66.     if x2 == x: print "ok"
  67.     else: print "bad"
  68.     print "dumps() binary"
  69.     s = pickle.dumps(x, 1)
  70.     print "loads() binary"
  71.     x2 = pickle.loads(s)
  72.     if x2 == x: print "ok"
  73.     else: print "bad"
  74.     print "loads() BINDATA"
  75.     x2 = pickle.loads(BINDATA)
  76.     if x2 == x: print "ok"
  77.     else: print "bad"
  78.     s = pickle.dumps(r)
  79.     print "dumps() RECURSIVE"
  80.     x2 = pickle.loads(s)
  81.     if x2 == r: print "ok"
  82.     else: print "bad"
  83.     # don't create cyclic garbage
  84.     del x2[0]
  85.     del r[0]
  86.  
  87.     # Test protection against closed files
  88.     import tempfile, os
  89.     fn = tempfile.mktemp()
  90.     f = open(fn, "w")
  91.     f.close()
  92.     try:
  93.         pickle.dump(123, f)
  94.     except ValueError:
  95.         pass
  96.     else:
  97.         print "dump to closed file should raise ValueError"
  98.     f = open(fn, "r")
  99.     f.close()
  100.     try:
  101.         pickle.load(f)
  102.     except ValueError:
  103.         pass
  104.     else:
  105.         print "load from closed file should raise ValueError"
  106.     os.remove(fn)
  107.  
  108.     # Test specific bad cases
  109.     for i in range(10):
  110.         try:
  111.             x = pickle.loads('garyp')
  112.         except KeyError, y:
  113.             # pickle
  114.             del y
  115.         except pickle.BadPickleGet, y:
  116.             # cPickle
  117.             del y
  118.         else:
  119.             print "unexpected success!"
  120.             break
  121.  
  122.     # Test insecure strings
  123.     insecure = ["abc", "2 + 2", # not quoted
  124.                 "'abc' + 'def'", # not a single quoted string
  125.                 "'abc", # quote is not closed
  126.                 "'abc\"", # open quote and close quote don't match
  127.                 "'abc'   ?", # junk after close quote
  128.                 # some tests of the quoting rules
  129.                 "'abc\"\''",
  130.                 "'\\\\a\'\'\'\\\'\\\\\''",
  131.                 ]
  132.     for s in insecure:
  133.         buf = "S" + s + "\012p0\012."
  134.         try:
  135.             x = pickle.loads(buf)
  136.         except ValueError:
  137.             pass
  138.         else:
  139.             print "accepted insecure string: %s" % repr(buf)
  140.         
  141.  
  142. import pickle
  143. dotest(pickle)
  144.