Index: mojo/public/cpp/bindings/tests/data_view_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/data_view_unittest.cc b/mojo/public/cpp/bindings/tests/data_view_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7bf58e71610e48eaf8621693b6853087b73f6131 |
--- /dev/null |
+++ b/mojo/public/cpp/bindings/tests/data_view_unittest.cc |
@@ -0,0 +1,303 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <memory> |
+#include <string> |
+#include <unordered_map> |
+#include <vector> |
+ |
+#include "base/message_loop/message_loop.h" |
+#include "mojo/public/cpp/bindings/binding.h" |
+#include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
+#include "mojo/public/cpp/bindings/lib/serialization.h" |
+#include "mojo/public/interfaces/bindings/tests/test_data_view.mojom.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace mojo { |
+namespace test { |
+namespace data_view { |
+namespace { |
+ |
+class DataViewTest : public testing::Test { |
+ private: |
+ base::MessageLoop message_loop_; |
+}; |
+ |
+struct DataViewHolder { |
+ std::unique_ptr<TestStructDataView> data_view; |
+ std::unique_ptr<mojo::internal::FixedBufferForTesting> buf; |
+ mojo::internal::SerializationContext context; |
+}; |
+ |
+std::unique_ptr<DataViewHolder> SerializeTestStruct(TestStructPtr input) { |
+ std::unique_ptr<DataViewHolder> result(new DataViewHolder); |
+ |
+ size_t size = mojo::internal::PrepareToSerialize<TestStructPtr>( |
+ input, &result->context); |
+ |
+ result->buf.reset(new mojo::internal::FixedBufferForTesting(size)); |
+ internal::TestStruct_Data* data = nullptr; |
+ mojo::internal::Serialize<TestStructPtr>(input, result->buf.get(), &data, |
+ &result->context); |
+ |
+ result->data_view.reset(new TestStructDataView(data, &result->context)); |
+ return result; |
+} |
+ |
+class TestInterfaceImpl : public TestInterface { |
+ public: |
+ explicit TestInterfaceImpl(TestInterfaceRequest request) |
+ : binding_(this, std::move(request)) {} |
+ ~TestInterfaceImpl() override {} |
+ |
+ // TestInterface implementation: |
+ void Echo(int32_t value, const EchoCallback& callback) override { |
+ callback.Run(value); |
+ } |
+ |
+ private: |
+ Binding<TestInterface> binding_; |
+}; |
+ |
+} // namespace |
+ |
+TEST_F(DataViewTest, String) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_string = "hello"; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ StringDataView string_data_view; |
+ data_view.GetFStringDataView(&string_data_view); |
+ |
+ ASSERT_FALSE(string_data_view.is_null()); |
+ EXPECT_EQ(std::string("hello"), |
+ std::string(string_data_view.storage(), string_data_view.size())); |
+} |
+ |
+TEST_F(DataViewTest, NestedStruct) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_struct = NestedStruct::New(); |
+ obj->f_struct->f_int32 = 42; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ NestedStructDataView struct_data_view; |
+ data_view.GetFStructDataView(&struct_data_view); |
+ |
+ ASSERT_FALSE(struct_data_view.is_null()); |
+ EXPECT_EQ(42, struct_data_view.f_int32()); |
+} |
+ |
+TEST_F(DataViewTest, NativeStruct) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_native_struct = NativeStruct::New(); |
+ obj->f_native_struct->data = std::vector<uint8_t>({3, 2, 1}); |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ NativeStructDataView struct_data_view; |
+ data_view.GetFNativeStructDataView(&struct_data_view); |
+ |
+ ASSERT_FALSE(struct_data_view.is_null()); |
+ ASSERT_EQ(3u, struct_data_view.size()); |
+ EXPECT_EQ(3, struct_data_view[0]); |
+ EXPECT_EQ(2, struct_data_view[1]); |
+ EXPECT_EQ(1, struct_data_view[2]); |
+ EXPECT_EQ(3, *struct_data_view.data()); |
+} |
+ |
+TEST_F(DataViewTest, BoolArray) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_bool_array = {true, false}; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<bool> array_data_view; |
+ data_view.GetFBoolArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(2u, array_data_view.size()); |
+ EXPECT_TRUE(array_data_view[0]); |
+ EXPECT_FALSE(array_data_view[1]); |
+} |
+ |
+TEST_F(DataViewTest, IntegerArray) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_int32_array = {1024, 128}; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<int32_t> array_data_view; |
+ data_view.GetFInt32ArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(2u, array_data_view.size()); |
+ EXPECT_EQ(1024, array_data_view[0]); |
+ EXPECT_EQ(128, array_data_view[1]); |
+ EXPECT_EQ(1024, *array_data_view.data()); |
+} |
+ |
+TEST_F(DataViewTest, EnumArray) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_enum_array = {TestEnum::VALUE_1, TestEnum::VALUE_0}; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<TestEnum> array_data_view; |
+ data_view.GetFEnumArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(2u, array_data_view.size()); |
+ EXPECT_EQ(TestEnum::VALUE_1, array_data_view[0]); |
+ EXPECT_EQ(TestEnum::VALUE_0, array_data_view[1]); |
+ EXPECT_EQ(TestEnum::VALUE_0, *(array_data_view.data() + 1)); |
+ |
+ TestEnum output; |
+ ASSERT_TRUE(array_data_view.Read(0, &output)); |
+ EXPECT_EQ(TestEnum::VALUE_1, output); |
+} |
+ |
+TEST_F(DataViewTest, InterfaceArray) { |
+ TestInterfacePtr ptr; |
+ TestInterfaceImpl impl(GetProxy(&ptr)); |
+ |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_interface_array.push_back(std::move(ptr)); |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<TestInterfacePtr> array_data_view; |
+ data_view.GetFInterfaceArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(1u, array_data_view.size()); |
+ |
+ TestInterfacePtr ptr2 = array_data_view.Take(0); |
+ ASSERT_TRUE(ptr2); |
+ int32_t result = 0; |
+ ASSERT_TRUE(ptr2->Echo(42, &result)); |
+ EXPECT_EQ(42, result); |
+} |
+ |
+TEST_F(DataViewTest, NestedArray) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_nested_array = {{3, 4}, {2}}; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<ArrayDataView<int32_t>> array_data_view; |
+ data_view.GetFNestedArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(2u, array_data_view.size()); |
+ |
+ ArrayDataView<int32_t> nested_array_data_view; |
+ array_data_view.GetDataView(0, &nested_array_data_view); |
+ ASSERT_FALSE(nested_array_data_view.is_null()); |
+ ASSERT_EQ(2u, nested_array_data_view.size()); |
+ EXPECT_EQ(4, nested_array_data_view[1]); |
+ |
+ std::vector<int32_t> vec; |
+ ASSERT_TRUE(array_data_view.Read(1, &vec)); |
+ ASSERT_EQ(1u, vec.size()); |
+ EXPECT_EQ(2, vec[0]); |
+} |
+ |
+TEST_F(DataViewTest, StructArray) { |
+ NestedStructPtr nested_struct(NestedStruct::New()); |
+ nested_struct->f_int32 = 42; |
+ |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_struct_array.push_back(std::move(nested_struct)); |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<NestedStructDataView> array_data_view; |
+ data_view.GetFStructArrayDataView(&array_data_view); |
+ |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(1u, array_data_view.size()); |
+ |
+ NestedStructDataView struct_data_view; |
+ array_data_view.GetDataView(0, &struct_data_view); |
+ ASSERT_FALSE(struct_data_view.is_null()); |
+ EXPECT_EQ(42, struct_data_view.f_int32()); |
+ |
+ NestedStructPtr nested_struct2; |
+ ASSERT_TRUE(array_data_view.Read(0, &nested_struct2)); |
+ ASSERT_TRUE(nested_struct2); |
+ EXPECT_EQ(42, nested_struct2->f_int32); |
+} |
+ |
+TEST_F(DataViewTest, Map) { |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_map["1"] = 1; |
+ obj->f_map["2"] = 2; |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ MapDataView<StringDataView, int32_t> map_data_view; |
+ data_view.GetFMapDataView(&map_data_view); |
+ |
+ ASSERT_FALSE(map_data_view.is_null()); |
+ ASSERT_EQ(2u, map_data_view.size()); |
+ |
+ ASSERT_FALSE(map_data_view.keys().is_null()); |
+ ASSERT_EQ(2u, map_data_view.keys().size()); |
+ |
+ ASSERT_FALSE(map_data_view.values().is_null()); |
+ ASSERT_EQ(2u, map_data_view.values().size()); |
+ |
+ std::vector<std::string> keys; |
+ ASSERT_TRUE(map_data_view.ReadKeys(&keys)); |
+ std::vector<int32_t> values; |
+ ASSERT_TRUE(map_data_view.ReadValues(&values)); |
+ |
+ std::unordered_map<std::string, int32_t> map; |
+ for (size_t i = 0; i < 2; ++i) |
+ map[keys[i]] = values[i]; |
+ |
+ EXPECT_EQ(1, map["1"]); |
+ EXPECT_EQ(2, map["2"]); |
+} |
+ |
+TEST_F(DataViewTest, UnionArray) { |
+ TestUnionPtr union_ptr(TestUnion::New()); |
+ union_ptr->set_f_int32(1024); |
+ |
+ TestStructPtr obj(TestStruct::New()); |
+ obj->f_union_array.push_back(std::move(union_ptr)); |
+ |
+ auto data_view_holder = SerializeTestStruct(std::move(obj)); |
+ auto& data_view = *data_view_holder->data_view; |
+ |
+ ArrayDataView<TestUnionDataView> array_data_view; |
+ data_view.GetFUnionArrayDataView(&array_data_view); |
+ ASSERT_FALSE(array_data_view.is_null()); |
+ ASSERT_EQ(1u, array_data_view.size()); |
+ |
+ TestUnionDataView union_data_view; |
+ array_data_view.GetDataView(0, &union_data_view); |
+ ASSERT_FALSE(union_data_view.is_null()); |
+ |
+ TestUnionPtr union_ptr2; |
+ ASSERT_TRUE(array_data_view.Read(0, &union_ptr2)); |
+ ASSERT_TRUE(union_ptr2->is_f_int32()); |
+ EXPECT_EQ(1024, union_ptr2->get_f_int32()); |
+} |
+ |
+} // namespace data_view |
+} // namespace test |
+} // namespace mojo |