aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/integration.rs65
1 files changed, 62 insertions, 3 deletions
diff --git a/tests/integration.rs b/tests/integration.rs
index cb3af56..e6be74f 100644
--- a/tests/integration.rs
+++ b/tests/integration.rs
@@ -4,9 +4,11 @@ extern crate tempfile;
use ctor::ctor;
use env_logger;
use log::debug;
-use log_db::{self, RecordField};
+use log_db::{
+ self, ForwardLogReader, RecordField, ACTIVE_LOG_FILENAME, SEQ_LIT_ESCAPE, SEQ_RECORD_SEP,
+};
use log_db::{Record, RecordValue, DB, TEST_RESOURCES_DIR};
-use std::fs;
+use std::fs::{self, OpenOptions};
use std::path::Path;
use std::thread;
use std::time::Duration;
@@ -460,7 +462,6 @@ fn test_one_writer_and_multiple_reading_threads() {
#[test]
fn test_literal_escape_is_escaped() {
let data_dir = tmp_dir();
- debug!("data_dir: {:?}", data_dir);
let mut db = DB::configure()
.data_dir(&data_dir)
@@ -494,3 +495,61 @@ fn test_literal_escape_is_escaped() {
assert_eq!(received, &vec![0x1A, 0x1B, 0x1C, 0x1D]);
}
+
+#[test]
+fn test_log_is_rotated_when_capacity_reached() {
+ let data_dir = tmp_dir();
+
+ let record = Record {
+ values: vec![RecordValue::Int(1), RecordValue::Bytes(vec![1, 2, 3, 4])],
+ };
+ let record_len = &record.serialize().len() + SEQ_RECORD_SEP.len();
+
+ let mut db = DB::configure()
+ .data_dir(&data_dir)
+ .memtable_capacity(0) // disable memtables
+ .segment_size(10 * record_len) // small log segment size
+ .fields(&vec![
+ (Field::Id, RecordField::int()),
+ (Field::Data, RecordField::bytes()),
+ ])
+ .primary_key(Field::Id)
+ .initialize()
+ .expect("Failed to initialize DB instance");
+
+ // Insert more records than fits the capacity
+ for _ in 0..25 {
+ db.upsert(&record).expect("Failed to upsert record");
+
+ db.do_maintenance_tasks()
+ .expect("Failed to do maintenance tasks");
+ }
+
+ // Check that the rotated segments exist
+ assert!(Path::new(&data_dir)
+ .join(ACTIVE_LOG_FILENAME)
+ .with_extension("1")
+ .exists());
+
+ assert!(Path::new(&data_dir)
+ .join(ACTIVE_LOG_FILENAME)
+ .with_extension("2")
+ .exists());
+
+ assert!(!Path::new(&data_dir)
+ .join(ACTIVE_LOG_FILENAME)
+ .with_extension("3")
+ .exists());
+
+ // Check that the active file only contains two rows
+ let mut file = OpenOptions::new()
+ .read(true)
+ .open(Path::new(&data_dir).join(ACTIVE_LOG_FILENAME))
+ .expect("File could not be opened");
+ let records_in_active_log = ForwardLogReader::new(&mut file).count();
+ assert_eq!(records_in_active_log, 5);
+
+ // Look for nonexistant record to scan all segment files
+ let found = db.get(&RecordValue::Int(2)).expect("Failed to get record");
+ assert!(found.is_none());
+}