// 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 <lib/async-loop/cpp/loop.h>
#include <lib/async/default.h>
#include <stdio.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <zircon/processargs.h>

#include <algorithm>
#include <cstdlib>
#include <random>
#include <vector>

#include "garnet/public/lib/fidl/compatibility_test/echo_client_app.h"
#include "gtest/gtest.h"
#include "lib/fidl/cpp/binding_set.h"
#include "src/lib/files/path.h"
#include "src/lib/fxl/strings/split_string.h"
#include "src/lib/fxl/strings/utf_codecs.h"

using fidl::VectorPtr;
using fidl::test::compatibility::Struct;
using std::string;

namespace {
// Want a size small enough that it doesn't get too big to transmit but
// large enough to exercise interesting code paths.
constexpr uint8_t kArbitraryVectorSize = 3;
// This is used as a literal constant in compatibility_test_service.fidl.
constexpr uint8_t kArbitraryConstant = 2;

constexpr char kServersEnvVarName[] = "FIDL_COMPATIBILITY_TEST_SERVERS";
constexpr char kUsage[] =
    ("Usage:\n  fidl_compatibility_test foo_server bar_server\n");

zx::handle Handle() {
  zx_handle_t raw_event;
  const zx_status_t status = zx_event_create(0u, &raw_event);
  // Can't use gtest ASSERT_EQ because we're in a non-void function.
  ZX_ASSERT_MSG(status == ZX_OK, "status = %d", status);
  return zx::handle(raw_event);
}

::testing::AssertionResult HandlesEq(const zx::object_base& a,
                                     const zx::object_base& b) {
  if (a.is_valid() != b.is_valid()) {
    return ::testing::AssertionFailure()
           << "Handles are not equally valid :" << a.is_valid() << " vs "
           << b.is_valid();
  }
  if (!a.is_valid()) {
    return ::testing::AssertionSuccess() << "Both handles invalid";
  }
  zx_info_handle_basic_t a_info, b_info;
  zx_status_t status = zx_object_get_info(
      a.get(), ZX_INFO_HANDLE_BASIC, &a_info, sizeof(a_info), nullptr, nullptr);
  if (ZX_OK != status) {
    return ::testing::AssertionFailure()
           << "zx_object_get_info(a) returned " << status;
  }
  status = zx_object_get_info(b.get(), ZX_INFO_HANDLE_BASIC, &b_info,
                              sizeof(b_info), nullptr, nullptr);
  if (ZX_OK != status) {
    return ::testing::AssertionFailure()
           << "zx_object_get_info(b) returned " << status;
  }
  if (a_info.koid != b_info.koid) {
    return ::testing::AssertionFailure()
           << std::endl
           << "a_info.koid is: " << a_info.koid << std::endl
           << "b_info.koid is: " << b_info.koid;
  }
  return ::testing::AssertionSuccess();
}

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.is_null(), b.vectors.b_nullable_0.is_null());
  EXPECT_EQ(a.vectors.i8_nullable_0.is_null(),
            b.vectors.i8_nullable_0.is_null());
  EXPECT_EQ(a.vectors.i16_nullable_0.is_null(),
            b.vectors.i16_nullable_0.is_null());
  EXPECT_EQ(a.vectors.i32_nullable_0.is_null(),
            b.vectors.i32_nullable_0.is_null());
  EXPECT_EQ(a.vectors.i64_nullable_0.is_null(),
            b.vectors.i64_nullable_0.is_null());
  EXPECT_EQ(a.vectors.u8_nullable_0.is_null(),
            b.vectors.u8_nullable_0.is_null());
  EXPECT_EQ(a.vectors.u16_nullable_0.is_null(),
            b.vectors.u16_nullable_0.is_null());
  EXPECT_EQ(a.vectors.u32_nullable_0.is_null(),
            b.vectors.u32_nullable_0.is_null());
  EXPECT_EQ(a.vectors.u64_nullable_0.is_null(),
            b.vectors.u64_nullable_0.is_null());
  EXPECT_EQ(a.vectors.f32_nullable_0.is_null(),
            b.vectors.f32_nullable_0.is_null());
  EXPECT_EQ(a.vectors.f64_nullable_0.is_null(),
            b.vectors.f64_nullable_0.is_null());
  EXPECT_EQ(a.vectors.handle_nullable_0.is_null(),
            b.vectors.handle_nullable_0.is_null());

  EXPECT_EQ(a.vectors.b_nullable_1.is_null(), b.vectors.b_nullable_1.is_null());
  EXPECT_EQ(a.vectors.i8_nullable_1.is_null(),
            b.vectors.i8_nullable_1.is_null());
  EXPECT_EQ(a.vectors.i16_nullable_1.is_null(),
            b.vectors.i16_nullable_1.is_null());
  EXPECT_EQ(a.vectors.i32_nullable_1.is_null(),
            b.vectors.i32_nullable_1.is_null());
  EXPECT_EQ(a.vectors.i64_nullable_1.is_null(),
            b.vectors.i64_nullable_1.is_null());
  EXPECT_EQ(a.vectors.u8_nullable_1.is_null(),
            b.vectors.u8_nullable_1.is_null());
  EXPECT_EQ(a.vectors.u16_nullable_1.is_null(),
            b.vectors.u16_nullable_1.is_null());
  EXPECT_EQ(a.vectors.u32_nullable_1.is_null(),
            b.vectors.u32_nullable_1.is_null());
  EXPECT_EQ(a.vectors.u64_nullable_1.is_null(),
            b.vectors.u64_nullable_1.is_null());
  EXPECT_EQ(a.vectors.f32_nullable_1.is_null(),
            b.vectors.f32_nullable_1.is_null());
  EXPECT_EQ(a.vectors.f64_nullable_1.is_null(),
            b.vectors.f64_nullable_1.is_null());
  EXPECT_EQ(a.vectors.handle_nullable_1.is_null(),
            b.vectors.handle_nullable_1.is_null());

  for (uint8_t i = 0; i < kArbitraryVectorSize; ++i) {
    EXPECT_EQ(a.vectors.i8_nullable_1.get()[i],
              b.vectors.i8_nullable_1.get()[i]);
  }

  EXPECT_EQ(a.vectors.b_nullable_sized_0.is_null(),
            b.vectors.b_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.i8_nullable_sized_0.is_null(),
            b.vectors.i8_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.i16_nullable_sized_0.is_null(),
            b.vectors.i16_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.i32_nullable_sized_0.is_null(),
            b.vectors.i32_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.i64_nullable_sized_0.is_null(),
            b.vectors.i64_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.u8_nullable_sized_0.is_null(),
            b.vectors.u8_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.u16_nullable_sized_0.is_null(),
            b.vectors.u16_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.u32_nullable_sized_0.is_null(),
            b.vectors.u32_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.u64_nullable_sized_0.is_null(),
            b.vectors.u64_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.f32_nullable_sized_0.is_null(),
            b.vectors.f32_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.f64_nullable_sized_0.is_null(),
            b.vectors.f64_nullable_sized_0.is_null());
  EXPECT_EQ(a.vectors.handle_nullable_sized_0.is_null(),
            b.vectors.handle_nullable_sized_0.is_null());

  EXPECT_EQ(a.vectors.i16_nullable_sized_0.get(),
            b.vectors.i16_nullable_sized_0.get());

  EXPECT_EQ(a.vectors.b_nullable_sized_1.is_null(),
            b.vectors.b_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.i8_nullable_sized_1.is_null(),
            b.vectors.i8_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.i16_nullable_sized_1.is_null(),
            b.vectors.i16_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.i32_nullable_sized_1.is_null(),
            b.vectors.i32_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.i64_nullable_sized_1.is_null(),
            b.vectors.i64_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.u8_nullable_sized_1.is_null(),
            b.vectors.u8_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.u16_nullable_sized_1.is_null(),
            b.vectors.u16_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.u32_nullable_sized_1.is_null(),
            b.vectors.u32_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.u64_nullable_sized_1.is_null(),
            b.vectors.u64_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.f32_nullable_sized_1.is_null(),
            b.vectors.f32_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.f64_nullable_sized_1.is_null(),
            b.vectors.f64_nullable_sized_1.is_null());
  EXPECT_EQ(a.vectors.handle_nullable_sized_1.is_null(),
            b.vectors.handle_nullable_sized_1.is_null());

  EXPECT_EQ(a.vectors.f64_nullable_sized_1.get(),
            b.vectors.f64_nullable_sized_1.get());

  EXPECT_EQ(a.vectors.b_nullable_sized_2.is_null(),
            b.vectors.b_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.i8_nullable_sized_2.is_null(),
            b.vectors.i8_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.i16_nullable_sized_2.is_null(),
            b.vectors.i16_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.i32_nullable_sized_2.is_null(),
            b.vectors.i32_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.i64_nullable_sized_2.is_null(),
            b.vectors.i64_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.u8_nullable_sized_2.is_null(),
            b.vectors.u8_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.u16_nullable_sized_2.is_null(),
            b.vectors.u16_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.u32_nullable_sized_2.is_null(),
            b.vectors.u32_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.u64_nullable_sized_2.is_null(),
            b.vectors.u64_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.f32_nullable_sized_2.is_null(),
            b.vectors.f32_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.f64_nullable_sized_2.is_null(),
            b.vectors.f64_nullable_sized_2.is_null());
  EXPECT_EQ(a.vectors.handle_nullable_sized_2.is_null(),
            b.vectors.handle_nullable_sized_2.is_null());

  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.get()[i][j],
                            b.vectors.handle_nullable_sized_2.get()[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.log_handle, b.handles.log_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.get(),
            b.strings.nullable_size_0_s.get());
  EXPECT_EQ(a.strings.nullable_size_1_s.is_null(),
            b.strings.nullable_size_1_s.is_null());

  // 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);

  // 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());

  // bool
  EXPECT_EQ(a.b, b.b);
}

