// 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 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;
      bool test_completed = false;
      proxy.echo().set_error_handler([&proxy_url, &loop, &test_completed](zx_status_t status) {
        if (!test_completed) {
          loop.Quit();
          FAIL() << "Connection to " << proxy_url << " failed unexpectedly: " << status;
        }
      });
      proxy.Start(proxy_url);

      body(loop, proxy.echo(), server_url);
      test_completed = true;
    }
  }
}

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

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

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

  return RUN_ALL_TESTS();
}
