// Copyright 2021 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_component as fcomponent, fidl_fuchsia_component_tests as fctests,
    fidl_fuchsia_sys2 as fsys,
    fuchsia_component::client,
    futures::stream::{FusedStream, StreamExt},
};

const CHILD_MONIKER: &str = "./looper";
const NUM_CONNECTIONS: u64 = 3;

#[fuchsia::test]
async fn binder() {
    let event_source = EventSource::from_proxy(
        client::connect_to_protocol::<fsys::EventSourceMarker>()
            .expect("failed to connect to fuchsia.sys2.EventSource"),
    );

    let mut event_stream = event_source
        .subscribe(vec![EventSubscription::new(vec![Started::NAME, Stopped::NAME])])
        .await
        .expect("failed to create event stream");

    let mut binders = (0..NUM_CONNECTIONS)
        .map(|_| {
            let binder = client::connect_to_protocol::<fcomponent::BinderMarker>()
                .expect("failed to connect to fuchsia.component.Binder");
            binder.take_event_stream()
        })
        .collect::<Vec<_>>();

    // First, assert that a connection to fuchsia.component.Binder triggers a start.
    EventMatcher::ok()
        .r#type(fsys::EventType::Started)
        .moniker(CHILD_MONIKER.to_owned())
        .wait::<Started>(&mut event_stream)
        .await
        .expect("failed to observe events");

    // Next, assert that channel is still open.
    for evt_stream in binders.iter_mut() {
        assert!(!evt_stream.is_terminated());
    }

    let shutdowner = client::connect_to_protocol::<fctests::ShutdownerMarker>()
        .expect("failed to connect to fuchsia.component.tests.Shutdowner");
    let () = shutdowner.shutdown().expect("failed to call Shutdown()");
    EventMatcher::ok()
        .r#type(fsys::EventType::Stopped)
        .moniker(CHILD_MONIKER.to_owned())
        .wait::<Stopped>(&mut event_stream)
        .await
        .expect("failed to observe events");

    // Channel should be closing now.
    for evt_stream in binders.iter_mut() {
        assert_matches::assert_matches!(evt_stream.next().await, None);
    }
}
