| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string.h> | 5 #include <string.h> |
| 6 #include <type_traits> | 6 #include <type_traits> |
| 7 | 7 |
| 8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" | 8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
| 9 #include "mojo/public/cpp/bindings/lib/validation_errors.h" | 9 #include "mojo/public/cpp/bindings/lib/validation_errors.h" |
| 10 #include "mojo/public/cpp/environment/environment.h" | |
| 11 #include "mojo/public/cpp/system/message_pipe.h" | 10 #include "mojo/public/cpp/system/message_pipe.h" |
| 12 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" | 11 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 13 |
| 15 namespace mojo { | 14 namespace mojo { |
| 16 namespace test { | 15 namespace test { |
| 17 namespace { | 16 namespace { |
| 18 | 17 |
| 19 static_assert(std::is_same<std::underlying_type<ScopedConstants::EType>::type, | 18 static_assert(std::is_same<std::underlying_type<ScopedConstants::EType>::type, |
| 20 int32_t>::value, | 19 int32_t>::value, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 72 |
| 74 OutputDataType output_data = reinterpret_cast<OutputDataType>(data); | 73 OutputDataType output_data = reinterpret_cast<OutputDataType>(data); |
| 75 output_data->DecodePointersAndHandles(&handles); | 74 output_data->DecodePointersAndHandles(&handles); |
| 76 | 75 |
| 77 using RawUType = typename mojo::internal::RemoveStructPtr<U>::type; | 76 using RawUType = typename mojo::internal::RemoveStructPtr<U>::type; |
| 78 U output(RawUType::New()); | 77 U output(RawUType::New()); |
| 79 Deserialize_(output_data, output.get()); | 78 Deserialize_(output_data, output.get()); |
| 80 return output; | 79 return output; |
| 81 } | 80 } |
| 82 | 81 |
| 83 class StructTest : public testing::Test { | |
| 84 public: | |
| 85 ~StructTest() override {} | |
| 86 | |
| 87 private: | |
| 88 Environment env_; | |
| 89 }; | |
| 90 | |
| 91 } // namespace | 82 } // namespace |
| 92 | 83 |
| 93 TEST_F(StructTest, Rect) { | 84 TEST(StructTest, Rect) { |
| 94 RectPtr rect; | 85 RectPtr rect; |
| 95 EXPECT_FALSE(rect); | 86 EXPECT_FALSE(rect); |
| 96 EXPECT_TRUE(rect.is_null()); | 87 EXPECT_TRUE(rect.is_null()); |
| 97 EXPECT_TRUE(!rect); | 88 EXPECT_TRUE(!rect); |
| 98 EXPECT_FALSE(rect); | 89 EXPECT_FALSE(rect); |
| 99 | 90 |
| 100 rect = nullptr; | 91 rect = nullptr; |
| 101 EXPECT_FALSE(rect); | 92 EXPECT_FALSE(rect); |
| 102 EXPECT_TRUE(rect.is_null()); | 93 EXPECT_TRUE(rect.is_null()); |
| 103 EXPECT_TRUE(!rect); | 94 EXPECT_TRUE(!rect); |
| 104 EXPECT_FALSE(rect); | 95 EXPECT_FALSE(rect); |
| 105 | 96 |
| 106 rect = MakeRect(); | 97 rect = MakeRect(); |
| 107 EXPECT_TRUE(rect); | 98 EXPECT_TRUE(rect); |
| 108 EXPECT_FALSE(rect.is_null()); | 99 EXPECT_FALSE(rect.is_null()); |
| 109 EXPECT_FALSE(!rect); | 100 EXPECT_FALSE(!rect); |
| 110 EXPECT_TRUE(rect); | 101 EXPECT_TRUE(rect); |
| 111 | 102 |
| 112 RectPtr null_rect = nullptr; | 103 RectPtr null_rect = nullptr; |
| 113 EXPECT_FALSE(null_rect); | 104 EXPECT_FALSE(null_rect); |
| 114 EXPECT_TRUE(null_rect.is_null()); | 105 EXPECT_TRUE(null_rect.is_null()); |
| 115 EXPECT_TRUE(!null_rect); | 106 EXPECT_TRUE(!null_rect); |
| 116 EXPECT_FALSE(null_rect); | 107 EXPECT_FALSE(null_rect); |
| 117 | 108 |
| 118 CheckRect(*rect); | 109 CheckRect(*rect); |
| 119 } | 110 } |
| 120 | 111 |
| 121 TEST_F(StructTest, Clone) { | 112 TEST(StructTest, Clone) { |
| 122 NamedRegionPtr region; | 113 NamedRegionPtr region; |
| 123 | 114 |
| 124 NamedRegionPtr clone_region = region.Clone(); | 115 NamedRegionPtr clone_region = region.Clone(); |
| 125 EXPECT_TRUE(clone_region.is_null()); | 116 EXPECT_TRUE(clone_region.is_null()); |
| 126 | 117 |
| 127 region = NamedRegion::New(); | 118 region = NamedRegion::New(); |
| 128 clone_region = region.Clone(); | 119 clone_region = region.Clone(); |
| 129 EXPECT_TRUE(clone_region->name.is_null()); | 120 EXPECT_TRUE(clone_region->name.is_null()); |
| 130 EXPECT_TRUE(clone_region->rects.is_null()); | 121 EXPECT_TRUE(clone_region->rects.is_null()); |
| 131 | 122 |
| 132 region->name = "hello world"; | 123 region->name = "hello world"; |
| 133 clone_region = region.Clone(); | 124 clone_region = region.Clone(); |
| 134 EXPECT_EQ(region->name, clone_region->name); | 125 EXPECT_EQ(region->name, clone_region->name); |
| 135 | 126 |
| 136 region->rects = Array<RectPtr>::New(2); | 127 region->rects = Array<RectPtr>::New(2); |
| 137 region->rects[1] = MakeRect(); | 128 region->rects[1] = MakeRect(); |
| 138 clone_region = region.Clone(); | 129 clone_region = region.Clone(); |
| 139 EXPECT_EQ(2u, clone_region->rects.size()); | 130 EXPECT_EQ(2u, clone_region->rects.size()); |
| 140 EXPECT_TRUE(clone_region->rects[0].is_null()); | 131 EXPECT_TRUE(clone_region->rects[0].is_null()); |
| 141 CheckRect(*clone_region->rects[1]); | 132 CheckRect(*clone_region->rects[1]); |
| 142 | 133 |
| 143 // NoDefaultFieldValues contains handles, so Clone() is not available, but | 134 // NoDefaultFieldValues contains handles, so Clone() is not available, but |
| 144 // NoDefaultFieldValuesPtr should still compile. | 135 // NoDefaultFieldValuesPtr should still compile. |
| 145 NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New()); | 136 NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New()); |
| 146 EXPECT_FALSE(no_default_field_values->f13.is_valid()); | 137 EXPECT_FALSE(no_default_field_values->f13.is_valid()); |
| 147 } | 138 } |
| 148 | 139 |
| 149 // Serialization test of a struct with no pointer or handle members. | 140 // Serialization test of a struct with no pointer or handle members. |
| 150 TEST_F(StructTest, Serialization_Basic) { | 141 TEST(StructTest, Serialization_Basic) { |
| 151 RectPtr rect(MakeRect()); | 142 RectPtr rect(MakeRect()); |
| 152 | 143 |
| 153 size_t size = GetSerializedSize_(*rect); | 144 size_t size = GetSerializedSize_(*rect); |
| 154 EXPECT_EQ(8U + 16U, size); | 145 EXPECT_EQ(8U + 16U, size); |
| 155 | 146 |
| 156 mojo::internal::FixedBufferForTesting buf(size); | 147 mojo::internal::FixedBufferForTesting buf(size); |
| 157 internal::Rect_Data* data; | 148 internal::Rect_Data* data; |
| 158 EXPECT_EQ(mojo::internal::ValidationError::NONE, | 149 EXPECT_EQ(mojo::internal::ValidationError::NONE, |
| 159 Serialize_(rect.get(), &buf, &data)); | 150 Serialize_(rect.get(), &buf, &data)); |
| 160 | 151 |
| 161 RectPtr rect2(Rect::New()); | 152 RectPtr rect2(Rect::New()); |
| 162 Deserialize_(data, rect2.get()); | 153 Deserialize_(data, rect2.get()); |
| 163 | 154 |
| 164 CheckRect(*rect2); | 155 CheckRect(*rect2); |
| 165 } | 156 } |
| 166 | 157 |
| 167 // Construction of a struct with struct pointers from null. | 158 // Construction of a struct with struct pointers from null. |
| 168 TEST_F(StructTest, Construction_StructPointers) { | 159 TEST(StructTest, Construction_StructPointers) { |
| 169 RectPairPtr pair; | 160 RectPairPtr pair; |
| 170 EXPECT_TRUE(pair.is_null()); | 161 EXPECT_TRUE(pair.is_null()); |
| 171 | 162 |
| 172 pair = RectPair::New(); | 163 pair = RectPair::New(); |
| 173 EXPECT_FALSE(pair.is_null()); | 164 EXPECT_FALSE(pair.is_null()); |
| 174 EXPECT_TRUE(pair->first.is_null()); | 165 EXPECT_TRUE(pair->first.is_null()); |
| 175 EXPECT_TRUE(pair->first.is_null()); | 166 EXPECT_TRUE(pair->first.is_null()); |
| 176 | 167 |
| 177 pair = nullptr; | 168 pair = nullptr; |
| 178 EXPECT_TRUE(pair.is_null()); | 169 EXPECT_TRUE(pair.is_null()); |
| 179 } | 170 } |
| 180 | 171 |
| 181 // Serialization test of a struct with struct pointers. | 172 // Serialization test of a struct with struct pointers. |
| 182 TEST_F(StructTest, Serialization_StructPointers) { | 173 TEST(StructTest, Serialization_StructPointers) { |
| 183 RectPairPtr pair(RectPair::New()); | 174 RectPairPtr pair(RectPair::New()); |
| 184 pair->first = MakeRect(); | 175 pair->first = MakeRect(); |
| 185 pair->second = MakeRect(); | 176 pair->second = MakeRect(); |
| 186 | 177 |
| 187 size_t size = GetSerializedSize_(*pair); | 178 size_t size = GetSerializedSize_(*pair); |
| 188 EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size); | 179 EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size); |
| 189 | 180 |
| 190 mojo::internal::FixedBufferForTesting buf(size); | 181 mojo::internal::FixedBufferForTesting buf(size); |
| 191 internal::RectPair_Data* data; | 182 internal::RectPair_Data* data; |
| 192 EXPECT_EQ(mojo::internal::ValidationError::NONE, | 183 EXPECT_EQ(mojo::internal::ValidationError::NONE, |
| 193 Serialize_(pair.get(), &buf, &data)); | 184 Serialize_(pair.get(), &buf, &data)); |
| 194 | 185 |
| 195 RectPairPtr pair2(RectPair::New()); | 186 RectPairPtr pair2(RectPair::New()); |
| 196 Deserialize_(data, pair2.get()); | 187 Deserialize_(data, pair2.get()); |
| 197 | 188 |
| 198 CheckRect(*pair2->first); | 189 CheckRect(*pair2->first); |
| 199 CheckRect(*pair2->second); | 190 CheckRect(*pair2->second); |
| 200 } | 191 } |
| 201 | 192 |
| 202 // Serialization test of a struct with an array member. | 193 // Serialization test of a struct with an array member. |
| 203 TEST_F(StructTest, Serialization_ArrayPointers) { | 194 TEST(StructTest, Serialization_ArrayPointers) { |
| 204 NamedRegionPtr region(NamedRegion::New()); | 195 NamedRegionPtr region(NamedRegion::New()); |
| 205 region->name = "region"; | 196 region->name = "region"; |
| 206 region->rects = Array<RectPtr>::New(4); | 197 region->rects = Array<RectPtr>::New(4); |
| 207 for (size_t i = 0; i < region->rects.size(); ++i) | 198 for (size_t i = 0; i < region->rects.size(); ++i) |
| 208 region->rects[i] = MakeRect(static_cast<int32_t>(i) + 1); | 199 region->rects[i] = MakeRect(static_cast<int32_t>(i) + 1); |
| 209 | 200 |
| 210 size_t size = GetSerializedSize_(*region); | 201 size_t size = GetSerializedSize_(*region); |
| 211 EXPECT_EQ(8U + // header | 202 EXPECT_EQ(8U + // header |
| 212 8U + // name pointer | 203 8U + // name pointer |
| 213 8U + // rects pointer | 204 8U + // rects pointer |
| (...skipping 14 matching lines...) Expand all Loading... |
| 228 Deserialize_(data, region2.get()); | 219 Deserialize_(data, region2.get()); |
| 229 | 220 |
| 230 EXPECT_EQ(String("region"), region2->name); | 221 EXPECT_EQ(String("region"), region2->name); |
| 231 | 222 |
| 232 EXPECT_EQ(4U, region2->rects.size()); | 223 EXPECT_EQ(4U, region2->rects.size()); |
| 233 for (size_t i = 0; i < region2->rects.size(); ++i) | 224 for (size_t i = 0; i < region2->rects.size(); ++i) |
| 234 CheckRect(*region2->rects[i], static_cast<int32_t>(i) + 1); | 225 CheckRect(*region2->rects[i], static_cast<int32_t>(i) + 1); |
| 235 } | 226 } |
| 236 | 227 |
| 237 // Serialization test of a struct with null array pointers. | 228 // Serialization test of a struct with null array pointers. |
| 238 TEST_F(StructTest, Serialization_NullArrayPointers) { | 229 TEST(StructTest, Serialization_NullArrayPointers) { |
| 239 NamedRegionPtr region(NamedRegion::New()); | 230 NamedRegionPtr region(NamedRegion::New()); |
| 240 EXPECT_TRUE(region->name.is_null()); | 231 EXPECT_TRUE(region->name.is_null()); |
| 241 EXPECT_TRUE(region->rects.is_null()); | 232 EXPECT_TRUE(region->rects.is_null()); |
| 242 | 233 |
| 243 size_t size = GetSerializedSize_(*region); | 234 size_t size = GetSerializedSize_(*region); |
| 244 EXPECT_EQ(8U + // header | 235 EXPECT_EQ(8U + // header |
| 245 8U + // name pointer | 236 8U + // name pointer |
| 246 8U, // rects pointer | 237 8U, // rects pointer |
| 247 size); | 238 size); |
| 248 | 239 |
| 249 mojo::internal::FixedBufferForTesting buf(size); | 240 mojo::internal::FixedBufferForTesting buf(size); |
| 250 internal::NamedRegion_Data* data; | 241 internal::NamedRegion_Data* data; |
| 251 EXPECT_EQ(mojo::internal::ValidationError::NONE, | 242 EXPECT_EQ(mojo::internal::ValidationError::NONE, |
| 252 Serialize_(region.get(), &buf, &data)); | 243 Serialize_(region.get(), &buf, &data)); |
| 253 | 244 |
| 254 NamedRegionPtr region2(NamedRegion::New()); | 245 NamedRegionPtr region2(NamedRegion::New()); |
| 255 Deserialize_(data, region2.get()); | 246 Deserialize_(data, region2.get()); |
| 256 | 247 |
| 257 EXPECT_TRUE(region2->name.is_null()); | 248 EXPECT_TRUE(region2->name.is_null()); |
| 258 EXPECT_TRUE(region2->rects.is_null()); | 249 EXPECT_TRUE(region2->rects.is_null()); |
| 259 } | 250 } |
| 260 | 251 |
| 261 TEST_F(StructTest, Serialization_InterfaceRequest) { | 252 TEST(StructTest, Serialization_InterfaceRequest) { |
| 262 ContainsInterfaceRequest iface_req_struct; | 253 ContainsInterfaceRequest iface_req_struct; |
| 263 | 254 |
| 264 auto size = GetSerializedSize_(iface_req_struct); | 255 auto size = GetSerializedSize_(iface_req_struct); |
| 265 EXPECT_EQ(8U // struct header | 256 EXPECT_EQ(8U // struct header |
| 266 + 4U // interface request handle | 257 + 4U // interface request handle |
| 267 + 4U, // interface request nullable handle | 258 + 4U, // interface request nullable handle |
| 268 size); | 259 size); |
| 269 | 260 |
| 270 mojo::internal::FixedBufferForTesting buf(size * 2); | 261 mojo::internal::FixedBufferForTesting buf(size * 2); |
| 271 ContainsInterfaceRequest::Data_* data; | 262 ContainsInterfaceRequest::Data_* data; |
| 272 | 263 |
| 273 // Test failure when non-nullable interface request is null. | 264 // Test failure when non-nullable interface request is null. |
| 274 EXPECT_EQ(mojo::internal::ValidationError::UNEXPECTED_INVALID_HANDLE, | 265 EXPECT_EQ(mojo::internal::ValidationError::UNEXPECTED_INVALID_HANDLE, |
| 275 Serialize_(&iface_req_struct, &buf, &data)); | 266 Serialize_(&iface_req_struct, &buf, &data)); |
| 276 | 267 |
| 277 SomeInterfacePtr i_ptr; | 268 SomeInterfacePtr i_ptr; |
| 278 iface_req_struct.req = GetProxy(&i_ptr); | 269 iface_req_struct.req = GetProxy(&i_ptr); |
| 279 EXPECT_TRUE(iface_req_struct.req.is_pending()); | 270 EXPECT_TRUE(iface_req_struct.req.is_pending()); |
| 280 | 271 |
| 281 EXPECT_EQ(mojo::internal::ValidationError::NONE, | 272 EXPECT_EQ(mojo::internal::ValidationError::NONE, |
| 282 Serialize_(&iface_req_struct, &buf, &data)); | 273 Serialize_(&iface_req_struct, &buf, &data)); |
| 283 EXPECT_FALSE(iface_req_struct.req.is_pending()); | 274 EXPECT_FALSE(iface_req_struct.req.is_pending()); |
| 284 | 275 |
| 285 Deserialize_(data, &iface_req_struct); | 276 Deserialize_(data, &iface_req_struct); |
| 286 EXPECT_TRUE(iface_req_struct.req.is_pending()); | 277 EXPECT_TRUE(iface_req_struct.req.is_pending()); |
| 287 } | 278 } |
| 288 | 279 |
| 289 // Tests deserializing structs as a newer version. | 280 // Tests deserializing structs as a newer version. |
| 290 TEST_F(StructTest, Versioning_OldToNew) { | 281 TEST(StructTest, Versioning_OldToNew) { |
| 291 { | 282 { |
| 292 MultiVersionStructV0Ptr input(MultiVersionStructV0::New()); | 283 MultiVersionStructV0Ptr input(MultiVersionStructV0::New()); |
| 293 input->f_int32 = 123; | 284 input->f_int32 = 123; |
| 294 MultiVersionStructPtr expected_output(MultiVersionStruct::New()); | 285 MultiVersionStructPtr expected_output(MultiVersionStruct::New()); |
| 295 expected_output->f_int32 = 123; | 286 expected_output->f_int32 = 123; |
| 296 | 287 |
| 297 MultiVersionStructPtr output = | 288 MultiVersionStructPtr output = |
| 298 SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); | 289 SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
| 299 EXPECT_TRUE(output); | 290 EXPECT_TRUE(output); |
| 300 EXPECT_TRUE(output->Equals(*expected_output)); | 291 EXPECT_TRUE(output->Equals(*expected_output)); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 MultiVersionStructPtr output = | 371 MultiVersionStructPtr output = |
| 381 SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); | 372 SerializeAndDeserialize<MultiVersionStructPtr>(input.Pass()); |
| 382 EXPECT_TRUE(output); | 373 EXPECT_TRUE(output); |
| 383 EXPECT_EQ(expected_handle, output->f_message_pipe.get().value()); | 374 EXPECT_EQ(expected_handle, output->f_message_pipe.get().value()); |
| 384 output->f_message_pipe.reset(); | 375 output->f_message_pipe.reset(); |
| 385 EXPECT_TRUE(output->Equals(*expected_output)); | 376 EXPECT_TRUE(output->Equals(*expected_output)); |
| 386 } | 377 } |
| 387 } | 378 } |
| 388 | 379 |
| 389 // Tests deserializing structs as an older version. | 380 // Tests deserializing structs as an older version. |
| 390 TEST_F(StructTest, Versioning_NewToOld) { | 381 TEST(StructTest, Versioning_NewToOld) { |
| 391 { | 382 { |
| 392 MultiVersionStructPtr input = MakeMultiVersionStruct(); | 383 MultiVersionStructPtr input = MakeMultiVersionStruct(); |
| 393 MultiVersionStructV7Ptr expected_output(MultiVersionStructV7::New()); | 384 MultiVersionStructV7Ptr expected_output(MultiVersionStructV7::New()); |
| 394 expected_output->f_int32 = 123; | 385 expected_output->f_int32 = 123; |
| 395 expected_output->f_rect = MakeRect(5); | 386 expected_output->f_rect = MakeRect(5); |
| 396 expected_output->f_string = "hello"; | 387 expected_output->f_string = "hello"; |
| 397 expected_output->f_array = Array<int8_t>::New(3); | 388 expected_output->f_array = Array<int8_t>::New(3); |
| 398 expected_output->f_array[0] = 10; | 389 expected_output->f_array[0] = 10; |
| 399 expected_output->f_array[1] = 9; | 390 expected_output->f_array[1] = 9; |
| 400 expected_output->f_array[2] = 8; | 391 expected_output->f_array[2] = 8; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 449 |
| 459 MultiVersionStructV0Ptr output = | 450 MultiVersionStructV0Ptr output = |
| 460 SerializeAndDeserialize<MultiVersionStructV0Ptr>(input.Pass()); | 451 SerializeAndDeserialize<MultiVersionStructV0Ptr>(input.Pass()); |
| 461 EXPECT_TRUE(output); | 452 EXPECT_TRUE(output); |
| 462 EXPECT_TRUE(output->Equals(*expected_output)); | 453 EXPECT_TRUE(output->Equals(*expected_output)); |
| 463 } | 454 } |
| 464 } | 455 } |
| 465 | 456 |
| 466 } // namespace test | 457 } // namespace test |
| 467 } // namespace mojo | 458 } // namespace mojo |
| OLD | NEW |