#![cfg(feature = "concurrency")]
use std::path::Path;
use std::process::Command;
use tempfile::TempDir;
mod common;
use common::paths;
use common::utils;
fn run_vex2pdf_with_jobs(
input_path: &str,
output_dir: &Path,
max_jobs: Option<u8>,
) -> std::process::Output {
let mut cmd = Command::new(paths::PATH_TO_EXE);
cmd.arg("-d").arg(output_dir).arg(input_path);
if let Some(jobs) = max_jobs {
cmd.arg("--max-jobs").arg(jobs.to_string());
}
let output = cmd.output().expect("Failed to execute command");
if !output.stdout.is_empty() {
println!("stdout: {}", utils::bytes_to_str(&output.stdout));
}
if !output.stderr.is_empty() {
eprintln!("stderr: {}", utils::bytes_to_str(&output.stderr));
}
assert!(
output.status.success(),
"Command failed with status: {}",
output.status
);
output
}
#[test]
fn test_single_threaded_mode() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = run_vex2pdf_with_jobs(paths::SIMPLE_BOM_PATH, output_dir.path(), Some(1));
utils::assert_output_contains(
&output.stdout,
"Concurrency Disabled: running all jobs sequentially in main thread",
);
let pdf_count = utils::count_pdf_files(output_dir.path());
assert_eq!(
pdf_count, 1,
"Should generate exactly 1 PDF in single-threaded mode"
);
}
#[test]
fn test_multi_threaded_mode_2_jobs() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = run_vex2pdf_with_jobs(
paths::SOURCE_BOMS_BASE_ARTIFACTS_DIR,
output_dir.path(),
Some(2),
);
utils::assert_output_contains(&output.stdout, "Concurrency Enabled: running with 2 jobs");
let pdf_count = utils::count_pdf_files(output_dir.path());
assert!(
pdf_count > 1,
"Should generate multiple PDFs with 2 jobs, found {}",
pdf_count
);
}
#[test]
fn test_multi_threaded_mode_4_jobs() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = run_vex2pdf_with_jobs(
paths::SOURCE_BOMS_BASE_ARTIFACTS_DIR,
output_dir.path(),
Some(4),
);
utils::assert_output_contains(&output.stdout, "Concurrency Enabled: running with 4 jobs");
let pdf_count = utils::count_pdf_files(output_dir.path());
assert!(
pdf_count > 1,
"Should generate multiple PDFs with 4 jobs, found {}",
pdf_count
);
}
#[test]
fn test_default_parallelism() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = run_vex2pdf_with_jobs(paths::SIMPLE_BOM_PATH, output_dir.path(), None);
utils::assert_output_contains(&output.stdout, "Concurrency Enabled: running with");
let pdf_count = utils::count_pdf_files(output_dir.path());
assert_eq!(
pdf_count, 1,
"Should generate exactly 1 PDF with default parallelism"
);
}
#[test]
fn test_max_jobs_zero_uses_default() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = run_vex2pdf_with_jobs(paths::SIMPLE_BOM_PATH, output_dir.path(), Some(0));
utils::assert_output_contains(&output.stdout, "Concurrency Enabled: running with");
let pdf_count = utils::count_pdf_files(output_dir.path());
assert_eq!(
pdf_count, 1,
"Should generate exactly 1 PDF with max_jobs=0"
);
}
#[test]
fn test_env_var_single_threaded() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = Command::new(paths::PATH_TO_EXE)
.env("VEX2PDF_MAX_JOBS", "1")
.arg("-d")
.arg(output_dir.path())
.arg(paths::SIMPLE_BOM_PATH)
.output()
.expect("Failed to execute command");
if !output.stdout.is_empty() {
println!("stdout: {}", utils::bytes_to_str(&output.stdout));
}
if !output.stderr.is_empty() {
eprintln!("stderr: {}", utils::bytes_to_str(&output.stderr));
}
assert!(
output.status.success(),
"Command failed with status: {}",
output.status
);
utils::assert_output_contains(
&output.stdout,
"Concurrency Disabled: running all jobs sequentially in main thread",
);
let pdf_count = utils::count_pdf_files(output_dir.path());
assert_eq!(
pdf_count, 1,
"Should generate exactly 1 PDF with VEX2PDF_MAX_JOBS=1"
);
}
#[test]
fn test_env_var_default_parallelism() {
let output_dir = TempDir::new().expect("Failed to create temp dir");
let output = Command::new(paths::PATH_TO_EXE)
.env("VEX2PDF_MAX_JOBS", "0")
.arg("-d")
.arg(output_dir.path())
.arg(paths::SIMPLE_BOM_PATH)
.output()
.expect("Failed to execute command");
if !output.stdout.is_empty() {
println!("stdout: {}", utils::bytes_to_str(&output.stdout));
}
if !output.stderr.is_empty() {
eprintln!("stderr: {}", utils::bytes_to_str(&output.stderr));
}
assert!(
output.status.success(),
"Command failed with status: {}",
output.status
);
utils::assert_output_contains(&output.stdout, "Concurrency Enabled: running with");
let pdf_count = utils::count_pdf_files(output_dir.path());
assert_eq!(
pdf_count, 1,
"Should generate exactly 1 PDF with VEX2PDF_MAX_JOBS=0"
);
}