Path: blob/main/crates/cache/src/config/tests.rs
1693 views
use super::CacheConfig;1use std::fs;2use std::path::PathBuf;3use std::time::Duration;4use tempfile::TempDir;56// note: config loading during validation creates cache directory to canonicalize its path,7// that's why these function and macro always use custom cache directory8// note: tempdir removes directory when being dropped, so we need to return it to the caller,9// so the paths are valid10pub fn test_prolog() -> (TempDir, PathBuf, PathBuf) {11let _ = env_logger::try_init();12let temp_dir = tempfile::tempdir().expect("Can't create temporary directory");13let cache_dir = temp_dir.path().join("cache-dir");14let config_path = temp_dir.path().join("cache-config.toml");15(temp_dir, cache_dir, config_path)16}1718macro_rules! load_config {19($config_path:ident, $content_fmt:expr, $cache_dir:ident) => {{20let config_path = &$config_path;21let content = format!($content_fmt, cache_dir = $cache_dir.display());22fs::write(config_path, content).expect("Failed to write test config file");23CacheConfig::from_file(Some(config_path)).unwrap()24}};25}2627macro_rules! bad_config {28($config_path:ident, $content_fmt:expr, $cache_dir:ident) => {{29let config_path = &$config_path;30let content = format!($content_fmt, cache_dir = $cache_dir.display());31fs::write(config_path, content).expect("Failed to write test config file");32assert!(CacheConfig::from_file(Some(config_path)).is_err());33}};34}3536#[test]37fn test_unrecognized_settings() {38let (_td, cd, cp) = test_prolog();39bad_config!(40cp,41"unrecognized-setting = 42\n\42[cache]\n\43directory = '{cache_dir}'",44cd45);4647bad_config!(48cp,49"[cache]\n\50directory = '{cache_dir}'\n\51unrecognized-setting = 42",52cd53);54}5556#[test]57fn test_all_settings() {58let (_td, cd, cp) = test_prolog();59let conf = load_config!(60cp,61"[cache]\n\62directory = '{cache_dir}'\n\63worker-event-queue-size = '16'\n\64baseline-compression-level = 3\n\65optimized-compression-level = 20\n\66optimized-compression-usage-counter-threshold = '256'\n\67cleanup-interval = '1h'\n\68optimizing-compression-task-timeout = '30m'\n\69allowed-clock-drift-for-files-from-future = '1d'\n\70file-count-soft-limit = '65536'\n\71files-total-size-soft-limit = '512Mi'\n\72file-count-limit-percent-if-deleting = '70%'\n\73files-total-size-limit-percent-if-deleting = '70%'",74cd75);76check_conf(&conf, &cd);7778let conf = load_config!(79cp,80// added some white spaces81"[cache]\n\82directory = '{cache_dir}'\n\83worker-event-queue-size = ' 16\t'\n\84baseline-compression-level = 3\n\85optimized-compression-level =\t 20\n\86optimized-compression-usage-counter-threshold = '256'\n\87cleanup-interval = ' 1h'\n\88optimizing-compression-task-timeout = '30 m'\n\89allowed-clock-drift-for-files-from-future = '1\td'\n\90file-count-soft-limit = '\t \t65536\t'\n\91files-total-size-soft-limit = '512\t\t Mi '\n\92file-count-limit-percent-if-deleting = '70\t%'\n\93files-total-size-limit-percent-if-deleting = ' 70 %'",94cd95);96check_conf(&conf, &cd);9798fn check_conf(conf: &CacheConfig, cd: &PathBuf) {99assert_eq!(100conf.directory(),101Some(&fs::canonicalize(cd).expect("canonicalize failed"))102);103assert_eq!(conf.worker_event_queue_size(), 0x10);104assert_eq!(conf.baseline_compression_level(), 3);105assert_eq!(conf.optimized_compression_level(), 20);106assert_eq!(conf.optimized_compression_usage_counter_threshold(), 0x100);107assert_eq!(conf.cleanup_interval(), Duration::from_secs(60 * 60));108assert_eq!(109conf.optimizing_compression_task_timeout(),110Duration::from_secs(30 * 60)111);112assert_eq!(113conf.allowed_clock_drift_for_files_from_future(),114Duration::from_secs(60 * 60 * 24)115);116assert_eq!(conf.file_count_soft_limit(), 0x10_000);117assert_eq!(conf.files_total_size_soft_limit(), 512 * (1u64 << 20));118assert_eq!(conf.file_count_limit_percent_if_deleting(), 70);119assert_eq!(conf.files_total_size_limit_percent_if_deleting(), 70);120}121}122123#[test]124fn test_compression_level_settings() {125let (_td, cd, cp) = test_prolog();126let conf = load_config!(127cp,128"[cache]\n\129directory = '{cache_dir}'\n\130baseline-compression-level = 1\n\131optimized-compression-level = 21",132cd133);134assert_eq!(conf.baseline_compression_level(), 1);135assert_eq!(conf.optimized_compression_level(), 21);136137bad_config!(138cp,139"[cache]\n\140directory = '{cache_dir}'\n\141baseline-compression-level = -1\n\142optimized-compression-level = 21",143cd144);145146bad_config!(147cp,148"[cache]\n\149directory = '{cache_dir}'\n\150baseline-compression-level = 15\n\151optimized-compression-level = 10",152cd153);154}155156#[test]157fn test_si_prefix_settings() {158let (_td, cd, cp) = test_prolog();159let conf = load_config!(160cp,161"[cache]\n\162directory = '{cache_dir}'\n\163worker-event-queue-size = '42'\n\164optimized-compression-usage-counter-threshold = '4K'\n\165file-count-soft-limit = '3M'",166cd167);168assert_eq!(conf.worker_event_queue_size(), 42);169assert_eq!(conf.optimized_compression_usage_counter_threshold(), 4_000);170assert_eq!(conf.file_count_soft_limit(), 3_000_000);171172let conf = load_config!(173cp,174"[cache]\n\175directory = '{cache_dir}'\n\176worker-event-queue-size = '2K'\n\177optimized-compression-usage-counter-threshold = '4444T'\n\178file-count-soft-limit = '1P'",179cd180);181assert_eq!(conf.worker_event_queue_size(), 2_000);182assert_eq!(183conf.optimized_compression_usage_counter_threshold(),1844_444_000_000_000_000185);186assert_eq!(conf.file_count_soft_limit(), 1_000_000_000_000_000);187188// different errors189bad_config!(190cp,191"[cache]\n\192directory = '{cache_dir}'\n\193worker-event-queue-size = '2g'",194cd195);196197bad_config!(198cp,199"[cache]\n\200directory = '{cache_dir}'\n\201file-count-soft-limit = 1",202cd203);204205bad_config!(206cp,207"[cache]\n\208directory = '{cache_dir}'\n\209file-count-soft-limit = '-31337'",210cd211);212213bad_config!(214cp,215"[cache]\n\216directory = '{cache_dir}'\n\217file-count-soft-limit = '3.14M'",218cd219);220}221222#[test]223fn test_disk_space_settings() {224let (_td, cd, cp) = test_prolog();225let conf = load_config!(226cp,227"[cache]\n\228directory = '{cache_dir}'\n\229files-total-size-soft-limit = '76'",230cd231);232assert_eq!(conf.files_total_size_soft_limit(), 76);233234let conf = load_config!(235cp,236"[cache]\n\237directory = '{cache_dir}'\n\238files-total-size-soft-limit = '42 Mi'",239cd240);241assert_eq!(conf.files_total_size_soft_limit(), 42 * (1u64 << 20));242243let conf = load_config!(244cp,245"[cache]\n\246directory = '{cache_dir}'\n\247files-total-size-soft-limit = '2 Gi'",248cd249);250assert_eq!(conf.files_total_size_soft_limit(), 2 * (1u64 << 30));251252let conf = load_config!(253cp,254"[cache]\n\255directory = '{cache_dir}'\n\256files-total-size-soft-limit = '31337 Ti'",257cd258);259assert_eq!(conf.files_total_size_soft_limit(), 31337 * (1u64 << 40));260261let conf = load_config!(262cp,263"[cache]\n\264directory = '{cache_dir}'\n\265files-total-size-soft-limit = '7 Pi'",266cd267);268assert_eq!(conf.files_total_size_soft_limit(), 7 * (1u64 << 50));269270let conf = load_config!(271cp,272"[cache]\n\273directory = '{cache_dir}'\n\274files-total-size-soft-limit = '7M'",275cd276);277assert_eq!(conf.files_total_size_soft_limit(), 7_000_000);278279// different errors280bad_config!(281cp,282"[cache]\n\283directory = '{cache_dir}'\n\284files-total-size-soft-limit = '7 mi'",285cd286);287288bad_config!(289cp,290"[cache]\n\291directory = '{cache_dir}'\n\292files-total-size-soft-limit = 1",293cd294);295296bad_config!(297cp,298"[cache]\n\299directory = '{cache_dir}'\n\300files-total-size-soft-limit = '-31337'",301cd302);303304bad_config!(305cp,306"[cache]\n\307directory = '{cache_dir}'\n\308files-total-size-soft-limit = '3.14Ki'",309cd310);311}312313#[test]314fn test_duration_settings() {315let (_td, cd, cp) = test_prolog();316let conf = load_config!(317cp,318"[cache]\n\319directory = '{cache_dir}'\n\320cleanup-interval = '100s'\n\321optimizing-compression-task-timeout = '3m'\n\322allowed-clock-drift-for-files-from-future = '4h'",323cd324);325assert_eq!(conf.cleanup_interval(), Duration::from_secs(100));326assert_eq!(327conf.optimizing_compression_task_timeout(),328Duration::from_secs(3 * 60)329);330assert_eq!(331conf.allowed_clock_drift_for_files_from_future(),332Duration::from_secs(4 * 60 * 60)333);334335let conf = load_config!(336cp,337"[cache]\n\338directory = '{cache_dir}'\n\339cleanup-interval = '2d'\n\340optimizing-compression-task-timeout = '333 m'",341cd342);343assert_eq!(344conf.cleanup_interval(),345Duration::from_secs(2 * 24 * 60 * 60)346);347assert_eq!(348conf.optimizing_compression_task_timeout(),349Duration::from_secs(333 * 60)350);351352// different errors353bad_config!(354cp,355"[cache]\n\356directory = '{cache_dir}'\n\357optimizing-compression-task-timeout = '333'",358cd359);360361bad_config!(362cp,363"[cache]\n\364directory = '{cache_dir}'\n\365optimizing-compression-task-timeout = 333",366cd367);368369bad_config!(370cp,371"[cache]\n\372directory = '{cache_dir}'\n\373optimizing-compression-task-timeout = '10 M'",374cd375);376377bad_config!(378cp,379"[cache]\n\380directory = '{cache_dir}'\n\381optimizing-compression-task-timeout = '10 min'",382cd383);384385bad_config!(386cp,387"[cache]\n\388directory = '{cache_dir}'\n\389optimizing-compression-task-timeout = '-10s'",390cd391);392393bad_config!(394cp,395"[cache]\n\396directory = '{cache_dir}'\n\397optimizing-compression-task-timeout = '1.5m'",398cd399);400}401402#[test]403fn test_percent_settings() {404let (_td, cd, cp) = test_prolog();405let conf = load_config!(406cp,407"[cache]\n\408directory = '{cache_dir}'\n\409file-count-limit-percent-if-deleting = '62%'\n\410files-total-size-limit-percent-if-deleting = '23 %'",411cd412);413assert_eq!(conf.file_count_limit_percent_if_deleting(), 62);414assert_eq!(conf.files_total_size_limit_percent_if_deleting(), 23);415416// different errors417bad_config!(418cp,419"[cache]\n\420directory = '{cache_dir}'\n\421files-total-size-limit-percent-if-deleting = '23'",422cd423);424425bad_config!(426cp,427"[cache]\n\428directory = '{cache_dir}'\n\429files-total-size-limit-percent-if-deleting = '22.5%'",430cd431);432433bad_config!(434cp,435"[cache]\n\436directory = '{cache_dir}'\n\437files-total-size-limit-percent-if-deleting = '0.5'",438cd439);440441bad_config!(442cp,443"[cache]\n\444directory = '{cache_dir}'\n\445files-total-size-limit-percent-if-deleting = '-1%'",446cd447);448449bad_config!(450cp,451"[cache]\n\452directory = '{cache_dir}'\n\453files-total-size-limit-percent-if-deleting = '101%'",454cd455);456}457458/// Default builder produces a disabled cache configuration with the same defaults.459#[test]460fn test_builder_default() {461let (_td, _cd, cp) = test_prolog();462let config_content = "[cache]\n";463fs::write(&cp, config_content).expect("Failed to write test config file");464let expected_config = CacheConfig::from_file(Some(&cp)).unwrap();465466let mut config = CacheConfig::new();467config468.validate()469.expect("Failed to validate default config");470471assert_eq!(config.directory, expected_config.directory);472assert_eq!(473config.worker_event_queue_size,474expected_config.worker_event_queue_size475);476assert_eq!(477config.baseline_compression_level,478expected_config.baseline_compression_level479);480assert_eq!(481config.optimized_compression_level,482expected_config.optimized_compression_level483);484assert_eq!(485config.optimized_compression_usage_counter_threshold,486expected_config.optimized_compression_usage_counter_threshold487);488assert_eq!(config.cleanup_interval, expected_config.cleanup_interval);489assert_eq!(490config.optimizing_compression_task_timeout,491expected_config.optimizing_compression_task_timeout492);493assert_eq!(494config.allowed_clock_drift_for_files_from_future,495expected_config.allowed_clock_drift_for_files_from_future496);497assert_eq!(498config.file_count_soft_limit,499expected_config.file_count_soft_limit500);501assert_eq!(502config.files_total_size_soft_limit,503expected_config.files_total_size_soft_limit504);505assert_eq!(506config.file_count_limit_percent_if_deleting,507expected_config.file_count_limit_percent_if_deleting508);509assert_eq!(510config.files_total_size_limit_percent_if_deleting,511expected_config.files_total_size_limit_percent_if_deleting512);513}514515#[test]516fn test_builder_all_settings() {517let (_td, cd, _cp) = test_prolog();518519let mut conf = CacheConfig::new();520conf.with_directory(&cd)521.with_worker_event_queue_size(0x10)522.with_baseline_compression_level(3)523.with_optimized_compression_level(20)524.with_optimized_compression_usage_counter_threshold(0x100)525.with_cleanup_interval(Duration::from_secs(60 * 60))526.with_optimizing_compression_task_timeout(Duration::from_secs(30 * 60))527.with_allowed_clock_drift_for_files_from_future(Duration::from_secs(60 * 60 * 24))528.with_file_count_soft_limit(0x10_000)529.with_files_total_size_soft_limit(512 * (1u64 << 20))530.with_file_count_limit_percent_if_deleting(70)531.with_files_total_size_limit_percent_if_deleting(70);532conf.validate().expect("validation failed");533check_conf(&conf, &cd);534535fn check_conf(conf: &CacheConfig, cd: &PathBuf) {536assert_eq!(537conf.directory(),538Some(&fs::canonicalize(cd).expect("canonicalize failed"))539);540assert_eq!(conf.worker_event_queue_size(), 0x10);541assert_eq!(conf.baseline_compression_level(), 3);542assert_eq!(conf.optimized_compression_level(), 20);543assert_eq!(conf.optimized_compression_usage_counter_threshold(), 0x100);544assert_eq!(conf.cleanup_interval(), Duration::from_secs(60 * 60));545assert_eq!(546conf.optimizing_compression_task_timeout(),547Duration::from_secs(30 * 60)548);549assert_eq!(550conf.allowed_clock_drift_for_files_from_future(),551Duration::from_secs(60 * 60 * 24)552);553assert_eq!(conf.file_count_soft_limit(), 0x10_000);554assert_eq!(conf.files_total_size_soft_limit(), 512 * (1u64 << 20));555assert_eq!(conf.file_count_limit_percent_if_deleting(), 70);556assert_eq!(conf.files_total_size_limit_percent_if_deleting(), 70);557}558}559560561