Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: mojo/public/cpp/bindings/tests/array_unittest.cc

Issue 615063003: Mojo cpp bindings: support Clone() for structs and arrays which don't contain handles. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698