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

#[cfg(test)]
mod tests {
    use {
        anyhow::{format_err, Context as _, Error},
        fidl::endpoints::ServiceMarker,
        fidl_fuchsia_netemul_environment::{
            EnvironmentOptions, LaunchService, LoggerOptions, ManagedEnvironmentMarker,
            ManagedEnvironmentProxy,
        },
        fidl_fuchsia_netemul_network::{
            NetworkConfig, NetworkContextMarker, NetworkContextProxy, NetworkManagerMarker,
            NetworkProxy,
        },
        fidl_fuchsia_netemul_sandbox::{SandboxMarker, SandboxProxy},
        fidl_fuchsia_netemul_sync::{BusMarker, BusProxy, SyncManagerMarker, SyncManagerProxy},
        fidl_fuchsia_netstack::NetstackMarker,
        fuchsia_async as fasync,
        fuchsia_component::client,
        fuchsia_zircon as zx,
    };

    fn create_named_env_with_netstack(
        sandbox: &SandboxProxy,
        name: Option<String>,
    ) -> Result<ManagedEnvironmentProxy, Error> {
        let (env, env_server_end) = fidl::endpoints::create_proxy::<ManagedEnvironmentMarker>()?;
        let services = vec![LaunchService {
            name: String::from("fuchsia.netstack.Netstack"),
            url: String::from("fuchsia-pkg://fuchsia.com/netstack#meta/netstack.cmx"),
            arguments: Vec::new(),
        }];
        sandbox.create_environment(
            env_server_end,
            EnvironmentOptions {
                name: name, // don't care about the name, let it be created by itself
                services: Some(services),
                devices: None,
                inherit_parent_launch_services: Some(false),
                logger_options: Some(LoggerOptions {
                    enabled: Some(true),
                    klogs_enabled: Some(false),
                    filter_options: None,
                    syslog_output: Some(true),
                    ..LoggerOptions::EMPTY
                }),
                ..EnvironmentOptions::EMPTY
            },
        )?;

        Ok(env)
    }

    fn create_env_with_netstack(sandbox: &SandboxProxy) -> Result<ManagedEnvironmentProxy, Error> {
        create_named_env_with_netstack(sandbox, None)
    }

