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 <utility> |
| 6 |
5 #include "mojo/public/cpp/bindings/array.h" | 7 #include "mojo/public/cpp/bindings/array.h" |
6 #include "mojo/public/cpp/bindings/lib/array_internal.h" | 8 #include "mojo/public/cpp/bindings/lib/array_internal.h" |
7 #include "mojo/public/cpp/bindings/lib/array_serialization.h" | 9 #include "mojo/public/cpp/bindings/lib/array_serialization.h" |
8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" | 10 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
9 #include "mojo/public/cpp/bindings/tests/container_test_util.h" | 11 #include "mojo/public/cpp/bindings/tests/container_test_util.h" |
10 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" | 12 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 | 14 |
13 namespace mojo { | 15 namespace mojo { |
14 namespace test { | 16 namespace test { |
(...skipping 23 matching lines...) Expand all Loading... |
38 bool val = i % 3 == 0; | 40 bool val = i % 3 == 0; |
39 array[i] = val; | 41 array[i] = val; |
40 EXPECT_EQ(val, array.at(i)); | 42 EXPECT_EQ(val, array.at(i)); |
41 } | 43 } |
42 } | 44 } |
43 | 45 |
44 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles. | 46 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles. |
45 TEST_F(ArrayTest, Handle) { | 47 TEST_F(ArrayTest, Handle) { |
46 MessagePipe pipe; | 48 MessagePipe pipe; |
47 Array<ScopedMessagePipeHandle> handles(2); | 49 Array<ScopedMessagePipeHandle> handles(2); |
48 handles[0] = pipe.handle0.Pass(); | 50 handles[0] = std::move(pipe.handle0); |
49 handles[1].reset(pipe.handle1.release()); | 51 handles[1].reset(pipe.handle1.release()); |
50 | 52 |
51 EXPECT_FALSE(pipe.handle0.is_valid()); | 53 EXPECT_FALSE(pipe.handle0.is_valid()); |
52 EXPECT_FALSE(pipe.handle1.is_valid()); | 54 EXPECT_FALSE(pipe.handle1.is_valid()); |
53 | 55 |
54 Array<ScopedMessagePipeHandle> handles2 = handles.Pass(); | 56 Array<ScopedMessagePipeHandle> handles2 = std::move(handles); |
55 EXPECT_TRUE(handles2[0].is_valid()); | 57 EXPECT_TRUE(handles2[0].is_valid()); |
56 EXPECT_TRUE(handles2[1].is_valid()); | 58 EXPECT_TRUE(handles2[1].is_valid()); |
57 | 59 |
58 ScopedMessagePipeHandle pipe_handle = handles2[0].Pass(); | 60 ScopedMessagePipeHandle pipe_handle = std::move(handles2[0]); |
59 EXPECT_TRUE(pipe_handle.is_valid()); | 61 EXPECT_TRUE(pipe_handle.is_valid()); |
60 EXPECT_FALSE(handles2[0].is_valid()); | 62 EXPECT_FALSE(handles2[0].is_valid()); |
61 } | 63 } |
62 | 64 |
63 // Tests that Array<ScopedMessagePipeHandle> supports closing handles. | 65 // Tests that Array<ScopedMessagePipeHandle> supports closing handles. |
64 TEST_F(ArrayTest, HandlesAreClosed) { | 66 TEST_F(ArrayTest, HandlesAreClosed) { |
65 MessagePipe pipe; | 67 MessagePipe pipe; |
66 MojoHandle pipe0_value = pipe.handle0.get().value(); | 68 MojoHandle pipe0_value = pipe.handle0.get().value(); |
67 MojoHandle pipe1_value = pipe.handle0.get().value(); | 69 MojoHandle pipe1_value = pipe.handle0.get().value(); |
68 | 70 |
69 { | 71 { |
70 Array<ScopedMessagePipeHandle> handles(2); | 72 Array<ScopedMessagePipeHandle> handles(2); |
71 handles[0] = pipe.handle0.Pass(); | 73 handles[0] = std::move(pipe.handle0); |
72 handles[1].reset(pipe.handle0.release()); | 74 handles[1].reset(pipe.handle0.release()); |
73 } | 75 } |
74 | 76 |
75 // We expect the pipes to have been closed. | 77 // We expect the pipes to have been closed. |
76 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); | 78 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); |
77 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); | 79 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); |
78 } | 80 } |
79 | 81 |
80 TEST_F(ArrayTest, Clone) { | 82 TEST_F(ArrayTest, Clone) { |
81 { | 83 { |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 Array<int32_t> array(4); | 148 Array<int32_t> array(4); |
147 for (size_t i = 0; i < array.size(); ++i) | 149 for (size_t i = 0; i < array.size(); ++i) |
148 array[i] = static_cast<int32_t>(i); | 150 array[i] = static_cast<int32_t>(i); |
149 | 151 |
150 size_t size = GetSerializedSize_(array); | 152 size_t size = GetSerializedSize_(array); |
151 EXPECT_EQ(8U + 4 * 4U, size); | 153 EXPECT_EQ(8U + 4 * 4U, size); |
152 | 154 |
153 FixedBufferForTesting buf(size); | 155 FixedBufferForTesting buf(size); |
154 Array_Data<int32_t>* data; | 156 Array_Data<int32_t>* data; |
155 ArrayValidateParams validate_params(0, false, nullptr); | 157 ArrayValidateParams validate_params(0, false, nullptr); |
156 SerializeArray_(array.Pass(), &buf, &data, &validate_params); | 158 SerializeArray_(std::move(array), &buf, &data, &validate_params); |
157 | 159 |
158 Array<int32_t> array2; | 160 Array<int32_t> array2; |
159 Deserialize_(data, &array2, nullptr); | 161 Deserialize_(data, &array2, nullptr); |
160 | 162 |
161 EXPECT_EQ(4U, array2.size()); | 163 EXPECT_EQ(4U, array2.size()); |
162 for (size_t i = 0; i < array2.size(); ++i) | 164 for (size_t i = 0; i < array2.size(); ++i) |
163 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); | 165 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); |
164 } | 166 } |
165 | 167 |
166 TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) { | 168 TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) { |
167 Array<int32_t> array(0); | 169 Array<int32_t> array(0); |
168 size_t size = GetSerializedSize_(array); | 170 size_t size = GetSerializedSize_(array); |
169 EXPECT_EQ(8U, size); | 171 EXPECT_EQ(8U, size); |
170 | 172 |
171 FixedBufferForTesting buf(size); | 173 FixedBufferForTesting buf(size); |
172 Array_Data<int32_t>* data; | 174 Array_Data<int32_t>* data; |
173 ArrayValidateParams validate_params(0, false, nullptr); | 175 ArrayValidateParams validate_params(0, false, nullptr); |
174 SerializeArray_(array.Pass(), &buf, &data, &validate_params); | 176 SerializeArray_(std::move(array), &buf, &data, &validate_params); |
175 | 177 |
176 Array<int32_t> array2; | 178 Array<int32_t> array2; |
177 Deserialize_(data, &array2, nullptr); | 179 Deserialize_(data, &array2, nullptr); |
178 EXPECT_EQ(0U, array2.size()); | 180 EXPECT_EQ(0U, array2.size()); |
179 } | 181 } |
180 | 182 |
181 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { | 183 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { |
182 Array<Array<int32_t>> array(2); | 184 Array<Array<int32_t>> array(2); |
183 for (size_t j = 0; j < array.size(); ++j) { | 185 for (size_t j = 0; j < array.size(); ++j) { |
184 Array<int32_t> inner(4); | 186 Array<int32_t> inner(4); |
185 for (size_t i = 0; i < inner.size(); ++i) | 187 for (size_t i = 0; i < inner.size(); ++i) |
186 inner[i] = static_cast<int32_t>(i + (j * 10)); | 188 inner[i] = static_cast<int32_t>(i + (j * 10)); |
187 array[j] = inner.Pass(); | 189 array[j] = std::move(inner); |
188 } | 190 } |
189 | 191 |
190 size_t size = GetSerializedSize_(array); | 192 size_t size = GetSerializedSize_(array); |
191 EXPECT_EQ(8U + 2 * 8U + 2 * (8U + 4 * 4U), size); | 193 EXPECT_EQ(8U + 2 * 8U + 2 * (8U + 4 * 4U), size); |
192 | 194 |
193 FixedBufferForTesting buf(size); | 195 FixedBufferForTesting buf(size); |
194 Array_Data<Array_Data<int32_t>*>* data; | 196 Array_Data<Array_Data<int32_t>*>* data; |
195 ArrayValidateParams validate_params( | 197 ArrayValidateParams validate_params( |
196 0, false, new ArrayValidateParams(0, false, nullptr)); | 198 0, false, new ArrayValidateParams(0, false, nullptr)); |
197 SerializeArray_(array.Pass(), &buf, &data, &validate_params); | 199 SerializeArray_(std::move(array), &buf, &data, &validate_params); |
198 | 200 |
199 Array<Array<int32_t>> array2; | 201 Array<Array<int32_t>> array2; |
200 Deserialize_(data, &array2, nullptr); | 202 Deserialize_(data, &array2, nullptr); |
201 | 203 |
202 EXPECT_EQ(2U, array2.size()); | 204 EXPECT_EQ(2U, array2.size()); |
203 for (size_t j = 0; j < array2.size(); ++j) { | 205 for (size_t j = 0; j < array2.size(); ++j) { |
204 const Array<int32_t>& inner = array2[j]; | 206 const Array<int32_t>& inner = array2[j]; |
205 EXPECT_EQ(4U, inner.size()); | 207 EXPECT_EQ(4U, inner.size()); |
206 for (size_t i = 0; i < inner.size(); ++i) | 208 for (size_t i = 0; i < inner.size(); ++i) |
207 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); | 209 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); |
208 } | 210 } |
209 } | 211 } |
210 | 212 |
211 TEST_F(ArrayTest, Serialization_ArrayOfBool) { | 213 TEST_F(ArrayTest, Serialization_ArrayOfBool) { |
212 Array<bool> array(10); | 214 Array<bool> array(10); |
213 for (size_t i = 0; i < array.size(); ++i) | 215 for (size_t i = 0; i < array.size(); ++i) |
214 array[i] = i % 2 ? true : false; | 216 array[i] = i % 2 ? true : false; |
215 | 217 |
216 size_t size = GetSerializedSize_(array); | 218 size_t size = GetSerializedSize_(array); |
217 EXPECT_EQ(8U + 8U, size); | 219 EXPECT_EQ(8U + 8U, size); |
218 | 220 |
219 FixedBufferForTesting buf(size); | 221 FixedBufferForTesting buf(size); |
220 Array_Data<bool>* data; | 222 Array_Data<bool>* data; |
221 ArrayValidateParams validate_params(0, false, nullptr); | 223 ArrayValidateParams validate_params(0, false, nullptr); |
222 SerializeArray_(array.Pass(), &buf, &data, &validate_params); | 224 SerializeArray_(std::move(array), &buf, &data, &validate_params); |
223 | 225 |
224 Array<bool> array2; | 226 Array<bool> array2; |
225 Deserialize_(data, &array2, nullptr); | 227 Deserialize_(data, &array2, nullptr); |
226 | 228 |
227 EXPECT_EQ(10U, array2.size()); | 229 EXPECT_EQ(10U, array2.size()); |
228 for (size_t i = 0; i < array2.size(); ++i) | 230 for (size_t i = 0; i < array2.size(); ++i) |
229 EXPECT_EQ(i % 2 ? true : false, array2[i]); | 231 EXPECT_EQ(i % 2 ? true : false, array2[i]); |
230 } | 232 } |
231 | 233 |
232 TEST_F(ArrayTest, Serialization_ArrayOfString) { | 234 TEST_F(ArrayTest, Serialization_ArrayOfString) { |
233 Array<String> array(10); | 235 Array<String> array(10); |
234 for (size_t i = 0; i < array.size(); ++i) { | 236 for (size_t i = 0; i < array.size(); ++i) { |
235 char c = 'A' + static_cast<char>(i); | 237 char c = 'A' + static_cast<char>(i); |
236 array[i] = String(&c, 1); | 238 array[i] = String(&c, 1); |
237 } | 239 } |
238 | 240 |
239 size_t size = GetSerializedSize_(array); | 241 size_t size = GetSerializedSize_(array); |
240 EXPECT_EQ(8U + // array header | 242 EXPECT_EQ(8U + // array header |
241 10 * 8U + // array payload (10 pointers) | 243 10 * 8U + // array payload (10 pointers) |
242 10 * (8U + // string header | 244 10 * (8U + // string header |
243 8U), // string length of 1 padded to 8 | 245 8U), // string length of 1 padded to 8 |
244 size); | 246 size); |
245 | 247 |
246 FixedBufferForTesting buf(size); | 248 FixedBufferForTesting buf(size); |
247 Array_Data<String_Data*>* data; | 249 Array_Data<String_Data*>* data; |
248 ArrayValidateParams validate_params( | 250 ArrayValidateParams validate_params( |
249 0, false, new ArrayValidateParams(0, false, nullptr)); | 251 0, false, new ArrayValidateParams(0, false, nullptr)); |
250 SerializeArray_(array.Pass(), &buf, &data, &validate_params); | 252 SerializeArray_(std::move(array), &buf, &data, &validate_params); |
251 | 253 |
252 Array<String> array2; | 254 Array<String> array2; |
253 Deserialize_(data, &array2, nullptr); | 255 Deserialize_(data, &array2, nullptr); |
254 | 256 |
255 EXPECT_EQ(10U, array2.size()); | 257 EXPECT_EQ(10U, array2.size()); |
256 for (size_t i = 0; i < array2.size(); ++i) { | 258 for (size_t i = 0; i < array2.size(); ++i) { |
257 char c = 'A' + static_cast<char>(i); | 259 char c = 'A' + static_cast<char>(i); |
258 EXPECT_EQ(String(&c, 1), array2[i]); | 260 EXPECT_EQ(String(&c, 1), array2[i]); |
259 } | 261 } |
260 } | 262 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 402 |
401 TEST_F(ArrayTest, PushBack_MoveOnly) { | 403 TEST_F(ArrayTest, PushBack_MoveOnly) { |
402 ASSERT_EQ(0u, MoveOnlyType::num_instances()); | 404 ASSERT_EQ(0u, MoveOnlyType::num_instances()); |
403 mojo::Array<MoveOnlyType> array(2); | 405 mojo::Array<MoveOnlyType> array(2); |
404 array.reset(); | 406 array.reset(); |
405 std::vector<MoveOnlyType*> value_ptrs; | 407 std::vector<MoveOnlyType*> value_ptrs; |
406 size_t capacity = array.storage().capacity(); | 408 size_t capacity = array.storage().capacity(); |
407 for (size_t i = 0; i < capacity; i++) { | 409 for (size_t i = 0; i < capacity; i++) { |
408 MoveOnlyType value; | 410 MoveOnlyType value; |
409 value_ptrs.push_back(value.ptr()); | 411 value_ptrs.push_back(value.ptr()); |
410 array.push_back(value.Pass()); | 412 array.push_back(std::move(value)); |
411 ASSERT_EQ(i + 1, array.size()); | 413 ASSERT_EQ(i + 1, array.size()); |
412 ASSERT_EQ(i + 1, value_ptrs.size()); | 414 ASSERT_EQ(i + 1, value_ptrs.size()); |
413 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); | 415 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); |
414 EXPECT_TRUE(array[i].moved()); | 416 EXPECT_TRUE(array[i].moved()); |
415 EXPECT_EQ(value_ptrs[i], array[i].ptr()); | 417 EXPECT_EQ(value_ptrs[i], array[i].ptr()); |
416 array[i].ResetMoved(); | 418 array[i].ResetMoved(); |
417 EXPECT_TRUE(array); | 419 EXPECT_TRUE(array); |
418 } | 420 } |
419 { | 421 { |
420 MoveOnlyType value; | 422 MoveOnlyType value; |
421 value_ptrs.push_back(value.ptr()); | 423 value_ptrs.push_back(value.ptr()); |
422 array.push_back(value.Pass()); | 424 array.push_back(std::move(value)); |
423 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); | 425 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); |
424 } | 426 } |
425 ASSERT_EQ(capacity + 1, array.size()); | 427 ASSERT_EQ(capacity + 1, array.size()); |
426 EXPECT_EQ(array.size(), MoveOnlyType::num_instances()); | 428 EXPECT_EQ(array.size(), MoveOnlyType::num_instances()); |
427 | 429 |
428 for (size_t i = 0; i < array.size(); i++) { | 430 for (size_t i = 0; i < array.size(); i++) { |
429 EXPECT_TRUE(array[i].moved()); | 431 EXPECT_TRUE(array[i].moved()); |
430 EXPECT_EQ(value_ptrs[i], array[i].ptr()); | 432 EXPECT_EQ(value_ptrs[i], array[i].ptr()); |
431 } | 433 } |
432 array.reset(); | 434 array.reset(); |
433 EXPECT_EQ(0u, MoveOnlyType::num_instances()); | 435 EXPECT_EQ(0u, MoveOnlyType::num_instances()); |
434 } | 436 } |
435 | 437 |
436 } // namespace | 438 } // namespace |
437 } // namespace test | 439 } // namespace test |
438 } // namespace mojo | 440 } // namespace mojo |
OLD | NEW |