| 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 |