| // 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 { |
| fuchsia_async as fasync, |
| fuchsia_component::client::ScopedInstance, |
| fuchsia_syslog::{self as fxlog}, |
| test_utils_lib::{ |
| events::{Event, EventMode, EventSource, EventSubscription, Stopped}, |
| matcher::{EventMatcher, ExitStatusMatcher}, |
| sequence::EventSequence, |
| }, |
| }; |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn test_normal_behavior() { |
| fxlog::init().unwrap(); |
| |
| let event_source = EventSource::new_sync().unwrap(); |
| let event_stream = event_source |
| .subscribe(vec![EventSubscription::new(vec![Stopped::NAME], EventMode::Sync)]) |
| .await |
| .unwrap(); |
| event_source.start_component_tree().await; |
| let collection_name = String::from("test-collection"); |
| // What is going on here? A scoped dynamic instance is created and then |
| // dropped. When a the instance is dropped it stops the instance. |
| let (child_name, destroy_waiter) = { |
| let mut instance = ScopedInstance::new( |
| collection_name.clone(), |
| String::from( |
| "fuchsia-pkg://fuchsia.com/elf_runner_lifecycle_test#meta/lifecycle-full.cm", |
| ), |
| ) |
| .await |
| .unwrap(); |
| |
| (instance.child_name(), instance.take_destroy_waiter()) |
| }; |
| if let Some(e) = destroy_waiter.await { |
| panic!("failed to destroy child: {:?}", e); |
| } |
| |
| let moniker_stem = format!("./{}:{}:", collection_name, child_name); |
| let descriptor_moniker = format!("^{}\\d+$", moniker_stem); |
| EventSequence::new() |
| .then(EventMatcher::ok().moniker(&descriptor_moniker).stop(Some(ExitStatusMatcher::Clean))) |
| .expect(event_stream) |
| .await |
| .unwrap(); |
| } |