From b0362413a9c12d5c501bf7f518b18544cf3bb3f8 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Mon, 25 Nov 2019 22:36:08 +0100
Subject: [PATCH] [ref] bc-db: merge db handler and reader into a struct

---
 lib/modules-lib/bc-db-reader/Cargo.toml       |  2 +-
 .../bc-db-reader/src/indexes/identities.rs    | 16 +++++------
 lib/modules-lib/bc-db-reader/src/lib.rs       |  9 +++++--
 lib/modules-lib/bc-db-reader/src/traits.rs    | 23 +++++++++++-----
 .../bc-db-writer/src/indexes/transactions.rs  |  7 +++--
 .../blockchain/bc-db-writer/src/lib.rs        |  2 ++
 .../blockchain/src/fork/fork_algo.rs          | 13 +++++----
 .../blockchain/src/fork/rollback.rs           | 21 ++++++++-------
 .../blockchain/blockchain/tests/common.rs     |  4 +--
 lib/modules/gva/src/db.rs                     |  4 +--
 lib/modules/gva/src/schema/entities/block.rs  |  4 +--
 lib/modules/gva/src/schema/queries/block.rs   |  4 +--
 lib/modules/gva/src/schema/queries/blocks.rs  |  4 +--
 lib/modules/gva/src/schema/queries/current.rs |  4 +--
 lib/tools/common-tools/src/traits/mod.rs      |  4 +++
 lib/tools/dbs-tools/Cargo.toml                |  1 +
 lib/tools/dbs-tools/src/kv_db.rs              |  2 ++
 lib/tools/dbs-tools/src/kv_db/file.rs         | 27 ++++++++++++++++---
 18 files changed, 96 insertions(+), 55 deletions(-)

diff --git a/lib/modules-lib/bc-db-reader/Cargo.toml b/lib/modules-lib/bc-db-reader/Cargo.toml
index 7dfb6496..1084dd8b 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 8a23e570..b1067c13 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 2c148ed0..20a90069 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 9e8f8e33..544a2776 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 9dcf7c02..05317b87 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 6bcfceac..74462a32 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 96e22cd1..725c91c6 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 e7a01da7..ec11ff9f 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 fe02380f..c02ac26b 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 dd893c58..ecdea969 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 972a9bc6..10e54692 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 09cde41e..fc9253a5 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 9c0fd898..fa4a97c1 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 2a8e3b20..6a736f8a 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 757fcc09..812a3a13 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 e00a66f2..a94e4c5e 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 e94247a9..ac1afbfd 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 7f0d52f6..fa0a23e5 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)?
-- 
GitLab