// 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 "gatt_client_server.h"

#include "src/connectivity/bluetooth/core/bt-host/gatt/fake_layer_test.h"

namespace bthost {
namespace {

namespace fgatt = fuchsia::bluetooth::gatt;

constexpr bt::PeerId kPeerId(1);
constexpr bt::UUID kHeartRate(uint16_t{0x180D});
constexpr bt::UUID kHid(uint16_t{0x1812});

class FIDL_GattClientServerTest : public bt::gatt::testing::FakeLayerTest {
 public:
  FIDL_GattClientServerTest() = default;
  ~FIDL_GattClientServerTest() override = default;

  void SetUp() override {
    fidl::InterfaceHandle<fgatt::Client> handle;
    server_ = std::make_unique<GattClientServer>(kPeerId, gatt()->AsWeakPtr(), handle.NewRequest());
    proxy_.Bind(std::move(handle));
  }

  fgatt::Client* proxy() const { return proxy_.get(); }

 private:
  std::unique_ptr<GattClientServer> server_;
  fgatt::ClientPtr proxy_;

  DISALLOW_COPY_ASSIGN_AND_MOVE(FIDL_GattClientServerTest);
};

TEST_F(FIDL_GattClientServerTest, ListServices) {
  bt::gatt::ServiceData data1(bt::gatt::ServiceKind::PRIMARY, 1, 1, kHeartRate);
  bt::gatt::ServiceData data2(bt::gatt::ServiceKind::SECONDARY, 2, 2, kHid);
  gatt()->AddPeerService(kPeerId, data1);
  gatt()->AddPeerService(kPeerId, data2);

  std::vector<fgatt::ServiceInfo> results;
  proxy()->ListServices({}, [&](auto status, auto cb_results) {
    EXPECT_FALSE(status.error);
    results = std::move(cb_results);
  });
  RunLoopUntilIdle();

  ASSERT_EQ(2u, results.size());
  EXPECT_EQ(kHeartRate.ToString(), results[0].type);
  EXPECT_TRUE(results[0].primary);
  EXPECT_EQ(kHid.ToString(), results[1].type);
  EXPECT_FALSE(results[1].primary);
}

}  // namespace
}  // namespace bthost
