def test_struct_with_set_fields(self) -> None: s = Sets( boolSet={True, False}, byteSet={1, 2, 3}, i16Set={4, 5, 6}, i64Set={7, 8, 9}, doubleSet={1.23, 4.56}, floatSet={7.89, 10.11}, stringSet={"foo", "bar"}, binarySet={b"foo", b"bar"}, iobufSet={IOBuf(b"foo"), IOBuf(b"bar")}, structSet={Foo(value=1), Foo(value=2)}, ) self.assertEqual(s.boolSet, {True, False}) self.assertEqual(s.byteSet, {1, 2, 3}) self.assertEqual(s.i16Set, {4, 5, 6}) self.assertEqual(s.i64Set, {7, 8, 9}) self.assertEqual(s.doubleSet, {1.23, 4.56}) self.assertEqual(s.floatSet, {7.89, 10.11}) self.assertEqual(s.stringSet, {"foo", "bar"}) self.assertEqual(s.binarySet, {b"foo", b"bar"}) self.assertEqual(s.iobufSet, {IOBuf(b"foo"), IOBuf(b"bar")}) self.assertEqual(s.structSet, {Foo(value=1), Foo(value=2)}) # test reaccess the set element won't have to recreating the struct structs1 = list(s.structSet) structs2 = list(s.structSet) self.assertIs(structs1[0], structs2[0]) self.assertIs(structs1[1], structs2[1])
def test_struct_with_list_fields(self) -> None: s = Lists( boolList=[True, False], byteList=[1, 2, 3], i16List=[4, 5, 6], i64List=[7, 8, 9], doubleList=[1.23, 4.56], floatList=[7.89, 10.11], stringList=["foo", "bar"], binaryList=[b"foo", b"bar"], iobufList=[IOBuf(b"foo"), IOBuf(b"bar")], structList=[Foo(value=1), Foo(value=2)], ) self.assertEqual(s.boolList, [True, False]) self.assertEqual(s.byteList, [1, 2, 3]) self.assertEqual(s.i16List, [4, 5, 6]) self.assertEqual(s.i64List, [7, 8, 9]) self.assertEqual(s.doubleList, [1.23, 4.56]) self.assertEqual(s.floatList, [7.89, 10.11]) self.assertEqual(s.stringList, ["foo", "bar"]) self.assertEqual(s.binaryList, [b"foo", b"bar"]) self.assertEqual(s.iobufList, [IOBuf(b"foo"), IOBuf(b"bar")]) self.assertEqual(s.structList, [Foo(value=1), Foo(value=2)]) # test reaccess the list element not recreating the struct self.assertIs(s.structList[0], s.structList[0]) self.assertIs(s.structList[1], s.structList[1])
async def inner_test() -> None: async with TestServer(handler=BinaryHandler(self), ip="::1") as sa: assert sa.ip and sa.port async with get_client(BinaryService, host=sa.ip, port=sa.port) as client: val: Any val = await client.sendRecvBinaries( Binaries( no_special_type=b'c1', iobuf_val=IOBuf(b'c2'), iobuf_ptr=IOBuf(b'c3'), fbstring=b'c4', nonstandard_type=b'c5', )) self.assertEqual(val.no_special_type, b's1') self.assertEqual(bytes(val.iobuf_val), b's2') assert val.iobuf_ptr is not None self.assertEqual(bytes(val.iobuf_ptr), b's3') self.assertEqual(val.fbstring, b's4') self.assertEqual(val.nonstandard_type, b's5') val = await client.sendRecvBinary(b'cv1') self.assertEqual(val, b'sv1') val = await client.sendRecvIOBuf(IOBuf(b'cv2')) self.assertEqual(bytes(val), b'sv2') val = await client.sendRecvIOBufPtr(IOBuf(b'cv3')) self.assertEqual(bytes(val), b'sv3') val = await client.sendRecvFbstring(b'cv4') self.assertEqual(val, b'sv4') val = await client.sendRecvBuffer(b'cv5') self.assertEqual(val, b'sv5')
def test_hash(self) -> None: x = b"omg" y = b"wtf" xb = IOBuf(x) yb = IOBuf(y) hash(xb) self.assertNotEqual(hash(xb), hash(yb)) self.assertEqual(hash(xb), hash(IOBuf(x)))
def test_cmp(self) -> None: x = IOBuf(b"abc") y = IOBuf(b"def") z = IOBuf(b"abc") self.assertEqual(x, z) self.assertNotEqual(x, y) self.assertLess(x, y) self.assertLessEqual(x, y) self.assertLessEqual(x, z) self.assertGreater(y, x) self.assertGreaterEqual(y, x)
def test_get_set_struct_field(self) -> None: m = Moo(val=3, ptr=IOBuf(b'abcdef'), buf=IOBuf(b'xyzzy')) m2 = Moo(val=3, ptr=IOBuf(b'abcdef'), buf=IOBuf(b'xyzzy')) self.assertEqual(m, m2) assert m.ptr is not None assert m2.ptr is not None self.assertEqual(bytes(m.ptr), bytes(m2.ptr)) self.assertEqual(b'abcdef', bytes(m.ptr)) self.assertEqual(bytes(m.buf), bytes(m2.buf)) self.assertEqual(b'xyzzy', bytes(m.buf))
def test_serialize_map_struct(self) -> None: control = Maps( boolMap={True: 1, False: 0}, byteMap={1: 1, 2: 2, 3: 3}, i16Map={4: 4, 5: 5, 6: 6}, i64Map={7: 7, 8: 8, 9: 9}, doubleMap={1.23: 1.23, 4.56: 4.56}, floatMap={7.0: 7.0, 8.0: 8.0}, stringMap={"foo": "foo", "bar": "bar"}, binaryMap={b"foo": b"foo", b"bar": b"bar"}, iobufMap={IOBuf(b"foo"): IOBuf(b"foo"), IOBuf(b"bar"): IOBuf(b"bar")}, structMap={Foo(value=1): Foo(value=1), Foo(value=2): Foo(value=2)}, ) self.thrift_serialization_round_trip(control)
def test_serialize_set_struct(self) -> None: control = Sets( boolSet={True, False}, byteSet={1, 2, 3}, i16Set={4, 5, 6}, i64Set={7, 8, 9}, doubleSet={1.23, 4.56}, floatSet={7, 8}, stringSet={"foo", "bar"}, binarySet={b"foo", b"bar"}, iobufSet={IOBuf(b"foo"), IOBuf(b"bar")}, structSet={Foo(value=1), Foo(value=2)}, ) self.thrift_serialization_round_trip(control)
async def sendRecvBinaries(self, val: Binaries) -> Binaries: self.unit_test.assertEqual(val.no_special_type, b"c1") self.unit_test.assertEqual(bytes(val.iobuf_val), b"c2") assert val.iobuf_ptr is not None self.unit_test.assertEqual(bytes(val.iobuf_ptr), b"c3") self.unit_test.assertEqual(val.fbstring, b"c4") self.unit_test.assertEqual(val.nonstandard_type, b"c5") return Binaries( no_special_type=b"s1", iobuf_val=IOBuf(b"s2"), iobuf_ptr=IOBuf(b"s3"), fbstring=b"s4", nonstandard_type=b"s5", )
async def sendRecvBinaries(self, val: Binaries) -> Binaries: self.unit_test.assertEqual(val.no_special_type, b'c1') self.unit_test.assertEqual(bytes(val.iobuf_val), b'c2') assert val.iobuf_ptr is not None self.unit_test.assertEqual(bytes(val.iobuf_ptr), b'c3') self.unit_test.assertEqual(val.fbstring, b'c4') self.unit_test.assertEqual(val.nonstandard_type, b'c5') return Binaries( no_special_type=b's1', iobuf_val=IOBuf(b's2'), iobuf_ptr=IOBuf(b's3'), fbstring=b's4', nonstandard_type=b's5', )
def test_serialize_lists_struct(self) -> None: control = Lists( boolList=[True, False], byteList=[1, 2, 3], i16List=[4, 5, 6], i64List=[7, 8, 9], doubleList=[1.23, 4.56], floatList=[7.0, 8.0], stringList=["foo", "bar"], binaryList=[b"foo", b"bar"], iobufList=[IOBuf(b"foo"), IOBuf(b"bar")], structList=[Foo(value=1), Foo(value=2)], ) self.thrift_serialization_round_trip(control)
def test_various_binary_types(self) -> None: val = Binaries( no_special_type=b"abcdef", iobuf_val=IOBuf(b"mnopqr"), iobuf_ptr=IOBuf(b"ghijkl"), fbstring=b"stuvwx", nonstandard_type=b"yzabcd", ) self.assertEqual(val.no_special_type, b"abcdef") self.assertEqual(bytes(val.iobuf_val), b"mnopqr") assert val.iobuf_ptr is not None self.assertEqual(bytes(val.iobuf_ptr), b"ghijkl") self.assertEqual(val.fbstring, b"stuvwx") self.assertEqual(val.nonstandard_type, b"yzabcd")
def test_various_binary_types(self) -> None: val = Binaries( no_special_type=b'abcdef', iobuf_val=IOBuf(b'mnopqr'), iobuf_ptr=IOBuf(b'ghijkl'), fbstring=b'stuvwx', nonstandard_type=b'yzabcd', ) self.assertEqual(val.no_special_type, b'abcdef') self.assertEqual(bytes(val.iobuf_val), b'mnopqr') assert val.iobuf_ptr is not None self.assertEqual(bytes(val.iobuf_ptr), b'ghijkl') self.assertEqual(val.fbstring, b'stuvwx') self.assertEqual(val.nonstandard_type, b'yzabcd')
async def inner_test() -> None: async with TestServer(handler=StackHandler(), ip="::1") as sa: assert sa.ip and sa.port async with get_client(StackService, host=sa.ip, port=sa.port) as client: self.assertEqual((3, 4, 5, 6), await client.add_to(lst=(1, 2, 3, 4), value=2)) self.assertEqual(66, (await client.get_simple()).val) await client.take_simple(simple(val=10)) self.assertEqual(b"abc", bytes(await client.get_iobuf())) await client.take_iobuf(IOBuf(b"cba")) # currently unsupported by cpp backend: # self.assertEqual(b'xyz', (await client.get_iobuf_ptr())) await client.take_iobuf_ptr(IOBuf(b"zyx"))
def test_empty(self) -> None: x = b"" xb = IOBuf(x) self.assertEqual(memoryview(xb), x) # type: ignore self.assertEqual(bytes(xb), x) self.assertFalse(xb) self.assertEqual(len(xb), len(x))
async def inner_test() -> None: async with TestServer(handler=StackHandler(), ip="::1") as sa: ip, port = sa.ip, sa.port assert ip and port # pyre-fixme[6]: Expected `Union[ipaddress.IPv4Address, # ipaddress.IPv6Address, str]` for 2nd param but got `Union[None, # ipaddress.IPv4Address, ipaddress.IPv6Address]`. async with get_client(StackService, host=ip, port=port) as client: self.assertEqual((3, 4, 5, 6), await client.add_to(lst=(1, 2, 3, 4), value=2)) self.assertEqual(66, (await client.get_simple()).val) await client.take_simple(simple(val=10)) self.assertEqual(b"abc", bytes(await client.get_iobuf())) await client.take_iobuf(IOBuf(b"cba")) # currently unsupported by cpp backend: # self.assertEqual(b'xyz', (await client.get_iobuf_ptr())) await client.take_iobuf_ptr(IOBuf(b"zyx"))
def test_empty(self) -> None: x = b"" xb = IOBuf(x) # pyre-fixme[6]: Expected `Union[bytearray, bytes, memoryview]` for 1st # param but got `IOBuf`. self.assertEqual(memoryview(xb), x) self.assertEqual(bytes(xb), x) self.assertFalse(xb) self.assertEqual(len(xb), len(x))
async def inner_test() -> None: async with TestServer(handler=BinaryHandler(self), ip="::1") as sa: ip, port = sa.ip, sa.port assert ip and port # pyre-fixme[6]: Expected `Union[ipaddress.IPv4Address, # ipaddress.IPv6Address, str]` for 2nd param but got `Union[None, # ipaddress.IPv4Address, ipaddress.IPv6Address]`. async with get_client(BinaryService, host=ip, port=port) as client: val: Any val = await client.sendRecvBinaries( Binaries( no_special_type=b"c1", iobuf_val=IOBuf(b"c2"), iobuf_ptr=IOBuf(b"c3"), fbstring=b"c4", nonstandard_type=b"c5", )) self.assertEqual(val.no_special_type, b"s1") self.assertEqual(bytes(val.iobuf_val), b"s2") assert val.iobuf_ptr is not None self.assertEqual(bytes(val.iobuf_ptr), b"s3") self.assertEqual(val.fbstring, b"s4") self.assertEqual(val.nonstandard_type, b"s5") val = await client.sendRecvBinary(b"cv1") self.assertEqual(val, b"sv1") val = await client.sendRecvIOBuf(IOBuf(b"cv2")) self.assertEqual(bytes(val), b"sv2") val = await client.sendRecvIOBufPtr(IOBuf(b"cv3")) self.assertEqual(bytes(val), b"sv3") val = await client.sendRecvFbstring(b"cv4") self.assertEqual(val, b"sv4") val = await client.sendRecvBuffer(b"cv5") self.assertEqual(val, b"sv5") bu = BinaryUnion(iobuf_val=IOBuf(b"cv6")) val = await client.sendRecBinaryUnion(bu) self.assertEqual(bytes(val.iobuf_val), b"sv6")
def test_chain(self) -> None: control = [b'facebook', b'thrift', b'python3', b'cython'] chain = make_chain([IOBuf(x) for x in control]) self.assertTrue(chain.is_chained) self.assertTrue(chain) self.assertEqual(bytes(chain), control[0]) self.assertEqual(len(chain), len(control[0])) self.assertEqual(chain.chain_size(), sum(len(x) for x in control)) self.assertEqual(chain.chain_count(), len(control)) self.assertEqual(memoryview(chain.next), control[1]) # type: ignore self.assertEqual(b''.join(chain), b''.join(control))
def test_cyclic_chain(self) -> None: control = [b"aaa", b"aaaa"] chain = make_chain([IOBuf(x) for x in control]) self.assertTrue(chain.is_chained) self.assertTrue(chain) self.assertEqual(bytes(chain), control[0]) self.assertEqual(len(chain), len(control[0])) self.assertEqual(chain.chain_size(), sum(len(x) for x in control)) self.assertEqual(chain.chain_count(), len(control)) self.assertEqual(memoryview(chain.next), control[1]) # type: ignore self.assertEqual(b"".join(chain), b"".join(control))
async def inner_test() -> None: async with TestServer(handler=BinaryHandler(self), ip="::1") as sa: ip, port = sa.ip, sa.port assert ip and port async with get_client(BinaryService, host=ip, port=port) as client: # pyre-fixme[33]: Given annotation cannot be `Any`. val: Any val = await client.sendRecvBinaries( Binaries( no_special_type=b"c1", iobuf_val=IOBuf(b"c2"), iobuf_ptr=IOBuf(b"c3"), fbstring=b"c4", nonstandard_type=b"c5", )) self.assertEqual(val.no_special_type, b"s1") self.assertEqual(bytes(val.iobuf_val), b"s2") assert val.iobuf_ptr is not None self.assertEqual(bytes(val.iobuf_ptr), b"s3") self.assertEqual(val.fbstring, b"s4") self.assertEqual(val.nonstandard_type, b"s5") val = await client.sendRecvBinary(b"cv1") self.assertEqual(val, b"sv1") val = await client.sendRecvIOBuf(IOBuf(b"cv2")) self.assertEqual(bytes(val), b"sv2") val = await client.sendRecvIOBufPtr(IOBuf(b"cv3")) self.assertEqual(bytes(val), b"sv3") val = await client.sendRecvFbstring(b"cv4") self.assertEqual(val, b"sv4") val = await client.sendRecvBuffer(b"cv5") self.assertEqual(val, b"sv5") bu = BinaryUnion(iobuf_val=IOBuf(b"cv6")) val = await client.sendRecBinaryUnion(bu) self.assertEqual(bytes(val.iobuf_val), b"sv6")
def test_get_set_struct_field(self) -> None: m = Moo(val=3, ptr=IOBuf(b"abcdef"), buf=IOBuf(b"xyzzy"), opt_ptr=IOBuf(b"pqr")) m2 = Moo(val=3, ptr=IOBuf(b"abcdef"), buf=IOBuf(b"xyzzy"), opt_ptr=IOBuf(b"pqr")) self.assertEqual(m, m2) assert m.ptr is not None assert m2.ptr is not None assert m.opt_ptr is not None assert m2.opt_ptr is not None # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. self.assertEqual(bytes(m.ptr), bytes(m2.ptr)) # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. self.assertEqual(b"abcdef", bytes(m.ptr)) self.assertEqual(bytes(m.buf), bytes(m2.buf)) self.assertEqual(b"xyzzy", bytes(m.buf)) # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. self.assertEqual(bytes(m.opt_ptr), bytes(m2.opt_ptr)) # pyre-fixme[6]: Expected `Iterable[int]` for 1st param but got # `Optional[IOBuf]`. self.assertEqual(b"pqr", bytes(m.opt_ptr))
def test_get_set_struct_field(self) -> None: m = Moo( val=3, ptr=IOBuf(b"abcdef"), buf=IOBuf(b"xyzzy"), opt_ptr=IOBuf(b"pqr"), ) m2 = Moo( val=3, ptr=IOBuf(b"abcdef"), buf=IOBuf(b"xyzzy"), opt_ptr=IOBuf(b"pqr"), ) self.assertEqual(m, m2) assert m.ptr is not None assert m2.ptr is not None assert m.opt_ptr is not None assert m2.opt_ptr is not None self.assertEqual(bytes(m.ptr), bytes(m2.ptr)) self.assertEqual(b"abcdef", bytes(m.ptr)) self.assertEqual(bytes(m.buf), bytes(m2.buf)) self.assertEqual(b"xyzzy", bytes(m.buf)) self.assertEqual(bytes(m.opt_ptr), bytes(m2.opt_ptr)) self.assertEqual(b"pqr", bytes(m.opt_ptr))
def test_cyclic_chain(self) -> None: control = [b"aaa", b"aaaa"] chain = make_chain([IOBuf(x) for x in control]) self.assertTrue(chain.is_chained) self.assertTrue(chain) self.assertEqual(bytes(chain), control[0]) self.assertEqual(len(chain), len(control[0])) self.assertEqual(chain.chain_size(), sum(len(x) for x in control)) self.assertEqual(chain.chain_count(), len(control)) # pyre-fixme[6]: Expected `Union[bytearray, bytes, memoryview]` for 1st # param but got `Optional[IOBuf]`. self.assertEqual(memoryview(chain.next), control[1]) self.assertEqual(b"".join(chain), b"".join(control))
def test_serialize_Complex(self) -> None: control = Complex( val_bool=True, val_i32=42, val_i64=1 << 33, val_string="hello\u4e16\u754c", val_binary=b"\xe5\x92\x8c\xe5\b9\xb3", val_iobuf=IOBuf(b"\xe5\x9b\x9b\xe5\x8d\x81\xe4\xba\x8c"), val_enum=Color.green, val_union=ComplexUnion(double_val=1.234), val_set={easy(val=42)}, val_map={"foo": b"foovalue"}, val_complex_map={"bar": [{easy(val=42), easy(val_list=[1, 2, 3])}]}, val_struct_with_containers=ColorGroups( color_list=[Color.blue, Color.green], color_set={Color.blue, Color.red}, color_map={Color.blue: Color.green}, ), ) self.thrift_serialization_round_trip(control)
def test_iobuf_union(self) -> None: abuf = IOBuf(b"3.141592025756836") union = IOBufUnion.fromValue(abuf) self.assertEqual(union.type, IOBufUnion.Type.buf) self.assertEqual(bytes(union.buf), bytes(abuf))
async def sendRecvIOBufPtr(self, val: IOBuf) -> IOBuf: self.unit_test.assertEqual(bytes(val), b"cv3") return IOBuf(b"sv3")
async def get_iobuf(self) -> IOBuf: return IOBuf(b'abc')
async def get_iobuf(self) -> IOBuf: return IOBuf(b"abc")
async def sendRecBinaryUnion(self, val: BinaryUnion) -> BinaryUnion: self.unit_test.assertEqual(bytes(val.iobuf_val), b"cv6") return BinaryUnion(iobuf_val=IOBuf(b"sv6"))