2015-11-17 02:01:17 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
#
|
|
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
# or more contributor license agreements. See the NOTICE file
|
|
|
|
# distributed with this work for additional information
|
|
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
|
|
# to you under the Apache License, Version 2.0 (the
|
|
|
|
# "License"); you may not use this file except in compliance
|
|
|
|
# with the License. You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing,
|
|
|
|
# software distributed under the License is distributed on an
|
|
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
# KIND, either express or implied. See the License for the
|
|
|
|
# specific language governing permissions and limitations
|
|
|
|
# under the License.
|
|
|
|
#
|
|
|
|
|
|
|
|
from DebugProtoTest.ttypes import CompactProtoTestStruct, Empty, Wrapper
|
|
|
|
from thrift.Thrift import TFrozenDict
|
|
|
|
from thrift.transport import TTransport
|
2016-02-11 04:58:39 +00:00
|
|
|
from thrift.protocol import TBinaryProtocol, TCompactProtocol
|
2015-11-17 02:01:17 +00:00
|
|
|
import collections
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
class TestFrozenBase(unittest.TestCase):
|
2016-02-02 16:57:03 +00:00
|
|
|
def _roundtrip(self, src, dst):
|
|
|
|
otrans = TTransport.TMemoryBuffer()
|
|
|
|
optoro = self.protocol(otrans)
|
|
|
|
src.write(optoro)
|
|
|
|
itrans = TTransport.TMemoryBuffer(otrans.getvalue())
|
|
|
|
iproto = self.protocol(itrans)
|
|
|
|
return dst.read(iproto) or dst
|
|
|
|
|
|
|
|
def test_dict_is_hashable_only_after_frozen(self):
|
|
|
|
d0 = {}
|
|
|
|
self.assertFalse(isinstance(d0, collections.Hashable))
|
|
|
|
d1 = TFrozenDict(d0)
|
|
|
|
self.assertTrue(isinstance(d1, collections.Hashable))
|
|
|
|
|
|
|
|
def test_struct_with_collection_fields(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_set(self):
|
|
|
|
"""Test that annotated set field can be serialized and deserialized"""
|
|
|
|
x = CompactProtoTestStruct(set_byte_map={
|
|
|
|
frozenset([42, 100, -100]): 99,
|
|
|
|
frozenset([0]): 100,
|
|
|
|
frozenset([]): 0,
|
|
|
|
})
|
|
|
|
x2 = self._roundtrip(x, CompactProtoTestStruct())
|
|
|
|
self.assertEqual(x2.set_byte_map[frozenset([42, 100, -100])], 99)
|
|
|
|
self.assertEqual(x2.set_byte_map[frozenset([0])], 100)
|
|
|
|
self.assertEqual(x2.set_byte_map[frozenset([])], 0)
|
|
|
|
|
|
|
|
def test_map(self):
|
|
|
|
"""Test that annotated map field can be serialized and deserialized"""
|
|
|
|
x = CompactProtoTestStruct(map_byte_map={
|
|
|
|
TFrozenDict({42: 42, 100: -100}): 99,
|
|
|
|
TFrozenDict({0: 0}): 100,
|
|
|
|
TFrozenDict({}): 0,
|
|
|
|
})
|
|
|
|
x2 = self._roundtrip(x, CompactProtoTestStruct())
|
|
|
|
self.assertEqual(x2.map_byte_map[TFrozenDict({42: 42, 100: -100})], 99)
|
|
|
|
self.assertEqual(x2.map_byte_map[TFrozenDict({0: 0})], 100)
|
|
|
|
self.assertEqual(x2.map_byte_map[TFrozenDict({})], 0)
|
|
|
|
|
|
|
|
def test_list(self):
|
|
|
|
"""Test that annotated list field can be serialized and deserialized"""
|
|
|
|
x = CompactProtoTestStruct(list_byte_map={
|
|
|
|
(42, 100, -100): 99,
|
|
|
|
(0,): 100,
|
|
|
|
(): 0,
|
|
|
|
})
|
|
|
|
x2 = self._roundtrip(x, CompactProtoTestStruct())
|
|
|
|
self.assertEqual(x2.list_byte_map[(42, 100, -100)], 99)
|
|
|
|
self.assertEqual(x2.list_byte_map[(0,)], 100)
|
|
|
|
self.assertEqual(x2.list_byte_map[()], 0)
|
|
|
|
|
|
|
|
def test_empty_struct(self):
|
|
|
|
"""Test that annotated empty struct can be serialized and deserialized"""
|
|
|
|
x = CompactProtoTestStruct(empty_struct_field=Empty())
|
|
|
|
x2 = self._roundtrip(x, CompactProtoTestStruct())
|
|
|
|
self.assertEqual(x2.empty_struct_field, Empty())
|
|
|
|
|
|
|
|
def test_struct(self):
|
|
|
|
"""Test that annotated struct can be serialized and deserialized"""
|
|
|
|
x = Wrapper(foo=Empty())
|
|
|
|
self.assertEqual(x.foo, Empty())
|
|
|
|
x2 = self._roundtrip(x, Wrapper)
|
|
|
|
self.assertEqual(x2.foo, Empty())
|
2015-11-17 02:01:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
class TestFrozen(TestFrozenBase):
|
2016-02-02 16:57:03 +00:00
|
|
|
def protocol(self, trans):
|
|
|
|
return TBinaryProtocol.TBinaryProtocolFactory().getProtocol(trans)
|
2015-11-17 02:01:17 +00:00
|
|
|
|
|
|
|
|
2016-02-11 04:58:39 +00:00
|
|
|
class TestFrozenAcceleratedBinary(TestFrozenBase):
|
2016-02-02 16:57:03 +00:00
|
|
|
def protocol(self, trans):
|
2016-02-11 07:21:01 +00:00
|
|
|
return TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(trans)
|
2015-11-17 02:01:17 +00:00
|
|
|
|
|
|
|
|
2016-02-11 04:58:39 +00:00
|
|
|
class TestFrozenAcceleratedCompact(TestFrozenBase):
|
|
|
|
def protocol(self, trans):
|
2016-02-11 07:21:01 +00:00
|
|
|
return TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(trans)
|
2016-02-11 04:58:39 +00:00
|
|
|
|
|
|
|
|
2015-11-17 02:01:17 +00:00
|
|
|
def suite():
|
2016-02-02 16:57:03 +00:00
|
|
|
suite = unittest.TestSuite()
|
|
|
|
loader = unittest.TestLoader()
|
|
|
|
suite.addTest(loader.loadTestsFromTestCase(TestFrozen))
|
2016-02-11 04:58:39 +00:00
|
|
|
suite.addTest(loader.loadTestsFromTestCase(TestFrozenAcceleratedBinary))
|
|
|
|
suite.addTest(loader.loadTestsFromTestCase(TestFrozenAcceleratedCompact))
|
2016-02-02 16:57:03 +00:00
|
|
|
return suite
|
2015-11-17 02:01:17 +00:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2016-02-02 16:57:03 +00:00
|
|
|
unittest.main(defaultTest="suite", testRunner=unittest.TextTestRunner(verbosity=2))
|