std::string RandomUTF8(size_t count) {
  // 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(count);
  std::uniform_int_distribution<uint32_t> uint32_distribution;

  std::string random_string;
  random_string.reserve(count);
  do {
    // Generate a random 32 bit unsigned int to use a the code point.
    uint32_t code_point = uint32_distribution(rand_engine);
    // Mask the random number so that it can be encoded into the number of bytes
    // remaining.
    size_t remaining = count - random_string.size();
    if (remaining == 1) {
      code_point &= 0x7F;
    } else if (remaining == 2) {
      code_point &= 0x7FF;
    } else if (remaining == 3) {
      code_point &= 0xFFFF;
    } else {
      // Mask to fall within the general range of code points.
      code_point &= 0x1FFFFF;
    }
    // Check that it's really a valid code point, otherwise try again.
    if (!fxl::IsValidCodepoint(code_point)) {
      continue;
    }
    // Add the character to the random string.
    fxl::WriteUnicodeCharacter(code_point, &random_string);
    FXL_CHECK(random_string.size() <= count);
  } while (random_string.size() < count);
  return random_string;
}

void Initialize(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::uniform_int_distribution<bool> bool_distribution;
  std::uniform_int_distribution<int8_t> int8_distribution;
  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<uint8_t> uint8_distribution;
  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);
  std::string random_short_string = RandomUTF8(kArbitraryConstant);

  // primitive_types
  s->primitive_types.b = bool_distribution(rand_engine);
  s->primitive_types.i8 = 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 = 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] = 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] = 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] = 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] = 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] = 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] = 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 = VectorPtr<bool>(
      std::vector<bool>(kArbitraryVectorSize, bool_distribution(rand_engine)));
  s->vectors.i8_0 = VectorPtr<int8_t>(std::vector<int8_t>(
      kArbitraryVectorSize, int8_distribution(rand_engine)));
  s->vectors.i16_0 = VectorPtr<int16_t>(std::vector<int16_t>(
      kArbitraryVectorSize, int16_distribution(rand_engine)));
  s->vectors.i32_0 = VectorPtr<int32_t>(std::vector<int32_t>(
      kArbitraryVectorSize, int32_distribution(rand_engine)));
  s->vectors.i64_0 = VectorPtr<int64_t>(std::vector<int64_t>(
      kArbitraryVectorSize, int64_distribution(rand_engine)));
  s->vectors.u8_0 = VectorPtr<uint8_t>(std::vector<uint8_t>(
      kArbitraryVectorSize, uint8_distribution(rand_engine)));
  s->vectors.u16_0 = VectorPtr<uint16_t>(std::vector<uint16_t>(
      kArbitraryVectorSize, uint16_distribution(rand_engine)));
  s->vectors.u32_0 = VectorPtr<uint32_t>(std::vector<uint32_t>(
      kArbitraryVectorSize, uint32_distribution(rand_engine)));
  s->vectors.u64_0 = VectorPtr<uint64_t>(std::vector<uint64_t>(
      kArbitraryVectorSize, uint64_distribution(rand_engine)));
  s->vectors.f32_0 = VectorPtr<float>(std::vector<float>(
      kArbitraryVectorSize, float_distribution(rand_engine)));
  s->vectors.f64_0 = VectorPtr<double>(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, 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, 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 =
      VectorPtr<bool>(std::vector<bool>{bool_distribution(rand_engine)});
  s->vectors.i8_sized_0 =
      VectorPtr<int8_t>(std::vector<int8_t>{int8_distribution(rand_engine)});
  s->vectors.i16_sized_0 =
      VectorPtr<int16_t>(std::vector<int16_t>{int16_distribution(rand_engine)});
  s->vectors.i32_sized_0 =
      VectorPtr<int32_t>(std::vector<int32_t>{int32_distribution(rand_engine)});
  s->vectors.i64_sized_0 =
      VectorPtr<int64_t>(std::vector<int64_t>{int64_distribution(rand_engine)});
  s->vectors.u8_sized_0 =
      VectorPtr<uint8_t>(std::vector<uint8_t>{uint8_distribution(rand_engine)});
  s->vectors.u16_sized_0 = VectorPtr<uint16_t>(
      std::vector<uint16_t>{uint16_distribution(rand_engine)});
  s->vectors.u32_sized_0 = VectorPtr<uint32_t>(
      std::vector<uint32_t>{uint32_distribution(rand_engine)});
  s->vectors.u64_sized_0 = VectorPtr<uint64_t>(
      std::vector<uint64_t>{uint64_distribution(rand_engine)});
  s->vectors.f32_sized_0 =
      VectorPtr<float>(std::vector<float>{float_distribution(rand_engine)});
  s->vectors.f64_sized_0 =
      VectorPtr<double>(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 = VectorPtr<bool>(std::vector<bool>(
      fidl::test::compatibility::vectors_size, bool_distribution(rand_engine)));
  s->vectors.i8_sized_1 = VectorPtr<int8_t>(std::vector<int8_t>(
      fidl::test::compatibility::vectors_size, int8_distribution(rand_engine)));
  s->vectors.i16_sized_1 = VectorPtr<int16_t>(
      std::vector<int16_t>(fidl::test::compatibility::vectors_size,
                           int16_distribution(rand_engine)));
  s->vectors.i32_sized_1 = VectorPtr<int32_t>(
      std::vector<int32_t>(fidl::test::compatibility::vectors_size,
                           int32_distribution(rand_engine)));
  s->vectors.i64_sized_1 = VectorPtr<int64_t>(
      std::vector<int64_t>(fidl::test::compatibility::vectors_size,
                           int64_distribution(rand_engine)));
  s->vectors.u8_sized_1 = VectorPtr<uint8_t>(
      std::vector<uint8_t>(fidl::test::compatibility::vectors_size,
                           uint8_distribution(rand_engine)));
  s->vectors.u16_sized_1 = VectorPtr<uint16_t>(
      std::vector<uint16_t>(fidl::test::compatibility::vectors_size,
                            uint16_distribution(rand_engine)));
  s->vectors.u32_sized_1 = VectorPtr<uint32_t>(
      std::vector<uint32_t>(fidl::test::compatibility::vectors_size,
                            uint32_distribution(rand_engine)));
  s->vectors.u64_sized_1 = VectorPtr<uint64_t>(
      std::vector<uint64_t>(fidl::test::compatibility::vectors_size,
                            uint64_distribution(rand_engine)));
  s->vectors.f32_sized_1 = VectorPtr<float>(
      std::vector<float>(fidl::test::compatibility::vectors_size,
                         float_distribution(rand_engine)));
  s->vectors.f64_sized_1 = VectorPtr<double>(
      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, 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, 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(VectorPtr<int8_t>(std::vector<int8_t>(
          kArbitraryConstant, 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));
  ASSERT_EQ(ZX_OK,
            zx::debuglog::create(zx::resource(), 0u, &s->handles.log_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(
                       0u, getpagesize(), ZX_VM_CAN_MAP_READ,
                       &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 = fidl::StringPtr(random_string);
  s->strings.size_0_s = fidl::StringPtr(random_short_string);
  s->strings.size_1_s = fidl::StringPtr(random_string);
  s->strings.nullable_size_0_s = fidl::StringPtr(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;

  // structs
  s->structs.s.s = fidl::StringPtr(random_string);

  // unions
  s->unions.u.set_s(fidl::StringPtr(random_string));
  s->unions.nullable_u = fidl::test::compatibility::this_is_a_union::New();
  s->unions.nullable_u->set_b(bool_distribution(rand_engine));

  // 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(&kAsyncLoopConfigAttachToThread));
  }
  std::string proxy_url_;
  std::string server_url_;
  std::unique_ptr<async::Loop> loop_;
};

std::vector<std::string> servers;

using TestBody = std::function<void(async::Loop& loop,
                                    fidl::test::compatibility::EchoPtr& proxy,
                                    const std::string& server_url)>;

void ForAllServers(TestBody body) {
  for (auto const& proxy_url : servers) {
    for (auto const& server_url : servers) {
      std::cerr << proxy_url << " <-> " << server_url << std::endl;
      async::Loop loop(&kAsyncLoopConfigAttachToThread);
      fidl::test::compatibility::EchoClientApp proxy;
      proxy.Start(proxy_url);

      body(loop, proxy.echo(), server_url);
    }
  }
}

TEST(Compatibility, EchoStruct) {
  ForAllServers([](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
                   const std::string& server_url) {
    Struct sent;
    Initialize(&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);
  });
}

TEST(Compatibility, EchoStructNoRetval) {
  ForAllServers([](async::Loop& loop, fidl::test::compatibility::EchoPtr& proxy,
                   const std::string& server_url) {
    Struct sent;
    Initialize(&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);
  });
}

}  // namespace

int main(int argc, char** argv) {
  testing::InitGoogleTest(&argc, argv);

  // TODO(ianloic): remove support for environment once Topaz has migrated to
  // passing server names on the command-line.
  const char* servers_from_env = getenv(kServersEnvVarName);
  if (servers_from_env != nullptr) {
    servers = fxl::SplitStringCopy(
        fxl::StringView(servers_from_env, strlen(servers_from_env)), ",",
        fxl::WhiteSpaceHandling::kTrimWhitespace,
        fxl::SplitResult::kSplitWantNonEmpty);
  }

  for (int i = 1; i < argc; i++) {
    servers.push_back(argv[i]);
  }

  FXL_CHECK(!servers.empty()) << kUsage;

  return RUN_ALL_TESTS();
}
