| Index: mojo/public/cpp/bindings/tests/array_unittest.cc
|
| diff --git a/mojo/public/cpp/bindings/tests/array_unittest.cc b/mojo/public/cpp/bindings/tests/array_unittest.cc
|
| index 4bef4cd57001916be97b21a5f12540a47f7578aa..b0c1f6b65347228c9ef5a9e9974ad56b1da6d7c6 100644
|
| --- a/mojo/public/cpp/bindings/tests/array_unittest.cc
|
| +++ b/mojo/public/cpp/bindings/tests/array_unittest.cc
|
| @@ -2,10 +2,9 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "mojo/public/cpp/bindings/allocation_scope.h"
|
| #include "mojo/public/cpp/bindings/array.h"
|
| +#include "mojo/public/cpp/bindings/lib/array_serialization.h"
|
| #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
|
| -#include "mojo/public/cpp/bindings/lib/scratch_buffer.h"
|
| #include "mojo/public/cpp/environment/environment.h"
|
| #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -16,97 +15,57 @@ namespace {
|
|
|
| // Tests that basic Array operations work.
|
| TEST(ArrayTest, Basic) {
|
| - Environment env;
|
| -
|
| - // 8 bytes for the array, with 8 bytes left over for elements.
|
| - internal::FixedBuffer buf(8 + 8*sizeof(char));
|
| - EXPECT_EQ(16u, buf.size());
|
| -
|
| - Array<char>::Builder builder(8);
|
| - EXPECT_EQ(8u, builder.size());
|
| - for (size_t i = 0; i < builder.size(); ++i) {
|
| - char val = static_cast<char>(i*2);
|
| - builder[i] = val;
|
| - EXPECT_EQ(val, builder.at(i));
|
| - }
|
| - Array<char> array = builder.Finish();
|
| + Array<char> array(8);
|
| for (size_t i = 0; i < array.size(); ++i) {
|
| - char val = static_cast<char>(i) * 2;
|
| - EXPECT_EQ(val, array[i]);
|
| + char val = static_cast<char>(i*2);
|
| + array[i] = val;
|
| + EXPECT_EQ(val, array.at(i));
|
| }
|
| }
|
|
|
| -// Tests that basic Array<bool> operations work, and that it's packed into 1
|
| -// bit per element.
|
| +// Tests that basic Array<bool> operations work.
|
| TEST(ArrayTest, Bool) {
|
| - Environment env;
|
| -
|
| - // 8 bytes for the array header, with 8 bytes left over for elements.
|
| - internal::FixedBuffer buf(8 + 3);
|
| - EXPECT_EQ(16u, buf.size());
|
| -
|
| - // An array of 64 bools can fit into 8 bytes.
|
| - Array<bool>::Builder builder(64);
|
| - EXPECT_EQ(64u, builder.size());
|
| - for (size_t i = 0; i < builder.size(); ++i) {
|
| - bool val = i % 3 == 0;
|
| - builder[i] = val;
|
| - EXPECT_EQ(val, builder.at(i));
|
| - }
|
| - Array<bool> array = builder.Finish();
|
| + Array<bool> array(64);
|
| for (size_t i = 0; i < array.size(); ++i) {
|
| bool val = i % 3 == 0;
|
| - EXPECT_EQ(val, array[i]);
|
| + array[i] = val;
|
| + EXPECT_EQ(val, array.at(i));
|
| }
|
| }
|
|
|
| -// Tests that Array<Handle> supports transferring handles.
|
| +// Tests that Array<ScopedMessagePipeHandle> supports transferring handles.
|
| TEST(ArrayTest, Handle) {
|
| - Environment env;
|
| -
|
| - AllocationScope scope;
|
| -
|
| ScopedMessagePipeHandle pipe0, pipe1;
|
| CreateMessagePipe(&pipe0, &pipe1);
|
|
|
| - Array<MessagePipeHandle>::Builder handles_builder(2);
|
| - handles_builder[0] = pipe0.Pass();
|
| - handles_builder[1].reset(pipe1.release());
|
| + Array<ScopedMessagePipeHandle> handles(2);
|
| + handles[0] = pipe0.Pass();
|
| + handles[1].reset(pipe1.release());
|
|
|
| EXPECT_FALSE(pipe0.is_valid());
|
| EXPECT_FALSE(pipe1.is_valid());
|
|
|
| - Array<MessagePipeHandle> handles = handles_builder.Finish();
|
| - EXPECT_TRUE(handles[0].is_valid());
|
| - EXPECT_TRUE(handles[1].is_valid());
|
| + Array<ScopedMessagePipeHandle> handles2 = handles.Pass();
|
| + EXPECT_TRUE(handles2[0].is_valid());
|
| + EXPECT_TRUE(handles2[1].is_valid());
|
|
|
| - pipe0 = handles[0].Pass();
|
| + pipe0 = handles2[0].Pass();
|
| EXPECT_TRUE(pipe0.is_valid());
|
| - EXPECT_FALSE(handles[0].is_valid());
|
| + EXPECT_FALSE(handles2[0].is_valid());
|
| }
|
|
|
| -// Tests that Array<Handle> supports closing handles.
|
| +// Tests that Array<ScopedMessagePipeHandle> supports closing handles.
|
| TEST(ArrayTest, HandlesAreClosed) {
|
| - Environment env;
|
| -
|
| - ScopedMessagePipeHandle msg_pipe0, msg_pipe1;
|
| - CreateMessagePipe(&msg_pipe0, &msg_pipe1);
|
| -
|
| - ScopedHandle pipe0 = ScopedHandle::From(msg_pipe0.Pass());
|
| - ScopedHandle pipe1 = ScopedHandle::From(msg_pipe1.Pass());
|
| + ScopedMessagePipeHandle pipe0, pipe1;
|
| + CreateMessagePipe(&pipe0, &pipe1);
|
|
|
| MojoHandle pipe0_value = pipe0.get().value();
|
| MojoHandle pipe1_value = pipe1.get().value();
|
|
|
| {
|
| - AllocationScope scope;
|
| -
|
| - Array<Handle>::Builder handles_builder(2);
|
| - handles_builder[0] = pipe0.Pass();
|
| - handles_builder[1].reset(pipe1.release());
|
| -
|
| - MOJO_ALLOW_UNUSED Array<Handle> handles =
|
| - handles_builder.Finish();
|
| + Array<ScopedMessagePipeHandle> handles(2);
|
| + handles[0] = pipe0.Pass();
|
| + handles[1].reset(pipe1.release());
|
| }
|
|
|
| // We expect the pipes to have been closed.
|
| @@ -114,30 +73,100 @@ TEST(ArrayTest, HandlesAreClosed) {
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value));
|
| }
|
|
|
| -// Tests that Array<MessagePipeHandle> supports closing handles.
|
| -TEST(ArrayTest, MessagePipeHandlesAreClosed) {
|
| - Environment env;
|
| +TEST(ArrayTest, Serialization_ArrayOfPOD) {
|
| + Array<int32_t> array(4);
|
| + for (size_t i = 0; i < array.size(); ++i)
|
| + array[i] = static_cast<int32_t>(i);
|
|
|
| - ScopedMessagePipeHandle pipe0, pipe1;
|
| - CreateMessagePipe(&pipe0, &pipe1);
|
| + size_t size = GetSerializedSize_(array);
|
| + EXPECT_EQ(8U + 4*4U, size);
|
|
|
| - MojoHandle pipe0_value = pipe0.get().value();
|
| - MojoHandle pipe1_value = pipe1.get().value();
|
| + internal::FixedBuffer buf(size);
|
| + internal::Array_Data<int32_t>* data;
|
| + Serialize_(array.Pass(), &buf, &data);
|
|
|
| - {
|
| - AllocationScope scope;
|
| + Array<int32_t> array2;
|
| + Deserialize_(data, &array2);
|
|
|
| - Array<MessagePipeHandle>::Builder handles_builder(2);
|
| - handles_builder[0] = pipe0.Pass();
|
| - handles_builder[1].reset(pipe1.release());
|
| + EXPECT_EQ(4U, array2.size());
|
| + for (size_t i = 0; i < array2.size(); ++i)
|
| + EXPECT_EQ(static_cast<int32_t>(i), array2[i]);
|
| +}
|
|
|
| - MOJO_ALLOW_UNUSED Array<MessagePipeHandle> handles =
|
| - handles_builder.Finish();
|
| +TEST(ArrayTest, Serialization_ArrayOfArrayOfPOD) {
|
| + Array<Array<int32_t> > array(2);
|
| + for (size_t j = 0; j < array.size(); ++j) {
|
| + Array<int32_t> inner(4);
|
| + for (size_t i = 0; i < inner.size(); ++i)
|
| + inner[i] = static_cast<int32_t>(i + (j * 10));
|
| + array[j] = inner.Pass();
|
| }
|
|
|
| - // We expect the pipes to have been closed.
|
| - EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value));
|
| - EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value));
|
| + size_t size = GetSerializedSize_(array);
|
| + EXPECT_EQ(8U + 2*8U + 2*(8U + 4*4U), size);
|
| +
|
| + internal::FixedBuffer buf(size);
|
| + internal::Array_Data<internal::Array_Data<int32_t>*>* data;
|
| + Serialize_(array.Pass(), &buf, &data);
|
| +
|
| + Array<Array<int32_t> > array2;
|
| + Deserialize_(data, &array2);
|
| +
|
| + EXPECT_EQ(2U, array2.size());
|
| + for (size_t j = 0; j < array2.size(); ++j) {
|
| + const Array<int32_t>& inner = array2[j];
|
| + EXPECT_EQ(4U, inner.size());
|
| + for (size_t i = 0; i < inner.size(); ++i)
|
| + EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]);
|
| + }
|
| +}
|
| +
|
| +TEST(ArrayTest, Serialization_ArrayOfBool) {
|
| + Array<bool> array(10);
|
| + for (size_t i = 0; i < array.size(); ++i)
|
| + array[i] = i % 2 ? true : false;
|
| +
|
| + size_t size = GetSerializedSize_(array);
|
| + EXPECT_EQ(8U + 8U, size);
|
| +
|
| + internal::FixedBuffer buf(size);
|
| + internal::Array_Data<bool>* data;
|
| + Serialize_(array.Pass(), &buf, &data);
|
| +
|
| + Array<bool> array2;
|
| + Deserialize_(data, &array2);
|
| +
|
| + EXPECT_EQ(10U, array2.size());
|
| + for (size_t i = 0; i < array2.size(); ++i)
|
| + EXPECT_EQ(i % 2 ? true : false, array2[i]);
|
| +}
|
| +
|
| +TEST(ArrayTest, Serialization_ArrayOfString) {
|
| + Array<String> array(10);
|
| + for (size_t i = 0; i < array.size(); ++i) {
|
| + char c = 'A' + 1;
|
| + array[i] = String(&c, 1);
|
| + }
|
| +
|
| + size_t size = GetSerializedSize_(array);
|
| + EXPECT_EQ(8U + // array header
|
| + 10*8U + // array payload (10 pointers)
|
| + 10*(8U + // string header
|
| + 8U), // string length of 1 padded to 8
|
| + size);
|
| +
|
| + internal::FixedBuffer buf(size);
|
| + internal::Array_Data<internal::String_Data*>* data;
|
| + Serialize_(array.Pass(), &buf, &data);
|
| +
|
| + Array<String> array2;
|
| + Deserialize_(data, &array2);
|
| +
|
| + EXPECT_EQ(10U, array2.size());
|
| + for (size_t i = 0; i < array2.size(); ++i) {
|
| + char c = 'A' + 1;
|
| + EXPECT_EQ(String(&c, 1), array2[i]);
|
| + }
|
| }
|
|
|
| } // namespace
|
|
|