blob: a99bd61db93d317a9cb37a49c76640bf03a6e54f [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 <fidl/test/compatibility/cpp/fidl.h>
#include <fidl/test/imported/cpp/fidl.h>
#include <gtest/gtest.h>
#include <src/lib/fxl/test/test_settings.h>
#include <src/tests/fidl/compatibility/helpers.h>
#include <src/tests/fidl/compatibility/hlcpp_client_app.h>
using fidl::VectorPtr;
using fidl::test::compatibility::Echo_EchoStructWithError_Result;
using fidl::test::compatibility::RespondWith;
using fidl::test::compatibility::Struct;
using fidl::test::compatibility::this_is_a_union;
using fidl_test_compatibility_helpers::ExtractShortName;
using fidl_test_compatibility_helpers::ForAllImpls;
using fidl_test_compatibility_helpers::GetImplsUnderTest;
using fidl_test_compatibility_helpers::Handle;
using fidl_test_compatibility_helpers::HandlesEq;
using fidl_test_compatibility_helpers::Impls;
using fidl_test_compatibility_helpers::kArbitraryConstant;
using fidl_test_compatibility_helpers::kArbitraryVectorSize;
using fidl_test_compatibility_helpers::PrintSummary;
using fidl_test_compatibility_helpers::RandomUTF8;
using fidl_test_compatibility_helpers::Summary;
namespace {
void InitializeStruct(Struct* s) {
// Prepare randomness.
std::default_random_engine rand_engine;
// Using randomness to avoid having to come up with varied values by hand.
// Seed deterministically so that this function's outputs are predictable.
rand_engine.seed(42);
std::bernoulli_distribution bool_distribution;
std::uniform_int_distribution<int16_t> int8_distribution(0, std::numeric_limits<int8_t>::max());
std::uniform_int_distribution<int16_t> int16_distribution;
std::uniform_int_distribution<int32_t> int32_distribution;
std::uniform_int_distribution<int64_t> int64_distribution;
std::uniform_int_distribution<uint16_t> uint8_distribution(0,
std::numeric_limits<uint8_t>::max());
std::uniform_int_distribution<uint16_t> uint16_distribution;
std::uniform_int_distribution<uint32_t> uint32_distribution;
std::uniform_int_distribution<uint64_t> uint64_distribution;
std::uniform_real_distribution<float> float_distribution;
std::uniform_real_distribution<double> double_distribution;
std::string random_string = RandomUTF8(fidl::test::compatibility::strings_size, rand_engine);
std::string random_short_string = RandomUTF8(kArbitraryConstant, rand_engine);
// primitive_types
s->primitive_types.b = bool_distribution(rand_engine);
s->primitive_types.i8 = static_cast<int8_t>(int8_distribution(rand_engine));
s->primitive_types.i16 = int16_distribution(rand_engine);
s->primitive_types.i32 = int32_distribution(rand_engine);
s->primitive_types.i64 = int64_distribution(rand_engine);
s->primitive_types.u8 = static_cast<uint8_t>(uint8_distribution(rand_engine));
s->primitive_types.u16 = uint16_distribution(rand_engine);
s->primitive_types.u32 = uint32_distribution(rand_engine);
s->primitive_types.u64 = uint64_distribution(rand_engine);
s->primitive_types.f32 = float_distribution(rand_engine);
s->primitive_types.f64 = double_distribution(rand_engine);
// arrays
s->arrays.b_0[0] = bool_distribution(rand_engine);
s->arrays.i8_0[0] = static_cast<int8_t>(int8_distribution(rand_engine));
s->arrays.i16_0[0] = int16_distribution(rand_engine);
s->arrays.i32_0[0] = int32_distribution(rand_engine);
s->arrays.i64_0[0] = int64_distribution(rand_engine);
s->arrays.u8_0[0] = static_cast<uint8_t>(uint8_distribution(rand_engine));
s->arrays.u16_0[0] = uint16_distribution(rand_engine);
s->arrays.u32_0[0] = uint32_distribution(rand_engine);
s->arrays.u64_0[0] = uint64_distribution(rand_engine);
s->arrays.f32_0[0] = float_distribution(rand_engine);
s->arrays.f64_0[0] = double_distribution(rand_engine);
s->arrays.handle_0[0] = Handle();
for (uint32_t i = 0; i < fidl::test::compatibility::arrays_size; ++i) {
s->arrays.b_1[i] = bool_distribution(rand_engine);
s->arrays.i8_1[i] = static_cast<int8_t>(int8_distribution(rand_engine));
s->arrays.i16_1[i] = int16_distribution(rand_engine);
s->arrays.i32_1[i] = int32_distribution(rand_engine);
s->arrays.i64_1[i] = int64_distribution(rand_engine);
s->arrays.u8_1[i] = static_cast<uint8_t>(uint8_distribution(rand_engine));
s->arrays.u16_1[i] = uint16_distribution(rand_engine);
s->arrays.u32_1[i] = uint32_distribution(rand_engine);
s->arrays.u64_1[i] = uint64_distribution(rand_engine);
s->arrays.f32_1[i] = float_distribution(rand_engine);
s->arrays.f64_1[i] = double_distribution(rand_engine);
s->arrays.handle_1[i] = Handle();
}
// arrays_2d
for (uint32_t i = 0; i < fidl::test::compatibility::arrays_size; ++i) {
for (uint32_t j = 0; j < kArbitraryConstant; ++j) {
s->arrays_2d.b[i][j] = bool_distribution(rand_engine);
s->arrays_2d.i8[i][j] = static_cast<int8_t>(int8_distribution(rand_engine));
s->arrays_2d.i16[i][j] = int16_distribution(rand_engine);
s->arrays_2d.i32[i][j] = int32_distribution(rand_engine);
s->arrays_2d.i64[i][j] = int64_distribution(rand_engine);
s->arrays_2d.u8[i][j] = static_cast<uint8_t>(uint8_distribution(rand_engine));
s->arrays_2d.u16[i][j] = uint16_distribution(rand_engine);
s->arrays_2d.u32[i][j] = uint32_distribution(rand_engine);
s->arrays_2d.u64[i][j] = uint64_distribution(rand_engine);
s->arrays_2d.f32[i][j] = float_distribution(rand_engine);
s->arrays_2d.f64[i][j] = double_distribution(rand_engine);
s->arrays_2d.handle_handle[i][j] = Handle();
}
}
// vectors
s->vectors.b_0 = std::vector<bool>(kArbitraryVectorSize, bool_distribution(rand_engine));
s->vectors.i8_0 = std::vector<int8_t>(kArbitraryVectorSize,
static_cast<int8_t>(int8_distribution(rand_engine)));
s->vectors.i16_0 = std::vector<int16_t>(kArbitraryVectorSize, int16_distribution(rand_engine));
s->vectors.i32_0 = std::vector<int32_t>(kArbitraryVectorSize, int32_distribution(rand_engine));
s->vectors.i64_0 = std::vector<int64_t>(kArbitraryVectorSize, int64_distribution(rand_engine));
s->vectors.u8_0 = std::vector<uint8_t>(kArbitraryVectorSize,
static_cast<uint8_t>(uint8_distribution(rand_engine)));
s->vectors.u16_0 = std::vector<uint16_t>(kArbitraryVectorSize, uint16_distribution(rand_engine));
s->vectors.u32_0 = std::vector<uint32_t>(kArbitraryVectorSize, uint32_distribution(rand_engine));
s->vectors.u64_0 = std::vector<uint64_t>(kArbitraryVectorSize, uint64_distribution(rand_engine));
s->vectors.f32_0 = std::vector<float>(kArbitraryVectorSize, float_distribution(rand_engine));
s->vectors.f64_0 = std::vector<double>(kArbitraryVectorSize, double_distribution(rand_engine));
{
std::vector<zx::handle> underlying_vec;
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
underlying_vec.emplace_back(Handle());
}
s->vectors.handle_0 = std::vector<zx::handle>(std::move(underlying_vec));
}
{
std::vector<std::vector<bool>> bool_outer_vector;
std::vector<std::vector<int8_t>> int8_outer_vector;
std::vector<std::vector<int16_t>> int16_outer_vector;
std::vector<std::vector<int32_t>> int32_outer_vector;
std::vector<std::vector<int64_t>> int64_outer_vector;
std::vector<std::vector<uint8_t>> uint8_outer_vector;
std::vector<std::vector<uint16_t>> uint16_outer_vector;
std::vector<std::vector<uint32_t>> uint32_outer_vector;
std::vector<std::vector<uint64_t>> uint64_outer_vector;
std::vector<std::vector<float>> float_outer_vector;
std::vector<std::vector<double>> double_outer_vector;
std::vector<std::vector<zx::handle>> handle_outer_vector;
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
bool_outer_vector.emplace_back(
std::vector<bool>(std::vector<bool>(kArbitraryConstant, bool_distribution(rand_engine))));
int8_outer_vector.emplace_back(std::vector<int8_t>(std::vector<int8_t>(
kArbitraryConstant, static_cast<int8_t>(int8_distribution(rand_engine)))));
int16_outer_vector.emplace_back(std::vector<int16_t>(
std::vector<int16_t>(kArbitraryConstant, int16_distribution(rand_engine))));
int32_outer_vector.emplace_back(std::vector<int32_t>(
std::vector<int32_t>(kArbitraryConstant, int32_distribution(rand_engine))));
int64_outer_vector.emplace_back(std::vector<int64_t>(
std::vector<int64_t>(kArbitraryConstant, int64_distribution(rand_engine))));
uint8_outer_vector.emplace_back(std::vector<uint8_t>(std::vector<uint8_t>(
kArbitraryConstant, static_cast<uint8_t>(uint8_distribution(rand_engine)))));
uint16_outer_vector.emplace_back(std::vector<uint16_t>(
std::vector<uint16_t>(kArbitraryConstant, uint16_distribution(rand_engine))));
uint32_outer_vector.emplace_back(std::vector<uint32_t>(
std::vector<uint32_t>(kArbitraryConstant, uint32_distribution(rand_engine))));
uint64_outer_vector.emplace_back(std::vector<uint64_t>(
std::vector<uint64_t>(kArbitraryConstant, uint64_distribution(rand_engine))));
float_outer_vector.emplace_back(std::vector<float>(
std::vector<float>(kArbitraryConstant, float_distribution(rand_engine))));
double_outer_vector.emplace_back(std::vector<double>(
std::vector<double>(kArbitraryConstant, double_distribution(rand_engine))));
std::vector<zx::handle> handle_inner_vector;
for (uint8_t i = 0; i < kArbitraryConstant; ++i) {
handle_inner_vector.emplace_back(Handle());
}
handle_outer_vector.emplace_back(std::vector<zx::handle>(std::move(handle_inner_vector)));
}
s->vectors.b_1 = std::vector<std::vector<bool>>(std::move(bool_outer_vector));
s->vectors.i8_1 = std::vector<std::vector<int8_t>>(std::move(int8_outer_vector));
s->vectors.i16_1 = std::vector<std::vector<int16_t>>(std::move(int16_outer_vector));
s->vectors.i32_1 = std::vector<std::vector<int32_t>>(std::move(int32_outer_vector));
s->vectors.i64_1 = std::vector<std::vector<int64_t>>(std::move(int64_outer_vector));
s->vectors.u8_1 = std::vector<std::vector<uint8_t>>(std::move(uint8_outer_vector));
s->vectors.u16_1 = std::vector<std::vector<uint16_t>>(std::move(uint16_outer_vector));
s->vectors.u32_1 = std::vector<std::vector<uint32_t>>(std::move(uint32_outer_vector));
s->vectors.u64_1 = std::vector<std::vector<uint64_t>>(std::move(uint64_outer_vector));
s->vectors.f32_1 = std::vector<std::vector<float>>(std::move(float_outer_vector));
s->vectors.f64_1 = std::vector<std::vector<double>>(std::move(double_outer_vector));
s->vectors.handle_1 = std::vector<std::vector<zx::handle>>(std::move(handle_outer_vector));
}
s->vectors.b_sized_0 = std::vector<bool>{bool_distribution(rand_engine)};
s->vectors.i8_sized_0 = std::vector<int8_t>{static_cast<int8_t>(int8_distribution(rand_engine))};
s->vectors.i16_sized_0 = std::vector<int16_t>{int16_distribution(rand_engine)};
s->vectors.i32_sized_0 = std::vector<int32_t>{int32_distribution(rand_engine)};
s->vectors.i64_sized_0 = std::vector<int64_t>{int64_distribution(rand_engine)};
s->vectors.u8_sized_0 =
std::vector<uint8_t>{static_cast<uint8_t>(uint8_distribution(rand_engine))};
s->vectors.u16_sized_0 = std::vector<uint16_t>{uint16_distribution(rand_engine)};
s->vectors.u32_sized_0 = std::vector<uint32_t>{uint32_distribution(rand_engine)};
s->vectors.u64_sized_0 = std::vector<uint64_t>{uint64_distribution(rand_engine)};
s->vectors.f32_sized_0 = std::vector<float>{float_distribution(rand_engine)};
s->vectors.f64_sized_0 = std::vector<double>{double_distribution(rand_engine)};
{
std::vector<zx::handle> underlying_vec;
underlying_vec.emplace_back(Handle());
s->vectors.handle_sized_0 = std::vector<zx::handle>(std::move(underlying_vec));
}
s->vectors.b_sized_1 =
std::vector<bool>(fidl::test::compatibility::vectors_size, bool_distribution(rand_engine));
s->vectors.i8_sized_1 = std::vector<int8_t>(fidl::test::compatibility::vectors_size,
static_cast<int8_t>(int8_distribution(rand_engine)));
s->vectors.i16_sized_1 = std::vector<int16_t>(fidl::test::compatibility::vectors_size,
int16_distribution(rand_engine));
s->vectors.i32_sized_1 = std::vector<int32_t>(fidl::test::compatibility::vectors_size,
int32_distribution(rand_engine));
s->vectors.i64_sized_1 = std::vector<int64_t>(fidl::test::compatibility::vectors_size,
int64_distribution(rand_engine));
s->vectors.u8_sized_1 =
std::vector<uint8_t>(fidl::test::compatibility::vectors_size,
static_cast<uint8_t>(uint8_distribution(rand_engine)));
s->vectors.u16_sized_1 = std::vector<uint16_t>(fidl::test::compatibility::vectors_size,
uint16_distribution(rand_engine));
s->vectors.u32_sized_1 = std::vector<uint32_t>(fidl::test::compatibility::vectors_size,
uint32_distribution(rand_engine));
s->vectors.u64_sized_1 = std::vector<uint64_t>(fidl::test::compatibility::vectors_size,
uint64_distribution(rand_engine));
s->vectors.f32_sized_1 =
std::vector<float>(fidl::test::compatibility::vectors_size, float_distribution(rand_engine));
s->vectors.f64_sized_1 = std::vector<double>(fidl::test::compatibility::vectors_size,
double_distribution(rand_engine));
{
std::vector<zx::handle> underlying_vec;
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
underlying_vec.emplace_back(Handle());
}
s->vectors.handle_sized_1 = std::vector<zx::handle>(std::move(underlying_vec));
}
{
std::vector<std::vector<bool>> bool_outer_vector;
std::vector<std::vector<int8_t>> int8_outer_vector;
std::vector<std::vector<int16_t>> int16_outer_vector;
std::vector<std::vector<int32_t>> int32_outer_vector;
std::vector<std::vector<int64_t>> int64_outer_vector;
std::vector<std::vector<uint8_t>> uint8_outer_vector;
std::vector<std::vector<uint16_t>> uint16_outer_vector;
std::vector<std::vector<uint32_t>> uint32_outer_vector;
std::vector<std::vector<uint64_t>> uint64_outer_vector;
std::vector<std::vector<float>> float_outer_vector;
std::vector<std::vector<double>> double_outer_vector;
std::vector<std::vector<zx::handle>> handle_outer_vector;
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
bool_outer_vector.emplace_back(
std::vector<bool>(std::vector<bool>(kArbitraryConstant, bool_distribution(rand_engine))));
int8_outer_vector.emplace_back(std::vector<int8_t>(std::vector<int8_t>(
kArbitraryConstant, static_cast<int8_t>(int8_distribution(rand_engine)))));
int16_outer_vector.emplace_back(std::vector<int16_t>(
std::vector<int16_t>(kArbitraryConstant, int16_distribution(rand_engine))));
int32_outer_vector.emplace_back(std::vector<int32_t>(
std::vector<int32_t>(kArbitraryConstant, int32_distribution(rand_engine))));
int64_outer_vector.emplace_back(std::vector<int64_t>(
std::vector<int64_t>(kArbitraryConstant, int64_distribution(rand_engine))));
uint8_outer_vector.emplace_back(std::vector<uint8_t>(std::vector<uint8_t>(
kArbitraryConstant, static_cast<uint8_t>(uint8_distribution(rand_engine)))));
uint16_outer_vector.emplace_back(std::vector<uint16_t>(
std::vector<uint16_t>(kArbitraryConstant, uint16_distribution(rand_engine))));
uint32_outer_vector.emplace_back(std::vector<uint32_t>(
std::vector<uint32_t>(kArbitraryConstant, uint32_distribution(rand_engine))));
uint64_outer_vector.emplace_back(std::vector<uint64_t>(
std::vector<uint64_t>(kArbitraryConstant, uint64_distribution(rand_engine))));
float_outer_vector.emplace_back(std::vector<float>(
std::vector<float>(kArbitraryConstant, float_distribution(rand_engine))));
double_outer_vector.emplace_back(std::vector<double>(
std::vector<double>(kArbitraryConstant, double_distribution(rand_engine))));
std::vector<zx::handle> handle_inner_vector;
for (uint8_t i = 0; i < kArbitraryConstant; ++i) {
handle_inner_vector.emplace_back(Handle());
}
handle_outer_vector.emplace_back(std::vector<zx::handle>(std::move(handle_inner_vector)));
}
s->vectors.b_sized_2 = std::vector<std::vector<bool>>(std::move(bool_outer_vector));
s->vectors.i8_sized_2 = std::vector<std::vector<int8_t>>(std::move(int8_outer_vector));
s->vectors.i16_sized_2 = std::vector<std::vector<int16_t>>(std::move(int16_outer_vector));
s->vectors.i32_sized_2 = std::vector<std::vector<int32_t>>(std::move(int32_outer_vector));
s->vectors.i64_sized_2 = std::vector<std::vector<int64_t>>(std::move(int64_outer_vector));
s->vectors.u8_sized_2 = std::vector<std::vector<uint8_t>>(std::move(uint8_outer_vector));
s->vectors.u16_sized_2 = std::vector<std::vector<uint16_t>>(std::move(uint16_outer_vector));
s->vectors.u32_sized_2 = std::vector<std::vector<uint32_t>>(std::move(uint32_outer_vector));
s->vectors.u64_sized_2 = std::vector<std::vector<uint64_t>>(std::move(uint64_outer_vector));
s->vectors.f32_sized_2 = std::vector<std::vector<float>>(std::move(float_outer_vector));
s->vectors.f64_sized_2 = std::vector<std::vector<double>>(std::move(double_outer_vector));
s->vectors.handle_sized_2 =
std::vector<std::vector<zx::handle>>(std::move(handle_outer_vector));
}
// intentionally leave most of the nullable vectors as null, just set one
// from each category.
s->vectors.b_nullable_0 = VectorPtr<bool>(std::vector<bool>{bool_distribution(rand_engine)});
{
std::vector<std::vector<int8_t>> int8_outer_vector;
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
int8_outer_vector.emplace_back(std::vector<int8_t>(std::vector<int8_t>(
kArbitraryConstant, static_cast<int8_t>(int8_distribution(rand_engine)))));
}
s->vectors.i8_nullable_1 = VectorPtr<std::vector<int8_t>>(std::move(int8_outer_vector));
}
s->vectors.i16_nullable_sized_0 =
VectorPtr<int16_t>(std::vector<int16_t>{int16_distribution(rand_engine)});
s->vectors.f64_nullable_sized_1 = VectorPtr<double>(std::vector<double>(
fidl::test::compatibility::vectors_size, double_distribution(rand_engine)));
{
std::vector<std::vector<zx::handle>> handle_outer_vector;
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
std::vector<zx::handle> handle_inner_vector;
for (uint8_t i = 0; i < kArbitraryConstant; ++i) {
handle_inner_vector.emplace_back(Handle());
}
handle_outer_vector.emplace_back(std::vector<zx::handle>(std::move(handle_inner_vector)));
}
s->vectors.handle_nullable_sized_2 =
VectorPtr<std::vector<zx::handle>>(std::move(handle_outer_vector));
}
// handles
s->handles.handle_handle = Handle();
ASSERT_EQ(ZX_OK,
zx::process::self()->duplicate(ZX_RIGHT_SAME_RIGHTS, &s->handles.process_handle));
ASSERT_EQ(ZX_OK, zx::thread::create(*zx::unowned_process(zx::process::self()), "dummy", 5u, 0u,
&s->handles.thread_handle));
ASSERT_EQ(ZX_OK, zx::vmo::create(0u, 0u, &s->handles.vmo_handle));
ASSERT_EQ(ZX_OK, zx::event::create(0u, &s->handles.event_handle));
ASSERT_EQ(ZX_OK, zx::port::create(0u, &s->handles.port_handle));
zx::socket socket1;
ASSERT_EQ(ZX_OK, zx::socket::create(0u, &s->handles.socket_handle, &socket1));
zx::eventpair eventpair1;
ASSERT_EQ(ZX_OK, zx::eventpair::create(0u, &s->handles.eventpair_handle, &eventpair1));
ASSERT_EQ(ZX_OK, zx::job::create(*zx::job::default_job(), 0u, &s->handles.job_handle));
uintptr_t vmar_addr;
ASSERT_EQ(ZX_OK, zx::vmar::root_self()->allocate(ZX_VM_CAN_MAP_READ, 0u, getpagesize(),
&s->handles.vmar_handle, &vmar_addr));
zx::fifo fifo1;
ASSERT_EQ(ZX_OK, zx::fifo::create(1u, 1u, 0u, &s->handles.fifo_handle, &fifo1));
ASSERT_EQ(ZX_OK, zx::timer::create(0u, ZX_CLOCK_MONOTONIC, &s->handles.timer_handle));
// For the nullable ones, just set one of them.
s->handles.nullable_handle_handle = Handle();
// strings
s->strings.s = random_string;
s->strings.size_0_s = random_short_string;
s->strings.size_1_s = random_string;
s->strings.nullable_size_0_s = random_short_string;
// enums
s->default_enum = fidl::test::compatibility::default_enum::kOne;
s->i8_enum = fidl::test::compatibility::i8_enum::kNegativeOne;
s->i16_enum = fidl::test::compatibility::i16_enum::kNegativeOne;
s->i32_enum = fidl::test::compatibility::i32_enum::kNegativeOne;
s->i64_enum = fidl::test::compatibility::i64_enum::kNegativeOne;
s->u8_enum = fidl::test::compatibility::u8_enum::kOne;
s->u16_enum = fidl::test::compatibility::u16_enum::kTwo;
s->u32_enum = fidl::test::compatibility::u32_enum::kThree;
s->u64_enum = fidl::test::compatibility::u64_enum::kFour;
// bits
s->default_bits = fidl::test::compatibility::default_bits::kOne;
s->u8_bits = fidl::test::compatibility::u8_bits::kOne;
s->u16_bits = fidl::test::compatibility::u16_bits::kTwo;
s->u32_bits = fidl::test::compatibility::u32_bits::kThree;
s->u64_bits = fidl::test::compatibility::u64_bits::kFour;
// structs
s->structs.s.s = random_string;
// unions
s->unions.u.set_s(random_string);
s->unions.nullable_u = std::make_unique<this_is_a_union>();
s->unions.nullable_u->set_b(bool_distribution(rand_engine));
s->table.set_s(random_string);
s->xunion_.set_s(random_string);
// bool
s->b = bool_distribution(rand_engine);
}
class CompatibilityTest : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
protected:
void SetUp() override {
proxy_url_ = ::testing::get<0>(GetParam());
server_url_ = ::testing::get<1>(GetParam());
// The FIDL support lib requires async_get_default_dispatcher() to return
// non-null.
loop_.reset(new async::Loop(&kAsyncLoopConfigAttachToCurrentThread));
}
std::string proxy_url_;
std::string server_url_;
std::unique_ptr<async::Loop> loop_;
};
Impls impls;
Summary summary;
void ExpectEq(const Struct& a, const Struct& b) {
// primitive types
EXPECT_EQ(a.primitive_types.b, b.primitive_types.b);
EXPECT_EQ(a.primitive_types.i8, b.primitive_types.i8);
EXPECT_EQ(a.primitive_types.i16, b.primitive_types.i16);
EXPECT_EQ(a.primitive_types.i32, b.primitive_types.i32);
EXPECT_EQ(a.primitive_types.i64, b.primitive_types.i64);
EXPECT_EQ(a.primitive_types.u8, b.primitive_types.u8);
EXPECT_EQ(a.primitive_types.u16, b.primitive_types.u16);
EXPECT_EQ(a.primitive_types.u32, b.primitive_types.u32);
EXPECT_EQ(a.primitive_types.u64, b.primitive_types.u64);
EXPECT_EQ(a.primitive_types.f32, b.primitive_types.f32);
EXPECT_EQ(a.primitive_types.f64, b.primitive_types.f64);
// arrays
EXPECT_EQ(a.arrays.b_0[0], b.arrays.b_0[0]);
EXPECT_EQ(a.arrays.i8_0[0], b.arrays.i8_0[0]);
EXPECT_EQ(a.arrays.i16_0[0], b.arrays.i16_0[0]);
EXPECT_EQ(a.arrays.i32_0[0], b.arrays.i32_0[0]);
EXPECT_EQ(a.arrays.i64_0[0], b.arrays.i64_0[0]);
EXPECT_EQ(a.arrays.u8_0[0], b.arrays.u8_0[0]);
EXPECT_EQ(a.arrays.u16_0[0], b.arrays.u16_0[0]);
EXPECT_EQ(a.arrays.u32_0[0], b.arrays.u32_0[0]);
EXPECT_EQ(a.arrays.u64_0[0], b.arrays.u64_0[0]);
EXPECT_EQ(a.arrays.f32_0[0], b.arrays.f32_0[0]);
EXPECT_EQ(a.arrays.f64_0[0], b.arrays.f64_0[0]);
EXPECT_TRUE(HandlesEq(a.arrays.handle_0[0], b.arrays.handle_0[0]));
for (uint32_t i = 0; i < fidl::test::compatibility::arrays_size; ++i) {
EXPECT_EQ(a.arrays.b_1[i], b.arrays.b_1[i]);
EXPECT_EQ(a.arrays.i8_1[i], b.arrays.i8_1[i]);
EXPECT_EQ(a.arrays.i16_1[i], b.arrays.i16_1[i]);
EXPECT_EQ(a.arrays.i32_1[i], b.arrays.i32_1[i]);
EXPECT_EQ(a.arrays.i64_1[i], b.arrays.i64_1[i]);
EXPECT_EQ(a.arrays.u8_1[i], b.arrays.u8_1[i]);
EXPECT_EQ(a.arrays.u16_1[i], b.arrays.u16_1[i]);
EXPECT_EQ(a.arrays.u32_1[i], b.arrays.u32_1[i]);
EXPECT_EQ(a.arrays.u64_1[i], b.arrays.u64_1[i]);
EXPECT_EQ(a.arrays.f32_1[i], b.arrays.f32_1[i]);
EXPECT_EQ(a.arrays.f64_1[i], b.arrays.f64_1[i]);
EXPECT_TRUE(HandlesEq(a.arrays.handle_1[i], b.arrays.handle_1[i]));
}
// arrays_2d
for (uint32_t i = 0; i < fidl::test::compatibility::arrays_size; ++i) {
for (uint32_t j = 0; j < kArbitraryConstant; ++j) {
EXPECT_EQ(a.arrays_2d.b[i][j], b.arrays_2d.b[i][j]);
EXPECT_EQ(a.arrays_2d.i8[i][j], b.arrays_2d.i8[i][j]);
EXPECT_EQ(a.arrays_2d.i16[i][j], b.arrays_2d.i16[i][j]);
EXPECT_EQ(a.arrays_2d.i32[i][j], b.arrays_2d.i32[i][j]);
EXPECT_EQ(a.arrays_2d.i64[i][j], b.arrays_2d.i64[i][j]);
EXPECT_EQ(a.arrays_2d.u8[i][j], b.arrays_2d.u8[i][j]);
EXPECT_EQ(a.arrays_2d.u16[i][j], b.arrays_2d.u16[i][j]);
EXPECT_EQ(a.arrays_2d.u32[i][j], b.arrays_2d.u32[i][j]);
EXPECT_EQ(a.arrays_2d.u64[i][j], b.arrays_2d.u64[i][j]);
EXPECT_EQ(a.arrays_2d.f32[i][j], b.arrays_2d.f32[i][j]);
EXPECT_EQ(a.arrays_2d.f64[i][j], b.arrays_2d.f64[i][j]);
EXPECT_TRUE(HandlesEq(a.arrays_2d.handle_handle[i][j], b.arrays_2d.handle_handle[i][j]));
}
}
// vectors
EXPECT_EQ(a.vectors.b_0, b.vectors.b_0);
EXPECT_EQ(a.vectors.i8_0, b.vectors.i8_0);
EXPECT_EQ(a.vectors.i16_0, b.vectors.i16_0);
EXPECT_EQ(a.vectors.i32_0, b.vectors.i32_0);
EXPECT_EQ(a.vectors.i64_0, b.vectors.i64_0);
EXPECT_EQ(a.vectors.u8_0, b.vectors.u8_0);
EXPECT_EQ(a.vectors.u16_0, b.vectors.u16_0);
EXPECT_EQ(a.vectors.u32_0, b.vectors.u32_0);
EXPECT_EQ(a.vectors.u64_0, b.vectors.u64_0);
EXPECT_EQ(a.vectors.f32_0, b.vectors.f32_0);
EXPECT_EQ(a.vectors.f64_0, b.vectors.f64_0);
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
EXPECT_TRUE(HandlesEq(a.vectors.handle_0[i], b.vectors.handle_0[i]));
}
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
EXPECT_EQ(a.vectors.b_1[i], b.vectors.b_1[i]);
EXPECT_EQ(a.vectors.i8_1[i], b.vectors.i8_1[i]);
EXPECT_EQ(a.vectors.i16_1[i], b.vectors.i16_1[i]);
EXPECT_EQ(a.vectors.i32_1[i], b.vectors.i32_1[i]);
EXPECT_EQ(a.vectors.i64_1[i], b.vectors.i64_1[i]);
EXPECT_EQ(a.vectors.u8_1[i], b.vectors.u8_1[i]);
EXPECT_EQ(a.vectors.u16_1[i], b.vectors.u16_1[i]);
EXPECT_EQ(a.vectors.u32_1[i], b.vectors.u32_1[i]);
EXPECT_EQ(a.vectors.u64_1[i], b.vectors.u64_1[i]);
EXPECT_EQ(a.vectors.f32_1[i], b.vectors.f32_1[i]);
EXPECT_EQ(a.vectors.f64_1[i], b.vectors.f64_1[i]);
for (uint8_t j = 0; j < kArbitraryConstant; ++j) {
EXPECT_TRUE(HandlesEq(a.vectors.handle_1[i][j], b.vectors.handle_1[i][j]));
}
}
EXPECT_EQ(a.vectors.b_sized_0, b.vectors.b_sized_0);
EXPECT_EQ(a.vectors.i8_sized_0, b.vectors.i8_sized_0);
EXPECT_EQ(a.vectors.i16_sized_0, b.vectors.i16_sized_0);
EXPECT_EQ(a.vectors.i32_sized_0, b.vectors.i32_sized_0);
EXPECT_EQ(a.vectors.i64_sized_0, b.vectors.i64_sized_0);
EXPECT_EQ(a.vectors.u8_sized_0, b.vectors.u8_sized_0);
EXPECT_EQ(a.vectors.u16_sized_0, b.vectors.u16_sized_0);
EXPECT_EQ(a.vectors.u32_sized_0, b.vectors.u32_sized_0);
EXPECT_EQ(a.vectors.u64_sized_0, b.vectors.u64_sized_0);
EXPECT_EQ(a.vectors.f32_sized_0, b.vectors.f32_sized_0);
EXPECT_EQ(a.vectors.f64_sized_0, b.vectors.f64_sized_0);
EXPECT_TRUE(HandlesEq(a.vectors.handle_sized_0[0], b.vectors.handle_sized_0[0]));
EXPECT_EQ(a.vectors.b_sized_1, b.vectors.b_sized_1);
EXPECT_EQ(a.vectors.i8_sized_1, b.vectors.i8_sized_1);
EXPECT_EQ(a.vectors.i16_sized_1, b.vectors.i16_sized_1);
EXPECT_EQ(a.vectors.i32_sized_1, b.vectors.i32_sized_1);
EXPECT_EQ(a.vectors.i64_sized_1, b.vectors.i64_sized_1);
EXPECT_EQ(a.vectors.u8_sized_1, b.vectors.u8_sized_1);
EXPECT_EQ(a.vectors.u16_sized_1, b.vectors.u16_sized_1);
EXPECT_EQ(a.vectors.u32_sized_1, b.vectors.u32_sized_1);
EXPECT_EQ(a.vectors.u64_sized_1, b.vectors.u64_sized_1);
EXPECT_EQ(a.vectors.f32_sized_1, b.vectors.f32_sized_1);
EXPECT_EQ(a.vectors.f64_sized_1, b.vectors.f64_sized_1);
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
EXPECT_TRUE(HandlesEq(a.vectors.handle_sized_1[i], b.vectors.handle_sized_1[i]));
}
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
EXPECT_EQ(a.vectors.b_sized_2[i], b.vectors.b_sized_2[i]);
EXPECT_EQ(a.vectors.i8_sized_2[i], b.vectors.i8_sized_2[i]);
EXPECT_EQ(a.vectors.i16_sized_2[i], b.vectors.i16_sized_2[i]);
EXPECT_EQ(a.vectors.i32_sized_2[i], b.vectors.i32_sized_2[i]);
EXPECT_EQ(a.vectors.i64_sized_2[i], b.vectors.i64_sized_2[i]);
EXPECT_EQ(a.vectors.u8_sized_2[i], b.vectors.u8_sized_2[i]);
EXPECT_EQ(a.vectors.u16_sized_2[i], b.vectors.u16_sized_2[i]);
EXPECT_EQ(a.vectors.u32_sized_2[i], b.vectors.u32_sized_2[i]);
EXPECT_EQ(a.vectors.u64_sized_2[i], b.vectors.u64_sized_2[i]);
EXPECT_EQ(a.vectors.f32_sized_2[i], b.vectors.f32_sized_2[i]);
EXPECT_EQ(a.vectors.f64_sized_2[i], b.vectors.f64_sized_2[i]);
for (uint8_t j = 0; j < kArbitraryConstant; ++j) {
EXPECT_TRUE(HandlesEq(a.vectors.handle_sized_2[i][j], b.vectors.handle_sized_2[i][j]));
}
}
EXPECT_EQ(a.vectors.b_nullable_0.has_value(), b.vectors.b_nullable_0.has_value());
EXPECT_EQ(a.vectors.i8_nullable_0.has_value(), b.vectors.i8_nullable_0.has_value());
EXPECT_EQ(a.vectors.i16_nullable_0.has_value(), b.vectors.i16_nullable_0.has_value());
EXPECT_EQ(a.vectors.i32_nullable_0.has_value(), b.vectors.i32_nullable_0.has_value());
EXPECT_EQ(a.vectors.i64_nullable_0.has_value(), b.vectors.i64_nullable_0.has_value());
EXPECT_EQ(a.vectors.u8_nullable_0.has_value(), b.vectors.u8_nullable_0.has_value());
EXPECT_EQ(a.vectors.u16_nullable_0.has_value(), b.vectors.u16_nullable_0.has_value());
EXPECT_EQ(a.vectors.u32_nullable_0.has_value(), b.vectors.u32_nullable_0.has_value());
EXPECT_EQ(a.vectors.u64_nullable_0.has_value(), b.vectors.u64_nullable_0.has_value());
EXPECT_EQ(a.vectors.f32_nullable_0.has_value(), b.vectors.f32_nullable_0.has_value());
EXPECT_EQ(a.vectors.f64_nullable_0.has_value(), b.vectors.f64_nullable_0.has_value());
EXPECT_EQ(a.vectors.handle_nullable_0.has_value(), b.vectors.handle_nullable_0.has_value());
EXPECT_EQ(a.vectors.b_nullable_1.has_value(), b.vectors.b_nullable_1.has_value());
EXPECT_EQ(a.vectors.i8_nullable_1.has_value(), b.vectors.i8_nullable_1.has_value());
EXPECT_EQ(a.vectors.i16_nullable_1.has_value(), b.vectors.i16_nullable_1.has_value());
EXPECT_EQ(a.vectors.i32_nullable_1.has_value(), b.vectors.i32_nullable_1.has_value());
EXPECT_EQ(a.vectors.i64_nullable_1.has_value(), b.vectors.i64_nullable_1.has_value());
EXPECT_EQ(a.vectors.u8_nullable_1.has_value(), b.vectors.u8_nullable_1.has_value());
EXPECT_EQ(a.vectors.u16_nullable_1.has_value(), b.vectors.u16_nullable_1.has_value());
EXPECT_EQ(a.vectors.u32_nullable_1.has_value(), b.vectors.u32_nullable_1.has_value());
EXPECT_EQ(a.vectors.u64_nullable_1.has_value(), b.vectors.u64_nullable_1.has_value());
EXPECT_EQ(a.vectors.f32_nullable_1.has_value(), b.vectors.f32_nullable_1.has_value());
EXPECT_EQ(a.vectors.f64_nullable_1.has_value(), b.vectors.f64_nullable_1.has_value());
EXPECT_EQ(a.vectors.handle_nullable_1.has_value(), b.vectors.handle_nullable_1.has_value());
ASSERT_TRUE(a.vectors.i8_nullable_1.has_value());
ASSERT_TRUE(b.vectors.i8_nullable_1.has_value());
for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
EXPECT_EQ(a.vectors.i8_nullable_1->at(i), b.vectors.i8_nullable_1->at(i));
}
EXPECT_EQ(a.vectors.b_nullable_sized_0.has_value(), b.vectors.b_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.i8_nullable_sized_0.has_value(), b.vectors.i8_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.i16_nullable_sized_0.has_value(), b.vectors.i16_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.i32_nullable_sized_0.has_value(), b.vectors.i32_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.i64_nullable_sized_0.has_value(), b.vectors.i64_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.u8_nullable_sized_0.has_value(), b.vectors.u8_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.u16_nullable_sized_0.has_value(), b.vectors.u16_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.u32_nullable_sized_0.has_value(), b.vectors.u32_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.u64_nullable_sized_0.has_value(), b.vectors.u64_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.f32_nullable_sized_0.has_value(), b.vectors.f32_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.f64_nullable_sized_0.has_value(), b.vectors.f64_nullable_sized_0.has_value());
EXPECT_EQ(a.vectors.handle_nullable_sized_0.has_value(),
b.vectors.handle_nullable_sized_0.has_value());
if (a.vectors.i16_nullable_sized_0.has_value()) {
EXPECT_EQ(a.vectors.i16_nullable_sized_0.value(), b.vectors.i16_nullable_sized_0.value());
}
EXPECT_EQ(a.vectors.b_nullable_sized_1.has_value(), b.vectors.b_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.i8_nullable_sized_1.has_value(), b.vectors.i8_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.i16_nullable_sized_1.has_value(), b.vectors.i16_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.i32_nullable_sized_1.has_value(), b.vectors.i32_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.i64_nullable_sized_1.has_value(), b.vectors.i64_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.u8_nullable_sized_1.has_value(), b.vectors.u8_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.u16_nullable_sized_1.has_value(), b.vectors.u16_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.u32_nullable_sized_1.has_value(), b.vectors.u32_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.u64_nullable_sized_1.has_value(), b.vectors.u64_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.f32_nullable_sized_1.has_value(), b.vectors.f32_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.f64_nullable_sized_1.has_value(), b.vectors.f64_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.handle_nullable_sized_1.has_value(),
b.vectors.handle_nullable_sized_1.has_value());
EXPECT_EQ(a.vectors.f64_nullable_sized_1.has_value(), b.vectors.f64_nullable_sized_1.has_value());
if (a.vectors.f64_nullable_sized_1.has_value()) {
EXPECT_EQ(a.vectors.f64_nullable_sized_1.value(), b.vectors.f64_nullable_sized_1.value());
}
EXPECT_EQ(a.vectors.b_nullable_sized_2.has_value(), b.vectors.b_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.i8_nullable_sized_2.has_value(), b.vectors.i8_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.i16_nullable_sized_2.has_value(), b.vectors.i16_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.i32_nullable_sized_2.has_value(), b.vectors.i32_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.i64_nullable_sized_2.has_value(), b.vectors.i64_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.u8_nullable_sized_2.has_value(), b.vectors.u8_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.u16_nullable_sized_2.has_value(), b.vectors.u16_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.u32_nullable_sized_2.has_value(), b.vectors.u32_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.u64_nullable_sized_2.has_value(), b.vectors.u64_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.f32_nullable_sized_2.has_value(), b.vectors.f32_nullable_sized_2.has_value());
EXPECT_EQ(a.vectors.f64_nullable_sized_2.has_value(), b.vectors.f64_nullable_sized_2.has_value());
EXPECT_TRUE(a.vectors.handle_nullable_sized_2.has_value());
EXPECT_TRUE(b.vectors.handle_nullable_sized_2.has_value());
for (uint32_t i = 0; i < fidl::test::compatibility::vectors_size; ++i) {
for (uint8_t j = 0; j < kArbitraryConstant; ++j) {
EXPECT_TRUE(HandlesEq(a.vectors.handle_nullable_sized_2.value()[i][j],
b.vectors.handle_nullable_sized_2.value()[i][j]));
}
}
// handles
EXPECT_TRUE(HandlesEq(a.handles.handle_handle, b.handles.handle_handle));
EXPECT_TRUE(HandlesEq(a.handles.process_handle, b.handles.process_handle));
EXPECT_TRUE(HandlesEq(a.handles.thread_handle, b.handles.thread_handle));
EXPECT_TRUE(HandlesEq(a.handles.vmo_handle, b.handles.vmo_handle));
EXPECT_TRUE(HandlesEq(a.handles.event_handle, b.handles.event_handle));
EXPECT_TRUE(HandlesEq(a.handles.port_handle, b.handles.port_handle));
EXPECT_TRUE(HandlesEq(a.handles.socket_handle, b.handles.socket_handle));
EXPECT_TRUE(HandlesEq(a.handles.eventpair_handle, b.handles.eventpair_handle));
EXPECT_TRUE(HandlesEq(a.handles.job_handle, b.handles.job_handle));
EXPECT_TRUE(HandlesEq(a.handles.vmar_handle, b.handles.vmar_handle));
EXPECT_TRUE(HandlesEq(a.handles.fifo_handle, b.handles.fifo_handle));
EXPECT_TRUE(HandlesEq(a.handles.timer_handle, b.handles.timer_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_handle_handle, b.handles.nullable_handle_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_process_handle, b.handles.nullable_process_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_thread_handle, b.handles.nullable_thread_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_vmo_handle, b.handles.nullable_vmo_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_channel_handle, b.handles.nullable_channel_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_event_handle, b.handles.nullable_event_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_port_handle, b.handles.nullable_port_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_interrupt_handle, b.handles.nullable_interrupt_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_log_handle, b.handles.nullable_log_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_socket_handle, b.handles.nullable_socket_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_eventpair_handle, b.handles.nullable_eventpair_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_job_handle, b.handles.nullable_job_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_vmar_handle, b.handles.nullable_vmar_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_fifo_handle, b.handles.nullable_fifo_handle));
EXPECT_TRUE(HandlesEq(a.handles.nullable_timer_handle, b.handles.nullable_timer_handle));
// strings
EXPECT_EQ(a.strings.s, b.strings.s);
EXPECT_EQ(a.strings.size_0_s, b.strings.size_0_s);
EXPECT_EQ(a.strings.size_1_s, b.strings.size_1_s);
EXPECT_EQ(a.strings.nullable_size_0_s.has_value(), b.strings.nullable_size_0_s.has_value());
if (a.strings.nullable_size_0_s.has_value() && b.strings.nullable_size_0_s.has_value()) {
EXPECT_EQ(a.strings.nullable_size_0_s.value(), b.strings.nullable_size_0_s.value());
}
EXPECT_EQ(a.strings.nullable_size_1_s.has_value(), b.strings.nullable_size_1_s.has_value());
// enums
EXPECT_EQ(a.default_enum, b.default_enum);
EXPECT_EQ(a.i8_enum, b.i8_enum);
EXPECT_EQ(a.i16_enum, b.i16_enum);
EXPECT_EQ(a.i32_enum, b.i32_enum);
EXPECT_EQ(a.i64_enum, b.i64_enum);
EXPECT_EQ(a.u8_enum, b.u8_enum);
EXPECT_EQ(a.u16_enum, b.u16_enum);
EXPECT_EQ(a.u32_enum, b.u32_enum);
EXPECT_EQ(a.u64_enum, b.u64_enum);
// bits
EXPECT_EQ(a.default_bits, b.default_bits);
EXPECT_EQ(a.u8_bits, b.u8_bits);
EXPECT_EQ(a.u16_bits, b.u16_bits);
EXPECT_EQ(a.u32_bits, b.u32_bits);
EXPECT_EQ(a.u64_bits, b.u64_bits);
// structs
EXPECT_EQ(a.structs.s.s, b.structs.s.s);
EXPECT_EQ(a.structs.nullable_s, b.structs.nullable_s);
// empty structs
EXPECT_TRUE(fidl::Equals(a.structs.es, b.structs.es));
EXPECT_EQ(a.structs.es.__reserved, 0u);
// unions
EXPECT_EQ(a.unions.u.is_s(), b.unions.u.is_s());
EXPECT_EQ(a.unions.u.s(), b.unions.u.s());
EXPECT_EQ(a.unions.nullable_u->is_b(), b.unions.nullable_u->is_b());
EXPECT_EQ(a.unions.nullable_u->b(), b.unions.nullable_u->b());
// tables and xunions
EXPECT_TRUE(fidl::Equals(a.table, b.table));
EXPECT_TRUE(fidl::Equals(a.xunion_, b.xunion_));
// bool
EXPECT_EQ(a.b, b.b);
}
TEST(Struct, EchoStruct) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) + " (struct)"] =
false;
Struct sent;
InitializeStruct(&sent);
Struct sent_clone;
sent.Clone(&sent_clone);
Struct resp_clone;
bool called_back = false;
proxy->EchoStruct(std::move(sent), server_url, [&loop, &resp_clone, &called_back](Struct resp) {
ASSERT_EQ(ZX_OK, resp.Clone(&resp_clone));
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
ExpectEq(sent_clone, resp_clone);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) + " (struct)"] =
true;
});
}
TEST(Struct, EchoStructWithErrorSuccessCase) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result success)"] = false;
Struct sent;
InitializeStruct(&sent);
auto err = fidl::test::compatibility::default_enum::kOne;
Struct sent_clone;
sent.Clone(&sent_clone);
Struct resp_clone;
bool called_back = false;
proxy->EchoStructWithError(
std::move(sent), err, server_url, RespondWith::SUCCESS,
[&loop, &resp_clone, &called_back](Echo_EchoStructWithError_Result resp) {
ASSERT_TRUE(resp.is_response());
ASSERT_EQ(ZX_OK, resp.response().value.Clone(&resp_clone));
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
ExpectEq(sent_clone, resp_clone);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result success)"] = true;
});
}
TEST(Struct, EchoStructWithErrorErrorCase) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result error)"] = false;
Struct sent;
InitializeStruct(&sent);
auto err = fidl::test::compatibility::default_enum::kOne;
bool called_back = false;
proxy->EchoStructWithError(std::move(sent), err, server_url, RespondWith::ERR,
[&loop, &err, &called_back](Echo_EchoStructWithError_Result resp) {
ASSERT_TRUE(resp.is_err());
ASSERT_EQ(err, resp.err());
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result error)"] = true;
});
}
TEST(Struct, EchoStructNoRetval) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct_no_ret)"] = false;
Struct sent;
InitializeStruct(&sent);
Struct sent_clone;
sent.Clone(&sent_clone);
fidl::test::compatibility::Struct resp_clone;
bool event_received = false;
proxy.events().EchoEvent = [&loop, &resp_clone, &event_received](Struct resp) {
resp.Clone(&resp_clone);
event_received = true;
loop.Quit();
};
proxy->EchoStructNoRetVal(std::move(sent), server_url);
loop.Run();
ASSERT_TRUE(event_received);
ExpectEq(sent_clone, resp_clone);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct_no_ret)"] = true;
});
}
TEST(Struct, EchoNamedStruct) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) + " (struct)"] =
false;
fidl::test::imported::SimpleStruct sent;
sent.f1 = true;
sent.f2 = 1;
fidl::test::imported::SimpleStruct sent_clone;
sent.Clone(&sent_clone);
fidl::test::imported::SimpleStruct resp_clone;
bool called_back = false;
proxy->EchoNamedStruct(
std::move(sent), server_url,
[&loop, &resp_clone, &called_back](fidl::test::imported::SimpleStruct resp) {
ASSERT_EQ(ZX_OK, resp.Clone(&resp_clone));
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
EXPECT_EQ(sent_clone.f1, resp_clone.f1);
EXPECT_EQ(sent_clone.f2, resp_clone.f2);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) + " (struct)"] =
true;
});
}
TEST(Struct, EchoNamedStructWithErrorSuccessCase) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result success)"] = false;
fidl::test::imported::SimpleStruct sent;
sent.f1 = false;
sent.f2 = 2;
const uint32_t err = 12;
fidl::test::imported::SimpleStruct sent_clone;
sent.Clone(&sent_clone);
fidl::test::imported::SimpleStruct resp_clone;
bool called_back = false;
proxy->EchoNamedStructWithError(
std::move(sent), err, server_url, fidl::test::imported::WantResponse::SUCCESS,
[&loop, &resp_clone,
&called_back](fidl::test::compatibility::Echo_EchoNamedStructWithError_Result resp) {
ASSERT_TRUE(resp.is_response());
ASSERT_EQ(ZX_OK, resp.response().value.Clone(&resp_clone));
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
EXPECT_EQ(sent_clone.f1, resp_clone.f1);
EXPECT_EQ(sent_clone.f2, resp_clone.f2);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result success)"] = true;
});
}
TEST(Struct, EchoNamedStructWithErrorErrorCase) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string& proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result error)"] = false;
fidl::test::imported::SimpleStruct sent;
sent.f1 = true;
sent.f2 = 3;
const uint32_t err = 13;
bool called_back = false;
proxy->EchoNamedStructWithError(
std::move(sent), err, server_url, fidl::test::imported::WantResponse::ERR,
[&loop, &err,
&called_back](fidl::test::compatibility::Echo_EchoNamedStructWithError_Result resp) {
ASSERT_TRUE(resp.is_err());
ASSERT_EQ(err, resp.err());
called_back = true;
loop.Quit();
});
loop.Run();
ASSERT_TRUE(called_back);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct result error)"] = true;
});
}
TEST(Struct, EchoNamedStructNoRetval) {
ForAllImpls(impls, [](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
const std::string& server_url, const std::string proxy_url) {
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct_no_ret)"] = false;
fidl::test::imported::SimpleStruct sent;
sent.f1 = false;
sent.f2 = 4;
fidl::test::imported::SimpleStruct sent_clone;
sent.Clone(&sent_clone);
fidl::test::imported::SimpleStruct resp_clone;
bool event_received = false;
proxy.events().OnEchoNamedEvent = [&loop, &resp_clone,
&event_received](fidl::test::imported::SimpleStruct resp) {
resp.Clone(&resp_clone);
event_received = true;
loop.Quit();
};
proxy->EchoNamedStructNoRetVal(std::move(sent), server_url);
loop.Run();
ASSERT_TRUE(event_received);
EXPECT_EQ(sent_clone.f1, resp_clone.f1);
EXPECT_EQ(sent_clone.f2, resp_clone.f2);
summary[ExtractShortName(proxy_url) + " <-> " + ExtractShortName(server_url) +
" (struct_no_ret)"] = true;
});
}
} // namespace
int main(int argc, char** argv) {
if (!fxl::SetTestSettings(argc, argv)) {
return EXIT_FAILURE;
}
testing::InitGoogleTest(&argc, argv);
GetImplsUnderTest(&impls);
int r = RUN_ALL_TESTS();
PrintSummary(summary);
return r;
}