// 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 <fidl/fuchsia.driver.test/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/device-watcher/cpp/device-watcher.h>
#include <lib/driver_test_realm/realm_builder/cpp/lib.h>
#include <lib/fdio/directory.h>
#include <lib/sys/component/cpp/testing/realm_builder.h>
#include <lib/sys/component/cpp/testing/realm_builder_types.h>

#include <thread>

#include <fbl/unique_fd.h>
#include <zxtest/zxtest.h>

TEST(DriverTransportTest, ParentChildExists) {
  async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);

  // Create and build the realm.
  auto realm_builder = component_testing::RealmBuilder::Create();
  driver_test_realm::Setup(realm_builder);
  auto realm = realm_builder.Build(loop.dispatcher());

  // Start DriverTestRealm.
  zx::result dtr_client = realm.component().Connect<fuchsia_driver_test::Realm>();
  ASSERT_OK(dtr_client.status_value());
  fidl::Result realm_result = fidl::Call(*dtr_client)->Start({});
  ASSERT_TRUE(realm_result.is_ok());

  fbl::unique_fd fd;
  auto exposed = realm.component().CloneExposedDir();
  ASSERT_EQ(fdio_fd_create(exposed.TakeChannel().release(), fd.reset_and_get_address()), ZX_OK);

  {
    // Wait for parent driver.
    zx::result channel =
        device_watcher::RecursiveWaitForFile(fd.get(), "dev-topological/sys/test/transport-child");
    ASSERT_EQ(channel.status_value(), ZX_OK);
  }

  {
    // Wait for child driver.
    zx::result channel = device_watcher::RecursiveWaitForFile(
        fd.get(), "dev-topological/sys/test/transport-child/test");
    ASSERT_EQ(channel.status_value(), ZX_OK);
  }
}
