Index: third_party/mojo/src/mojo/public/cpp/bindings/tests/struct_unittest.cc |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/struct_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/struct_unittest.cc |
index 52d1313a489f3ce660df677aa1b08667df8e5e4a..7f5a376cc63ae5513b0fd764fd5953687a952361 100644 |
--- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/struct_unittest.cc |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/struct_unittest.cc |
@@ -2,8 +2,11 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <string.h> |
+ |
#include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
#include "mojo/public/cpp/environment/environment.h" |
+#include "mojo/public/cpp/system/message_pipe.h" |
#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -27,6 +30,48 @@ void CheckRect(const Rect& rect, int32_t factor = 1) { |
EXPECT_EQ(20 * factor, rect.height); |
} |
+MultiVersionStructPtr MakeMultiVersionStruct() { |
+ MultiVersionStructPtr output(MultiVersionStruct::New()); |
+ output->f_int32 = 123; |
+ output->f_rect = MakeRect(5); |
+ output->f_string = "hello"; |
+ output->f_array = Array<int8_t>(3); |
+ output->f_array[0] = 10; |
+ output->f_array[1] = 9; |
+ output->f_array[2] = 8; |
+ MessagePipe pipe; |
+ output->f_message_pipe = pipe.handle0.Pass(); |
+ output->f_int16 = 42; |
+ |
+ return output.Pass(); |
+} |
+ |
+template <typename U, typename T> |
+U SerializeAndDeserialize(T input) { |
+ typedef typename mojo::internal::WrapperTraits<T>::DataType InputDataType; |
+ typedef typename mojo::internal::WrapperTraits<U>::DataType OutputDataType; |
+ |
+ size_t size = GetSerializedSize_(input); |
+ mojo::internal::FixedBuffer buf(size + 32); |
+ InputDataType data; |
+ Serialize_(input.Pass(), &buf, &data); |
+ |
+ std::vector<Handle> handles; |
+ data->EncodePointersAndHandles(&handles); |
+ |
+ // Set the subsequent area to a special value, so that we can find out if we |
+ // mistakenly access the area. |
+ void* subsequent_area = buf.Allocate(32); |
+ memset(subsequent_area, 0xAA, 32); |
+ |
+ OutputDataType output_data = reinterpret_cast<OutputDataType>(data); |
+ output_data->DecodePointersAndHandles(&handles); |
+ |
+ U output; |
+ Deserialize_(output_data, &output); |
+ return output.Pass(); |
+} |
+ |
class StructTest : public testing::Test { |
public: |
~StructTest() override {} |
@@ -197,5 +242,182 @@ TEST_F(StructTest, Serialization_NullArrayPointers) { |
EXPECT_TRUE(region2->rects.is_null()); |
} |
+// Tests deserializing structs as a newer version. |
+TEST_F(StructTest, Versioning_OldToNew) { |
+ { |
+ MultiVersionStructV0Ptr input(MultiVersionStructV0::New()); |
+ input->f_int32 = 123; |
+ MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
+ expected_output->f_int32 = 123; |
+ |
+ MultiVersionStructPtr output = |
+ SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructV1Ptr input(MultiVersionStructV1::New()); |
+ input->f_int32 = 123; |
+ input->f_rect = MakeRect(5); |
+ MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ |
+ MultiVersionStructPtr output = |
+ SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructV3Ptr input(MultiVersionStructV3::New()); |
+ input->f_int32 = 123; |
+ input->f_rect = MakeRect(5); |
+ input->f_string = "hello"; |
+ MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ |
+ MultiVersionStructPtr output = |
+ SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructV5Ptr input(MultiVersionStructV5::New()); |
+ input->f_int32 = 123; |
+ input->f_rect = MakeRect(5); |
+ input->f_string = "hello"; |
+ input->f_array = Array<int8_t>(3); |
+ input->f_array[0] = 10; |
+ input->f_array[1] = 9; |
+ input->f_array[2] = 8; |
+ MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ expected_output->f_array = Array<int8_t>(3); |
+ expected_output->f_array[0] = 10; |
+ expected_output->f_array[1] = 9; |
+ expected_output->f_array[2] = 8; |
+ |
+ MultiVersionStructPtr output = |
+ SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructV7Ptr input(MultiVersionStructV7::New()); |
+ input->f_int32 = 123; |
+ input->f_rect = MakeRect(5); |
+ input->f_string = "hello"; |
+ input->f_array = Array<int8_t>(3); |
+ input->f_array[0] = 10; |
+ input->f_array[1] = 9; |
+ input->f_array[2] = 8; |
+ MessagePipe pipe; |
+ input->f_message_pipe = pipe.handle0.Pass(); |
+ |
+ MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ expected_output->f_array = Array<int8_t>(3); |
+ expected_output->f_array[0] = 10; |
+ expected_output->f_array[1] = 9; |
+ expected_output->f_array[2] = 8; |
+ // Save the raw handle value separately so that we can compare later. |
+ MojoHandle expected_handle = input->f_message_pipe.get().value(); |
+ |
+ MultiVersionStructPtr output = |
+ SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_EQ(expected_handle, output->f_message_pipe.get().value()); |
+ output->f_message_pipe.reset(); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+} |
+ |
+// Tests deserializing structs as an older version. |
+TEST_F(StructTest, Versioning_NewToOld) { |
+ { |
+ MultiVersionStructPtr input = MakeMultiVersionStruct(); |
+ MultiVersionStructV7Ptr expected_output(MultiVersionStructV7::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ expected_output->f_array = Array<int8_t>(3); |
+ expected_output->f_array[0] = 10; |
+ expected_output->f_array[1] = 9; |
+ expected_output->f_array[2] = 8; |
+ // Save the raw handle value separately so that we can compare later. |
+ MojoHandle expected_handle = input->f_message_pipe.get().value(); |
+ |
+ MultiVersionStructV7Ptr output = |
+ SerializeAndDeserialize<MultiVersionStructV7Ptr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_EQ(expected_handle, output->f_message_pipe.get().value()); |
+ output->f_message_pipe.reset(); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructPtr input = MakeMultiVersionStruct(); |
+ MultiVersionStructV5Ptr expected_output(MultiVersionStructV5::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ expected_output->f_array = Array<int8_t>(3); |
+ expected_output->f_array[0] = 10; |
+ expected_output->f_array[1] = 9; |
+ expected_output->f_array[2] = 8; |
+ |
+ MultiVersionStructV5Ptr output = |
+ SerializeAndDeserialize<MultiVersionStructV5Ptr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructPtr input = MakeMultiVersionStruct(); |
+ MultiVersionStructV3Ptr expected_output(MultiVersionStructV3::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ expected_output->f_string = "hello"; |
+ |
+ MultiVersionStructV3Ptr output = |
+ SerializeAndDeserialize<MultiVersionStructV3Ptr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructPtr input = MakeMultiVersionStruct(); |
+ MultiVersionStructV1Ptr expected_output(MultiVersionStructV1::New()); |
+ expected_output->f_int32 = 123; |
+ expected_output->f_rect = MakeRect(5); |
+ |
+ MultiVersionStructV1Ptr output = |
+ SerializeAndDeserialize<MultiVersionStructV1Ptr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+ |
+ { |
+ MultiVersionStructPtr input = MakeMultiVersionStruct(); |
+ MultiVersionStructV0Ptr expected_output(MultiVersionStructV0::New()); |
+ expected_output->f_int32 = 123; |
+ |
+ MultiVersionStructV0Ptr output = |
+ SerializeAndDeserialize<MultiVersionStructV0Ptr>(input.Pass()); |
+ EXPECT_TRUE(output); |
+ EXPECT_TRUE(output->Equals(*expected_output)); |
+ } |
+} |
+ |
} // namespace test |
} // namespace mojo |