// 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 {
    component_events::{events::*, matcher::*},
    fidl_fuchsia_sys2 as fsys,
    fuchsia_component_test::new::{ChildOptions, RealmBuilder},
};

#[fuchsia::test]
async fn base_resolver_appmgr_bridge_test() {
    let builder = RealmBuilder::new().await.unwrap();
    builder
        .add_child(
            "echo_server",
            "fuchsia-pkg://fuchsia.com/base_resolver_test#meta/echo_server.cm",
            ChildOptions::new().eager(),
        )
        .await
        .unwrap();
    let instance =
        builder.build_in_nested_component_manager("#meta/cm_appmgr_loader.cm").await.unwrap();
    let proxy =
        instance.root.connect_to_protocol_at_exposed_dir::<fsys::EventSourceMarker>().unwrap();

    let event_source = EventSource::from_proxy(proxy);

    let mut event_stream =
        event_source.subscribe(vec![EventSubscription::new(vec![Started::NAME])]).await.unwrap();

    instance.start_component_tree().await.unwrap();

    // Expect realm builder root to start
    EventMatcher::ok().moniker(".").expect_match::<Started>(&mut event_stream).await;

    // Expect start to succeed because we're using the appmgr loader
    EventMatcher::ok().moniker("./echo_server").expect_match::<Started>(&mut event_stream).await;
}

#[fuchsia::test]
/// This uses the root_component.rs implementation to make the test package's
/// contents appear at /pkgfs. This allows component manager's built-in base
/// package resolver to see the contents of the package. HOWEVER, the component
/// manager configuration here sets the built-in resolver to 'None', meaning we
/// expect the attempt to start `echo_server` to not resolve.
async fn base_resolver_disabled_test() {
    let builder = RealmBuilder::new().await.unwrap();
    builder.add_child("root", "#meta/root.cm", ChildOptions::new().eager()).await.unwrap();
    let instance =
        builder.build_in_nested_component_manager("#meta/cm_disabled_resolver.cm").await.unwrap();
    let proxy =
        instance.root.connect_to_protocol_at_exposed_dir::<fsys::EventSourceMarker>().unwrap();

    let event_source = EventSource::from_proxy(proxy);

    let mut event_stream = event_source
        .subscribe(vec![EventSubscription::new(vec![Started::NAME, Resolved::NAME])])
        .await
        .unwrap();

    instance.start_component_tree().await.unwrap();

    // Expect the root component to be bound to
    let _ = EventMatcher::ok().moniker("./root").wait::<Started>(&mut event_stream).await.unwrap();

    // Expect start failure for echo_server because we shouldn't resolve the component
    EventMatcher::err()
        .moniker("./root/echo_server")
        .expect_match::<Resolved>(&mut event_stream)
        .await;
}
