Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions masq_lib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ pub mod crash_point;
pub mod data_version;
pub mod exit_locations;
pub mod shared_schema;
pub mod simple_clock;
pub mod test_utils;
pub mod ui_gateway;
pub mod ui_traffic_converter;
16 changes: 16 additions & 0 deletions masq_lib/src/simple_clock.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) 2025, MASQ (https://masq.ai) and/or its affiliates. All rights reserved.

use std::time::SystemTime;

pub trait SimpleClock {
fn now(&self) -> SystemTime;
}

#[derive(Default)]
pub struct SimpleClockReal {}

impl SimpleClock for SimpleClockReal {
fn now(&self) -> SystemTime {
SystemTime::now()
}
}
1 change: 1 addition & 0 deletions masq_lib/src/test_utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ pub mod fake_stream_holder;
pub mod logging;
pub mod mock_blockchain_client_server;
pub mod mock_websockets_server;
pub mod simple_clock;
pub mod ui_connection;
pub mod utils;
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
// Copyright (c) 2025, MASQ (https://masq.ai) and/or its affiliates. All rights reserved.

use crate::blockchain::errors::validation_status::ValidationFailureClock;
use crate::simple_clock::SimpleClock;
use std::cell::RefCell;
use std::time::SystemTime;

#[derive(Default)]
pub struct ValidationFailureClockMock {
pub struct SimpleClockMock {
now_results: RefCell<Vec<SystemTime>>,
}

impl ValidationFailureClock for ValidationFailureClockMock {
impl SimpleClock for SimpleClockMock {
fn now(&self) -> SystemTime {
self.now_results.borrow_mut().remove(0)
}
}

impl ValidationFailureClockMock {
impl SimpleClockMock {
pub fn now_result(self, result: SystemTime) -> Self {
self.now_results.borrow_mut().push(result);
self
Expand Down
13 changes: 6 additions & 7 deletions node/src/accountant/db_access_objects/failed_payable_dao.rs
Original file line number Diff line number Diff line change
Expand Up @@ -427,17 +427,16 @@ mod tests {
};
use crate::accountant::db_access_objects::utils::current_unix_timestamp;
use crate::accountant::db_access_objects::Transaction;
use crate::accountant::scanners::pending_payable_scanner::test_utils::ValidationFailureClockMock;
use crate::blockchain::errors::rpc_errors::{AppRpcErrorKind, LocalErrorKind, RemoteErrorKind};
use crate::blockchain::errors::validation_status::{
PreviousAttempts, ValidationFailureClockReal, ValidationStatus,
};
use crate::blockchain::errors::validation_status::{PreviousAttempts, ValidationStatus};
use crate::blockchain::errors::BlockchainErrorKind;
use crate::blockchain::test_utils::{make_address, make_tx_hash};
use crate::database::db_initializer::{
DbInitializationConfig, DbInitializer, DbInitializerReal,
};
use crate::database::test_utils::ConnectionWrapperMock;
use masq_lib::simple_clock::SimpleClockReal;
use masq_lib::test_utils::simple_clock::SimpleClockMock;
use masq_lib::test_utils::utils::ensure_node_home_directory_exists;
use rusqlite::Connection;
use std::collections::{BTreeSet, HashMap};
Expand Down Expand Up @@ -701,7 +700,7 @@ mod tests {

#[test]
fn failure_status_from_str_works() {
let validation_failure_clock = ValidationFailureClockMock::default().now_result(
let validation_failure_clock = SimpleClockMock::default().now_result(
SystemTime::UNIX_EPOCH
.add(Duration::from_secs(1755080031))
.add(Duration::from_nanos(612180914)),
Expand Down Expand Up @@ -831,7 +830,7 @@ mod tests {
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
),
)))
.build();
Expand Down Expand Up @@ -950,7 +949,7 @@ mod tests {
]))
.unwrap();
let timestamp = SystemTime::now();
let clock = ValidationFailureClockMock::default()
let clock = SimpleClockMock::default()
.now_result(timestamp)
.now_result(timestamp);
let hashmap = HashMap::from([
Expand Down
39 changes: 19 additions & 20 deletions node/src/accountant/db_access_objects/sent_payable_dao.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,20 +540,19 @@ mod tests {
make_read_only_db_connection, make_sent_tx, TxBuilder,
};
use crate::accountant::db_access_objects::Transaction;
use crate::accountant::scanners::pending_payable_scanner::test_utils::ValidationFailureClockMock;
use crate::blockchain::blockchain_interface::data_structures::TxBlock;
use crate::blockchain::errors::internal_errors::InternalErrorKind;
use crate::blockchain::errors::rpc_errors::{AppRpcErrorKind, LocalErrorKind, RemoteErrorKind};
use crate::blockchain::errors::validation_status::{
PreviousAttempts, ValidationFailureClockReal, ValidationStatus,
};
use crate::blockchain::errors::validation_status::{PreviousAttempts, ValidationStatus};
use crate::blockchain::errors::BlockchainErrorKind;
use crate::blockchain::test_utils::{make_address, make_block_hash, make_tx_hash};
use crate::database::db_initializer::{
DbInitializationConfig, DbInitializer, DbInitializerReal,
};
use crate::database::test_utils::ConnectionWrapperMock;
use ethereum_types::{H256, U64};
use masq_lib::simple_clock::SimpleClockReal;
use masq_lib::test_utils::simple_clock::SimpleClockMock;
use masq_lib::test_utils::utils::ensure_node_home_directory_exists;
use rusqlite::Connection;
use std::cmp::Ordering;
Expand All @@ -578,13 +577,13 @@ mod tests {
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
)
.add_attempt(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
),
)))
.build();
Expand Down Expand Up @@ -822,7 +821,7 @@ mod tests {
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
),
)))
.build();
Expand Down Expand Up @@ -1205,7 +1204,7 @@ mod tests {
let mut tx2 = make_sent_tx(789);
tx2.status = TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(RemoteErrorKind::Unreachable)),
&ValidationFailureClockMock::default().now_result(timestamp_b),
&SimpleClockMock::default().now_result(timestamp_b),
)));
let mut tx3 = make_sent_tx(123);
tx3.status = TxStatus::Pending(ValidationStatus::Waiting);
Expand All @@ -1217,7 +1216,7 @@ mod tests {
tx1.hash,
TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Local(LocalErrorKind::Internal)),
&ValidationFailureClockMock::default().now_result(timestamp_a),
&SimpleClockMock::default().now_result(timestamp_a),
))),
),
(
Expand All @@ -1227,13 +1226,13 @@ mod tests {
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockMock::default().now_result(timestamp_b),
&SimpleClockMock::default().now_result(timestamp_b),
)
.add_attempt(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable,
)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
),
)),
),
Expand Down Expand Up @@ -1266,7 +1265,7 @@ mod tests {
updated_txs[1].status,
TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Local(LocalErrorKind::Internal)),
&ValidationFailureClockMock::default().now_result(timestamp_a)
&SimpleClockMock::default().now_result(timestamp_a)
)))
);
assert_eq!(
Expand All @@ -1276,13 +1275,13 @@ mod tests {
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable
)),
&ValidationFailureClockMock::default().now_result(timestamp_b)
&SimpleClockMock::default().now_result(timestamp_b)
)
.add_attempt(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(
RemoteErrorKind::Unreachable
)),
&ValidationFailureClockReal::default()
&SimpleClockReal::default()
)
))
);
Expand Down Expand Up @@ -1318,7 +1317,7 @@ mod tests {
make_tx_hash(1),
TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(RemoteErrorKind::Unreachable)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
))),
)]));

