blob: 2da804a230ed0c2b5eae97fdd1c0b2379ee6841c [file]
use crate::cli::common::CLAP_INDENT;
use crate::cli::common::{IggyCmdCommand, IggyCmdTest, IggyCmdTestCase, TestHelpCmd, USAGE_PREFIX};
use assert_cmd::assert::Assert;
use async_trait::async_trait;
use iggy::client::Client;
use predicates::str::starts_with;
use serial_test::parallel;
use std::{
fs::{self, File},
io::Read,
};
use tempfile::tempdir;
use zip::ZipArchive;
struct TestSnapshotCmd {
temp_out_dir: String,
}
impl TestSnapshotCmd {
fn new(temp_out_dir: String) -> Self {
TestSnapshotCmd { temp_out_dir }
}
}
#[async_trait]
impl IggyCmdTestCase for TestSnapshotCmd {
async fn prepare_server_state(&mut self, _client: &dyn Client) {}
fn get_command(&self) -> IggyCmdCommand {
IggyCmdCommand::new()
.arg("snapshot")
.arg("--compression")
.arg("deflated")
.arg("--snapshot-types")
.arg("test")
.arg("server_logs")
.arg("--out-dir")
.arg(self.temp_out_dir.as_str())
.with_env_credentials()
}
fn verify_command(&self, command_state: Assert) {
command_state
.success()
.stdout(starts_with("Executing snapshot command\n"));
}
async fn verify_server_state(&self, _client: &dyn Client) {}
}
#[tokio::test]
#[parallel]
pub async fn should_be_successful() {
let mut iggy_cmd_test = IggyCmdTest::default();
iggy_cmd_test.setup().await;
let temp_out_dir = tempdir().unwrap();
iggy_cmd_test
.execute_test(TestSnapshotCmd::new(
temp_out_dir.path().to_str().unwrap().to_string(),
))
.await;
let snapshot_file = fs::read_dir(&temp_out_dir)
.unwrap()
.filter_map(Result::ok)
.find(|entry| {
let file_name = entry.file_name();
file_name.to_string_lossy().starts_with("snapshot")
})
.unwrap();
let zip_path = snapshot_file.path();
let file = File::open(zip_path).unwrap();
let mut archive = ZipArchive::new(file).unwrap();
let contents = {
let mut test_file = archive.by_name("test.txt").unwrap();
let mut contents = String::new();
test_file.read_to_string(&mut contents).unwrap();
contents
};
assert_eq!(contents.trim(), "test");
let contents = {
let mut server_logs_file = archive.by_name("server_logs.txt").unwrap();
let mut contents = String::new();
server_logs_file.read_to_string(&mut contents).unwrap();
contents
};
assert!(contents.trim().contains("INFO ThreadId"));
}
#[tokio::test]
#[parallel]
pub async fn should_help_match() {
let mut iggy_cmd_test = IggyCmdTest::help_message();
iggy_cmd_test
.execute_test_for_help_command(TestHelpCmd::new(
vec!["snapshot", "--help"],
format!(
r#"collect iggy server troubleshooting data
{USAGE_PREFIX} snapshot [OPTIONS]
Options:
-c, --compression <COMPRESSION>
Specify snapshot compression method.
{CLAP_INDENT}
Available options:
{CLAP_INDENT}
- `stored`: No compression
- `deflated`: Standard deflate compression
- `bzip2`: Higher compression ratio but slower
- `zstd`: Fast compression and decompression
- `lzma`: High compression, suitable for large files
- `xz`: Similar to `lzma` but often faster in decompression
{CLAP_INDENT}
Examples:
- `--compression bzip2` for higher compression.
- `--compression none` to store without compression.
-s, --snapshot-types <SNAPSHOT_TYPES>...
Specify types of snapshots to include.
{CLAP_INDENT}
Available snapshot types:
- `filesystem_overview`: Provides an overview of the filesystem structure.
- `process_list`: Captures the list of active processes.
- `resource_usage`: Monitors CPU, memory, and other system resources.
- `test`: Used for testing purposes.
- `server_logs`: Server logs from the specified logging directory, useful for system diagnostics.
- `server_config`: Server configuration.
- `all`: Take all available snapshots.
{CLAP_INDENT}
Examples:
- `--snapshot-types filesystem_overview process_list`
- `--snapshot-types resource_usage`
-o, --out-dir <OUT_DIR>
Define the output directory for the snapshot file.
{CLAP_INDENT}
This directory will contain the snapshot files generated by the command.
{CLAP_INDENT}
Examples:
- `--out-dir /var/snapshots`
- `--out-dir ./snapshots`
-h, --help
Print help (see a summary with '-h')
"#,
),
))
.await;
}
#[tokio::test]
#[parallel]
pub async fn should_short_help_match() {
let mut iggy_cmd_test = IggyCmdTest::help_message();
iggy_cmd_test
.execute_test_for_help_command(TestHelpCmd::new(
vec!["snapshot", "-h"],
format!(
r#"collect iggy server troubleshooting data
{USAGE_PREFIX} snapshot [OPTIONS]
Options:
-c, --compression <COMPRESSION> Specify snapshot compression method.
-s, --snapshot-types <SNAPSHOT_TYPES>... Specify types of snapshots to include.
-o, --out-dir <OUT_DIR> Define the output directory for the snapshot file.
-h, --help Print help (see more with '--help')
"#,
),
))
.await;
}