From 5453c5eed88e4570ac064f15625c07e49159d18c Mon Sep 17 00:00:00 2001 From: Karl Nelson Date: Fri, 17 Jan 2020 10:05:11 -0800 Subject: [PATCH] Diagnose pickle instability --- test/jpypetest/test_pickle.py | 43 ++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/test/jpypetest/test_pickle.py b/test/jpypetest/test_pickle.py index 6bd59adb6..2bbcb97a3 100644 --- a/test/jpypetest/test_pickle.py +++ b/test/jpypetest/test_pickle.py @@ -17,6 +17,8 @@ import jpype from jpype import java from jpype.pickle import JPickler, JUnpickler +import pickle +import sys import common try: @@ -24,27 +26,39 @@ except ImportError: import unittest +def dump(fname): + with open(fname, "rb") as fd: + data = fd.read() + out = ["%02x"%i for i in data] + print("Pickle fail", " ".join(out), file=sys.stderr) + class PickleTestCase(common.JPypeTestCase): def setUp(self): common.JPypeTestCase.setUp(self) def testString(self): - s = java.lang.String("test") - with open("test.pic","wb") as fd: - JPickler(fd).dump(s) - with open("test.pic","rb") as fd: - s2 = JUnpickler(fd).load() + try: + s = java.lang.String("test") + with open("test.pic","wb") as fd: + JPickler(fd).dump(s) + with open("test.pic","rb") as fd: + s2 = JUnpickler(fd).load() + except pickle.UnpicklingError: + dump("test.pic") self.assertEqual(s,s2) def testList(self): s = java.util.ArrayList() s.add("test") s.add("this") - with open("test.pic","wb") as fd: - JPickler(fd).dump(s) - with open("test.pic","rb") as fd: - s2 = JUnpickler(fd).load() + try: + with open("test.pic","wb") as fd: + JPickler(fd).dump(s) + with open("test.pic","rb") as fd: + s2 = JUnpickler(fd).load() + except pickle.UnpicklingError: + dump("test.pic") self.assertEqual(s2.get(0), "test") self.assertEqual(s2.get(1), "this") @@ -52,10 +66,13 @@ def testMixed(self): d = {} d["array"] = java.util.ArrayList() d["string"] = java.lang.String("food") - with open("test.pic","wb") as fd: - JPickler(fd).dump(d) - with open("test.pic","rb") as fd: - d2 = JUnpickler(fd).load() + try: + with open("test.pic","wb") as fd: + JPickler(fd).dump(d) + with open("test.pic","rb") as fd: + d2 = JUnpickler(fd).load() + except pickle.UnpicklingError: + dump("test.pic") self.assertEqual(d2['string'], "food") self.assertIsInstance(d2['array'], java.util.ArrayList)