|
20 | 20 |
|
21 | 21 | #include <folly/Traits.h>
|
22 | 22 | #include <folly/portability/GTest.h>
|
| 23 | +#include <thrift/lib/cpp2/op/Get.h> |
| 24 | +#include <thrift/lib/cpp2/protocol/Object.h> |
23 | 25 | #include <thrift/lib/cpp2/protocol/Serializer.h>
|
24 | 26 |
|
| 27 | +using namespace apache::thrift; |
25 | 28 | using namespace apache::thrift::test;
|
26 | 29 |
|
27 | 30 | namespace {
|
@@ -748,4 +751,93 @@ TEST_F(StructTest, RefsWithStringAndContainerTerseWrites) {
|
748 | 751 | TEST_F(StructTest, NotEligibleForConstexpr) {
|
749 | 752 | [[maybe_unused]] NotEligibleForConstexpr foo;
|
750 | 753 | }
|
| 754 | + |
| 755 | +template <class T> |
| 756 | +protocol::Object serializeToObject(const T& t) { |
| 757 | + auto buf = CompactSerializer::serialize<folly::IOBufQueue>(t).move(); |
| 758 | + return protocol::parseObject<CompactProtocolReader>(*buf); |
| 759 | +} |
| 760 | + |
| 761 | +template <class Id, class T> |
| 762 | +bool serializedField(const T& t) { |
| 763 | + return serializeToObject(t).contains(op::get_field_id_v<T, Id>); |
| 764 | +} |
| 765 | + |
| 766 | +TEST_F(StructTest, TerseFields) { |
| 767 | + TerseFieldsWithCustomDefault terse; |
| 768 | + |
| 769 | + // Primitive types |
| 770 | + EXPECT_EQ(terse.bool_field(), true); |
| 771 | + EXPECT_EQ(terse.byte_field(), 10); |
| 772 | + EXPECT_EQ(terse.short_field(), 20); |
| 773 | + EXPECT_EQ(terse.int_field(), 30); |
| 774 | + EXPECT_EQ(terse.long_field(), 40); |
| 775 | + EXPECT_EQ(terse.float_field(), 50); |
| 776 | + EXPECT_EQ(terse.double_field(), 60); |
| 777 | + EXPECT_EQ(terse.binary_field(), "70"); |
| 778 | + EXPECT_EQ(terse.string_field(), "80"); |
| 779 | + |
| 780 | + // Containers |
| 781 | + EXPECT_EQ(terse.list_field()->size(), 1); |
| 782 | + EXPECT_EQ(*terse.list_field()->begin(), 90); |
| 783 | + EXPECT_EQ(terse.set_field()->size(), 1); |
| 784 | + EXPECT_EQ(*terse.set_field()->begin(), 100); |
| 785 | + EXPECT_EQ(terse.map_field()->size(), 1); |
| 786 | + EXPECT_EQ(terse.map_field()->begin()->first, 110); |
| 787 | + EXPECT_EQ(terse.map_field()->begin()->second, 10); |
| 788 | + |
| 789 | + // Structures |
| 790 | + EXPECT_EQ(terse.struct_field()->int_field(), 42); |
| 791 | + EXPECT_EQ(terse.exception_field()->int_field(), 42); |
| 792 | + // Custom default on union is not honored. |
| 793 | + EXPECT_EQ(terse.union_field()->getType(), terse.union_field()->__EMPTY__); |
| 794 | + |
| 795 | + // Numeric fields are not serialized if they equal custom default |
| 796 | + EXPECT_FALSE(serializedField<ident::bool_field>(terse)); |
| 797 | + EXPECT_FALSE(serializedField<ident::byte_field>(terse)); |
| 798 | + EXPECT_FALSE(serializedField<ident::short_field>(terse)); |
| 799 | + EXPECT_FALSE(serializedField<ident::int_field>(terse)); |
| 800 | + EXPECT_FALSE(serializedField<ident::long_field>(terse)); |
| 801 | + EXPECT_FALSE(serializedField<ident::float_field>(terse)); |
| 802 | + EXPECT_FALSE(serializedField<ident::double_field>(terse)); |
| 803 | + |
| 804 | + // string/binary and container fields are serialized if they are not intrinsic |
| 805 | + // default |
| 806 | + EXPECT_TRUE(serializedField<ident::string_field>(terse)); |
| 807 | + EXPECT_TRUE(serializedField<ident::binary_field>(terse)); |
| 808 | + EXPECT_TRUE(serializedField<ident::list_field>(terse)); |
| 809 | + EXPECT_TRUE(serializedField<ident::set_field>(terse)); |
| 810 | + EXPECT_TRUE(serializedField<ident::map_field>(terse)); |
| 811 | + |
| 812 | + // Structure fields are always serialized |
| 813 | + EXPECT_TRUE(serializedField<ident::struct_field>(terse)); |
| 814 | + EXPECT_TRUE(serializedField<ident::union_field>(terse)); |
| 815 | + EXPECT_TRUE(serializedField<ident::exception_field>(terse)); |
| 816 | + |
| 817 | + // Change `terse` to intrinsic default |
| 818 | + apache::thrift::clear(terse); |
| 819 | + |
| 820 | + // Numeric fields are serialized if they don't equal custom default |
| 821 | + EXPECT_TRUE(serializedField<ident::bool_field>(terse)); |
| 822 | + EXPECT_TRUE(serializedField<ident::byte_field>(terse)); |
| 823 | + EXPECT_TRUE(serializedField<ident::short_field>(terse)); |
| 824 | + EXPECT_TRUE(serializedField<ident::int_field>(terse)); |
| 825 | + EXPECT_TRUE(serializedField<ident::long_field>(terse)); |
| 826 | + EXPECT_TRUE(serializedField<ident::float_field>(terse)); |
| 827 | + EXPECT_TRUE(serializedField<ident::double_field>(terse)); |
| 828 | + |
| 829 | + // string/binary and container fields are not serialized if they are intrinsic |
| 830 | + // default |
| 831 | + EXPECT_FALSE(serializedField<ident::string_field>(terse)); |
| 832 | + EXPECT_FALSE(serializedField<ident::binary_field>(terse)); |
| 833 | + EXPECT_FALSE(serializedField<ident::list_field>(terse)); |
| 834 | + EXPECT_FALSE(serializedField<ident::set_field>(terse)); |
| 835 | + EXPECT_FALSE(serializedField<ident::map_field>(terse)); |
| 836 | + |
| 837 | + // Structure fields are always serialized |
| 838 | + EXPECT_TRUE(serializedField<ident::struct_field>(terse)); |
| 839 | + EXPECT_TRUE(serializedField<ident::union_field>(terse)); |
| 840 | + EXPECT_TRUE(serializedField<ident::exception_field>(terse)); |
| 841 | +} |
| 842 | + |
751 | 843 | } // namespace
|
0 commit comments