    async fn create_network<'a>(
        env: &'a ManagedEnvironmentProxy,
        name: &'a str,
    ) -> Result<NetworkProxy, Error> {
        let (netctx, netctx_server_end) = fidl::endpoints::create_proxy::<NetworkContextMarker>()?;
        env.connect_to_service(NetworkContextMarker::NAME, netctx_server_end.into_channel())?;
        let (netmgr, netmgr_server_end) = fidl::endpoints::create_proxy::<NetworkManagerMarker>()?;
        netctx.get_network_manager(netmgr_server_end)?;
        let config = NetworkConfig {
            latency: None,
            packet_loss: None,
            reorder: None,
            ..NetworkConfig::EMPTY
        };
        let (status, network) = netmgr.create_network(name, config).await?;
        match status {
            zx::sys::ZX_OK => Ok(network.unwrap().into_proxy()?),
            _ => Err(format_err!("Create network failed")),
        }
    }

    async fn get_network<'a>(
        env: &'a ManagedEnvironmentProxy,
        name: &'a str,
    ) -> Result<NetworkProxy, Error> {
        let (netctx, netctx_server_end) = fidl::endpoints::create_proxy::<NetworkContextMarker>()?;
        env.connect_to_service(NetworkContextMarker::NAME, netctx_server_end.into_channel())?;
        get_network_from_context(&netctx, name).await
    }

    async fn get_network_from_context<'a>(
        netctx: &'a NetworkContextProxy,
        name: &'a str,
    ) -> Result<NetworkProxy, Error> {
        let (netmgr, netmgr_server_end) = fidl::endpoints::create_proxy::<NetworkManagerMarker>()?;
        netctx.get_network_manager(netmgr_server_end)?;
        let network = netmgr.get_network(name).await?;

        Ok(network.ok_or_else(|| format_err!("can't create network"))?.into_proxy()?)
    }

    async fn get_on_bus_from_env<'a>(
        env: &'a ManagedEnvironmentProxy,
        bus_name: &'static str,
        name: &'static str,
    ) -> Result<BusProxy, Error> {
        let (syncmgr, syncmgr_server_end) = fidl::endpoints::create_proxy::<SyncManagerMarker>()?;
        env.connect_to_service(SyncManagerMarker::NAME, syncmgr_server_end.into_channel())?;
        let (bus, bus_server_end) = fidl::endpoints::create_proxy::<BusMarker>()?;
        let () = syncmgr.bus_subscribe(bus_name, name, bus_server_end)?;
        // do something to ensure ordering
        let _ = bus.get_clients().await?;
        Ok(bus)
    }

    async fn get_on_bus_and_list_clients<'a>(
        syncmgr: &'a SyncManagerProxy,
        bus_name: &'static str,
        name: &'static str,
    ) -> Result<Vec<String>, Error> {
        let (bus, bus_server_end) = fidl::endpoints::create_proxy::<BusMarker>()?;
        let () = syncmgr.bus_subscribe(bus_name, name, bus_server_end)?;
        Ok(bus.get_clients().await?)
    }

    #[fasync::run_singlethreaded]
    #[test]
    async fn can_use_environment_services() {
        let sandbox = client::connect_to_service::<SandboxMarker>()
            .context("Can't connect to sandbox")
            .unwrap();
        let env = create_env_with_netstack(&sandbox).unwrap();
        let (netstack, netstack_server_end) =
            fidl::endpoints::create_proxy::<NetstackMarker>().unwrap();
        env.connect_to_service(NetstackMarker::NAME, netstack_server_end.into_channel())
            .context("Can't connect to netstack")
            .unwrap();
        let ifs =
            netstack.get_interfaces().await.context("can't list netstack interfaces").unwrap();
        assert!(
            ifs.len() <= 1,
            "brand new netstack should not have any interfaces except for loopback"
        );
    }

    #[fasync::run_singlethreaded]
    #[test]
    async fn environment_netctx_sandboxing() {
        let sandbox =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox 1");

        let sandbox2 =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox 2");

        let (netctx1, netctx_server_end) = fidl::endpoints::create_proxy::<NetworkContextMarker>()
            .expect("can't create context proxy 1");
        sandbox.get_network_context(netctx_server_end).expect("failed to get network context 1");

        let (netctx2, netctx_server_end) = fidl::endpoints::create_proxy::<NetworkContextMarker>()
            .expect("can't create context proxy 2");
        sandbox2.get_network_context(netctx_server_end).expect("failed to get network context 2");

        let env1 = create_env_with_netstack(&sandbox).expect("can't create env 1");
        let env2 = create_env_with_netstack(&sandbox).expect("can't create env 2");
        let env3 = create_env_with_netstack(&sandbox2).expect("can't create env 3");

        let _net = create_network(&env1, "network").await.expect("failed to create network");
        let net1_retrieve = get_network(&env1, "network").await;
        assert!(net1_retrieve.is_ok(), "can retrieve net from env1");
        let net2_retrieve = get_network(&env2, "network").await;
        assert!(net2_retrieve.is_ok(), "can retrieve net from env2");
        let net3_retrieve = get_network(&env3, "network").await;
        assert!(net3_retrieve.is_err(), "net should not exist in env3");

        get_network_from_context(&netctx1, "network")
            .await
            .expect("Should be able to retrieve net from sandbox 1");
        get_network_from_context(&netctx2, "network")
            .await
            .expect_err("Shouldn't be able retrieve net from sandbox 2");
    }

    #[fasync::run_singlethreaded]
    #[test]
    async fn environment_syncmgr_sandboxing() {
        const BUS_NAME: &'static str = "bus";

        let sandbox =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox 1");

        let sandbox2 =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox 2");

        let (sync1, sync_server_end) = fidl::endpoints::create_proxy::<SyncManagerMarker>()
            .expect("can't create sync manager proxy 1");
        sandbox.get_sync_manager(sync_server_end).expect("failed to get sync manager 1");

        let (sync2, sync_server_end) = fidl::endpoints::create_proxy::<SyncManagerMarker>()
            .expect("can't create sync manager proxy 2");
        sandbox2.get_sync_manager(sync_server_end).expect("failed to get sync manager 2");

        let env1 = create_env_with_netstack(&sandbox).expect("can't create env 1");
        let env2 = create_env_with_netstack(&sandbox).expect("can't create env 2");
        let env3 = create_env_with_netstack(&sandbox2).expect("can't create env 3");

        let _b_e1 = get_on_bus_from_env(&env1, BUS_NAME, "e1").await.expect("can get on bus as e1");
        let _b_e2 = get_on_bus_from_env(&env2, BUS_NAME, "e2").await.expect("can get on bus as e2");
        let _b_e3 = get_on_bus_from_env(&env3, BUS_NAME, "e3").await.expect("can get on bus as e3");

        let clients_1 =
            get_on_bus_and_list_clients(&sync1, BUS_NAME, "s1").await.expect("can get clients 1");
        let clients_2 =
            get_on_bus_and_list_clients(&sync2, BUS_NAME, "s2").await.expect("can get clients 2");

        assert_eq!(3, clients_1.len());
        assert_eq!(2, clients_2.len());
        assert!(clients_1.iter().any(|c| c == "e1"));
        assert!(clients_1.iter().any(|c| c == "e2"));
        assert!(clients_2.iter().any(|c| c == "e3"));
    }

    #[fasync::run_singlethreaded]
    #[test]
    async fn same_environment_name_fails() {
        let sandbox =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox");
        let env_name = Some("env_a".to_string());

        // environment creation should work for both, but doing anything on
        // env2 should fail:
        let env1 =
            create_named_env_with_netstack(&sandbox, env_name.clone()).expect("can't create env 1");
        let env2 = create_named_env_with_netstack(&sandbox, env_name).expect("can't create env 2");

        let _net1 =
            create_network(&env1, "network").await.expect("failed to create network on env 1");
        let _net2 = create_network(&env2, "network2")
            .await
            .expect_err("should've failed to create network on env 2");
    }

    #[fasync::run_singlethreaded]
    #[test]
    async fn same_environment_name_succeeds_in_different_sandboxes() {
        let sandbox =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox");
        let sandbox2 =
            client::connect_to_service::<SandboxMarker>().expect("Can't connect to sandbox 2");
        let env_name = Some("env_a".to_string());

        let env1 =
            create_named_env_with_netstack(&sandbox, env_name.clone()).expect("can't create env 1");
        let env2 = create_named_env_with_netstack(&sandbox2, env_name).expect("can't create env 2");

        let _net1 =
            create_network(&env1, "network").await.expect("failed to create network on env 1");
        let _net2 =
            create_network(&env2, "network2").await.expect("failed to create network on env 2");
    }
}
