|
8 | 8 |
|
9 | 9 | //! Contains the tests for the high-level API (directory, auditor, client)
|
10 | 10 |
|
| 11 | +use std::collections::HashMap; |
| 12 | + |
11 | 13 | use crate::{
|
12 | 14 | auditor::audit_verify,
|
13 | 15 | client::{key_history_verify, lookup_verify},
|
14 | 16 | directory::{Directory, PublishCorruption},
|
15 | 17 | ecvrf::{HardCodedAkdVRF, VRFKeyStorage},
|
16 |
| - errors::AkdError, |
17 |
| - storage::{manager::StorageManager, memory::AsyncInMemoryDatabase, types::DbRecord, Database}, |
| 18 | + errors::{AkdError, StorageError}, |
| 19 | + storage::{ |
| 20 | + manager::StorageManager, |
| 21 | + memory::AsyncInMemoryDatabase, |
| 22 | + types::{DbRecord, KeyData, ValueState, ValueStateRetrievalFlag}, |
| 23 | + Database, DbSetState, Storable, |
| 24 | + }, |
18 | 25 | AkdLabel, AkdValue, HistoryParams, HistoryVerificationParams, VerifyResult,
|
19 | 26 | };
|
20 | 27 |
|
| 28 | +#[derive(Clone)] |
| 29 | +pub struct LocalDatabase; |
| 30 | + |
| 31 | +unsafe impl Send for LocalDatabase {} |
| 32 | +unsafe impl Sync for LocalDatabase {} |
| 33 | + |
| 34 | +mockall::mock! { |
| 35 | + pub LocalDatabase { |
| 36 | + |
| 37 | + } |
| 38 | + impl Clone for LocalDatabase { |
| 39 | + fn clone(&self) -> Self; |
| 40 | + } |
| 41 | + #[async_trait::async_trait] |
| 42 | + impl Database for LocalDatabase { |
| 43 | + /// Set a record in the database |
| 44 | + async fn set(&self, record: DbRecord) -> Result<(), StorageError>; |
| 45 | + |
| 46 | + /// Set multiple records in the database with a minimal set of operations |
| 47 | + async fn batch_set( |
| 48 | + &self, |
| 49 | + records: Vec<DbRecord>, |
| 50 | + state: DbSetState, |
| 51 | + ) -> Result<(), StorageError>; |
| 52 | + |
| 53 | + /// Retrieve a stored record from the database |
| 54 | + async fn get<St: Storable>(&self, id: &St::StorageKey) -> Result<DbRecord, StorageError>; |
| 55 | + |
| 56 | + /// Retrieve a batch of records by id from the database |
| 57 | + async fn batch_get<St: Storable>( |
| 58 | + &self, |
| 59 | + ids: &[St::StorageKey], |
| 60 | + ) -> Result<Vec<DbRecord>, StorageError>; |
| 61 | + |
| 62 | + /* User data searching */ |
| 63 | + |
| 64 | + /// Retrieve the user data for a given user |
| 65 | + async fn get_user_data(&self, username: &AkdLabel) -> Result<KeyData, StorageError>; |
| 66 | + |
| 67 | + /// Retrieve a specific state for a given user |
| 68 | + async fn get_user_state( |
| 69 | + &self, |
| 70 | + username: &AkdLabel, |
| 71 | + flag: ValueStateRetrievalFlag, |
| 72 | + ) -> Result<ValueState, StorageError>; |
| 73 | + |
| 74 | + /// Retrieve the user -> state version mapping in bulk. This is the same as get_user_states but with less data retrieved from the storage layer |
| 75 | + async fn get_user_state_versions( |
| 76 | + &self, |
| 77 | + usernames: &[AkdLabel], |
| 78 | + flag: ValueStateRetrievalFlag, |
| 79 | + ) -> Result<HashMap<AkdLabel, (u64, AkdValue)>, StorageError>; |
| 80 | + } |
| 81 | +} |
| 82 | + |
21 | 83 | // A simple test to ensure that the empty tree hashes to the correct value
|
22 | 84 | #[tokio::test]
|
23 | 85 | async fn test_empty_tree_root_hash() -> Result<(), AkdError> {
|
|
0 commit comments