| Index: third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
|
| diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
|
| index 0803b9932111a33505b3883a8d82b6dc5d1e5acd..5017d979d2ddc907b530066b7225ba4843bdd940 100644
|
| --- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
|
| +++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
|
| @@ -2,6 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <vector>
|
| #include "mojo/public/cpp/bindings/array.h"
|
| #include "mojo/public/cpp/bindings/lib/array_internal.h"
|
| #include "mojo/public/cpp/bindings/lib/array_serialization.h"
|
| @@ -524,5 +525,300 @@ TEST(UnionTest, Validation_NullableUnion) {
|
| free(raw_buf);
|
| }
|
|
|
| +// TODO(azani): Move back in map_unittest.cc when possible.
|
| +// Map Tests
|
| +TEST(UnionTest, PodUnionInMap) {
|
| + SmallStructPtr small_struct(SmallStruct::New());
|
| + small_struct->pod_union_map = Map<String, PodUnionPtr>();
|
| + small_struct->pod_union_map.insert("one", PodUnion::New());
|
| + small_struct->pod_union_map.insert("two", PodUnion::New());
|
| +
|
| + small_struct->pod_union_map["one"]->set_f_int8(8);
|
| + small_struct->pod_union_map["two"]->set_f_int16(16);
|
| +
|
| + EXPECT_EQ(8, small_struct->pod_union_map["one"]->get_f_int8());
|
| + EXPECT_EQ(16, small_struct->pod_union_map["two"]->get_f_int16());
|
| +}
|
| +
|
| +TEST(UnionTest, PodUnionInMapSerialization) {
|
| + Environment environment;
|
| + Map<String, PodUnionPtr> map;
|
| + map.insert("one", PodUnion::New());
|
| + map.insert("two", PodUnion::New());
|
| +
|
| + map["one"]->set_f_int8(8);
|
| + map["two"]->set_f_int16(16);
|
| +
|
| + size_t size = GetSerializedSize_(map);
|
| + EXPECT_EQ(120U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + mojo::internal::Map_Data<mojo::internal::String_Data*,
|
| + internal::PodUnion_Data>* data;
|
| + mojo::internal::ArrayValidateParams validate_params(0, false, nullptr);
|
| + SerializeMap_(map.Pass(), &buf, &data, &validate_params);
|
| +
|
| + Map<String, PodUnionPtr> map2;
|
| + Deserialize_(data, &map2);
|
| +
|
| + EXPECT_EQ(8, map2["one"]->get_f_int8());
|
| + EXPECT_EQ(16, map2["two"]->get_f_int16());
|
| +}
|
| +
|
| +TEST(UnionTest, PodUnionInMapSerializationWithNull) {
|
| + Environment environment;
|
| + Map<String, PodUnionPtr> map;
|
| + map.insert("one", PodUnion::New());
|
| + map.insert("two", nullptr);
|
| +
|
| + map["one"]->set_f_int8(8);
|
| +
|
| + size_t size = GetSerializedSize_(map);
|
| + EXPECT_EQ(120U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + mojo::internal::Map_Data<mojo::internal::String_Data*,
|
| + internal::PodUnion_Data>* data;
|
| + mojo::internal::ArrayValidateParams validate_params(0, true, nullptr);
|
| + SerializeMap_(map.Pass(), &buf, &data, &validate_params);
|
| +
|
| + Map<String, PodUnionPtr> map2;
|
| + Deserialize_(data, &map2);
|
| +
|
| + EXPECT_EQ(8, map2["one"]->get_f_int8());
|
| + EXPECT_TRUE(map2["two"].is_null());
|
| +}
|
| +
|
| +TEST(UnionTest, StructInUnionGetterSetterPasser) {
|
| + DummyStructPtr dummy(DummyStruct::New());
|
| + dummy->f_int8 = 8;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_dummy(dummy.Pass());
|
| +
|
| + EXPECT_EQ(8, obj->get_f_dummy()->f_int8);
|
| +}
|
| +
|
| +TEST(UnionTest, StructInUnionSerialization) {
|
| + Environment environment;
|
| + DummyStructPtr dummy(DummyStruct::New());
|
| + dummy->f_int8 = 8;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_dummy(dummy.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| + EXPECT_EQ(32U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + ObjectUnionPtr obj2;
|
| + Deserialize_(data, &obj2);
|
| + EXPECT_EQ(8, obj2->get_f_dummy()->f_int8);
|
| +}
|
| +
|
| +TEST(UnionTest, StructInUnionValidation) {
|
| + Environment environment;
|
| + DummyStructPtr dummy(DummyStruct::New());
|
| + dummy->f_int8 = 8;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_dummy(dummy.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + void* raw_buf = buf.Leak();
|
| + mojo::internal::BoundsChecker bounds_checker(data,
|
| + static_cast<uint32_t>(size), 0);
|
| + EXPECT_TRUE(
|
| + internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
|
| + free(raw_buf);
|
| +}
|
| +
|
| +TEST(UnionTest, StructInUnionValidationNonNullable) {
|
| + Environment environment;
|
| + DummyStructPtr dummy(nullptr);
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_dummy(dummy.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + void* raw_buf = buf.Leak();
|
| + mojo::internal::BoundsChecker bounds_checker(data,
|
| + static_cast<uint32_t>(size), 0);
|
| + EXPECT_FALSE(
|
| + internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
|
| + free(raw_buf);
|
| +}
|
| +
|
| +TEST(UnionTest, StructInUnionValidationNullable) {
|
| + Environment environment;
|
| + DummyStructPtr dummy(nullptr);
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_nullable(dummy.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + void* raw_buf = buf.Leak();
|
| + mojo::internal::BoundsChecker bounds_checker(data,
|
| + static_cast<uint32_t>(size), 0);
|
| + EXPECT_TRUE(
|
| + internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
|
| + free(raw_buf);
|
| +}
|
| +
|
| +TEST(UnionTest, ArrayInUnionGetterSetter) {
|
| + Environment environment;
|
| +
|
| + Array<int8_t> array(2);
|
| + array[0] = 8;
|
| + array[1] = 9;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_array_int8(array.Pass());
|
| +
|
| + EXPECT_EQ(8, obj->get_f_array_int8()[0]);
|
| + EXPECT_EQ(9, obj->get_f_array_int8()[1]);
|
| +}
|
| +
|
| +TEST(UnionTest, ArrayInUnionSerialization) {
|
| + Environment environment;
|
| +
|
| + Array<int8_t> array(2);
|
| + array[0] = 8;
|
| + array[1] = 9;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_array_int8(array.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| + EXPECT_EQ(32U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + std::vector<Handle> handles;
|
| + data->EncodePointersAndHandles(&handles);
|
| + data->DecodePointersAndHandles(&handles);
|
| +
|
| + ObjectUnionPtr obj2;
|
| + Deserialize_(data, &obj2);
|
| +
|
| + EXPECT_EQ(8, obj2->get_f_array_int8()[0]);
|
| + EXPECT_EQ(9, obj2->get_f_array_int8()[1]);
|
| +}
|
| +
|
| +TEST(UnionTest, ArrayInUnionValidation) {
|
| + Environment environment;
|
| +
|
| + Array<int8_t> array(2);
|
| + array[0] = 8;
|
| + array[1] = 9;
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_array_int8(array.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + std::vector<Handle> handles;
|
| + data->EncodePointersAndHandles(&handles);
|
| +
|
| + void* raw_buf = buf.Leak();
|
| + mojo::internal::BoundsChecker bounds_checker(data,
|
| + static_cast<uint32_t>(size), 0);
|
| +
|
| + EXPECT_TRUE(
|
| + internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
|
| + free(raw_buf);
|
| +}
|
| +
|
| +TEST(UnionTest, MapInUnionGetterSetter) {
|
| + Environment environment;
|
| + Map<String, int8_t> map;
|
| + map.insert("one", 1);
|
| + map.insert("two", 2);
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_map_int8(map.Pass());
|
| +
|
| + EXPECT_EQ(1, obj->get_f_map_int8()["one"]);
|
| + EXPECT_EQ(2, obj->get_f_map_int8()["two"]);
|
| +}
|
| +
|
| +TEST(UnionTest, MapInUnionSerialization) {
|
| + Environment environment;
|
| + Map<String, int8_t> map;
|
| + map.insert("one", 1);
|
| + map.insert("two", 2);
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_map_int8(map.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| + EXPECT_EQ(112U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + std::vector<Handle> handles;
|
| + data->EncodePointersAndHandles(&handles);
|
| + data->DecodePointersAndHandles(&handles);
|
| +
|
| + ObjectUnionPtr obj2;
|
| + Deserialize_(data, &obj2);
|
| +
|
| + EXPECT_EQ(1, obj2->get_f_map_int8()["one"]);
|
| + EXPECT_EQ(2, obj2->get_f_map_int8()["two"]);
|
| +}
|
| +
|
| +TEST(UnionTest, MapInUnionValidation) {
|
| + Environment environment;
|
| + Map<String, int8_t> map;
|
| + map.insert("one", 1);
|
| + map.insert("two", 2);
|
| +
|
| + ObjectUnionPtr obj(ObjectUnion::New());
|
| + obj->set_f_map_int8(map.Pass());
|
| +
|
| + size_t size = GetSerializedSize_(obj, false);
|
| + EXPECT_EQ(112U, size);
|
| +
|
| + mojo::internal::FixedBuffer buf(size);
|
| + internal::ObjectUnion_Data* data = nullptr;
|
| + SerializeUnion_(obj.Pass(), &buf, &data, false);
|
| +
|
| + std::vector<Handle> handles;
|
| + data->EncodePointersAndHandles(&handles);
|
| +
|
| + void* raw_buf = buf.Leak();
|
| + mojo::internal::BoundsChecker bounds_checker(data,
|
| + static_cast<uint32_t>(size), 0);
|
| +
|
| + EXPECT_TRUE(
|
| + internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
|
| + free(raw_buf);
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace mojo
|
|
|