// Copyright 2020 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 "lib/fidl/cpp/comparison.h"

#include <map>

#include <zxtest/zxtest.h>

#include "lib/fidl/cpp/clone.h"

#ifdef __Fuchsia__
#include <lib/zx/event.h>
#endif

namespace fidl {
namespace {

TEST(Comparison, UnknownBytes) {
  UnknownBytes bytes1 = {
      .bytes = {0xde, 0xad, 0xbe, 0xef},
  };

  UnknownBytes bytes2 = {
      .bytes = {0xde, 0xad, 0xbe, 0xef},
  };

  ASSERT_EQ(true, Equals(bytes1, bytes2));
}

#ifdef __Fuchsia__
TEST(Comparison, UnknownDataSameHandle) {
  zx_handle_t h;
  ASSERT_EQ(ZX_OK, zx_event_create(0, &h));
  UnknownData data1 = {
      .bytes = {0xde, 0xad},
      .handles = {},
  };
  data1.handles.push_back(zx::handle(h));

  UnknownData data2 = {
      .bytes = {0xde, 0xad},
      .handles = {},
  };
  data2.handles.push_back(zx::handle(h));

  ASSERT_EQ(true, Equals(data1, data2));

  std::map<uint64_t, UnknownData> map1;
  map1.insert({3, std::move(data1)});
  std::map<uint64_t, UnknownData> map2;
  map2.insert({3, std::move(data2)});
  ASSERT_EQ(true, Equals(map1, map2));

  // prevent double close by releasing one of the handles
  [[maybe_unused]] zx_handle_t copy = map1.begin()->second.handles[0].release();
}

TEST(Comparison, UnknownDataCopiedHandle) {
  zx_handle_t h;
  ASSERT_EQ(ZX_OK, zx_event_create(0, &h));
  UnknownData data1 = {
      .bytes = {0xde, 0xad},
      .handles = {},
  };
  data1.handles.push_back(zx::handle(h));

  UnknownData data2;
  ASSERT_EQ(ZX_OK, Clone(data1, &data2));

  ASSERT_EQ(false, Equals(data1, data2));

  std::map<uint64_t, UnknownData> map1;
  map1.insert({3, std::move(data1)});
  std::map<uint64_t, UnknownData> map2;
  map2.insert({3, std::move(data2)});
  ASSERT_EQ(false, Equals(map1, map2));
}
#endif

}  // namespace
}  // namespace fidl
