// 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.

use {
    anyhow::{Context, Error},
    component_events::{events::*, matcher::EventMatcher},
    fidl::endpoints::{create_proxy, DiscoverableProtocolMarker},
    fidl_fuchsia_component as fcomponent, fidl_fuchsia_component_decl as fdecl,
    fidl_fuchsia_io as fio, fuchsia_component,
    test_utils_lib::opaque_test::{OpaqueTest, OpaqueTestBuilder},
};

fn connect_to_root_service<P: DiscoverableProtocolMarker>(
    test: &OpaqueTest,
) -> Result<P::Proxy, Error> {
    let mut service_path = test.get_hub_v2_path();
    service_path.extend(&["exec", "expose", P::PROTOCOL_NAME]);
    fuchsia_component::client::connect_to_protocol_at_path::<P>(service_path.to_str().unwrap())
}

pub async fn start_policy_test(
    component_manager_url: &str,
    root_component_url: &str,
    config_path: &str,
) -> Result<(OpaqueTest, fcomponent::RealmProxy, EventStream), Error> {
    let test = OpaqueTestBuilder::new(root_component_url)
        .component_manager_url(component_manager_url)
        .config(config_path)
        .build()
        .await?;
    let event_source = test.connect_to_event_source().await?;
    let mut event_stream = event_source
        .subscribe(vec![EventSubscription::new(vec![Started::NAME, Stopped::NAME])])
        .await?;
    test.start_component_tree().await.unwrap();

    // Wait for the root component to be started so we can connect to its Realm service through the
    // hub.
    EventMatcher::ok().moniker(".").expect_match::<Started>(&mut event_stream).await;

    let realm = connect_to_root_service::<fcomponent::RealmMarker>(&test)
        .context("failed to connect to root component.Realm")?;
    Ok((test, realm, event_stream))
}

pub async fn open_exposed_dir(
    realm: &fcomponent::RealmProxy,
    name: &str,
) -> Result<fio::DirectoryProxy, fcomponent::Error> {
    let mut child_ref = fdecl::ChildRef { name: name.to_string(), collection: None };
    let (exposed_dir, server_end) = create_proxy().unwrap();
    realm
        .open_exposed_dir(&mut child_ref, server_end)
        .await
        .expect("open_exposed_dir failed")
        .map(|_| exposed_dir)
}
