diff --git a/lib/modules-lib/bc-db-reader/Cargo.toml b/lib/modules-lib/bc-db-reader/Cargo.toml index 7dfb649613fd3015797d30517ea069022b7996d4..1084dd8b99fd17dc0398d01022b6edf4afb5f091 100644 --- a/lib/modules-lib/bc-db-reader/Cargo.toml +++ b/lib/modules-lib/bc-db-reader/Cargo.toml @@ -37,4 +37,4 @@ tempfile = "3.1.0" [features] client-indexer = [] -mock = ["mockall"] +mock = ["mockall", "durs-dbs-tools/mock"] diff --git a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs index 8a23e570e0f198075e2ab2bd12128b6c95a9a285..b1067c13e55be570d50bc95622b68651c6f09b7f 100644 --- a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs +++ b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs @@ -287,12 +287,12 @@ mod test { let idty_bin = durs_dbs_tools::to_bytes(idty)?; db.write(|mut w| { db.get_store(WOT_ID_INDEX).put( - db.w.as_mut(), + w.as_mut(), &idty.idty_doc.issuers()[0].to_bytes_vector(), &DbValue::U64(wot_id), )?; db.get_int_store(IDENTITIES).put( - db.w.as_mut(), + w.as_mut(), wot_id as u32, &KvFileDbHandler::db_value(&idty_bin)?, )?; @@ -304,7 +304,7 @@ mod test { // Write greatest wot id db.write(|mut w| { db.get_int_store(CURRENT_METAS_DATAS).put( - db.w.as_mut(), + w.as_mut(), CurrentMetaDataKey::NextWotId.to_u32(), &DbValue::U64(wot_id), )?; @@ -315,18 +315,18 @@ mod test { let mut filters = IdentitiesFilter::default(); assert!(slice_same_elems( &mock_identities, - &get_identities(&db, filters, BlockNumber(5))? + &db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? )); // Test by pubkey filter filters = IdentitiesFilter::by_pubkey(pubkey('A')); assert_eq!( vec![mock_identities[0].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); filters = IdentitiesFilter::by_pubkey(pubkey('C')); assert_eq!( vec![mock_identities[2].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); // Test paging filter with little page size @@ -341,7 +341,7 @@ mod test { }; assert!(slice_same_elems( &vec![mock_identities[2].clone(), mock_identities[3].clone()], - &get_identities(&db, filters, BlockNumber(5))? + &db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? )); // Test paging filter with limited interval @@ -356,7 +356,7 @@ mod test { }; assert_eq!( vec![mock_identities[2].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); Ok(()) diff --git a/lib/modules-lib/bc-db-reader/src/lib.rs b/lib/modules-lib/bc-db-reader/src/lib.rs index 2c148ed0e5082e7a3df5623e74fad312a70dca80..20a90069261b8cc290177a32c808f541da914251 100644 --- a/lib/modules-lib/bc-db-reader/src/lib.rs +++ b/lib/modules-lib/bc-db-reader/src/lib.rs @@ -42,8 +42,8 @@ pub use durs_dbs_tools::kv_db::{ }; pub use durs_dbs_tools::DbError; #[cfg(feature = "mock")] -pub use traits::MockBcDbInReadTx_ as MockBcDbInReadTx; -pub use traits::{BcDbInReadTx, BcDbInReadTx_, BcDbRead, BcDbWithReader}; +pub use traits::MockBcDbInReadTx; +pub use traits::{BcDbInReadTx, BcDbRead, BcDbWithReader}; use constants::*; use maplit::hashmap; @@ -100,6 +100,11 @@ where } } +impl<'r, 'db: 'r, DB> durs_common_tools::traits::NotMock for BcDbWithReaderStruct<'r, 'db, DB> where + DB: DbReadable +{ +} + #[cfg(test)] pub mod tests { diff --git a/lib/modules-lib/bc-db-reader/src/traits.rs b/lib/modules-lib/bc-db-reader/src/traits.rs index 9e8f8e33e379143afda0079f950213311f5ff006..544a2776707ad5119b51bf696df23f820be4ef4b 100644 --- a/lib/modules-lib/bc-db-reader/src/traits.rs +++ b/lib/modules-lib/bc-db-reader/src/traits.rs @@ -48,10 +48,6 @@ where } } -pub trait BcDbInReadTx: BcDbWithReader + BcDbInReadTx_ {} - -impl<T> BcDbInReadTx for T where T: BcDbWithReader + BcDbInReadTx_ {} - pub trait BcDbWithReader { type DB: DbReadable; type R: DbReader; @@ -60,8 +56,21 @@ pub trait BcDbWithReader { fn r(&self) -> &Self::R; } +#[cfg(feature = "mock")] +impl<'a> BcDbWithReader for MockBcDbInReadTx { + type DB = crate::BcDbRo; + type R = durs_dbs_tools::kv_db::MockKvFileDbReader; + + fn db(&self) -> &Self::DB { + unreachable!() + } + fn r(&self) -> &Self::R { + unreachable!() + } +} + #[cfg_attr(feature = "mock", automock)] -pub trait BcDbInReadTx_ { +pub trait BcDbInReadTx: BcDbWithReader { fn get_current_blockstamp(&self) -> Result<Option<Blockstamp>, DbError>; fn get_current_block(&self) -> Result<Option<DbBlock>, DbError>; fn get_db_block_in_local_blockchain( @@ -76,9 +85,9 @@ pub trait BcDbInReadTx_ { fn get_uid_from_pubkey(&self, pubkey: &PubKey) -> Result<Option<String>, DbError>; } -impl<T> BcDbInReadTx_ for T +impl<T> BcDbInReadTx for T where - T: BcDbWithReader, + T: BcDbWithReader + durs_common_tools::traits::NotMock, { fn get_current_blockstamp(&self) -> Result<Option<Blockstamp>, DbError> { crate::current_meta_datas::get_current_blockstamp(self) diff --git a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs index 9dcf7c0293cbf46957e6af7d85628aa55cbc55ea..05317b8777b79f0f18de7208b56f270ec29c501f 100644 --- a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs +++ b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs @@ -306,15 +306,14 @@ mod tests { // Check new UTXOS // TODO //db.get_store(UTXOS).iter_start()? - let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(r)?.count()))?; + let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(&r)?.count()))?; assert_eq!(2, count_utxos); // Revert first g1 tx db.write(|mut w| { if let Some(mut block_consumed_sources_opt) = durs_bc_db_reader::indexes::sources::get_block_consumed_sources_( - &db, - w.as_ref(), + &BcDbRwWithWriter { db: &db, w: &w }, BlockNumber(52), )? { @@ -326,7 +325,7 @@ mod tests { })?; // UTXOS must be empty - let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(r)?.count()))?; + let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(&r)?.count()))?; assert_eq!(0, count_utxos); Ok(()) diff --git a/lib/modules/blockchain/bc-db-writer/src/lib.rs b/lib/modules/blockchain/bc-db-writer/src/lib.rs index 6bcfceac1f50f672dd21aaccb2bddce972573bb3..74462a3254e70cf3e3cdfaa71f24d15e65defc3a 100644 --- a/lib/modules/blockchain/bc-db-writer/src/lib.rs +++ b/lib/modules/blockchain/bc-db-writer/src/lib.rs @@ -91,6 +91,8 @@ impl<'w, 'db: 'w> durs_bc_db_reader::BcDbWithReader for BcDbRwWithWriter<'w, 'db } } +impl<'w, 'db: 'w> durs_common_tools::traits::NotMock for BcDbRwWithWriter<'w, 'db> {} + #[derive(Debug)] /// Set of databases storing web of trust information pub struct WotsV10DBs { diff --git a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs index 96e22cd135bda5ff3adae73dcd16d0f5abf9eaeb..725c91c633cc49f9f5c80b9b4a7436fdd99a86df 100644 --- a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs +++ b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs @@ -140,10 +140,9 @@ mod tests { // Local blockchain must contain at least `fork_window_size +2` blocks assert!(db - .read( - |r| durs_bc_db_reader::blocks::get_block_in_local_blockchain( - &db, - r, + .r( + |db_r| durs_bc_db_reader::blocks::get_block_in_local_blockchain( + db_r, BlockNumber((fork_window_size + 1) as u32) ) )? @@ -182,7 +181,7 @@ mod tests { assert_eq!( None, db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &fork_tree, fork_window_size, current_blockstamp, @@ -226,7 +225,7 @@ mod tests { determining_blockstamp, ]), db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &mut fork_tree, fork_window_size, current_blockstamp, @@ -258,7 +257,7 @@ mod tests { assert_eq!( Some(new_main_blocks.iter().map(|b| b.blockstamp()).collect()), db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &mut fork_tree, fork_window_size, current_blockstamp, diff --git a/lib/modules/blockchain/blockchain/src/fork/rollback.rs b/lib/modules/blockchain/blockchain/src/fork/rollback.rs index e7a01da76edbf6ae0b38fdb4f7f049a7a63c52bd..ec11ff9f99a51e28a714d5f35c4af95a9d3b4a7a 100644 --- a/lib/modules/blockchain/blockchain/src/fork/rollback.rs +++ b/lib/modules/blockchain/blockchain/src/fork/rollback.rs @@ -18,7 +18,6 @@ use crate::fork::revert_block::ValidBlockRevertReqs; use crate::*; use dubp_common_doc::traits::Document; use dubp_common_doc::Blockstamp; -use durs_bc_db_reader::BcDbRead; use durs_common_tools::fatal_error; use unwrap::unwrap; @@ -36,12 +35,13 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) let db_tx_result = db.write(|mut w| { // Rollback (revert old branch) while bc.current_blockstamp.id.0 > last_common_block_number { - if let Some(dal_block) = db - .r(|db_r| durs_bc_db_reader::blocks::get_fork_block(db_r, bc.current_blockstamp)) - .unwrap_or_else(|_| { - fatal_error!("revert block {} fail !", bc.current_blockstamp); - }) - { + if let Some(dal_block) = durs_bc_db_reader::blocks::get_fork_block( + &BcDbRwWithWriter { db: &db, w: &w }, + bc.current_blockstamp, + ) + .unwrap_or_else(|_| { + fatal_error!("revert block {} fail !", bc.current_blockstamp); + }) { let blockstamp = dal_block.block.blockstamp(); debug!("try to revert block #{}", blockstamp); let ValidBlockRevertReqs { @@ -85,9 +85,10 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) // Apply new branch let mut new_branch_is_valid = true; for blockstamp in &new_bc_branch { - if let Ok(Some(dal_block)) = - db.r(|db_r| durs_bc_db_reader::blocks::get_fork_block(db_r, *blockstamp)) - { + if let Ok(Some(dal_block)) = durs_bc_db_reader::blocks::get_fork_block( + &BcDbRwWithWriter { db: &db, w: &w }, + *blockstamp, + ) { new_branch_blocks.push(dal_block.clone()); match check_and_apply_block(bc, &db, &mut w, dal_block.block) { Ok(check_and_apply_block_return) => match check_and_apply_block_return { diff --git a/lib/modules/blockchain/blockchain/tests/common.rs b/lib/modules/blockchain/blockchain/tests/common.rs index fe02380fa83befab7442250df802792989bc51b2..c02ac26b2345727e20e2cc0f70e1cdf8c123087a 100644 --- a/lib/modules/blockchain/blockchain/tests/common.rs +++ b/lib/modules/blockchain/blockchain/tests/common.rs @@ -34,8 +34,8 @@ pub fn init() -> PathBuf { /// Stop and clear test pub fn stop_and_clean( - bc_sender: Sender<DursMsg>, - handle: JoinHandle<()>, + _bc_sender: Sender<DursMsg>, + _handle: JoinHandle<()>, tmp_profile_path: PathBuf, ) { // Send STOP signal to blockchain module diff --git a/lib/modules/gva/src/db.rs b/lib/modules/gva/src/db.rs index dd893c58b2a6fc1d93de89f4e68b59850f4a9c7e..ecdea969f7fcfd386de1340081d983c49b1c741e 100644 --- a/lib/modules/gva/src/db.rs +++ b/lib/modules/gva/src/db.rs @@ -15,7 +15,7 @@ //! Gva Module: database requests -#[cfg(test)] -pub(crate) use durs_bc_db_reader::BcDbInReadTx as BcDbRo; #[cfg(not(test))] pub(crate) use durs_bc_db_reader::BcDbRo; +#[cfg(test)] +pub(crate) use durs_bc_db_reader::MockBcDbInReadTx as BcDbRo; diff --git a/lib/modules/gva/src/schema/entities/block.rs b/lib/modules/gva/src/schema/entities/block.rs index 972a9bc669dd130346236e5ba97843e7fc9a56ce..10e54692e20b1d6d51fbbe107663ef765fe57076 100644 --- a/lib/modules/gva/src/schema/entities/block.rs +++ b/lib/modules/gva/src/schema/entities/block.rs @@ -21,7 +21,7 @@ use chrono::NaiveDateTime; use dubp_block_doc::block::BlockDocumentTrait; use dubp_common_doc::traits::Document; use durs_bc_db_reader::blocks::DbBlock; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use durs_common_tools::fatal_error; use juniper::{Executor, FieldResult}; use juniper_from_schema::{QueryTrail, Walked}; @@ -43,7 +43,7 @@ impl Block { trail.issuer_name() } // Convert BlockDb (db entity) into Block (gva entity) - pub(crate) fn from_block_db<DB: BcDbWithReader>( + pub(crate) fn from_block_db<DB: BcDbInReadTx>( db: &DB, block_db: DbBlock, ask_issuer_name: bool, diff --git a/lib/modules/gva/src/schema/queries/block.rs b/lib/modules/gva/src/schema/queries/block.rs index 09cde41e968c35bba1901d9591003abe0972850d..fc9253a510d619b04fc7cf108ab7ba0f04fcefff 100644 --- a/lib/modules/gva/src/schema/queries/block.rs +++ b/lib/modules/gva/src/schema/queries/block.rs @@ -17,10 +17,10 @@ use crate::schema::entities::block::Block; use dubp_common_doc::BlockNumber; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, Block, Walked>, number: i32, diff --git a/lib/modules/gva/src/schema/queries/blocks.rs b/lib/modules/gva/src/schema/queries/blocks.rs index 9c0fd89852b351a10ccc7c669edc5f11d5d9b307..fa4a97c1d497be9640a30bf80d2517902f43536f 100644 --- a/lib/modules/gva/src/schema/queries/blocks.rs +++ b/lib/modules/gva/src/schema/queries/blocks.rs @@ -22,10 +22,10 @@ use crate::schema::inputs::paging::{FilledPaging, Paging}; use crate::schema::inputs::sort_order::SortOrder; use dubp_common_doc::BlockNumber; use durs_bc_db_reader::blocks::DbBlock; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, BlocksPage, Walked>, paging_opt: Option<Paging>, diff --git a/lib/modules/gva/src/schema/queries/current.rs b/lib/modules/gva/src/schema/queries/current.rs index 2a8e3b20abef72b216c605f3b268d33761dc1373..6a736f8a6bb2c2f7a7c9f1984e98b6a6e5bf7794 100644 --- a/lib/modules/gva/src/schema/queries/current.rs +++ b/lib/modules/gva/src/schema/queries/current.rs @@ -16,10 +16,10 @@ // ! Module execute GraphQl schema current query use crate::schema::entities::block::Block; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, Block, Walked>, ) -> Result<Option<Block>, DbError> { diff --git a/lib/tools/common-tools/src/traits/mod.rs b/lib/tools/common-tools/src/traits/mod.rs index 757fcc097538f2f88e40ce6aa7c69b658bdbaed6..812a3a13a101ed3b67e8671788eb16d32bc3d671 100644 --- a/lib/tools/common-tools/src/traits/mod.rs +++ b/lib/tools/common-tools/src/traits/mod.rs @@ -17,3 +17,7 @@ pub mod bool_ext; pub mod merge; + +/// Allows to mark the real structure in order to differentiate it from the mocked structure, +/// is essential in some special cases +pub trait NotMock {} diff --git a/lib/tools/dbs-tools/Cargo.toml b/lib/tools/dbs-tools/Cargo.toml index e00a66f2ff50a5c6fe49772cecd3544a6913c829..a94e4c5e73627676ffc8c75ce828c3e2ad9750bd 100644 --- a/lib/tools/dbs-tools/Cargo.toml +++ b/lib/tools/dbs-tools/Cargo.toml @@ -24,3 +24,4 @@ unwrap = "1.2.1" tempfile = "3.1.0" [features] +mock = [] diff --git a/lib/tools/dbs-tools/src/kv_db.rs b/lib/tools/dbs-tools/src/kv_db.rs index e94247a9931ad4ffd13118f8b987f050da8acff6..ac1afbfd785580a53c4ccabf2cc3d42184fcdfe9 100644 --- a/lib/tools/dbs-tools/src/kv_db.rs +++ b/lib/tools/dbs-tools/src/kv_db.rs @@ -17,6 +17,8 @@ mod file; +#[cfg(feature = "mock")] +pub use file::MockKvFileDbReader; pub use file::{ from_db_value, KvFileDbHandler, KvFileDbRead, KvFileDbReader, KvFileDbRoHandler, KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter, diff --git a/lib/tools/dbs-tools/src/kv_db/file.rs b/lib/tools/dbs-tools/src/kv_db/file.rs index 7f0d52f6bd4c067752ad5e9366e45c1b247a38e7..fa0a23e572348796b59a0ef0706f46c84d8539b6 100644 --- a/lib/tools/dbs-tools/src/kv_db/file.rs +++ b/lib/tools/dbs-tools/src/kv_db/file.rs @@ -42,6 +42,25 @@ impl<'r> rkv::Readable for KvFileDbReader<'r> { } } +#[cfg(feature = "mock")] +#[derive(Clone, Copy, Debug)] +/// Mock key-value database reader +pub struct MockKvFileDbReader; + +#[cfg(feature = "mock")] +impl rkv::Readable for MockKvFileDbReader { + fn get<K: AsRef<[u8]>>( + &self, + _: rkv::Database, + _: &K, + ) -> Result<Option<Value>, rkv::StoreError> { + unreachable!() + } + fn open_ro_cursor(&self, _: rkv::Database) -> Result<rkv::RoCursor, rkv::StoreError> { + unreachable!() + } +} + /// Key-value database writer pub struct KvFileDbWriter<'w> { buffer: Vec<u8>, @@ -418,7 +437,7 @@ mod tests { key: u32, ) -> Result<Option<String>, DbError> { ro_db.read(|r| { - if let Some(Value::Str(v)) = ro_db.get_int_store(store_name).get(r, key)? { + if let Some(Value::Str(v)) = ro_db.get_int_store(store_name).get(&r, key)? { Ok(Some(v.to_owned())) } else { Ok(None) @@ -436,7 +455,7 @@ mod tests { let store_test1 = db.get_int_store("test1"); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("toto"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("toto"))?; Ok(w) })?; @@ -448,7 +467,7 @@ mod tests { ); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("titi"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("titi"))?; Ok(w) })?; @@ -458,7 +477,7 @@ mod tests { ); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("tutu"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("tutu"))?; assert_eq!( Some("titi".to_owned()), get_int_store_str_val(&ro_db, "test1", 3)?