Skip to content

Commit 8793b00

Browse files
Mizuchifacebook-github-bot
authored andcommitted
deprecated_terse_writes behavior
Reviewed By: thedavekwon Differential Revision: D68471704 fbshipit-source-id: da2999b8a84426e9ce60ec9590da358fcf56e025
1 parent 869414d commit 8793b00

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

third-party/thrift/src/thrift/test/StructTest.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020

2121
#include <folly/Traits.h>
2222
#include <folly/portability/GTest.h>
23+
#include <thrift/lib/cpp2/op/Get.h>
24+
#include <thrift/lib/cpp2/protocol/Object.h>
2325
#include <thrift/lib/cpp2/protocol/Serializer.h>
2426

27+
using namespace apache::thrift;
2528
using namespace apache::thrift::test;
2629

2730
namespace {
@@ -748,4 +751,93 @@ TEST_F(StructTest, RefsWithStringAndContainerTerseWrites) {
748751
TEST_F(StructTest, NotEligibleForConstexpr) {
749752
[[maybe_unused]] NotEligibleForConstexpr foo;
750753
}
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+
751843
} // namespace

third-party/thrift/src/thrift/test/structs_terse.thrift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,34 @@ struct RefsWithStringAndContainerTerseWrites {
9595
@cpp.AllowLegacyNonOptionalRef
9696
2: string string_field;
9797
}
98+
99+
struct NestedStruct {
100+
1: i32 int_field = 42;
101+
}
102+
103+
union NestedUnion {
104+
1: i32 int_field = 42;
105+
}
106+
107+
exception NestedException {
108+
1: i32 int_field = 42;
109+
}
110+
111+
struct TerseFieldsWithCustomDefault {
112+
1: bool bool_field = true;
113+
2: byte byte_field = 10;
114+
3: i16 short_field = 20;
115+
4: i32 int_field = 30;
116+
5: i64 long_field = 40;
117+
6: float float_field = 50;
118+
7: double double_field = 60;
119+
8: binary binary_field = "70";
120+
9: string string_field = "80";
121+
10: list<i32> list_field = [90];
122+
11: set<i32> set_field = [100];
123+
12: map<i32, i32> map_field = {110: 10};
124+
125+
13: NestedStruct struct_field;
126+
14: NestedUnion union_field;
127+
15: NestedException exception_field;
128+
}

0 commit comments

Comments
 (0)