| Index: mojo/public/cpp/bindings/tests/serialization_api_unittest.cc
|
| diff --git a/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc b/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc
|
| deleted file mode 100644
|
| index 5fc8852eba074e6c7a5fef1a22f02cbaa9eb414a..0000000000000000000000000000000000000000
|
| --- a/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc
|
| +++ /dev/null
|
| @@ -1,205 +0,0 @@
|
| -// Copyright 2015 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 "gtest/gtest.h"
|
| -#include "mojo/public/cpp/bindings/array.h"
|
| -#include "mojo/public/cpp/bindings/lib/array_serialization.h"
|
| -#include "mojo/public/cpp/bindings/lib/validation_errors.h"
|
| -#include "mojo/public/cpp/system/message_pipe.h"
|
| -#include "mojo/public/interfaces/bindings/tests/rect.mojom.h"
|
| -#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
|
| -
|
| -namespace mojo {
|
| -namespace test {
|
| -namespace {
|
| -
|
| -class StructSerializationAPITest : public testing::Test {
|
| - public:
|
| - // We Serialize and Deserialize the given |Type|, and expect the given
|
| - // serialization warnings. We also validate (and expect a given error) in
|
| - // between serialization and deserialization.
|
| - template <typename Type>
|
| - void SerializeAndDeserialize(
|
| - Type* val,
|
| - mojo::internal::ValidationError expected_validation_error) {
|
| - size_t bytes_written = 0;
|
| - size_t num_bytes = val->GetSerializedSize();
|
| - std::vector<uint8_t> bytes(num_bytes + 1);
|
| -
|
| - // Last byte is a magic value, helps catch a buffer overflow for
|
| - // serialization.
|
| - bytes[num_bytes] = 170;
|
| - val->Serialize(bytes.data(), num_bytes, &bytes_written);
|
| - EXPECT_EQ(170u, bytes[num_bytes]);
|
| - EXPECT_EQ(num_bytes, bytes_written);
|
| -
|
| - mojo::internal::BoundsChecker bounds_checker(bytes.data(), num_bytes, 0);
|
| - auto actual_validation_error =
|
| - Type::Data_::Validate(bytes.data(), &bounds_checker, nullptr);
|
| - EXPECT_EQ(expected_validation_error, actual_validation_error);
|
| -
|
| - Type out_val;
|
| - bool deserialize_ret = out_val.Deserialize(bytes.data(), bytes.size());
|
| - if (actual_validation_error == mojo::internal::ValidationError::NONE) {
|
| - EXPECT_TRUE(val->Equals(out_val));
|
| - }
|
| - EXPECT_EQ(actual_validation_error == mojo::internal::ValidationError::NONE,
|
| - deserialize_ret);
|
| - }
|
| -};
|
| -
|
| -TEST_F(StructSerializationAPITest, GetSerializedSize) {
|
| - Rect rect;
|
| - // 8 byte struct header
|
| - // + 16 bytes worth of fields
|
| - EXPECT_EQ(24u, rect.GetSerializedSize());
|
| -
|
| - HandleStruct handle_struct;
|
| - // 8 byte struct header
|
| - // + 4 byte handle
|
| - // + 8 bytes for offset/pointer for Array.
|
| - // + 0 bytes for uninitialized Array.
|
| - // + 4-byte to make the struct 8-byte aligned.
|
| - EXPECT_EQ(24u, handle_struct.GetSerializedSize());
|
| -
|
| - // + 8 bytes for initialized array, 0-sized array.
|
| - handle_struct.array_h = mojo::Array<mojo::ScopedMessagePipeHandle>::New(0);
|
| - EXPECT_EQ(32u, handle_struct.GetSerializedSize());
|
| -
|
| - // + 4 bytes for array of size 1.
|
| - // + 4 more bytes to make the array serialization 8-byte aligned.
|
| - handle_struct.array_h = mojo::Array<mojo::ScopedMessagePipeHandle>::New(1);
|
| - EXPECT_EQ(16u, GetSerializedSize_(handle_struct.array_h));
|
| - EXPECT_EQ(40u, handle_struct.GetSerializedSize());
|
| -}
|
| -
|
| -TEST_F(StructSerializationAPITest, BasicStructSerialization) {
|
| - {
|
| - SCOPED_TRACE("Rect");
|
| - Rect rect;
|
| - rect.x = 123;
|
| - rect.y = 456;
|
| - rect.width = 789;
|
| - rect.height = 999;
|
| - SerializeAndDeserialize(&rect, mojo::internal::ValidationError::NONE);
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("DefaultFieldValues");
|
| - DefaultFieldValues default_values;
|
| - SerializeAndDeserialize(&default_values,
|
| - mojo::internal::ValidationError::NONE);
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("NoDefaultFieldValues.Serialize() should fail");
|
| - NoDefaultFieldValues nd;
|
| - nd.f0 = true;
|
| - nd.f23 = mojo::Array<mojo::String>::New(10);
|
| -
|
| - char buf[1000] = {};
|
| - EXPECT_FALSE(nd.Serialize(buf, sizeof(buf)));
|
| -
|
| - size_t bytes_written = 0;
|
| - EXPECT_FALSE(nd.Serialize(buf, sizeof(buf), &bytes_written));
|
| - EXPECT_EQ(160UL, bytes_written);
|
| - // The Serialize() shouldn't get around to reserving space for the |f23|
|
| - // array field.
|
| - EXPECT_LT(bytes_written, nd.GetSerializedSize());
|
| - }
|
| -}
|
| -
|
| -// This tests serialization of handles -- These should be deaths or
|
| -TEST_F(StructSerializationAPITest, HandlesSerialization) {
|
| - {
|
| - SCOPED_TRACE("Uninitialized Array");
|
| - HandleStruct handle_struct;
|
| - // TODO(vardhan): Once handles and pointers are encoded inline with
|
| - // serialization, validation should fail at
|
| - // ValidationError::UNEXPECTED_NULL_POINTER (which happens after the
|
| - // ValidationError::ILLEGAL_HANDLE error, which shouldn't happen since
|
| - // handles will be encoded even on failures).
|
| - SerializeAndDeserialize(&handle_struct,
|
| - mojo::internal::ValidationError::ILLEGAL_HANDLE);
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("Uninitialized required Handle in an Array");
|
| - HandleStruct handle_struct;
|
| - handle_struct.array_h = Array<mojo::ScopedMessagePipeHandle>::New(1);
|
| - // This won't die (i.e., we don't need to EXPECT_DEATH) because the handle
|
| - // is invalid, so should be serializable. Instead, we live with a
|
| - // serialization error for an invalid handle.
|
| - // TODO(vardhan): This should be
|
| - // mojo::internal::ValidationError::UNEXPECTED_INVALID_HANDLE after handles
|
| - // are encoded inline with serialization.
|
| - SerializeAndDeserialize(&handle_struct,
|
| - mojo::internal::ValidationError::ILLEGAL_HANDLE);
|
| - }
|
| -
|
| - // We shouldn't be able to serialize a valid handle.
|
| - {
|
| - SCOPED_TRACE("Serializing a Handle");
|
| - HandleStruct handle_struct;
|
| - handle_struct.h = MessagePipe().handle0.Pass();
|
| - handle_struct.array_h = Array<mojo::ScopedMessagePipeHandle>::New(0);
|
| - EXPECT_DEATH_IF_SUPPORTED({
|
| - SerializeAndDeserialize(&handle_struct,
|
| - mojo::internal::ValidationError::NONE);
|
| - }, "does not support handles");
|
| - }
|
| -}
|
| -
|
| -// We should be able to Serialize/Deserialize a struct that has a nullable
|
| -// handle which is null.
|
| -TEST_F(StructSerializationAPITest, NullableHandleSerialization) {
|
| - NullableHandleStruct handle_struct;
|
| - handle_struct.data = 16;
|
| - SerializeAndDeserialize(&handle_struct,
|
| - mojo::internal::ValidationError::NONE);
|
| -}
|
| -
|
| -// Test that |Deserialize()| appropriately fails on validation.
|
| -TEST_F(StructSerializationAPITest, DeserializationFailure) {
|
| - char buf[100] = {};
|
| - EmptyStruct es;
|
| -
|
| - // Bounds checker should fail this, since buf_size is too small.
|
| - EXPECT_FALSE(es.Deserialize(buf, 1));
|
| -
|
| - es.Serialize(buf, sizeof(buf));
|
| - EXPECT_TRUE(es.Deserialize(buf, sizeof(buf)));
|
| -
|
| - // Invalid struct header: this should happen inside
|
| - // EmptyStruct::Data_::Validate()).
|
| - es.Serialize(buf, sizeof(buf));
|
| - EmptyStruct::Data_* es_data = reinterpret_cast<EmptyStruct::Data_*>(buf);
|
| - es_data->header_.num_bytes = 0;
|
| - EXPECT_FALSE(es.Deserialize(buf, sizeof(buf)));
|
| -}
|
| -
|
| -TEST_F(StructSerializationAPITest, DeserializationWithoutValidation) {
|
| - const int32_t kMagic = 456;
|
| - char buf[100] = {};
|
| - ContainsOther::Data_* co_data = reinterpret_cast<ContainsOther::Data_*>(buf);
|
| - ContainsOther co;
|
| -
|
| - // Success case.
|
| - co.other = kMagic;
|
| - EXPECT_TRUE(co.Serialize(buf, sizeof(buf)));
|
| - co.other = 0;
|
| - co.DeserializeWithoutValidation(buf);
|
| - EXPECT_EQ(kMagic, co.other);
|
| -
|
| - // Invalid struct header, but will pass (i.e., won't crash) anyway because we
|
| - // don't Validate.
|
| - co_data->header_.num_bytes = 0u;
|
| - co.DeserializeWithoutValidation(buf);
|
| - EXPECT_EQ(kMagic, co_data->other);
|
| - EXPECT_EQ(0u, co_data->header_.num_bytes);
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace test
|
| -} // namespace mojo
|
|
|