use std::path::PathBuf;
use clap::Parser;
use crate::CommonOpts;
use crate::cli_wrapper::*;
use crate::common::TemporaryEnvironment;
use crate::common::TemporaryEnvironmentBuilder;
use crate::use_case::UseCase;
#[derive(Parser, Debug)]
pub struct ChaosReplayOpts {
#[clap(long)]
keep_temp_dir: bool,
#[clap(long)]
isolate_workdir: bool,
#[clap(long)]
hermit_arg: Vec<String>,
#[clap(value_name = "PROGRAM")]
guest_program: PathBuf,
#[clap(value_name = "ARGS")]
args: Vec<String>,
}
impl UseCase for ChaosReplayOpts {
fn build_temp_env(
&self,
_common_args: &CommonOpts,
) -> crate::common::TemporaryEnvironmentBuilder {
TemporaryEnvironmentBuilder::new()
.persist_temp_dir(self.keep_temp_dir)
.run_count(2)
}
fn build_first_hermit_args(
&self,
temp_env: &TemporaryEnvironment,
current_run: &crate::common::RunEnvironment,
) -> Vec<String> {
Hermit::new()
.log_level(tracing::Level::TRACE)
.log_file(current_run.log_file_path.clone())
.run(self.guest_program.clone(), self.args.clone())
.hermit_args(self.hermit_arg.clone())
.bind(temp_env.path().to_owned())
.workdir_isolate(current_run.workdir.clone(), self.isolate_workdir)
.record_preemptions_to(current_run.schedule_file.clone())
.into_args()
}
fn build_next_hermit_args(
&self,
_run_no: usize,
temp_env: &TemporaryEnvironment,
prev_run: &crate::common::RunEnvironment,
current_run: &crate::common::RunEnvironment,
) -> Vec<String> {
Hermit::new()
.log_level(tracing::Level::TRACE)
.log_file(current_run.log_file_path.clone())
.run(self.guest_program.clone(), self.args.clone())
.hermit_args(self.hermit_arg.clone())
.bind(temp_env.path().to_owned())
.workdir_isolate(current_run.workdir.clone(), self.isolate_workdir)
.replay_preemptions_from(prev_run.schedule_file.clone())
.record_preemptions_to(current_run.schedule_file.clone())
.into_args()
}
fn options(&self) -> crate::use_case::UseCaseOptions {
crate::use_case::UseCaseOptions {
output_stdout: true,
output_stderr: true,
verify_stdout: true,
verify_stderr: true,
verify_detlog_syscalls: true,
verify_detlog_syscall_results: true,
verify_detlog_others: true,
verify_commits: false,
verify_exit_statuses: true,
verify_desync: true,
verify_schedules: true,
ignore_lines: vec![String::from("CHAOSRAND")],
}
}
}