// 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.

#![feature(async_await, await_macro)]

use failure::Error;
use fidl_fuchsia_sys::FileDescriptor;
use fuchsia_async as fasync;
use fuchsia_component::client::{launch_with_options, launcher, LaunchOptions};
use fuchsia_runtime::HandleType;
use std::io::{BufRead, BufReader};

#[fasync::run_singlethreaded]
async fn main() -> Result<(), Error> {
    let (pipe, socket) = fdio::pipe_half()?;
    let mut launch_options = LaunchOptions::new();
    launch_options.set_out(FileDescriptor {
        type0: HandleType::FileDescriptor as i32,
        type1: 0,
        type2: 0,
        handle0: Some(socket.into()),
        handle1: None,
        handle2: None,
    });

    let launcher = launcher().expect("Failed to open launcher service");
    let _app = launch_with_options(
        &launcher,
        "fuchsia-pkg://fuchsia.com/dash_test#meta/component_manager.cmx".to_string(),
        Some(vec!["fuchsia-pkg://fuchsia.com/dash_test#meta/dash_hello.cm".to_string()]),
        launch_options,
    )
    .expect("Failed to launch component_manager with dash_hello");

    let mut reader = BufReader::new(pipe);

    // Assert component manager as a v1 component was able to launch dash as a v2 component was
    // able to launch hello world as a binary.
    let mut line = String::new();
    reader.read_line(&mut line)?;
    assert_eq!(line, "Hippo: Hello World!\n");

    Ok(())
}
