summaryrefslogtreecommitdiff
path: root/test/py
diff options
context:
space:
mode:
authorEric Conner <eric@pinterest.com>2017-06-21 03:34:12 +0200
committerJens Geyer <jensg@apache.org>2017-07-06 22:59:10 +0200
commitc34653f75106fbe20293ddfd5b07f74772891a6d (patch)
tree2a844527515654b65d8f1bfac9c68a2484c535f9 /test/py
parent49e5103920e75a149d02c7d487496c8c79154a6c (diff)
downloadthrift-c34653f75106fbe20293ddfd5b07f74772891a6d.tar.gz
THRIFT-2642 Recursive structs don't work in python
Client: Python Patch: Eric Conner <eric@pinterest.com> This closes #1293
Diffstat (limited to 'test/py')
-rw-r--r--test/py/Makefile.am10
-rwxr-xr-xtest/py/SerializationTest.py66
-rw-r--r--test/py/generate.cmake7
3 files changed, 82 insertions, 1 deletions
diff --git a/test/py/Makefile.am b/test/py/Makefile.am
index f105737cd..53c1e634b 100644
--- a/test/py/Makefile.am
+++ b/test/py/Makefile.am
@@ -25,18 +25,26 @@ py_unit_tests = RunClientServer.py
thrift_gen = \
gen-py/ThriftTest/__init__.py \
gen-py/DebugProtoTest/__init__.py \
+ gen-py/Recursive/__init__.py \
gen-py-default/ThriftTest/__init__.py \
gen-py-default/DebugProtoTest/__init__.py \
+ gen-py-default/Recursive/__init__.py \
gen-py-slots/ThriftTest/__init__.py \
gen-py-slots/DebugProtoTest/__init__.py \
+ gen-py-slots/Recursive/__init__.py \
gen-py-oldstyle/ThriftTest/__init__.py \
gen-py-oldstyle/DebugProtoTest/__init__.py \
+ gen-py-oldstyle/Recursive/__init__.py \
gen-py-no_utf8strings/ThriftTest/__init__.py \
gen-py-no_utf8strings/DebugProtoTest/__init__.py \
+ gen-py-no_utf8strings/Recursive/__init__.py \
gen-py-dynamic/ThriftTest/__init__.py \
gen-py-dynamic/DebugProtoTest/__init__.py \
+ gen-py-dynamic/Recursive/__init__.py \
gen-py-dynamicslots/ThriftTest/__init__.py \
- gen-py-dynamicslots/DebugProtoTest/__init__.py
+ gen-py-dynamicslots/DebugProtoTest/__init__.py \
+ gen-py-dynamicslots/Recursive/__init__.py
+
precross: $(thrift_gen)
BUILT_SOURCES = $(thrift_gen)
diff --git a/test/py/SerializationTest.py b/test/py/SerializationTest.py
index efe3c6d8d..b080d87fc 100755
--- a/test/py/SerializationTest.py
+++ b/test/py/SerializationTest.py
@@ -35,6 +35,11 @@ from ThriftTest.ttypes import (
Xtruct2,
)
+from Recursive.ttypes import RecTree
+from Recursive.ttypes import RecList
+from Recursive.ttypes import CoRec
+from Recursive.ttypes import CoRec2
+from Recursive.ttypes import VectorTest
from DebugProtoTest.ttypes import CompactProtoTestStruct, Empty
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol, TCompactProtocol, TJSONProtocol
@@ -285,6 +290,67 @@ class AbstractTest(unittest.TestCase):
for value in bad_values:
self.assertRaises(Exception, self._serialize, value)
+ def testRecTree(self):
+ """Ensure recursive tree node can be created."""
+ children = []
+ for idx in range(1, 5):
+ node = RecTree(item=idx, children=None)
+ children.append(node)
+
+ parent = RecTree(item=0, children=children)
+ serde_parent = self._deserialize(RecTree, self._serialize(parent))
+ self.assertEquals(0, serde_parent.item)
+ self.assertEquals(4, len(serde_parent.children))
+ for child in serde_parent.children:
+ # Cannot use assertIsInstance in python 2.6?
+ self.assertTrue(isinstance(child, RecTree))
+
+ def _buildLinkedList(self):
+ head = cur = RecList(item=0)
+ for idx in range(1, 5):
+ node = RecList(item=idx)
+ cur.nextitem = node
+ cur = node
+ return head
+
+ def _collapseLinkedList(self, head):
+ out_list = []
+ cur = head
+ while cur is not None:
+ out_list.append(cur.item)
+ cur = cur.nextitem
+ return out_list
+
+ def testRecList(self):
+ """Ensure recursive linked list can be created."""
+ rec_list = self._buildLinkedList()
+ serde_list = self._deserialize(RecList, self._serialize(rec_list))
+ out_list = self._collapseLinkedList(serde_list)
+ self.assertEquals([0, 1, 2, 3, 4], out_list)
+
+ def testCoRec(self):
+ """Ensure co-recursive structures can be created."""
+ item1 = CoRec()
+ item2 = CoRec2()
+
+ item1.other = item2
+ item2.other = item1
+
+ # NOTE [econner724,2017-06-21]: These objects cannot be serialized as serialization
+ # results in an infinite loop. fbthrift also suffers from this
+ # problem.
+
+ def testRecVector(self):
+ """Ensure a list of recursive nodes can be created."""
+ mylist = [self._buildLinkedList(), self._buildLinkedList()]
+ myvec = VectorTest(lister=mylist)
+
+ serde_vec = self._deserialize(VectorTest, self._serialize(myvec))
+ golden_list = [0, 1, 2, 3, 4]
+ for cur_list in serde_vec.lister:
+ out_list = self._collapseLinkedList(cur_list)
+ self.assertEqual(golden_list, out_list)
+
class NormalBinaryTest(AbstractTest):
protocol_factory = TBinaryProtocol.TBinaryProtocolFactory()
diff --git a/test/py/generate.cmake b/test/py/generate.cmake
index 44c53571f..46263c84a 100644
--- a/test/py/generate.cmake
+++ b/test/py/generate.cmake
@@ -20,3 +20,10 @@ generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:old_style gen-py-oldsty
generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:no_utf8strings gen-py-no_utf8strings)
generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:dynamic gen-py-dynamic)
generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:dynamic,slots gen-py-dynamicslots)
+
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py gen-py-default)
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:slots gen-py-slots)
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:old_style gen-py-oldstyle)
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:no_utf8strings gen-py-no_utf8strings)
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic gen-py-dynamic)
+generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic,slots gen-py-dynamicslots)