// Copyright 2022 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 "src/connectivity/network/mdns/service/services/service_impl_manager.h"

#include <fuchsia/net/mdns/cpp/fidl.h>
#include <lib/fidl/cpp/interface_ptr.h>

#include "src/lib/testing/loop_fixture/real_loop_fixture.h"

namespace mdns {
namespace test {

class ServiceImplManagerTests : public gtest::RealLoopFixture {};

class TestServiceImpl : public fuchsia::net::mdns::ServiceInstanceResolver {
 public:
  TestServiceImpl(bool& set_on_deletion) : set_on_deletion_(set_on_deletion) {}

  ~TestServiceImpl() override { set_on_deletion_ = true; }

  void ResolveServiceInstance(std::string service, std::string instance, int64_t timeout,
                              fuchsia::net::mdns::ServiceInstanceResolutionOptions options,
                              ResolveServiceInstanceCallback callback) override {}

  bool& set_on_deletion_;
};

// Tests normal use.
TEST_F(ServiceImplManagerTests, NormalUse) {
  fit::closure deleter_from_create;
  bool instance_deleted = false;

  ServiceImplManager<fuchsia::net::mdns::ServiceInstanceResolver> under_test(
      [&deleter_from_create, &instance_deleted](
          fidl::InterfaceRequest<fuchsia::net::mdns::ServiceInstanceResolver> request,
          fit::closure deleter) {
        deleter_from_create = std::move(deleter);
        return std::make_unique<TestServiceImpl>(instance_deleted);
      });

  fidl::InterfacePtr<fuchsia::net::mdns::ServiceInstanceResolver> pointer;
  under_test.Connect(pointer.NewRequest());

  // Expect that the creator hasn't been called yet, because we haven't called |OnReady|.
  EXPECT_FALSE(!!deleter_from_create);
  EXPECT_FALSE(instance_deleted);

  under_test.OnReady();

  // Expect that the creator has been called.
  EXPECT_TRUE(!!deleter_from_create);
  EXPECT_FALSE(instance_deleted);

  deleter_from_create();

  EXPECT_TRUE(instance_deleted);

  deleter_from_create = nullptr;
  instance_deleted = false;
  pointer = nullptr;

  under_test.Connect(pointer.NewRequest());

  // Expect that the creator has been called.
  EXPECT_TRUE(!!deleter_from_create);
  EXPECT_FALSE(instance_deleted);

  deleter_from_create();

  EXPECT_TRUE(instance_deleted);
}

}  // namespace test
}  // namespace mdns
