// Copyright 2018 The Chromium 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 "base/fuchsia/service_directory.h"

#include <lib/fdio/util.h>
#include <lib/zx/channel.h>
#include <utility>

#include "base/bind.h"
#include "base/fuchsia/service_directory_test_base.h"
#include "base/location.h"
#include "base/run_loop.h"
#include "base/task_runner.h"
#include "base/test/test_timeouts.h"
#include "base/threading/thread_task_runner_handle.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {
namespace fuchsia {

class ServiceDirectoryTest : public ServiceDirectoryTestBase {};

// Verifies that ComponentContext can consume a public service in
// ServiceDirectory and that connection is disconnected when the client stub is
// destroyed.
TEST_F(ServiceDirectoryTest, ConnectDisconnect) {
  auto stub = client_context_->ConnectToService<test_fidl::TestInterface>();
  VerifyTestInterface(&stub, false);

  base::RunLoop run_loop;
  service_binding_->SetOnLastClientCallback(run_loop.QuitClosure());

  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
      FROM_HERE,
      base::BindOnce(
          [](base::RunLoop* run_loop) {
            ADD_FAILURE();
            run_loop->Quit();
          },
          &run_loop),
      TestTimeouts::action_timeout());

  stub.Unbind();
  run_loop.Run();
}

// Verifies that we can connect to the service service more than once.
TEST_F(ServiceDirectoryTest, ConnectMulti) {
  auto stub = client_context_->ConnectToService<test_fidl::TestInterface>();
  auto stub2 = client_context_->ConnectToService<test_fidl::TestInterface>();
  VerifyTestInterface(&stub, false);
  VerifyTestInterface(&stub2, false);
}

// Verify that services are also exported to the legacy flat service namespace.
TEST_F(ServiceDirectoryTest, ConnectLegacy) {
  ConnectClientContextToDirectory(".");
  auto stub = client_context_->ConnectToService<test_fidl::TestInterface>();
  VerifyTestInterface(&stub, false);
}

// Verify that ComponentContext can handle the case when the service directory
// connection is disconnected.
TEST_F(ServiceDirectoryTest, DirectoryGone) {
  service_binding_.reset();
  service_directory_.reset();

  fidl::InterfacePtr<test_fidl::TestInterface> stub;
  zx_status_t status =
      client_context_->ConnectToService(FidlInterfaceRequest(&stub));
  EXPECT_EQ(status, ZX_ERR_PEER_CLOSED);

  VerifyTestInterface(&stub, true);
}

// Verify that the case when the service doesn't exist is handled properly.
TEST_F(ServiceDirectoryTest, NoService) {
  service_binding_.reset();
  auto stub = client_context_->ConnectToService<test_fidl::TestInterface>();
  VerifyTestInterface(&stub, true);
}

}  // namespace fuchsia
}  // namespace base
