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 |