Index: mojo/public/cpp/bindings/tests/array_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/array_unittest.cc b/mojo/public/cpp/bindings/tests/array_unittest.cc |
index 6d424dbd601f84d21e655565b1f7bc9ef249d73d..c61113cd82f530613cd6489cd3a74b609cd2d5b4 100644 |
--- a/mojo/public/cpp/bindings/tests/array_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/array_unittest.cc |
@@ -435,26 +435,22 @@ TEST_F(ArrayTest, Serialization_ArrayOfInterfacePtr) { |
// Test serializing and deserializing a struct with an Array<> of another struct |
// which has an InterfacePtr. |
-TEST_F(ArrayTest, Serialization_StructWithArrayOfIntefacePtr) { |
+TEST_F(ArrayTest, Serialization_StructWithArrayOfInterfacePtr) { |
StructWithInterfaceArray struct_arr_iface; |
struct_arr_iface.structs_array = Array<StructWithInterfacePtr>::New(1); |
struct_arr_iface.nullable_structs_array = |
Array<StructWithInterfacePtr>::New(1); |
size_t size = GetSerializedSize_(struct_arr_iface); |
- EXPECT_EQ(8U // struct header |
- + 8U // offset to |structs_array| |
- + (8U // array header |
- + 8U // offset to StructWithInterface |
- + (8U // StructWithInterface header |
- + 8U)) // Interface_Data |
- + 8U // offset to |structs_nullable_array| |
- + 8U // offset to |nullable_structs_array| |
- + (8U // array header |
- + 8U // offset to StructWithinInterface |
- + (8U // StructWithInterface header |
- + 8U)) // Interface_Data |
- + 8U, // offset to |nullable_structs_nullable_array| |
+ EXPECT_EQ(8U // struct header |
+ + 8U // offset to |structs_array| |
+ + (8U // array header |
+ + 8U) // offset to StructWithInterface (nullptr) |
+ + 8U // offset to |structs_nullable_array| |
+ + 8U // offset to |nullable_structs_array| |
+ + (8U // array header |
+ + 8U) // offset to StructWithinInterface (nullptr) |
+ + 8U, // offset to |nullable_structs_nullable_array| |
size); |
FixedBufferForTesting buf(size * 2); |
@@ -751,6 +747,87 @@ TEST_F(ArrayTest, Iterator) { |
} |
} |
+// Test serializing and deserializing of an array with null elements. |
+TEST_F(ArrayTest, Serialization_ArrayOfStructPtr) { |
+ ArrayValidateParams validate_nullable(2, true, nullptr); |
+ ArrayValidateParams validate_non_nullable(2, false, nullptr); |
+ |
+ Array<RectPtr> array = Array<RectPtr>::New(2); |
+ array[1] = Rect::New(); |
+ array[1]->x = 1; |
+ array[1]->y = 2; |
+ array[1]->width = 3; |
+ array[1]->height = 4; |
+ |
+ size_t size_with_null = GetSerializedSize_(array); |
+ EXPECT_EQ(8U + // array header |
+ 2 * 8U + // array payload (2 pointers) |
+ 8U + 4 * 4U, // struct header + contents (4 int32) |
+ size_with_null); |
+ Array_Data<Rect::Data_*>* output_with_null; |
+ |
+ // 1. Array with non-nullable structs should fail serialization due to |
+ // the null first element. |
+ { |
+ FixedBufferForTesting buf_with_null(size_with_null); |
+ EXPECT_EQ(mojo::internal::ValidationError::UNEXPECTED_NULL_POINTER, |
+ SerializeArray_(&array, &buf_with_null, &output_with_null, |
+ &validate_non_nullable)); |
+ } |
+ |
+ // 2. Array with nullable structs should succeed. |
+ { |
+ FixedBufferForTesting buf_with_null(size_with_null); |
+ EXPECT_EQ(mojo::internal::ValidationError::NONE, |
+ SerializeArray_(&array, &buf_with_null, &output_with_null, |
+ &validate_nullable)); |
+ |
+ Array<RectPtr> array2; |
+ Deserialize_(output_with_null, &array2); |
+ EXPECT_TRUE(array2[0].is_null()); |
+ EXPECT_FALSE(array2[1].is_null()); |
+ EXPECT_EQ(1, array2[1]->x); |
+ EXPECT_EQ(2, array2[1]->y); |
+ EXPECT_EQ(3, array2[1]->width); |
+ EXPECT_EQ(4, array2[1]->height); |
+ } |
+ |
+ // 3. Array with non-nullable structs should succeed after we fill in |
+ // the missing first element. |
+ { |
+ array[0] = Rect::New(); |
+ array[0]->x = -1; |
+ array[0]->y = -2; |
+ array[0]->width = -3; |
+ array[0]->height = -4; |
+ |
+ size_t size_without_null = GetSerializedSize_(array); |
+ EXPECT_EQ(8U + // array header |
+ 2 * 8U + // array payload (2 pointers) |
+ 2 * (8U + 4 * 4U), // struct header + contents (4 int32) |
+ size_without_null); |
+ |
+ FixedBufferForTesting buf_without_null(size_without_null); |
+ Array_Data<Rect::Data_*>* output_without_null; |
+ EXPECT_EQ(mojo::internal::ValidationError::NONE, |
+ SerializeArray_(&array, &buf_without_null, &output_without_null, |
+ &validate_non_nullable)); |
+ |
+ Array<RectPtr> array3; |
+ Deserialize_(output_without_null, &array3); |
+ EXPECT_FALSE(array3[0].is_null()); |
+ EXPECT_EQ(-1, array3[0]->x); |
+ EXPECT_EQ(-2, array3[0]->y); |
+ EXPECT_EQ(-3, array3[0]->width); |
+ EXPECT_EQ(-4, array3[0]->height); |
+ EXPECT_FALSE(array3[1].is_null()); |
+ EXPECT_EQ(1, array3[1]->x); |
+ EXPECT_EQ(2, array3[1]->y); |
+ EXPECT_EQ(3, array3[1]->width); |
+ EXPECT_EQ(4, array3[1]->height); |
+ } |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace mojo |