// Copyright 2021 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 {
    async_trait::async_trait,
    fidl_fuchsia_io as fio,
    fuchsia_zircon::Status,
    log::info,
    storage_stress_test_utils::{data::FileFactory, io::Directory},
    stress_test::actor::{Actor, ActorError},
};

// TODO(fxbug.dev/67497): This actor is very basic. At the moment, this is fine, since this is a
// v0 implementation of minfs stress tests. Eventually, we should write stress tests that exercise
// minfs as a true POSIX filesystem.
pub struct FileActor {
    pub factory: FileFactory,
    pub home_dir: Directory,
}

impl FileActor {
    pub fn new(factory: FileFactory, home_dir: Directory) -> Self {
        Self { factory, home_dir }
    }

    async fn create_file(&mut self) -> Result<(), Status> {
        let filename = self.factory.generate_filename();
        let data_bytes = self.factory.generate_bytes();

        // Write the file to disk
        let file = self
            .home_dir
            .open_file(
                &filename,
                fio::OpenFlags::CREATE
                    | fio::OpenFlags::CREATE_IF_ABSENT
                    | fio::OpenFlags::RIGHT_WRITABLE,
            )
            .await?;
        file.write(&data_bytes).await?;
        file.close().await
    }
}

#[async_trait]
impl Actor for FileActor {
    async fn perform(&mut self) -> Result<(), ActorError> {
        match self.create_file().await {
            Ok(()) => Ok(()),
            Err(Status::NO_SPACE) => Ok(()),
            // Any other error is assumed to come from an intentional crash.
            // The environment verifies that an intentional crash occurred
            // and will panic if that is not the case.
            Err(s) => {
                info!("File actor got status: {}", s);
                Err(ActorError::ResetEnvironment)
            }
        }
    }
}
