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 "mojo/public/cpp/bindings/array.h" | 5 #include "mojo/public/cpp/bindings/array.h" |
6 #include "mojo/public/cpp/bindings/lib/array_internal.h" | 6 #include "mojo/public/cpp/bindings/lib/array_internal.h" |
7 #include "mojo/public/cpp/bindings/lib/array_serialization.h" | 7 #include "mojo/public/cpp/bindings/lib/array_serialization.h" |
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/environment/environment.h" | 9 #include "mojo/public/cpp/environment/environment.h" |
| 10 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
11 | 12 |
12 namespace mojo { | 13 namespace mojo { |
13 namespace test { | 14 namespace test { |
14 namespace { | 15 namespace { |
15 | 16 |
| 17 using mojo::internal::Array_Data; |
| 18 using mojo::internal::ArrayValidateParams; |
| 19 using mojo::internal::FixedBuffer; |
| 20 using mojo::internal::NoValidateParams; |
| 21 using mojo::internal::String_Data; |
| 22 |
16 class CopyableType { | 23 class CopyableType { |
17 public: | 24 public: |
18 CopyableType() : copied_(false), ptr_(this) { num_instances_++; } | 25 CopyableType() : copied_(false), ptr_(this) { num_instances_++; } |
19 CopyableType(const CopyableType& other) : copied_(true), ptr_(other.ptr()) { | 26 CopyableType(const CopyableType& other) : copied_(true), ptr_(other.ptr()) { |
20 num_instances_++; | 27 num_instances_++; |
21 } | 28 } |
22 CopyableType& operator=(const CopyableType& other) { | 29 CopyableType& operator=(const CopyableType& other) { |
23 copied_ = true; | 30 copied_ = true; |
24 ptr_ = other.ptr(); | 31 ptr_ = other.ptr(); |
25 return *this; | 32 return *this; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 Array<ScopedMessagePipeHandle> handles(2); | 131 Array<ScopedMessagePipeHandle> handles(2); |
125 handles[0] = pipe.handle0.Pass(); | 132 handles[0] = pipe.handle0.Pass(); |
126 handles[1].reset(pipe.handle0.release()); | 133 handles[1].reset(pipe.handle0.release()); |
127 } | 134 } |
128 | 135 |
129 // We expect the pipes to have been closed. | 136 // We expect the pipes to have been closed. |
130 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); | 137 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); |
131 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); | 138 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); |
132 } | 139 } |
133 | 140 |
| 141 TEST_F(ArrayTest, Clone) { |
| 142 { |
| 143 // Test POD. |
| 144 Array<int32_t> array(3); |
| 145 for (size_t i = 0; i < array.size(); ++i) |
| 146 array[i] = static_cast<int32_t>(i); |
| 147 |
| 148 Array<int32_t> clone_array = array.Clone(); |
| 149 EXPECT_EQ(array.size(), clone_array.size()); |
| 150 for (size_t i = 0; i < array.size(); ++i) |
| 151 EXPECT_EQ(array[i], clone_array[i]); |
| 152 } |
| 153 |
| 154 { |
| 155 // Test copyable object. |
| 156 Array<String> array(2); |
| 157 array[0] = "hello"; |
| 158 array[1] = "world"; |
| 159 |
| 160 Array<String> clone_array = array.Clone(); |
| 161 EXPECT_EQ(array.size(), clone_array.size()); |
| 162 for (size_t i = 0; i < array.size(); ++i) |
| 163 EXPECT_EQ(array[i], clone_array[i]); |
| 164 } |
| 165 |
| 166 { |
| 167 // Test struct. |
| 168 Array<RectPtr> array(2); |
| 169 array[1] = Rect::New(); |
| 170 array[1]->x = 1; |
| 171 array[1]->y = 2; |
| 172 array[1]->width = 3; |
| 173 array[1]->height = 4; |
| 174 |
| 175 Array<RectPtr> clone_array = array.Clone(); |
| 176 EXPECT_EQ(array.size(), clone_array.size()); |
| 177 EXPECT_TRUE(clone_array[0].is_null()); |
| 178 EXPECT_EQ(array[1]->x, clone_array[1]->x); |
| 179 EXPECT_EQ(array[1]->y, clone_array[1]->y); |
| 180 EXPECT_EQ(array[1]->width, clone_array[1]->width); |
| 181 EXPECT_EQ(array[1]->height, clone_array[1]->height); |
| 182 } |
| 183 |
| 184 { |
| 185 // Test array of array. |
| 186 Array<Array<int8_t>> array(2); |
| 187 array[1] = Array<int8_t>(2); |
| 188 array[1][0] = 0; |
| 189 array[1][1] = 1; |
| 190 |
| 191 Array<Array<int8_t>> clone_array = array.Clone(); |
| 192 EXPECT_EQ(array.size(), clone_array.size()); |
| 193 EXPECT_TRUE(clone_array[0].is_null()); |
| 194 EXPECT_EQ(array[1].size(), clone_array[1].size()); |
| 195 EXPECT_EQ(array[1][0], clone_array[1][0]); |
| 196 EXPECT_EQ(array[1][1], clone_array[1][1]); |
| 197 } |
| 198 |
| 199 { |
| 200 // Test that array of handles still works although Clone() is not available. |
| 201 Array<ScopedMessagePipeHandle> array(10); |
| 202 EXPECT_FALSE(array[0].is_valid()); |
| 203 } |
| 204 } |
| 205 |
134 TEST_F(ArrayTest, Serialization_ArrayOfPOD) { | 206 TEST_F(ArrayTest, Serialization_ArrayOfPOD) { |
135 Array<int32_t> array(4); | 207 Array<int32_t> array(4); |
136 for (size_t i = 0; i < array.size(); ++i) | 208 for (size_t i = 0; i < array.size(); ++i) |
137 array[i] = static_cast<int32_t>(i); | 209 array[i] = static_cast<int32_t>(i); |
138 | 210 |
139 size_t size = GetSerializedSize_(array); | 211 size_t size = GetSerializedSize_(array); |
140 EXPECT_EQ(8U + 4*4U, size); | 212 EXPECT_EQ(8U + 4*4U, size); |
141 | 213 |
142 internal::FixedBuffer buf(size); | 214 FixedBuffer buf(size); |
143 internal::Array_Data<int32_t>* data; | 215 Array_Data<int32_t>* data; |
144 SerializeArray_<internal::ArrayValidateParams<0, false, | 216 SerializeArray_<ArrayValidateParams<0, false, NoValidateParams>>( |
145 internal::NoValidateParams> >( | |
146 array.Pass(), &buf, &data); | 217 array.Pass(), &buf, &data); |
147 | 218 |
148 Array<int32_t> array2; | 219 Array<int32_t> array2; |
149 Deserialize_(data, &array2); | 220 Deserialize_(data, &array2); |
150 | 221 |
151 EXPECT_EQ(4U, array2.size()); | 222 EXPECT_EQ(4U, array2.size()); |
152 for (size_t i = 0; i < array2.size(); ++i) | 223 for (size_t i = 0; i < array2.size(); ++i) |
153 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); | 224 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); |
154 } | 225 } |
155 | 226 |
156 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { | 227 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { |
157 Array<Array<int32_t> > array(2); | 228 Array<Array<int32_t>> array(2); |
158 for (size_t j = 0; j < array.size(); ++j) { | 229 for (size_t j = 0; j < array.size(); ++j) { |
159 Array<int32_t> inner(4); | 230 Array<int32_t> inner(4); |
160 for (size_t i = 0; i < inner.size(); ++i) | 231 for (size_t i = 0; i < inner.size(); ++i) |
161 inner[i] = static_cast<int32_t>(i + (j * 10)); | 232 inner[i] = static_cast<int32_t>(i + (j * 10)); |
162 array[j] = inner.Pass(); | 233 array[j] = inner.Pass(); |
163 } | 234 } |
164 | 235 |
165 size_t size = GetSerializedSize_(array); | 236 size_t size = GetSerializedSize_(array); |
166 EXPECT_EQ(8U + 2*8U + 2*(8U + 4*4U), size); | 237 EXPECT_EQ(8U + 2*8U + 2*(8U + 4*4U), size); |
167 | 238 |
168 internal::FixedBuffer buf(size); | 239 FixedBuffer buf(size); |
169 internal::Array_Data<internal::Array_Data<int32_t>*>* data; | 240 Array_Data<Array_Data<int32_t>*>* data; |
170 SerializeArray_<internal::ArrayValidateParams<0, false, | 241 SerializeArray_<ArrayValidateParams<0, false, |
171 internal::ArrayValidateParams<0, false, | 242 ArrayValidateParams<0, false, |
172 internal::NoValidateParams> > >( | 243 NoValidateParams>>>( |
173 array.Pass(), &buf, &data); | 244 array.Pass(), &buf, &data); |
174 | 245 |
175 Array<Array<int32_t> > array2; | 246 Array<Array<int32_t>> array2; |
176 Deserialize_(data, &array2); | 247 Deserialize_(data, &array2); |
177 | 248 |
178 EXPECT_EQ(2U, array2.size()); | 249 EXPECT_EQ(2U, array2.size()); |
179 for (size_t j = 0; j < array2.size(); ++j) { | 250 for (size_t j = 0; j < array2.size(); ++j) { |
180 const Array<int32_t>& inner = array2[j]; | 251 const Array<int32_t>& inner = array2[j]; |
181 EXPECT_EQ(4U, inner.size()); | 252 EXPECT_EQ(4U, inner.size()); |
182 for (size_t i = 0; i < inner.size(); ++i) | 253 for (size_t i = 0; i < inner.size(); ++i) |
183 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); | 254 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); |
184 } | 255 } |
185 } | 256 } |
186 | 257 |
187 TEST_F(ArrayTest, Serialization_ArrayOfBool) { | 258 TEST_F(ArrayTest, Serialization_ArrayOfBool) { |
188 Array<bool> array(10); | 259 Array<bool> array(10); |
189 for (size_t i = 0; i < array.size(); ++i) | 260 for (size_t i = 0; i < array.size(); ++i) |
190 array[i] = i % 2 ? true : false; | 261 array[i] = i % 2 ? true : false; |
191 | 262 |
192 size_t size = GetSerializedSize_(array); | 263 size_t size = GetSerializedSize_(array); |
193 EXPECT_EQ(8U + 8U, size); | 264 EXPECT_EQ(8U + 8U, size); |
194 | 265 |
195 internal::FixedBuffer buf(size); | 266 FixedBuffer buf(size); |
196 internal::Array_Data<bool>* data; | 267 Array_Data<bool>* data; |
197 SerializeArray_<internal::ArrayValidateParams<0, false, | 268 SerializeArray_<ArrayValidateParams<0, false, NoValidateParams>>( |
198 internal::NoValidateParams> >( | |
199 array.Pass(), &buf, &data); | 269 array.Pass(), &buf, &data); |
200 | 270 |
201 Array<bool> array2; | 271 Array<bool> array2; |
202 Deserialize_(data, &array2); | 272 Deserialize_(data, &array2); |
203 | 273 |
204 EXPECT_EQ(10U, array2.size()); | 274 EXPECT_EQ(10U, array2.size()); |
205 for (size_t i = 0; i < array2.size(); ++i) | 275 for (size_t i = 0; i < array2.size(); ++i) |
206 EXPECT_EQ(i % 2 ? true : false, array2[i]); | 276 EXPECT_EQ(i % 2 ? true : false, array2[i]); |
207 } | 277 } |
208 | 278 |
209 TEST_F(ArrayTest, Serialization_ArrayOfString) { | 279 TEST_F(ArrayTest, Serialization_ArrayOfString) { |
210 Array<String> array(10); | 280 Array<String> array(10); |
211 for (size_t i = 0; i < array.size(); ++i) { | 281 for (size_t i = 0; i < array.size(); ++i) { |
212 char c = 'A' + static_cast<char>(i); | 282 char c = 'A' + static_cast<char>(i); |
213 array[i] = String(&c, 1); | 283 array[i] = String(&c, 1); |
214 } | 284 } |
215 | 285 |
216 size_t size = GetSerializedSize_(array); | 286 size_t size = GetSerializedSize_(array); |
217 EXPECT_EQ(8U + // array header | 287 EXPECT_EQ(8U + // array header |
218 10*8U + // array payload (10 pointers) | 288 10*8U + // array payload (10 pointers) |
219 10*(8U + // string header | 289 10*(8U + // string header |
220 8U), // string length of 1 padded to 8 | 290 8U), // string length of 1 padded to 8 |
221 size); | 291 size); |
222 | 292 |
223 internal::FixedBuffer buf(size); | 293 FixedBuffer buf(size); |
224 internal::Array_Data<internal::String_Data*>* data; | 294 Array_Data<String_Data*>* data; |
225 SerializeArray_<internal::ArrayValidateParams<0, false, | 295 SerializeArray_<ArrayValidateParams<0, false, |
226 internal::ArrayValidateParams<0, false, | 296 ArrayValidateParams<0, false, |
227 internal::NoValidateParams> > >( | 297 NoValidateParams>>>( |
228 array.Pass(), &buf, &data); | 298 array.Pass(), &buf, &data); |
229 | 299 |
230 Array<String> array2; | 300 Array<String> array2; |
231 Deserialize_(data, &array2); | 301 Deserialize_(data, &array2); |
232 | 302 |
233 EXPECT_EQ(10U, array2.size()); | 303 EXPECT_EQ(10U, array2.size()); |
234 for (size_t i = 0; i < array2.size(); ++i) { | 304 for (size_t i = 0; i < array2.size(); ++i) { |
235 char c = 'A' + static_cast<char>(i); | 305 char c = 'A' + static_cast<char>(i); |
236 EXPECT_EQ(String(&c, 1), array2[i]); | 306 EXPECT_EQ(String(&c, 1), array2[i]); |
237 } | 307 } |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 EXPECT_TRUE(array[i].moved()); | 477 EXPECT_TRUE(array[i].moved()); |
408 EXPECT_EQ(value_ptrs[i], array[i].ptr()); | 478 EXPECT_EQ(value_ptrs[i], array[i].ptr()); |
409 } | 479 } |
410 array.reset(); | 480 array.reset(); |
411 EXPECT_EQ(0u, MoveOnlyType::num_instances()); | 481 EXPECT_EQ(0u, MoveOnlyType::num_instances()); |
412 } | 482 } |
413 | 483 |
414 } // namespace | 484 } // namespace |
415 } // namespace test | 485 } // namespace test |
416 } // namespace mojo | 486 } // namespace mojo |
OLD | NEW |