|
@@ -686,6 +686,33 @@ int main(int argc, char* argv[]) {
|
|
|
EXPECT_TRUE(map_message.IsInitialized());
|
|
|
}
|
|
|
|
|
|
+ {
|
|
|
+ // Check that adding more values to enum does not corrupt message
|
|
|
+ // when passed through an old client.
|
|
|
+ protobuf_unittest::V2MessageLite v2_message;
|
|
|
+ v2_message.set_int_field(800);
|
|
|
+ // Set enum field to the value not understood by the old client.
|
|
|
+ v2_message.set_enum_field(protobuf_unittest::V2_SECOND);
|
|
|
+ string v2_bytes = v2_message.SerializeAsString();
|
|
|
+
|
|
|
+ protobuf_unittest::V1MessageLite v1_message;
|
|
|
+ v1_message.ParseFromString(v2_bytes);
|
|
|
+ EXPECT_TRUE(v1_message.IsInitialized());
|
|
|
+ EXPECT_EQ(v1_message.int_field(), v2_message.int_field());
|
|
|
+ // V1 client does not understand V2_SECOND value, so it discards it and
|
|
|
+ // uses default value instead.
|
|
|
+ EXPECT_EQ(v1_message.enum_field(), protobuf_unittest::V1_FIRST);
|
|
|
+
|
|
|
+ // However, when re-serialized, it should preserve enum value.
|
|
|
+ string v1_bytes = v1_message.SerializeAsString();
|
|
|
+
|
|
|
+ protobuf_unittest::V2MessageLite same_v2_message;
|
|
|
+ same_v2_message.ParseFromString(v1_bytes);
|
|
|
+
|
|
|
+ EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field());
|
|
|
+ EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field());
|
|
|
+ }
|
|
|
+
|
|
|
std::cout << "PASS" << std::endl;
|
|
|
return 0;
|
|
|
}
|