// 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::{Event, EventSource, EventSubscription, Resolved, Started},
        matcher::EventMatcher,
    },
    fidl_fuchsia_component as fcomponent, fidl_fuchsia_component_decl as fdecl,
    fidl_fuchsia_io as fio,
    fuchsia_component::client::{connect_to_protocol, connect_to_protocol_at_dir_root},
};

#[fuchsia::component(logging_tags = ["resolveed_error_reporter"])]
async fn main() {
    // Track all the starting child components.
    let event_source = EventSource::new().unwrap();
    let mut event_stream = event_source
        .subscribe(vec![EventSubscription::new(vec![Resolved::NAME, Started::NAME])])
        .await
        .unwrap();

    // This will trigger the resolution of the child.
    let realm = connect_to_protocol::<fcomponent::RealmMarker>().unwrap();
    let mut child_ref = fdecl::ChildRef { name: "child_a".to_string(), collection: None };

    let (exposed_dir, server_end) =
        fidl::endpoints::create_proxy::<fio::DirectoryMarker>().unwrap();
    let _ = realm
        .open_exposed_dir(&mut child_ref, server_end)
        .await
        .expect("failed to open exposed dir");

    // Attempt to start the child component should fail.
    assert!(connect_to_protocol_at_dir_root::<fcomponent::BinderMarker>(&exposed_dir).is_err());

    let _resolved_event = EventMatcher::err().expect_match::<Resolved>(&mut event_stream).await;
}
