Implement test workload running logic

This commit is contained in:
Mubelotix
2025-08-25 13:32:34 +02:00
parent 0d8b2edfb0
commit c98efe18c9
4 changed files with 128 additions and 25 deletions

View File

@ -2,7 +2,14 @@ use cargo_metadata::semver::Version;
use serde::Deserialize;
use std::collections::BTreeMap;
use crate::common::{assets::Asset, command::Command};
use crate::{
common::{
assets::{fetch_assets, Asset},
client::Client,
command::{run_commands, Command},
},
test::TestDeriveArgs,
};
#[derive(Deserialize)]
#[serde(untagged)]
@ -11,6 +18,11 @@ pub enum CommandOrUpgrade {
Upgrade { upgrade: Version },
}
enum CommandOrUpgradeVec {
Commands(Vec<Command>),
Upgrade(Version),
}
/// A test workload.
/// Not to be confused with [a bench workload](crate::bench::workload::Workload).
#[derive(Deserialize)]
@ -19,3 +31,45 @@ pub struct TestWorkload {
pub assets: BTreeMap<String, Asset>,
pub commands: Vec<CommandOrUpgrade>,
}
impl TestWorkload {
pub async fn run(
&self,
args: &TestDeriveArgs,
assets_client: &Client,
meili_client: &Client,
) -> anyhow::Result<()> {
// Fetch assets
fetch_assets(assets_client, &self.assets, &args.common.asset_folder).await?;
// Group commands between upgrades
let mut commands_or_upgrade = Vec::new();
let mut current_commands = Vec::new();
for command_or_upgrade in &self.commands {
match command_or_upgrade {
CommandOrUpgrade::Command(command) => current_commands.push(command.clone()),
CommandOrUpgrade::Upgrade { upgrade } => {
if !current_commands.is_empty() {
commands_or_upgrade.push(CommandOrUpgradeVec::Commands(current_commands));
current_commands = Vec::new();
}
commands_or_upgrade.push(CommandOrUpgradeVec::Upgrade(upgrade.clone()));
}
}
}
for command_or_upgrade in commands_or_upgrade {
match command_or_upgrade {
CommandOrUpgradeVec::Commands(commands) => {
run_commands(meili_client, &commands, &self.assets, &args.common.asset_folder)
.await?;
}
CommandOrUpgradeVec::Upgrade(version) => {
todo!()
}
}
}
Ok(())
}
}