// Copyright 2022 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 {
    anyhow::Result,
    blackout_host::{BlackoutError, TestEnv},
    ffx_core::ffx_plugin,
    ffx_storage_blackout_integration_args::BlackoutIntegrationCommand,
    std::time::Duration,
};

async fn failure() -> Result<()> {
    let opts = blackout_host::CommonOpts {
        block_device: String::from("fail"),
        seed: None,
        relay: None,
        iterations: None,
        run_until_failure: false,
    };
    let mut test =
        TestEnv::new("blackout-integration-target", "blackout-integration-target-component", opts)
            .await;

    test.setup_step().load_step(Duration::from_secs(1)).verify_step(20, Duration::from_secs(15));

    match test.run().await {
        Err(BlackoutError::Verification(_)) => Ok(()),
        Ok(()) => Err(anyhow::anyhow!("test succeeded when it should've failed")),
        Err(e) => Err(anyhow::anyhow!("test failed, but not in the expected way: {:?}", e)),
    }
}

async fn success(iterations: Option<u64>) -> Result<()> {
    let opts = blackout_host::CommonOpts {
        block_device: String::from("/nothing"),
        seed: None,
        relay: None,
        iterations: iterations,
        run_until_failure: false,
    };
    let mut test =
        TestEnv::new("blackout-integration-target", "blackout-integration-target-component", opts)
            .await;

    test.setup_step().load_step(Duration::from_secs(1)).verify_step(20, Duration::from_secs(15));
    test.run().await?;

    Ok(())
}

#[ffx_plugin("storage_dev")]
async fn integration(cmd: BlackoutIntegrationCommand) -> Result<()> {
    // make sure verification failure detection works
    println!("testing a verification failure...");
    failure().await?;

    // make sure a successful test run works
    println!("testing a successful run...");
    success(cmd.iterations).await?;

    Ok(())
}