Expand Down Expand Up @@ -1512,8 +1511,8 @@ mod tests {

#[test]
fn tx_status_from_str_works() {
let validation_failure_clock = ValidationFailureClockMock::default()
.now_result(UNIX_EPOCH.add(Duration::from_secs(12456)));
let validation_failure_clock =
SimpleClockMock::default().now_result(UNIX_EPOCH.add(Duration::from_secs(12456)));

assert_eq!(
TxStatus::from_str(r#"{"Pending":"Waiting"}"#).unwrap(),
Expand Down Expand Up @@ -1579,15 +1578,15 @@ mod tests {
let tx_status_1 = TxStatus::Pending(ValidationStatus::Waiting);
let tx_status_2 = TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Remote(RemoteErrorKind::InvalidResponse)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
)));
let tx_status_3 = TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::AppRpc(AppRpcErrorKind::Local(LocalErrorKind::Decoder)),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
)));
let tx_status_4 = TxStatus::Pending(ValidationStatus::Reattempting(PreviousAttempts::new(
BlockchainErrorKind::Internal(InternalErrorKind::PendingTooLongNotReplaced),
&ValidationFailureClockReal::default(),
&SimpleClockReal::default(),
)));
let tx_status_5 = TxStatus::Confirmed {
block_hash: format!("{:?}", make_tx_hash(1)),
Expand Down
Loading