From df4f715d70d26f3da9dbfa8aba4a70b9cdb02300 Mon Sep 17 00:00:00 2001 From: rustmailer Date: Sun, 24 Aug 2025 23:53:25 +0800 Subject: [PATCH] add some tests --- src/modules/cache/imap/mod.rs | 2 + src/modules/cache/imap/tests.rs | 84 +++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/modules/cache/imap/tests.rs diff --git a/src/modules/cache/imap/mod.rs b/src/modules/cache/imap/mod.rs index 005428f..41d98a4 100644 --- a/src/modules/cache/imap/mod.rs +++ b/src/modules/cache/imap/mod.rs @@ -25,6 +25,8 @@ pub mod manager; pub mod minimal; pub mod sync; pub mod task; +#[cfg(test)] +mod tests; pub mod thread; pub static ENVELOPE_MODELS: LazyLock = LazyLock::new(|| { diff --git a/src/modules/cache/imap/tests.rs b/src/modules/cache/imap/tests.rs new file mode 100644 index 0000000..7373f68 --- /dev/null +++ b/src/modules/cache/imap/tests.rs @@ -0,0 +1,84 @@ +// Copyright © 2025 rustmailer.com +// Licensed under RustMailer License Agreement v1.0 +// Unauthorized copying, modification, or distribution is prohibited. + +use std::{fs, io, time::Instant}; + +use native_db::Builder; +use tempfile::NamedTempFile; + +use crate::modules::{cache::imap::minimal::MinimalEnvelope, database::ModelsAdapter}; + +fn create_temp_file() -> io::Result { + let temp_file = NamedTempFile::new()?; + Ok(temp_file) +} + +pub fn generate_envelopes( + accounts: u64, + mailboxes_per_account: u64, + uids_per_mailbox: u32, +) -> Vec { + let mut envelopes = + Vec::with_capacity((accounts * mailboxes_per_account * uids_per_mailbox as u64) as usize); + + let mut counter: u64 = 1; + + for account_id in 1..=accounts { + for mailbox_id in 1..=mailboxes_per_account { + for uid in 1..=uids_per_mailbox { + envelopes.push(MinimalEnvelope { + account_id, + mailbox_id, + uid, + flags_hash: counter, + }); + counter += 1; + } + } + } + + envelopes +} + +#[tokio::test] +async fn test1() { + let mut adapter = ModelsAdapter::new(); + adapter.register_model::(); + let models = adapter.models; + let temp_file = create_temp_file().unwrap(); + let temp_path = temp_file.path().to_str().unwrap(); + + // let database = Builder::new() + // .set_cache_size(1073741824) + // .create(&models, temp_path) + // .unwrap(); + let database = Builder::new().create_in_memory(&models).unwrap(); + + let envelopes = generate_envelopes(20, 50, 100); + let len = envelopes.len(); + let start_total = Instant::now(); + let rw = database.rw_transaction().unwrap(); + for e in envelopes { + rw.insert(e).unwrap(); + } + rw.commit().unwrap(); + // for chunk in envelopes.into_iter().chunks(10000).into_iter() { + // let rw = database.rw_transaction().unwrap(); + // for c in chunk { + // rw.insert(c).unwrap(); + // } + // rw.commit().unwrap(); + // } + + let elapsed_total = start_total.elapsed(); + println!("All {} envelopes inserted in {:?}", len, elapsed_total); + + let metadata = fs::metadata(temp_path).unwrap(); + let file_size = metadata.len(); + println!( + "Database file size: {} bytes ({:.2} MB)", + file_size, + file_size as f64 / (1024.0 * 1024.0) + ); +}