use super::*;
use crate::tests::lock_database;
const MILLIS_IN_TWO_DAYS: u64 = 2 * 24 * 60 * 60 * 1000;
#[test]
fn clear_database_test() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let a_week_ago = current_time - MILLIS_IN_A_WEEK;
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let mut task_ids = [
fast_random() as u32,
fast_random() as u32,
fast_random() as u32,
];
task_ids.sort();
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
for task_id in task_ids.iter().take(2) {
REQUEST_DB
.execute(sql, (*task_id, a_week_ago, State::Removed.repr as u64))
.unwrap();
}
REQUEST_DB
.execute(
sql,
(task_ids[2], a_week_ago + 20000, State::Running.repr as u64),
)
.unwrap();
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
for task_id in task_ids.iter() {
assert!(query.contains(task_id));
}
if let Ok(remain) = clear_database_by_state(query.len() + 1) {
assert!(!remain);
}
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
for task_id in task_ids.iter().take(2) {
assert!(!query.contains(task_id));
}
assert!(query.contains(&task_ids[2]));
}
#[test]
fn ut_clear_database_by_state_removed_tasks() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let two_days_ago = current_time - MILLIS_IN_TWO_DAYS;
let half_day_ago = current_time - MILLIS_IN_ONE_DAY / 2;
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let old_task_id = fast_random() as u32;
let recent_task_id = fast_random() as u32;
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
REQUEST_DB
.execute(sql, (old_task_id, two_days_ago, State::Removed.repr as u64))
.unwrap();
REQUEST_DB
.execute(
sql,
(recent_task_id, half_day_ago, State::Removed.repr as u64),
)
.unwrap();
let result = clear_database_by_state(1000).unwrap();
assert!(!result);
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
assert!(!query.contains(&old_task_id));
assert!(!query.contains(&recent_task_id));
}
#[test]
fn ut_clear_database_by_state_completed_tasks() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let two_days_ago = current_time - MILLIS_IN_TWO_DAYS;
let half_day_ago = current_time - MILLIS_IN_ONE_DAY / 2;
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let old_task_id = fast_random() as u32;
let recent_task_id = fast_random() as u32;
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
REQUEST_DB
.execute(
sql,
(old_task_id, two_days_ago, State::Completed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(recent_task_id, half_day_ago, State::Completed.repr as u64),
)
.unwrap();
let result = clear_database_by_state(1000).unwrap();
assert!(!result);
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
assert!(!query.contains(&old_task_id));
assert!(query.contains(&recent_task_id));
}
#[test]
fn ut_clear_database_by_state_failed_stopped_tasks() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let two_weeks_ago = current_time - MILLIS_IN_A_WEEK * 2;
let three_days_ago = current_time - MILLIS_IN_TWO_DAYS - MILLIS_IN_ONE_DAY;
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let old_failed_id = fast_random() as u32;
let old_stopped_id = fast_random() as u32;
let recent_failed_id = fast_random() as u32;
let recent_stopped_id = fast_random() as u32;
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
REQUEST_DB
.execute(
sql,
(old_failed_id, two_weeks_ago, State::Failed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(old_stopped_id, two_weeks_ago, State::Stopped.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(recent_failed_id, three_days_ago, State::Failed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(
recent_stopped_id,
three_days_ago,
State::Stopped.repr as u64,
),
)
.unwrap();
let result = clear_database_by_state(1000).unwrap();
assert!(!result);
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
assert!(!query.contains(&old_failed_id));
assert!(!query.contains(&old_stopped_id));
assert!(query.contains(&recent_failed_id));
assert!(query.contains(&recent_stopped_id));
}
#[test]
fn ut_clear_database_by_state_mixed_states() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let two_weeks_ago = current_time - MILLIS_IN_A_WEEK * 2;
let three_days_ago = current_time - MILLIS_IN_TWO_DAYS - MILLIS_IN_ONE_DAY;
let half_day_ago = current_time - MILLIS_IN_ONE_DAY / 2;
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let old_removed_id = fast_random() as u32;
let old_completed_id = fast_random() as u32;
let old_failed_id = fast_random() as u32;
let old_running_id = fast_random() as u32;
let recent_removed_id = fast_random() as u32;
let recent_running_id = fast_random() as u32;
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
REQUEST_DB
.execute(
sql,
(old_removed_id, two_weeks_ago, State::Removed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(
old_completed_id,
three_days_ago,
State::Completed.repr as u64,
),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(old_failed_id, two_weeks_ago, State::Failed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(old_running_id, two_weeks_ago, State::Running.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(recent_removed_id, half_day_ago, State::Removed.repr as u64),
)
.unwrap();
REQUEST_DB
.execute(
sql,
(
recent_running_id,
three_days_ago,
State::Running.repr as u64,
),
)
.unwrap();
let result = clear_database_by_state(1000).unwrap();
assert!(!result);
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
assert!(!query.contains(&old_removed_id));
assert!(!query.contains(&old_completed_id));
assert!(!query.contains(&old_failed_id));
assert!(!query.contains(&old_running_id));
assert!(!query.contains(&recent_removed_id));
assert!(query.contains(&recent_running_id));
}
#[test]
fn ut_clear_database_by_state_remain_flag() {
let _lock = lock_database();
use request_utils::fastrand::fast_random;
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
let two_days_ago = current_time - MILLIS_IN_TWO_DAYS;
REQUEST_DB.execute("DELETE FROM request_task", ()).unwrap();
REQUEST_DB
.execute(
"CREATE TABLE IF NOT EXISTS request_task (task_id INTEGER PRIMARY KEY, mtime INTEGER, state INTEGER)",
(),
)
.unwrap();
let mut task_ids = Vec::new();
let sql = "INSERT INTO request_task (task_id, mtime, state) VALUES (?, ?, ?)";
for _ in 0..5 {
let task_id = fast_random() as u32;
task_ids.push(task_id);
REQUEST_DB
.execute(sql, (task_id, two_days_ago, State::Completed.repr as u64))
.unwrap();
}
let result = clear_database_by_state(2).unwrap();
assert!(result);
let query: Vec<_> = REQUEST_DB
.query::<u32>("SELECT task_id from request_task", ())
.unwrap()
.collect();
assert_eq!(query.len(), 3);
}