// Copyright 2019 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 {
    test_utils_lib::{events::*, injectors::*, matcher::EventMatcher, opaque_test::*},
    work_scheduler_dispatch_reporter::{DispatchedEvent, WorkSchedulerDispatchReporter},
};

#[fuchsia_async::run_singlethreaded(test)]
async fn basic_work_scheduler_test() {
    let root_component_url =
        "fuchsia-pkg://fuchsia.com/work_scheduler_integration_test#meta/bound_worker.cm";
    let test = OpaqueTest::default(root_component_url).await.unwrap();

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

    let work_scheduler_dispatch_reporter = WorkSchedulerDispatchReporter::new();
    work_scheduler_dispatch_reporter.inject(&event_source, EventMatcher::ok()).await;

    event_source.start_component_tree().await;

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

    let dispatched_event = work_scheduler_dispatch_reporter.wait_for_dispatched().await;
    assert_eq!(DispatchedEvent::new("TEST".to_string()), dispatched_event);
}

#[fuchsia_async::run_singlethreaded(test)]
async fn unbound_work_scheduler_test() {
    let root_component_url =
        "fuchsia-pkg://fuchsia.com/work_scheduler_integration_test#meta/unbound_child_worker_parent.cm";
    let test = OpaqueTest::default(root_component_url).await.unwrap();

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

    let work_scheduler_dispatch_reporter = WorkSchedulerDispatchReporter::new();
    work_scheduler_dispatch_reporter.inject(&event_source, EventMatcher::ok()).await;

    event_source.start_component_tree().await;

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

    // `/worker_sibling:0` has started.
    let event = EventMatcher::ok()
        .moniker("./worker_sibling:0")
        .expect_match::<Started>(&mut event_stream)
        .await;
    event.resume().await.unwrap();

    // We no longer need to track `StartInstance` events.
    drop(event_stream);

    let dispatched_event = work_scheduler_dispatch_reporter.wait_for_dispatched().await;
    assert_eq!(DispatchedEvent::new("TEST".to_string()), dispatched_event);
}
