diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-10-03 09:54:02 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-10-03 10:11:43 +0200 |
| commit | e72919ec2b089c5d61b1db63d32a266e13f3b40f (patch) | |
| tree | 728960e8f900e17ffbf0a9a716eb3083ecda0d09 /tests | |
| parent | 8dce4fbbaaf373a5a6c6b02e311a7d8f25cf66c3 (diff) | |
Implement forward log reader, rebuild memtable at init
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/integration.rs | 138 | ||||
| -rw-r--r-- | tests/resources/test_db1 | bin | 28 -> 31 bytes | |||
| -rw-r--r-- | tests/resources/test_db2 | bin | 0 -> 39 bytes |
3 files changed, 117 insertions, 21 deletions
diff --git a/tests/integration.rs b/tests/integration.rs index 3e132bc..2aada21 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,6 +1,6 @@ use env_logger; use log_db; -use log_db::{LogReader, Record, RecordFieldType, RecordValue, DB}; +use log_db::{ForwardLogReader, Record, RecordFieldType, RecordValue, ReverseLogReader, DB}; use serial_test::serial; use std::fs; use std::path::Path; @@ -18,6 +18,8 @@ enum Field { #[test] #[serial] fn test_initialize() { + init_test(); + let _db = DB::configure() .data_dir(TEST_DATA_DIR) .fields(&vec![ @@ -29,13 +31,14 @@ fn test_initialize() { .initialize() .expect("Failed to initialize DB instance"); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); } #[test] #[serial] -fn test_upsert_and_get_with_memtable() { +fn test_upsert_and_get_with_primary_memtable() { + init_test(); + let mut db = DB::configure() .data_dir(TEST_DATA_DIR) .fields(&vec![ @@ -64,14 +67,14 @@ fn test_upsert_and_get_with_memtable() { _ => false, }); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); } #[test] #[serial] fn test_upsert_and_get_without_memtable() { - let _ = env_logger::builder().is_test(true).try_init(); + init_test(); + let mut db = DB::configure() .data_dir(TEST_DATA_DIR) .memtable_capacity(0) @@ -147,13 +150,14 @@ fn test_upsert_and_get_without_memtable() { _ => false, }); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); } #[test] #[serial] fn test_upsert_fails_on_invalid_number_of_values() { + init_test(); + let mut db = DB::configure() .data_dir(TEST_DATA_DIR) .fields(&vec![ @@ -174,13 +178,14 @@ fn test_upsert_fails_on_invalid_number_of_values() { }; assert!(db.upsert(&record).is_err()); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); } #[test] #[serial] fn test_upsert_fails_on_invalid_value_type() { + init_test(); + let mut db = DB::configure() .data_dir(TEST_DATA_DIR) .fields(&vec![ @@ -201,41 +206,85 @@ fn test_upsert_fails_on_invalid_value_type() { }; assert!(db.upsert(&record).is_err()); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); } #[test] #[serial] -fn test_log_reader_fixture_db1() { - let _ = env_logger::builder().is_test(true).try_init(); +fn test_reverse_log_reader_fixture_db1() { + init_test(); + let db_path = Path::new(TEST_RESOURCES_DIR).join("test_db1"); let mut file = fs::OpenOptions::new() .read(true) .open(&db_path) .expect("Failed to open file"); - let mut log_reader = LogReader::new(&mut file).unwrap(); + let mut reverse_log_reader = ReverseLogReader::new(&mut file).unwrap(); // There are two records in the log with "schema": Int, Null - let last_record = log_reader.next().expect("Failed to read the last record"); + let last_record = reverse_log_reader + .next() + .expect("Failed to read the last record"); assert!(match last_record.values.as_slice() { [RecordValue::Int(10), RecordValue::Null] => true, _ => false, }); - let first_record = log_reader.next().expect("Failed to read the first record"); + let first_record = reverse_log_reader + .next() + .expect("Failed to read the first record"); assert!(match first_record.values.as_slice() { // Note: the int value is equal to the escape byte [RecordValue::Int(0x1D), RecordValue::Null] => true, _ => false, }); + + assert!(reverse_log_reader.next().is_none()); + + cleanup_test(); +} + +#[test] +#[serial] +fn test_forward_log_reader_fixture_db1() { + init_test(); + + let db_path = Path::new(TEST_RESOURCES_DIR).join("test_db1"); + let mut file = fs::OpenOptions::new() + .read(true) + .open(&db_path) + .expect("Failed to open file"); + let mut forward_log_reader = ForwardLogReader::new(&mut file); + + // There are two records in the log with "schema": Int, Null + + let first_record = forward_log_reader + .next() + .expect("Failed to read the first record"); + assert!(match first_record.values.as_slice() { + [RecordValue::Int(0x1D), RecordValue::Null] => true, + _ => false, + }); + + let last_record = forward_log_reader + .next() + .expect("Failed to read the last record"); + assert!(match last_record.values.as_slice() { + [RecordValue::Int(10), RecordValue::Null] => true, + _ => false, + }); + + assert!(forward_log_reader.next().is_none()); + + cleanup_test(); } #[test] #[serial] fn test_upsert_and_get_from_secondary_memtable() { - let _ = env_logger::builder().is_test(true).try_init(); + init_test(); + let mut db = DB::configure() .data_dir(TEST_DATA_DIR) .fields(&vec![ @@ -286,6 +335,53 @@ fn test_upsert_and_get_from_secondary_memtable() { assert_eq!(johns.len(), 2); - // Clean up - std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); + cleanup_test(); +} + +#[test] +#[serial] +fn test_initialize_and_read_from_primary_memtable_fixture_db2() { + init_test(); + + // Copy the fixture DB to the test data directory + fs::create_dir_all(TEST_DATA_DIR).expect("Failed to create the test data directory"); + fs::copy( + &Path::new(TEST_RESOURCES_DIR).join("test_db2"), + &Path::new(TEST_DATA_DIR).join("db"), + ) + .expect("Failed to copy the fixture DB"); + + let mut db = DB::configure() + .data_dir(TEST_DATA_DIR) + .fields(&vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ]) + .primary_key(Field::Id) + .initialize() + .expect("Failed to initialize DB instance"); + + // Delete the DB so that any results must come from a memtable + fs::remove_file(Path::new(TEST_DATA_DIR).join("db")).expect("Failed to delete the DB log file"); + + let result = db.get(&RecordValue::Int(1)).unwrap().unwrap(); + + // Check that the IDs match + let expected = RecordValue::Int(1); + assert!(match (&result.values[0], &expected) { + (RecordValue::Int(a), RecordValue::Int(b)) => a == b, + _ => false, + }); + + cleanup_test(); +} + +fn init_test() { + let _ = env_logger::builder().is_test(true).try_init(); +} + +fn cleanup_test() { + std::fs::remove_dir_all(TEST_DATA_DIR.to_string()) + .unwrap_or_else(|e| eprintln!("Failed to delete the test data directory: {:?}", e)); } diff --git a/tests/resources/test_db1 b/tests/resources/test_db1 Binary files differindex e75edf5..1f19a86 100644 --- a/tests/resources/test_db1 +++ b/tests/resources/test_db1 diff --git a/tests/resources/test_db2 b/tests/resources/test_db2 Binary files differnew file mode 100644 index 0000000..2448640 --- /dev/null +++ b/tests/resources/test_db2 |
