diff --git a/.github/workflows/ci_unit_tests_macos.yaml b/.github/workflows/ci_unit_tests_macos.yaml index d878123900..1400348480 100644 --- a/.github/workflows/ci_unit_tests_macos.yaml +++ b/.github/workflows/ci_unit_tests_macos.yaml @@ -52,6 +52,8 @@ jobs: needs: prologue runs-on: macos-11 steps: + - name: Install nextest + uses: taiki-e/install-action@nextest - uses: actions/checkout@v3 - run: | if [[ ${{ needs.prologue.outputs.os_skip }} == run ]] && [[ ${{ needs.prologue.outputs.job_skip }} == run ]];then diff --git a/.github/workflows/ci_unit_tests_ubuntu.yaml b/.github/workflows/ci_unit_tests_ubuntu.yaml index 6f0f415ed4..28fa44f5c2 100644 --- a/.github/workflows/ci_unit_tests_ubuntu.yaml +++ b/.github/workflows/ci_unit_tests_ubuntu.yaml @@ -57,6 +57,8 @@ jobs: profile: minimal toolchain: 1.61.0 - run: sudo apt-get update && sudo apt-get install -y libssl-dev pkg-config libclang-dev + - name: Install nextest + uses: taiki-e/install-action@nextest - uses: actions/checkout@v3 - run: | if [[ ${{ needs.prologue.outputs.os_skip }} == run ]] && [[ ${{ needs.prologue.outputs.job_skip }} == run ]];then diff --git a/.github/workflows/ci_unit_tests_windows.yaml b/.github/workflows/ci_unit_tests_windows.yaml index 6f2855925c..87a59a825b 100644 --- a/.github/workflows/ci_unit_tests_windows.yaml +++ b/.github/workflows/ci_unit_tests_windows.yaml @@ -63,6 +63,11 @@ jobs: scoop install git scoop bucket add extras scoop install llvm yasm + - name: Install cargo-nextest + run: | + scoop install wget + wget https://github.com/nextest-rs/nextest/releases/download/cargo-nextest-0.9.36/cargo-nextest-0.9.36-x86_64-pc-windows-msvc.zip + 7z x cargo-nextest-0.9.36-x86_64-pc-windows-msvc.zip -oC:\Users\Administrator\.cargo\bin -y - run: | if [[ ${{ needs.prologue.outputs.os_skip }} == run ]] && [[ ${{ needs.prologue.outputs.job_skip }} == run ]];then devtools/ci/ci_main.sh diff --git a/Cargo.lock b/Cargo.lock index 94cc77aec3..245a7ef6f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -414,9 +414,9 @@ dependencies = [ "ckb-metrics-config", "ckb-pow", "ckb-resource", + "ckb-systemtime", "ckb-types", "clap 4.0.32", - "faketime", "path-clean", "rand 0.7.3", "sentry", @@ -549,13 +549,13 @@ dependencies = [ "ckb-shared", "ckb-stop-handler", "ckb-store", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-tx-pool", "ckb-types", "ckb-verification", "ckb-verification-contextual", "ckb-verification-traits", - "faketime", "faux", "lazy_static", "tempfile", @@ -808,11 +808,11 @@ dependencies = [ "ckb-stop-handler", "ckb-store", "ckb-sync", + "ckb-systemtime", "ckb-tx-pool", "ckb-types", "ckb-verification", "ckb-verification-traits", - "faketime", "num_cpus", "once_cell", "tempfile", @@ -848,10 +848,10 @@ dependencies = [ "ckb-shared", "ckb-store", "ckb-sync", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-tx-pool", "ckb-types", - "faketime", "tempfile", "tokio", ] @@ -999,10 +999,10 @@ dependencies = [ "ckb-metrics", "ckb-spawn", "ckb-stop-handler", + "ckb-systemtime", "ckb-types", "ckb-util", "criterion", - "faketime", "faster-hex", "futures", "ipnetwork", @@ -1038,9 +1038,9 @@ dependencies = [ "ckb-network", "ckb-notify", "ckb-stop-handler", + "ckb-systemtime", "ckb-types", "ckb-util", - "faketime", "lru", "once_cell", "semver", @@ -1178,6 +1178,7 @@ dependencies = [ "ckb-shared", "ckb-store", "ckb-sync", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-traits", "ckb-tx-pool", @@ -1185,7 +1186,6 @@ dependencies = [ "ckb-util", "ckb-verification", "ckb-verification-traits", - "faketime", "itertools", "jsonrpc-core", "jsonrpc-derive", @@ -1252,10 +1252,10 @@ dependencies = [ "ckb-snapshot", "ckb-stop-handler", "ckb-store", + "ckb-systemtime", "ckb-tx-pool", "ckb-types", "ckb-verification", - "faketime", ] [[package]] @@ -1329,6 +1329,7 @@ dependencies = [ "ckb-shared", "ckb-stop-handler", "ckb-store", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-traits", "ckb-tx-pool", @@ -1337,7 +1338,6 @@ dependencies = [ "ckb-verification", "ckb-verification-traits", "dashmap", - "faketime", "faux", "futures", "governor", @@ -1364,6 +1364,10 @@ dependencies = [ "phf", ] +[[package]] +name = "ckb-systemtime" +version = "0.107.0-pre" + [[package]] name = "ckb-test-chain-utils" version = "0.107.0-pre" @@ -1374,10 +1378,10 @@ dependencies = [ "ckb-db-schema", "ckb-resource", "ckb-store", + "ckb-systemtime", "ckb-traits", "ckb-types", "ckb-util", - "faketime", "lazy_static", "tempfile", ] @@ -1408,11 +1412,11 @@ dependencies = [ "ckb-snapshot", "ckb-stop-handler", "ckb-store", + "ckb-systemtime", "ckb-traits", "ckb-types", "ckb-util", "ckb-verification", - "faketime", "hyper", "lru", "rand 0.8.5", @@ -1465,12 +1469,12 @@ dependencies = [ "ckb-pow", "ckb-resource", "ckb-script", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-traits", "ckb-types", "ckb-verification-traits", "derive_more", - "faketime", "lru", ] @@ -1490,12 +1494,12 @@ dependencies = [ "ckb-reward-calculator", "ckb-shared", "ckb-store", + "ckb-systemtime", "ckb-test-chain-utils", "ckb-traits", "ckb-types", "ckb-verification", "ckb-verification-traits", - "faketime", "rand 0.7.3", "rayon", "tokio", @@ -2004,16 +2008,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -[[package]] -name = "faketime" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdcfc2bfe63c760bba09679ed6cb3a001d409c5195b4490dced0dc0aa800582b" -dependencies = [ - "js-sys", - "tempfile", -] - [[package]] name = "faster-hex" version = "0.6.1" diff --git a/Cargo.toml b/Cargo.toml index bb4c4230ba..c2e7d9f10e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ members = [ "util", "util/occupied-capacity/core", "util/channel", + "util/systemtime", "util/fixed-hash/core", "util/build-info", "util/logger", diff --git a/Makefile b/Makefile index db67fae77a..23e7f04cdb 100644 --- a/Makefile +++ b/Makefile @@ -19,13 +19,19 @@ GRCOV_EXCL_STOP = ^\s*\)(;)?$$ GRCOV_EXCL_LINE = \s*(((log|ckg_logger)::)?(trace|debug|info|warn|error)|(debug_)?assert(_eq|_ne|_error_eq))!\(.*\)(;)?$$ ##@ Testing +.PHONY: doc-test +doc-test: ## Run doc tests + cargo test --all --doc + .PHONY: test -test: quick-test ## Run all tests, including some tests can be time-consuming to execute (tagged with [ignore]) - cargo test ${VERBOSE} --features ${CKB_FEATURES} --all -- --nocapture --ignored +test: ## Run all tests, including some tests can be time-consuming to execute (tagged with [ignore]) + cargo nextest run ${VERBOSE} --features ${CKB_FEATURES} --workspace --hide-progress-bar --success-output immediate-final --failure-output immediate-final --run-ignored all + $(MAKE) doc-test .PHONY: quick-test quick-test: ## Run all tests, excluding some tests can be time-consuming to execute (tagged with [ignore]) - cargo test ${VERBOSE} --features ${CKB_FEATURES} --all -- --nocapture + cargo nextest run ${VERBOSE} --features ${CKB_FEATURES} --workspace --hide-progress-bar --success-output immediate-final --failure-output immediate-final --run-ignored default + $(MAKE) doc-test .PHONY: cov-install-tools cov-install-tools: diff --git a/chain/Cargo.toml b/chain/Cargo.toml index 19530ad34b..3ad789a1e4 100644 --- a/chain/Cargo.toml +++ b/chain/Cargo.toml @@ -18,7 +18,7 @@ ckb-store = { path = "../store", version = "= 0.107.0-pre" } ckb-verification = { path = "../verification", version = "= 0.107.0-pre" } ckb-verification-contextual = { path = "../verification/contextual", version = "= 0.107.0-pre" } ckb-verification-traits = { path = "../verification/traits", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } ckb-stop-handler = { path = "../util/stop-handler", version = "= 0.107.0-pre" } ckb-dao = { path = "../util/dao", version = "= 0.107.0-pre" } ckb-proposal-table = { path = "../util/proposal-table", version = "= 0.107.0-pre" } @@ -39,6 +39,7 @@ ckb-network = { path = "../network", version = "= 0.107.0-pre" } ckb-launcher = { path = "../util/launcher", version = "= 0.107.0-pre" } lazy_static = "1.4" tempfile = "3.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" ,features = ["enable_faketime"]} [features] default = [] diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 24970dce71..fb9ff6633d 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -15,6 +15,7 @@ use ckb_rust_unstable_port::IsSorted; use ckb_shared::shared::Shared; use ckb_stop_handler::{SignalSender, StopHandler}; use ckb_store::{attach_block_cell, detach_block_cell, ChainStore, StoreTransaction}; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{ cell::{ @@ -32,7 +33,6 @@ use ckb_verification::cache::Completed; use ckb_verification::{BlockVerifier, InvalidParentError, NonContextualBlockTxsVerifier}; use ckb_verification_contextual::{ContextualBlockVerifier, VerifyContext}; use ckb_verification_traits::{Switch, Verifier}; -use faketime::unix_time_as_millis; use std::collections::{HashSet, VecDeque}; use std::sync::Arc; use std::{cmp, thread}; diff --git a/chain/src/tests/block_assembler.rs b/chain/src/tests/block_assembler.rs index 3dbb8894c6..a35044b605 100644 --- a/chain/src/tests/block_assembler.rs +++ b/chain/src/tests/block_assembler.rs @@ -131,8 +131,8 @@ fn create_cellbase(number: BlockNumber, epoch: &EpochExt) -> TransactionView { #[cfg(not(disable_faketime))] #[test] fn test_block_template_timestamp() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - ::std::env::set_var("FAKETIME", faketime_file.as_os_str()); + let mut _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let consensus = Consensus::default(); let epoch = consensus.genesis_epoch_ext().clone(); diff --git a/chain/src/tests/find_fork.rs b/chain/src/tests/find_fork.rs index 2274ba1da6..7300656b6f 100644 --- a/chain/src/tests/find_fork.rs +++ b/chain/src/tests/find_fork.rs @@ -3,6 +3,7 @@ use crate::tests::util::{MockChain, MockStore}; use ckb_chain_spec::consensus::{Consensus, ProposalWindow}; use ckb_launcher::SharedBuilder; use ckb_store::ChainStore; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{BlockBuilder, BlockExt, BlockView}, packed, @@ -10,7 +11,6 @@ use ckb_types::{ U256, }; use ckb_verification_traits::Switch; -use faketime::unix_time_as_millis; use std::collections::HashSet; use std::sync::Arc; diff --git a/network/Cargo.toml b/network/Cargo.toml index 099700bcec..d03157b0b2 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -19,7 +19,7 @@ ckb-metrics = {path = "../util/metrics", version = "= 0.107.0-pre"} tokio = { version = "1", features = ["sync", "macros"] } tokio-util = { version = "0.7", features = ["codec"] } futures = "0.3" -faketime = "0.2.0" +ckb-systemtime = {path = "../util/systemtime", version = "= 0.107.0-pre"} lazy_static = { version = "1.3.0", optional = true } bs58 = { version = "0.4.0", optional = true } sentry = { version = "0.26.0", optional = true } @@ -48,6 +48,7 @@ criterion = "0.4" proptest = "1.0" num_cpus = "1.10" once_cell = "1.8.0" +ckb-systemtime = {path = "../util/systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"]} [[bench]] name = "peer_store" diff --git a/network/src/peer_store/addr_manager.rs b/network/src/peer_store/addr_manager.rs index 5559fd314a..d978ccbcd0 100644 --- a/network/src/peer_store/addr_manager.rs +++ b/network/src/peer_store/addr_manager.rs @@ -52,7 +52,7 @@ impl AddrManager { let mut duplicate_ips = HashSet::new(); let mut addr_infos = Vec::with_capacity(count); let mut rng = rand::thread_rng(); - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); for i in 0..self.random_ids.len() { // reuse the for loop to shuffle random ids // https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle diff --git a/network/src/peer_store/ban_list.rs b/network/src/peer_store/ban_list.rs index 29d860fe78..743e356665 100644 --- a/network/src/peer_store/ban_list.rs +++ b/network/src/peer_store/ban_list.rs @@ -1,7 +1,7 @@ //! Ban list use crate::peer_store::types::{ip_to_network, BannedAddr}; use crate::peer_store::Multiaddr; -use faketime::unix_time_as_millis; +use ckb_systemtime::unix_time_as_millis; use ipnetwork::IpNetwork; use p2p::utils::multiaddr_to_socketaddr; use std::collections::HashMap; diff --git a/network/src/peer_store/peer_store_impl.rs b/network/src/peer_store/peer_store_impl.rs index 0b434b4d90..514c832371 100644 --- a/network/src/peer_store/peer_store_impl.rs +++ b/network/src/peer_store/peer_store_impl.rs @@ -40,7 +40,7 @@ impl PeerStore { /// this method will assume peer is connected, which implies address is "verified". pub fn add_connected_peer(&mut self, addr: Multiaddr, session_type: SessionType) { - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); match self .connected_peers .entry(extract_peer_id(&addr).expect("connected addr should have peer id")) @@ -79,7 +79,7 @@ impl PeerStore { let score = self.score_config.default_score; self.addr_manager.add(AddrInfo::new( addr, - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), score, flags.bits(), )); @@ -132,7 +132,7 @@ impl PeerStore { // 1. Not already connected // 2. Connected within 3 days - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let peers = &self.connected_peers; let addr_expired_ms = now_ms.saturating_sub(ADDR_TRY_TIMEOUT_MS); // get addrs that can attempt. @@ -159,7 +159,7 @@ impl PeerStore { // 2. Not already tried in a minute // 3. Not connected within 3 days - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let addr_expired_ms = now_ms.saturating_sub(ADDR_TRY_TIMEOUT_MS); let peers = &self.connected_peers; self.addr_manager @@ -177,7 +177,7 @@ impl PeerStore { // Get info: // 1. Already connected or Connected within 7 days - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let addr_expired_ms = now_ms.saturating_sub(ADDR_TIMEOUT_MS); let peers = &self.connected_peers; // get success connected addrs. @@ -201,7 +201,7 @@ impl PeerStore { } pub(crate) fn ban_network(&mut self, network: IpNetwork, timeout_ms: u64, ban_reason: String) { - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let ban_addr = BannedAddr { address: network, ban_until: now_ms + timeout_ms, @@ -246,7 +246,7 @@ impl PeerStore { // 2.2. Sort according to the amount of data in the same network segment // 2.3. In the network segment with more than 4 peer, randomly evict 2 peer - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let candidate_peers: Vec<_> = self .addr_manager .addrs_iter() diff --git a/network/src/services/outbound_peer.rs b/network/src/services/outbound_peer.rs index 144946b878..6498ec6894 100644 --- a/network/src/services/outbound_peer.rs +++ b/network/src/services/outbound_peer.rs @@ -3,7 +3,7 @@ use crate::{ NetworkState, }; use ckb_logger::trace; -use faketime::unix_time_as_millis; +use ckb_systemtime::unix_time_as_millis; use futures::Future; use p2p::{multiaddr::MultiAddr, service::ServiceControl}; use rand::prelude::IteratorRandom; diff --git a/network/src/tests/peer_store.rs b/network/src/tests/peer_store.rs index 540eaee96f..eeeba15ded 100644 --- a/network/src/tests/peer_store.rs +++ b/network/src/tests/peer_store.rs @@ -85,8 +85,8 @@ fn test_update_status() { #[cfg(not(disable_faketime))] #[test] fn test_ban_peer() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let mut peer_store: PeerStore = Default::default(); let addr = random_addr(); @@ -114,7 +114,7 @@ fn test_ban_peer() { peer_store.ban_addr(&addr, 10_000, "no reason".into()); } - faketime::write_millis(&faketime_file, 30_000).expect("write millis"); + _faketime_guard.set_faketime(30_000); // Cleanup will be performed every 1024 inserts let addr = random_addr_v6(); @@ -125,10 +125,8 @@ fn test_ban_peer() { #[cfg(not(disable_faketime))] #[test] fn test_attempt_ban() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); - - faketime::write_millis(&faketime_file, 1).expect("write millis"); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(1); let mut peer_store: PeerStore = Default::default(); let addr = random_addr(); @@ -139,9 +137,9 @@ fn test_attempt_ban() { .mut_addr_manager() .get_mut(&addr) .unwrap() - .mark_connected(faketime::unix_time_as_millis()); + .mark_connected(ckb_systemtime::unix_time_as_millis()); - faketime::write_millis(&faketime_file, 100_000).expect("write millis"); + _faketime_guard.set_faketime(100_000); assert_eq!( peer_store @@ -161,10 +159,8 @@ fn test_attempt_ban() { #[cfg(not(disable_faketime))] #[test] fn test_fetch_addrs_to_attempt() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); - - faketime::write_millis(&faketime_file, 1).expect("write millis"); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(1); let mut peer_store: PeerStore = Default::default(); assert!(peer_store @@ -178,8 +174,8 @@ fn test_fetch_addrs_to_attempt() { .mut_addr_manager() .get_mut(&addr) .unwrap() - .mark_connected(faketime::unix_time_as_millis()); - faketime::write_millis(&faketime_file, 100_000).expect("write millis"); + .mark_connected(ckb_systemtime::unix_time_as_millis()); + _faketime_guard.set_faketime(100_000); assert_eq!( peer_store @@ -196,16 +192,14 @@ fn test_fetch_addrs_to_attempt() { #[cfg(not(disable_faketime))] #[test] fn test_fetch_addrs_to_attempt_or_feeler() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); - - faketime::write_millis(&faketime_file, 1).expect("write millis"); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(1); let mut peer_store: PeerStore = Default::default(); let addr = random_addr(); peer_store.add_outbound_addr(addr, Flags::COMPATIBILITY); - faketime::write_millis(&faketime_file, 100_000).expect("write millis"); + _faketime_guard.set_faketime(100_000); assert_eq!( peer_store @@ -215,8 +209,7 @@ fn test_fetch_addrs_to_attempt_or_feeler() { ); assert!(peer_store.fetch_addrs_to_feeler(2).is_empty()); - faketime::write_millis(&faketime_file, 100_000 + ADDR_TRY_TIMEOUT_MS + 1) - .expect("write millis"); + _faketime_guard.set_faketime(100_000 + ADDR_TRY_TIMEOUT_MS + 1); assert!(peer_store .fetch_addrs_to_attempt(2, Flags::COMPATIBILITY) @@ -227,17 +220,15 @@ fn test_fetch_addrs_to_attempt_or_feeler() { #[cfg(not(disable_faketime))] #[test] fn test_fetch_addrs_to_attempt_in_last_minutes() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); - - faketime::write_millis(&faketime_file, 100_000).expect("write millis"); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(100_000); let mut peer_store: PeerStore = Default::default(); let addr = random_addr(); peer_store .add_addr(addr.clone(), Flags::COMPATIBILITY) .unwrap(); - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); if let Some(paddr) = peer_store.mut_addr_manager().get_mut(&addr) { paddr.mark_tried(now); @@ -257,7 +248,7 @@ fn test_fetch_addrs_to_attempt_in_last_minutes() { .get_mut(&addr) .unwrap() .mark_connected(now); - faketime::write_millis(&faketime_file, 200_000).expect("write millis"); + _faketime_guard.set_faketime(200_000); assert_eq!( peer_store @@ -297,7 +288,7 @@ fn test_fetch_addrs_to_feeler() { .mut_addr_manager() .get_mut(&addr) .unwrap() - .last_connected_at_ms = faketime::unix_time_as_millis(); + .last_connected_at_ms = ckb_systemtime::unix_time_as_millis(); peer_store.remove_disconnected_peer(&addr); assert!(peer_store.fetch_addrs_to_feeler(1).is_empty()); } @@ -391,7 +382,7 @@ fn test_random_fetch_with_filter() { .mut_addr_manager() .get_mut(&addr1) .unwrap() - .last_connected_at_ms = faketime::unix_time_as_millis(); + .last_connected_at_ms = ckb_systemtime::unix_time_as_millis(); assert_eq!(peer_store.addr_manager().count(), 1); assert_eq!( peer_store.fetch_random_addrs(1, Flags::COMPATIBILITY).len(), @@ -406,7 +397,7 @@ fn test_random_fetch_with_filter() { .mut_addr_manager() .get_mut(&addr2) .unwrap() - .last_connected_at_ms = faketime::unix_time_as_millis(); + .last_connected_at_ms = ckb_systemtime::unix_time_as_millis(); assert_eq!(peer_store.fetch_random_addrs(2, Flags::SYNC).len(), 1); peer_store @@ -416,7 +407,7 @@ fn test_random_fetch_with_filter() { .mut_addr_manager() .get_mut(&addr3) .unwrap() - .last_connected_at_ms = faketime::unix_time_as_millis(); + .last_connected_at_ms = ckb_systemtime::unix_time_as_millis(); assert_eq!(peer_store.fetch_random_addrs(2, Flags::SYNC).len(), 2); assert_eq!( @@ -449,7 +440,7 @@ fn test_get_random_restrict_addrs_from_same_ip() { #[test] fn test_eviction() { let mut peer_store = PeerStore::default(); - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); let tried_ms = now - 61_000; // add addrs, make the peer store has 4 groups addrs for i in 0..(ADDR_COUNT_LIMIT - 5) { diff --git a/network/src/tests/peer_store_db.rs b/network/src/tests/peer_store_db.rs index 5d7e92b2b6..e3d63ec109 100644 --- a/network/src/tests/peer_store_db.rs +++ b/network/src/tests/peer_store_db.rs @@ -13,7 +13,7 @@ use std::{collections::HashSet, fs::create_dir_all}; #[test] fn test_peer_store_persistent() { - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let mut peer_store = PeerStore::default(); // add addrs to addr manager @@ -172,7 +172,7 @@ fn test_peer_store_dump_with_broken_tmp_file_should_be_ok() { addr_manager.add(AddrInfo::new(addr, 0, 60, 0)); } let ban_list = peer_store.mut_ban_list(); - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); ban_list.ban(BannedAddr { address: multiaddr_to_ip_network(&"/ip4/127.0.0.1/tcp/42".parse().unwrap()).unwrap(), ban_until: now_ms + 10_000, diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 576e2e637b..6ba69ffb91 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -35,7 +35,7 @@ ckb-verification = { path = "../verification", version = "= 0.107.0-pre" } ckb-verification-traits = { path = "../verification/traits", version = "= 0.107.0-pre" } ckb-traits = { path = "../traits", version = "= 0.107.0-pre" } ckb-util = { path = "../util", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } ckb-dao = { path = "../util/dao", version = "= 0.107.0-pre" } ckb-error = { path = "../error", version = "= 0.107.0-pre" } ckb-reward-calculator = { path = "../util/reward-calculator", version = "= 0.107.0-pre" } diff --git a/rpc/src/module/alert.rs b/rpc/src/module/alert.rs index 024a6ec65e..1abbd02857 100644 --- a/rpc/src/module/alert.rs +++ b/rpc/src/module/alert.rs @@ -93,7 +93,7 @@ impl AlertRpcImpl { impl AlertRpc for AlertRpcImpl { fn send_alert(&self, alert: Alert) -> Result<()> { let alert: packed::Alert = alert.into(); - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let notice_until: u64 = alert.raw().notice_until().unpack(); if notice_until < now_ms { return Err(RPCError::invalid_params(format!( diff --git a/rpc/src/module/miner.rs b/rpc/src/module/miner.rs index 122ada8fda..6f0b7b13c7 100644 --- a/rpc/src/module/miner.rs +++ b/rpc/src/module/miner.rs @@ -4,10 +4,10 @@ use ckb_jsonrpc_types::{Block, BlockTemplate, Uint64, Version}; use ckb_logger::{debug, error, info, warn}; use ckb_network::{NetworkController, PeerIndex, SupportProtocols, TargetSession}; use ckb_shared::{shared::Shared, Snapshot}; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{core, packed, prelude::*, H256}; use ckb_verification::HeaderVerifier; use ckb_verification_traits::Verifier; -use faketime::unix_time_as_millis; use jsonrpc_core::{Error, Result}; use jsonrpc_derive::rpc; use std::collections::HashSet; diff --git a/rpc/src/module/net.rs b/rpc/src/module/net.rs index f0b4dcb572..fce806e14c 100644 --- a/rpc/src/module/net.rs +++ b/rpc/src/module/net.rs @@ -5,7 +5,7 @@ use ckb_jsonrpc_types::{ }; use ckb_network::{extract_peer_id, multiaddr::Multiaddr, NetworkController}; use ckb_sync::SyncShared; -use faketime::unix_time_as_millis; +use ckb_systemtime::unix_time_as_millis; use jsonrpc_core::Result; use jsonrpc_derive::rpc; use std::sync::Arc; diff --git a/rpc/src/module/stats.rs b/rpc/src/module/stats.rs index 49cf598066..3a15d89561 100644 --- a/rpc/src/module/stats.rs +++ b/rpc/src/module/stats.rs @@ -121,7 +121,7 @@ impl StatsRpc for StatsRpcImpl { let difficulty = tip_header.difficulty(); let is_initial_block_download = self.shared.is_initial_block_download(); let alerts: Vec = { - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); let mut notifier = self.alert_notifier.lock(); notifier.clear_expired_alerts(now); notifier diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 4a01da9f7b..ed89f2954a 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -26,7 +26,10 @@ ckb-async-runtime = { path = "../util/runtime", version = "= 0.107.0-pre" } ckb-stop-handler = { path = "../util/stop-handler", version = "= 0.107.0-pre" } ckb-channel = { path = "../util/channel", version = "= 0.107.0-pre" } ckb-constant = { path = "../util/constant", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } + +[dev-dependencies] +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"] } [features] portable = ["ckb-db/portable", "ckb-store/portable", "ckb-tx-pool/portable"] diff --git a/shared/src/shared.rs b/shared/src/shared.rs index 0adaf1c6ab..30fdb04c33 100644 --- a/shared/src/shared.rs +++ b/shared/src/shared.rs @@ -12,6 +12,7 @@ use ckb_notify::NotifyController; use ckb_proposal_table::ProposalView; use ckb_stop_handler::{SignalSender, StopHandler}; use ckb_store::{ChainDB, ChainStore}; +use ckb_systemtime::unix_time_as_millis; use ckb_tx_pool::{BlockTemplate, TokioRwLock, TxPoolController}; use ckb_types::{ core::{service, BlockNumber, EpochExt, EpochNumber, HeaderView, Version}, @@ -20,7 +21,6 @@ use ckb_types::{ U256, }; use ckb_verification::cache::TxVerificationCache; -use faketime::unix_time_as_millis; use std::cmp; use std::collections::BTreeMap; use std::sync::atomic::{AtomicBool, Ordering}; diff --git a/sync/Cargo.toml b/sync/Cargo.toml index 3ef177f996..87e3a38225 100644 --- a/sync/Cargo.toml +++ b/sync/Cargo.toml @@ -35,7 +35,7 @@ lru = "0.7.1" futures = "0.3" governor = "0.3.1" tempfile = "3.0" -faketime = "0.2.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } bitflags = "1.0" dashmap = "4.0" keyed_priority_queue = "0.3" @@ -51,6 +51,7 @@ ckb-chain = { path = "../chain", version = "= 0.107.0-pre", features = ["mock"] ckb-launcher = { path = "../util/launcher", version = "= 0.107.0-pre" } faux = "^0.1" once_cell = "1.8.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" , features = ["enable_faketime"]} [features] default = [] diff --git a/sync/src/net_time_checker.rs b/sync/src/net_time_checker.rs index 42dec68945..3d306f4102 100644 --- a/sync/src/net_time_checker.rs +++ b/sync/src/net_time_checker.rs @@ -117,7 +117,7 @@ impl CKBProtocolHandler for NetTimeProtocol { ) { // send local time to inbound peers if let Some(true) = nc.get_peer(peer_index).map(|peer| peer.is_inbound()) { - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); let time = packed::Time::new_builder().timestamp(now.pack()).build(); let _status = send_message_to(nc.as_ref(), peer_index, &time); } @@ -152,7 +152,7 @@ impl CKBProtocolHandler for NetTimeProtocol { } }; - let now: u64 = faketime::unix_time_as_millis(); + let now: u64 = ckb_systemtime::unix_time_as_millis(); let offset: i64 = (i128::from(now) - i128::from(timestamp)) as i64; let mut net_time_checker = self.checker.write(); debug!("new net time offset sample {}ms", offset); diff --git a/sync/src/relayer/compact_block_process.rs b/sync/src/relayer/compact_block_process.rs index 38ec05be5c..242a0d540a 100644 --- a/sync/src/relayer/compact_block_process.rs +++ b/sync/src/relayer/compact_block_process.rs @@ -9,6 +9,7 @@ use ckb_chain_spec::consensus::Consensus; use ckb_logger::{self, debug_target}; use ckb_metrics::metrics; use ckb_network::{CKBProtocolContext, PeerIndex}; +use ckb_systemtime::unix_time_as_millis; use ckb_traits::HeaderProvider; use ckb_types::core::HeaderView; use ckb_types::packed::Byte32; @@ -18,7 +19,6 @@ use ckb_util::shrink_to_fit; use ckb_util::MutexGuard; use ckb_verification::{HeaderError, HeaderVerifier}; use ckb_verification_traits::Verifier; -use faketime::unix_time_as_millis; use std::collections::HashMap; use std::sync::Arc; diff --git a/sync/src/relayer/mod.rs b/sync/src/relayer/mod.rs index c7ece37017..9df39af847 100644 --- a/sync/src/relayer/mod.rs +++ b/sync/src/relayer/mod.rs @@ -32,6 +32,7 @@ use ckb_network::{ async_trait, bytes::Bytes, tokio, CKBProtocolContext, CKBProtocolHandler, PeerIndex, SupportProtocols, TargetSession, }; +use ckb_systemtime::unix_time_as_millis; use ckb_tx_pool::service::TxVerificationResult; use ckb_types::{ core::{self, BlockView}, @@ -39,7 +40,6 @@ use ckb_types::{ prelude::*, }; use ckb_util::Mutex; -use faketime::unix_time_as_millis; use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::time::{Duration, Instant}; diff --git a/sync/src/relayer/tests/block_transactions_process.rs b/sync/src/relayer/tests/block_transactions_process.rs index 1cd260fe21..5f13fac337 100644 --- a/sync/src/relayer/tests/block_transactions_process.rs +++ b/sync/src/relayer/tests/block_transactions_process.rs @@ -63,7 +63,7 @@ fn test_accept_block() { (peer_index, (vec![1], vec![0])), (other_peer_index, (vec![1], vec![])), ]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } @@ -126,7 +126,7 @@ fn test_unknown_request() { ( compact_block, HashMap::from_iter(vec![(foo_peer_index, (vec![1], vec![]))]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } @@ -191,7 +191,7 @@ fn test_invalid_transaction_root() { ( compact_block, HashMap::from_iter(vec![(peer_index, (vec![1], vec![]))]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } @@ -287,7 +287,7 @@ fn test_collision_and_send_missing_indexes() { ( compact_block, vec![(peer_index, (vec![1], vec![]))].into_iter().collect(), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } @@ -401,7 +401,7 @@ fn test_missing() { ( compact_block, HashMap::from_iter(vec![(peer_index, (vec![1], vec![]))]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } diff --git a/sync/src/relayer/tests/compact_block_process.rs b/sync/src/relayer/tests/compact_block_process.rs index 8ce508e368..452cfb4af5 100644 --- a/sync/src/relayer/tests/compact_block_process.rs +++ b/sync/src/relayer/tests/compact_block_process.rs @@ -4,6 +4,7 @@ use crate::relayer::tests::helper::{build_chain, new_header_builder, MockProtoco use crate::{Status, StatusCode}; use ckb_network::{PeerIndex, SupportProtocols}; use ckb_store::ChainStore; +use ckb_systemtime::unix_time_as_millis; use ckb_tx_pool::{PlugTarget, TxEntry}; use ckb_types::prelude::*; use ckb_types::{ @@ -11,7 +12,6 @@ use ckb_types::{ core::{BlockBuilder, Capacity, EpochNumberWithFraction, HeaderBuilder, TransactionBuilder}, packed::{self, CellInput, CellOutputBuilder, CompactBlock, OutPoint, ProposalShortId}, }; -use faketime::unix_time_as_millis; use std::collections::{HashMap, HashSet}; use std::sync::Arc; @@ -351,7 +351,7 @@ fn test_accept_block() { ( mock_compact_block_1, HashMap::from_iter(vec![(1.into(), (vec![1], vec![0]))]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); @@ -360,7 +360,7 @@ fn test_accept_block() { ( mock_compact_block_2, HashMap::from_iter(vec![(1.into(), (vec![1], vec![0]))]), - faketime::unix_time_as_millis(), + ckb_systemtime::unix_time_as_millis(), ), ); } diff --git a/sync/src/relayer/tests/helper.rs b/sync/src/relayer/tests/helper.rs index befa24710b..859e5c7136 100644 --- a/sync/src/relayer/tests/helper.rs +++ b/sync/src/relayer/tests/helper.rs @@ -10,6 +10,7 @@ use ckb_network::{ }; use ckb_shared::Shared; use ckb_store::ChainStore; +use ckb_systemtime::{self, unix_time_as_millis}; use ckb_test_chain_utils::always_success_cell; use ckb_types::prelude::*; use ckb_types::{ @@ -26,7 +27,6 @@ use ckb_types::{ U256, }; use ckb_verification_traits::Switch; -use faketime::{self, unix_time_as_millis}; use std::{cell::RefCell, future::Future, pin::Pin, sync::Arc, time::Duration}; pub(crate) fn new_index_transaction(index: usize) -> IndexTransaction { diff --git a/sync/src/synchronizer/block_fetcher.rs b/sync/src/synchronizer/block_fetcher.rs index 954fd5c0ba..dbca0fe0af 100644 --- a/sync/src/synchronizer/block_fetcher.rs +++ b/sync/src/synchronizer/block_fetcher.rs @@ -6,8 +6,8 @@ use ckb_constant::sync::{ }; use ckb_logger::{debug, trace}; use ckb_network::PeerIndex; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{core, packed}; -use faketime::unix_time_as_millis; use std::cmp::min; pub struct BlockFetcher<'a> { diff --git a/sync/src/synchronizer/mod.rs b/sync/src/synchronizer/mod.rs index 56c8393487..0ba755ed60 100644 --- a/sync/src/synchronizer/mod.rs +++ b/sync/src/synchronizer/mod.rs @@ -30,12 +30,12 @@ use ckb_network::{ async_trait, bytes::Bytes, tokio, CKBProtocolContext, CKBProtocolHandler, PeerIndex, ServiceControl, SupportProtocols, }; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{self, BlockNumber}, packed::{self, Byte32}, prelude::*, }; -use faketime::unix_time_as_millis; use std::{ collections::HashSet, sync::{atomic::Ordering, Arc}, diff --git a/sync/src/tests/inflight_blocks.rs b/sync/src/tests/inflight_blocks.rs index 46ef7c09a7..7d80272e99 100644 --- a/sync/src/tests/inflight_blocks.rs +++ b/sync/src/tests/inflight_blocks.rs @@ -90,8 +90,8 @@ fn inflight_blocks_state() { #[cfg(not(disable_faketime))] #[test] fn inflight_blocks_timeout() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let mut inflight_blocks = InflightBlocks::default(); inflight_blocks.protect_num = 0; @@ -103,7 +103,7 @@ fn inflight_blocks_timeout() { assert!(inflight_blocks.insert(2.into(), (5, h256!("0x5").pack()).into())); assert!(!inflight_blocks.insert(2.into(), (5, h256!("0x5").pack()).into())); - faketime::write_millis(&faketime_file, BLOCK_DOWNLOAD_TIMEOUT + 1).expect("write millis"); + _faketime_guard.set_faketime(BLOCK_DOWNLOAD_TIMEOUT + 1); assert!(!inflight_blocks.insert(3.into(), (3, h256!("0x3").pack()).into())); assert!(!inflight_blocks.insert(3.into(), (2, h256!("0x2").pack()).into())); @@ -143,8 +143,8 @@ fn inflight_blocks_timeout() { #[cfg(not(disable_faketime))] #[test] fn inflight_trace_number_state() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let mut inflight_blocks = InflightBlocks::default(); inflight_blocks.protect_num = 0; @@ -180,7 +180,7 @@ fn inflight_trace_number_state() { ]) ); - faketime::write_millis(&faketime_file, 2000).expect("write millis"); + _faketime_guard.set_faketime(2000); let list = inflight_blocks.prune(2); assert!(list.is_empty()); diff --git a/sync/src/tests/orphan_block_pool.rs b/sync/src/tests/orphan_block_pool.rs index dc45960534..4d3d14e524 100644 --- a/sync/src/tests/orphan_block_pool.rs +++ b/sync/src/tests/orphan_block_pool.rs @@ -1,7 +1,7 @@ use ckb_chain_spec::consensus::ConsensusBuilder; +use ckb_systemtime::unix_time_as_millis; use ckb_types::core::{BlockBuilder, BlockView, EpochNumberWithFraction, HeaderView}; use ckb_types::prelude::*; -use faketime::unix_time_as_millis; use std::collections::HashSet; use std::sync::Arc; use std::thread; diff --git a/sync/src/tests/synchronizer/basic_sync.rs b/sync/src/tests/synchronizer/basic_sync.rs index af46f083dc..317e0437f4 100644 --- a/sync/src/tests/synchronizer/basic_sync.rs +++ b/sync/src/tests/synchronizer/basic_sync.rs @@ -14,6 +14,7 @@ use ckb_network::SupportProtocols; use ckb_reward_calculator::RewardCalculator; use ckb_shared::Shared; use ckb_store::ChainStore; +use ckb_systemtime::{self, unix_time_as_millis}; use ckb_test_chain_utils::always_success_cell; use ckb_types::prelude::*; use ckb_types::{ @@ -25,7 +26,6 @@ use ckb_types::{ }; use ckb_util::RwLock; use ckb_verification_traits::Switch; -use faketime::{self, unix_time_as_millis}; use std::collections::HashSet; use std::sync::Arc; @@ -33,9 +33,9 @@ const DEFAULT_CHANNEL: usize = 128; #[test] fn basic_sync() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); - let thread_name = format!("FAKETIME={}", faketime_file.display()); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); + let thread_name = "fake_time=0".to_string(); let (mut node1, shared1) = setup_node(1); let (mut node2, shared2) = setup_node(3); diff --git a/sync/src/tests/synchronizer/functions.rs b/sync/src/tests/synchronizer/functions.rs index 10771fbbc3..1fe4398e67 100644 --- a/sync/src/tests/synchronizer/functions.rs +++ b/sync/src/tests/synchronizer/functions.rs @@ -11,6 +11,7 @@ use ckb_network::{ use ckb_reward_calculator::RewardCalculator; use ckb_shared::{Shared, Snapshot}; use ckb_store::ChainStore; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{ cell::resolve_transaction, BlockBuilder, BlockNumber, BlockView, EpochExt, HeaderBuilder, @@ -25,7 +26,6 @@ use ckb_types::{ }; use ckb_util::Mutex; use ckb_verification_traits::Switch; -use faketime::unix_time_as_millis; use futures::future::Future; use std::{ collections::{HashMap, HashSet}, @@ -694,13 +694,14 @@ fn test_sync_process() { #[cfg(not(disable_faketime))] #[test] fn test_header_sync_timeout() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let (_, _, synchronizer) = start_chain(None); let network_context = mock_network_context(5); - faketime::write_millis(&faketime_file, MAX_TIP_AGE * 2).expect("write millis"); + + _faketime_guard.set_faketime(MAX_TIP_AGE * 2); assert!(synchronizer .shared .active_chain() @@ -745,8 +746,8 @@ fn test_header_sync_timeout() { #[cfg(not(disable_faketime))] #[test] fn test_chain_sync_timeout() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let consensus = Consensus::default(); let block = BlockBuilder::default() @@ -897,7 +898,7 @@ fn test_chain_sync_timeout() { ); } } - faketime::write_millis(&faketime_file, CHAIN_SYNC_TIMEOUT + 1).expect("write millis"); + _faketime_guard.set_faketime(CHAIN_SYNC_TIMEOUT + 1); synchronizer.eviction(&network_context); { // No evidence yet that our peer has synced to a chain with work equal to that @@ -913,11 +914,7 @@ fn test_chain_sync_timeout() { unix_time_as_millis() + EVICTION_HEADERS_RESPONSE_TIME ); } - faketime::write_millis( - &faketime_file, - unix_time_as_millis() + EVICTION_HEADERS_RESPONSE_TIME + 1, - ) - .expect("write millis"); + _faketime_guard.set_faketime(unix_time_as_millis() + EVICTION_HEADERS_RESPONSE_TIME + 1); synchronizer.eviction(&network_context); { // Protected peer 0 chain_sync timeout @@ -947,8 +944,8 @@ fn test_chain_sync_timeout() { #[cfg(not(disable_faketime))] #[test] fn test_n_sync_started() { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let consensus = Consensus::default(); let block = BlockBuilder::default() @@ -992,7 +989,7 @@ fn test_n_sync_started() { synchronizer.eviction(&network_context); assert!({ network_context.disconnected.lock().is_empty() }); - faketime::write_millis(&faketime_file, CHAIN_SYNC_TIMEOUT + 1).expect("write millis"); + _faketime_guard.set_faketime(CHAIN_SYNC_TIMEOUT + 1); synchronizer.eviction(&network_context); { assert!({ network_context.disconnected.lock().is_empty() }); @@ -1007,11 +1004,8 @@ fn test_n_sync_started() { ); } - faketime::write_millis( - &faketime_file, - unix_time_as_millis() + EVICTION_HEADERS_RESPONSE_TIME + 1, - ) - .expect("write millis"); + _faketime_guard.set_faketime(unix_time_as_millis() + EVICTION_HEADERS_RESPONSE_TIME + 1); + synchronizer.eviction(&network_context); { // Protected peer 0 chain_sync timeout diff --git a/sync/src/types/mod.rs b/sync/src/types/mod.rs index 870e4da790..4a37e088d3 100644 --- a/sync/src/types/mod.rs +++ b/sync/src/types/mod.rs @@ -19,6 +19,7 @@ use ckb_metrics::metrics; use ckb_network::{CKBProtocolContext, PeerIndex, SupportProtocols}; use ckb_shared::{shared::Shared, Snapshot}; use ckb_store::{ChainDB, ChainStore}; +use ckb_systemtime::unix_time_as_millis; use ckb_traits::HeaderProvider; use ckb_tx_pool::service::TxVerificationResult; use ckb_types::{ @@ -30,7 +31,6 @@ use ckb_types::{ use ckb_util::{shrink_to_fit, Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuard}; use ckb_verification_traits::Switch; use dashmap::{self, DashMap}; -use faketime::unix_time_as_millis; use keyed_priority_queue::{self, KeyedPriorityQueue}; use lru::LruCache; use std::collections::{btree_map::Entry, BTreeMap, HashMap, HashSet}; @@ -623,7 +623,7 @@ impl InflightBlocks { } pub fn mark_slow_block(&mut self, tip: BlockNumber) { - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); for key in self.inflight_states.keys() { if key.number > tip + 1 { break; diff --git a/test/Cargo.toml b/test/Cargo.toml index c08843ae8a..4ccdcff74f 100644 --- a/test/Cargo.toml +++ b/test/Cargo.toml @@ -32,7 +32,7 @@ ckb-constant = { path = "../util/constant", version = "= 0.107.0-pre" } tempfile = "3.0" reqwest = { version = "0.11.4", features = ["blocking", "json"] } rand = "0.7" -faketime = "0.2" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } serde_json = "1.0" lazy_static = "1.4.0" byteorder = "1.3.1" diff --git a/test/src/specs/alert/alert_propagation.rs b/test/src/specs/alert/alert_propagation.rs index 008e7f34f0..d5e8164753 100644 --- a/test/src/specs/alert/alert_propagation.rs +++ b/test/src/specs/alert/alert_propagation.rs @@ -38,7 +38,7 @@ impl Spec for AlertPropagation { connect_all(nodes); let node0 = &nodes[0]; - let notice_until = faketime::unix_time_as_millis() + 100_000; + let notice_until = ckb_systemtime::unix_time_as_millis() + 100_000; // create and relay alert let id1: u32 = 42; diff --git a/tx-pool/Cargo.toml b/tx-pool/Cargo.toml index af72d261e5..2a2c7a526a 100644 --- a/tx-pool/Cargo.toml +++ b/tx-pool/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/nervosnetwork/ckb" ckb-types = { path = "../util/types", version = "= 0.107.0-pre" } ckb-logger = {path = "../util/logger", version = "= 0.107.0-pre"} ckb-verification = { path = "../verification", version = "= 0.107.0-pre" } -faketime = "0.2" +ckb-systemtime = {path = "../util/systemtime", version = "= 0.107.0-pre"} lru = "0.7.1" ckb-dao = { path = "../util/dao", version = "= 0.107.0-pre" } ckb-reward-calculator = { path = "../util/reward-calculator", version = "= 0.107.0-pre" } @@ -40,6 +40,7 @@ hyper = { version = "0.14", features = ["http1", "client", "tcp"] } [dev-dependencies] tempfile = "3.0" ckb-hash = { path = "../util/hash", version = "= 0.107.0-pre" } +ckb-systemtime = {path = "../util/systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"]} [features] default = [] diff --git a/tx-pool/src/block_assembler/mod.rs b/tx-pool/src/block_assembler/mod.rs index 74cf271eee..2ffaa6a15c 100644 --- a/tx-pool/src/block_assembler/mod.rs +++ b/tx-pool/src/block_assembler/mod.rs @@ -20,6 +20,7 @@ use ckb_logger::{debug, error, trace}; use ckb_reward_calculator::RewardCalculator; use ckb_snapshot::Snapshot; use ckb_store::ChainStore; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{ cell::{OverlayCellChecker, TransactionsChecker}, @@ -32,7 +33,6 @@ use ckb_types::{ }, prelude::*, }; -use faketime::unix_time_as_millis; use hyper::{client::HttpConnector, Body, Client, Method, Request}; use std::collections::HashSet; use std::sync::{ diff --git a/tx-pool/src/component/entry.rs b/tx-pool/src/component/entry.rs index 418bb7743f..36e18e7a62 100644 --- a/tx-pool/src/component/entry.rs +++ b/tx-pool/src/component/entry.rs @@ -1,4 +1,5 @@ use crate::component::container::AncestorsScoreSortKey; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{ cell::ResolvedTransaction, @@ -7,7 +8,6 @@ use ckb_types::{ }, packed::{OutPoint, ProposalShortId}, }; -use faketime::unix_time_as_millis; use std::cmp::Ordering; use std::hash::{Hash, Hasher}; diff --git a/tx-pool/src/component/orphan.rs b/tx-pool/src/component/orphan.rs index 0ce969fbee..f0551a1486 100644 --- a/tx-pool/src/component/orphan.rs +++ b/tx-pool/src/component/orphan.rs @@ -29,7 +29,7 @@ impl Entry { tx, peer, cycle, - expires_at: faketime::unix_time().as_secs() + ORPHAN_TX_EXPIRE_TIME, + expires_at: ckb_systemtime::unix_time().as_secs() + ORPHAN_TX_EXPIRE_TIME, } } } @@ -84,7 +84,7 @@ impl OrphanPool { } pub fn limit_size(&mut self) -> usize { - let now = faketime::unix_time().as_secs(); + let now = ckb_systemtime::unix_time().as_secs(); let expires: Vec<_> = self .entries .iter() diff --git a/tx-pool/src/pool.rs b/tx-pool/src/pool.rs index c0aabb3ee6..391f1f513a 100644 --- a/tx-pool/src/pool.rs +++ b/tx-pool/src/pool.rs @@ -297,7 +297,7 @@ impl TxPool { } pub(crate) fn remove_expired(&mut self, callbacks: &Callbacks) { - let now_ms = faketime::unix_time_as_millis(); + let now_ms = ckb_systemtime::unix_time_as_millis(); let removed = self .pending .remove_entries_by_filter(|_id, tx_entry| now_ms > self.expiry + tx_entry.timestamp); diff --git a/util/app-config/Cargo.toml b/util/app-config/Cargo.toml index 2bf09350fd..5ecc9efd64 100644 --- a/util/app-config/Cargo.toml +++ b/util/app-config/Cargo.toml @@ -28,7 +28,7 @@ secio = { version="0.5.7", package="tentacle-secio" } multiaddr = { version="0.3.0", package="tentacle-multiaddr" } rand = "0.7" sentry = { version = "0.26.0", optional = true } -faketime = "0.2.0" +ckb-systemtime = { path = "../systemtime", version = "= 0.107.0-pre" } url = { version = "2.2.2", features = ["serde"] } ubyte = { version = "0.10", features = ["serde"] } @@ -37,3 +37,4 @@ with_sentry = ["sentry"] [dev-dependencies] tempfile = "3.0" +ckb-systemtime = { path = "../systemtime", version = "= 0.107.0-pre" ,features = ["enable_faketime"]} diff --git a/util/app-config/src/args.rs b/util/app-config/src/args.rs index 378aef99d7..d7dcf2acdb 100644 --- a/util/app-config/src/args.rs +++ b/util/app-config/src/args.rs @@ -2,8 +2,8 @@ use crate::{CKBAppConfig, MemoryTrackerConfig, MinerConfig}; use ckb_chain_spec::consensus::Consensus; use ckb_jsonrpc_types::ScriptHashType; use ckb_pow::PowEngine; +use ckb_systemtime::unix_time_as_millis; use ckb_types::packed::Byte32; -use faketime::unix_time_as_millis; use std::path::PathBuf; use std::sync::Arc; diff --git a/util/launcher/Cargo.toml b/util/launcher/Cargo.toml index 0003ed04f7..864012e71d 100644 --- a/util/launcher/Cargo.toml +++ b/util/launcher/Cargo.toml @@ -47,7 +47,7 @@ once_cell = "1.8.0" tempfile = "3.0" [dev-dependencies] -faketime = "0.2.0" +ckb-systemtime = {path = "../systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"] } [features] with_sentry = [ "ckb-sync/with_sentry", "ckb-network/with_sentry", "ckb-app-config/with_sentry" ] diff --git a/util/launcher/src/tests.rs b/util/launcher/src/tests.rs index d0c1ad7d1b..ba68c542d6 100644 --- a/util/launcher/src/tests.rs +++ b/util/launcher/src/tests.rs @@ -7,13 +7,13 @@ use ckb_db_schema::{ COLUMN_BLOCK_PROPOSAL_IDS, COLUMN_BLOCK_UNCLE, COLUMN_EPOCH, COLUMN_INDEX, COLUMN_META, META_CURRENT_EPOCH_KEY, META_TIP_HEADER_KEY, }; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ core::{capacity_bytes, BlockBuilder, BlockExt, Capacity, TransactionBuilder}, packed::{self, Bytes}, prelude::*, utilities::DIFF_TWO, }; -use faketime::unix_time_as_millis; #[test] fn test_mock_migration() { diff --git a/util/light-client-protocol-server/Cargo.toml b/util/light-client-protocol-server/Cargo.toml index 193486401e..45d4846f73 100644 --- a/util/light-client-protocol-server/Cargo.toml +++ b/util/light-client-protocol-server/Cargo.toml @@ -16,6 +16,7 @@ ckb-logger = { path = "../logger", version = "= 0.107.0-pre" } ckb-types = { path = "../types", version = "= 0.107.0-pre" } ckb-store = { path = "../../store", version = "= 0.107.0-pre" } ckb-merkle-mountain-range = "0.5.2" +ckb-systemtime = {path = "../systemtime", version = "= 0.107.0-pre"} [dev-dependencies] ckb-chain = { path = "../../chain", version = "= 0.107.0-pre" } @@ -27,5 +28,5 @@ ckb-jsonrpc-types = { path = "../jsonrpc-types", version = "= 0.107.0-pre" } ckb-dao-utils = { path = "../dao/utils", version = "= 0.107.0-pre" } ckb-test-chain-utils = { path = "../test-chain-utils", version = "= 0.107.0-pre" } tempfile = "3.0" -faketime = "0.2" +ckb-systemtime = {path = "../systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"]} tokio = "1.20" diff --git a/util/light-client-protocol-server/src/tests/utils/chain.rs b/util/light-client-protocol-server/src/tests/utils/chain.rs index 7a87b1587a..9b1062bec7 100644 --- a/util/light-client-protocol-server/src/tests/utils/chain.rs +++ b/util/light-client-protocol-server/src/tests/utils/chain.rs @@ -12,6 +12,7 @@ use ckb_launcher::SharedBuilder; use ckb_network::{DefaultExitHandler, Flags, NetworkController, NetworkService, NetworkState}; use ckb_shared::Shared; use ckb_sync::SyncShared; +use ckb_systemtime::unix_time_as_millis; use ckb_test_chain_utils::always_success_cell; use ckb_tx_pool::TxPoolController; use ckb_types::{ @@ -20,7 +21,6 @@ use ckb_types::{ prelude::*, utilities::DIFF_TWO, }; -use faketime::unix_time_as_millis; use crate::{tests::prelude::*, LightClientProtocol}; diff --git a/util/network-alert/Cargo.toml b/util/network-alert/Cargo.toml index 8a08d490c7..6d850b54d8 100644 --- a/util/network-alert/Cargo.toml +++ b/util/network-alert/Cargo.toml @@ -18,7 +18,7 @@ ckb-jsonrpc-types = { path = "../jsonrpc-types", version = "= 0.107.0-pre" } ckb-logger = { path = "../logger", version = "= 0.107.0-pre"} ckb-app-config = { path = "../app-config", version = "= 0.107.0-pre" } ckb-error = { path = "../../error", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../systemtime", version = "= 0.107.0-pre" } lru = "0.7.1" semver = "1.0" @@ -27,3 +27,4 @@ ckb-crypto = { path = "../crypto", version = "= 0.107.0-pre" } ckb-async-runtime = { path = "../runtime", version = "= 0.107.0-pre" } ckb-stop-handler = { path = "../stop-handler", version = "= 0.107.0-pre" } once_cell = "1.8.0" +ckb-systemtime = {path = "../systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"]} diff --git a/util/network-alert/src/alert_relayer.rs b/util/network-alert/src/alert_relayer.rs index a55ec1ae6f..c8220ccddb 100644 --- a/util/network-alert/src/alert_relayer.rs +++ b/util/network-alert/src/alert_relayer.rs @@ -56,7 +56,7 @@ impl AlertRelayer { } fn clear_expired_alerts(&mut self) { - let now = faketime::unix_time_as_millis(); + let now = ckb_systemtime::unix_time_as_millis(); self.notifier.lock().clear_expired_alerts(now); } diff --git a/util/systemtime/Cargo.toml b/util/systemtime/Cargo.toml new file mode 100644 index 0000000000..f14d56e8d4 --- /dev/null +++ b/util/systemtime/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "ckb-systemtime" +version = "0.107.0-pre" +license = "MIT" +authors = ["Nervos "] +edition = "2021" +description = "CKB faketime." +homepage = "https://github.com/nervosnetwork/ckb" +repository = "https://github.com/nervosnetwork/ckb" + +[dependencies] + +[dev-dependencies] + +[features] +default = [] +enable_faketime = [] diff --git a/util/systemtime/src/lib.rs b/util/systemtime/src/lib.rs new file mode 100644 index 0000000000..3f845bb11b --- /dev/null +++ b/util/systemtime/src/lib.rs @@ -0,0 +1,77 @@ +//! ckb_systemtime provide real system timestamp, and faketime when `enable_faketime` feature is enabled. +mod test_faketime; +mod test_realtime; + +#[cfg(feature = "enable_faketime")] +use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; +use std::time::Duration; + +// Store faketime timestamp here +#[cfg(feature = "enable_faketime")] +static FAKETIME: AtomicU64 = AtomicU64::new(0); + +// Indicate whether faketime is enabled +#[cfg(feature = "enable_faketime")] +static FAKETIME_ENABLED: AtomicBool = AtomicBool::new(false); + +// Get real system's timestamp in millis +fn system_time_as_millis() -> u64 { + let duration = std::time::SystemTime::now() + .duration_since(std::time::SystemTime::UNIX_EPOCH) + .expect("SystemTime before UNIX EPOCH!"); + duration.as_secs() * 1000 + u64::from(duration.subsec_millis()) +} + +/// Get system's timestamp in millis +#[cfg(not(feature = "enable_faketime"))] +pub fn unix_time_as_millis() -> u64 { + system_time_as_millis() +} + +/// Return FaketimeGuard to set/disable faketime +#[cfg(feature = "enable_faketime")] +pub fn faketime() -> FaketimeGuard { + FaketimeGuard {} +} + +/// Get fake timestamp in millis, only available when `enable_faketime` feature is enabled +#[cfg(feature = "enable_faketime")] +pub fn unix_time_as_millis() -> u64 { + if FAKETIME_ENABLED.load(Ordering::SeqCst) { + return FAKETIME.load(Ordering::SeqCst); + } + system_time_as_millis() +} + +/// Get system's unix_time +pub fn unix_time() -> Duration { + Duration::from_millis(unix_time_as_millis()) +} + +/// FaketimeGuard is used to set/disable faketime, +/// and will disable faketime when dropped +#[cfg(feature = "enable_faketime")] +pub struct FaketimeGuard {} + +#[cfg(feature = "enable_faketime")] +impl FaketimeGuard { + /// Set faketime + #[cfg(feature = "enable_faketime")] + pub fn set_faketime(&self, time: u64) { + FAKETIME.store(time, Ordering::Relaxed); + FAKETIME_ENABLED.store(true, Ordering::SeqCst); + } + + /// Disable faketime + #[cfg(feature = "enable_faketime")] + pub fn disable_faketime(&self) { + FAKETIME_ENABLED.store(false, Ordering::Relaxed); + } +} + +#[cfg(feature = "enable_faketime")] +impl Drop for FaketimeGuard { + fn drop(&mut self) { + self.disable_faketime() + } +} diff --git a/util/systemtime/src/test_faketime.rs b/util/systemtime/src/test_faketime.rs new file mode 100644 index 0000000000..bba3a57421 --- /dev/null +++ b/util/systemtime/src/test_faketime.rs @@ -0,0 +1,50 @@ +#[cfg(feature = "enable_faketime")] +#[cfg(test)] +mod tests_faketime { + use crate::{faketime, system_time_as_millis, unix_time_as_millis}; + + #[test] + fn test_basic() { + assert!(cfg!(feature = "enable_faketime")); + + let faketime_guard = faketime(); + + faketime_guard.set_faketime(123); + assert!(unix_time_as_millis() == 123); + + faketime_guard.set_faketime(100); + assert!(unix_time_as_millis() == 100); + + faketime_guard.disable_faketime(); + + let now = system_time_as_millis(); + assert!(unix_time_as_millis() >= now); + + // The faketime_guard was dropped at the end of the scope, + // then FAKETIME_ENABLED will be set to false + } + + #[test] + fn test_get_system_real_timestamp() { + let now = system_time_as_millis(); + assert!(unix_time_as_millis() >= now); + } + + #[test] + fn test_faketime_will_disabled_when_faketime_guard_is_dropped() { + let now = system_time_as_millis(); + { + let faketime_guard = faketime(); + + faketime_guard.set_faketime(1); + assert_eq!(unix_time_as_millis(), 1); + } + assert!(unix_time_as_millis() >= now); + { + let faketime_guard = faketime(); + + faketime_guard.set_faketime(2); + assert_eq!(unix_time_as_millis(), 2); + } + } +} diff --git a/util/systemtime/src/test_realtime.rs b/util/systemtime/src/test_realtime.rs new file mode 100644 index 0000000000..07c70e1664 --- /dev/null +++ b/util/systemtime/src/test_realtime.rs @@ -0,0 +1,13 @@ +#[cfg(not(feature = "enable_faketime"))] +#[cfg(test)] +mod tests_realtime { + use crate::{system_time_as_millis, unix_time_as_millis}; + + #[test] + fn test_get_system_real_timestamp() { + assert!(cfg!(not(feature = "enable_faketime"))); + + let now = system_time_as_millis(); + assert!(unix_time_as_millis() >= now); + } +} diff --git a/util/test-chain-utils/Cargo.toml b/util/test-chain-utils/Cargo.toml index c3218213fe..101c2428c1 100644 --- a/util/test-chain-utils/Cargo.toml +++ b/util/test-chain-utils/Cargo.toml @@ -16,8 +16,11 @@ ckb-chain-spec = { path = "../../spec", version = "= 0.107.0-pre" } ckb-dao-utils = { path = "../dao/utils", version = "= 0.107.0-pre" } ckb-traits = { path = "../../traits", version = "= 0.107.0-pre" } lazy_static = "1.3.0" -faketime = "0.2.0" +ckb-systemtime = { path = "../systemtime", version = "= 0.107.0-pre" } ckb-resource = { path = "../../resource", version = "= 0.107.0-pre" } ckb-db-schema = { path = "../../db-schema", version = "= 0.107.0-pre" } ckb-util = { path = "..", version = "= 0.107.0-pre" } tempfile = "3.0" + +[dev-dependencies] +ckb-systemtime = { path = "../systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"] } diff --git a/util/test-chain-utils/src/chain.rs b/util/test-chain-utils/src/chain.rs index fe60488997..6712da9c5c 100644 --- a/util/test-chain-utils/src/chain.rs +++ b/util/test-chain-utils/src/chain.rs @@ -5,6 +5,7 @@ use ckb_chain_spec::{ }; use ckb_dao_utils::genesis_dao_data; use ckb_resource::Resource; +use ckb_systemtime::unix_time_as_millis; use ckb_types::{ bytes::Bytes, core::{ @@ -16,7 +17,6 @@ use ckb_types::{ utilities::difficulty_to_compact, H256, U256, }; -use faketime::unix_time_as_millis; use lazy_static::lazy_static; use std::fs::File; use std::io::Read; diff --git a/util/test-chain-utils/src/mock_store.rs b/util/test-chain-utils/src/mock_store.rs index 9f5c376806..1686f7b453 100644 --- a/util/test-chain-utils/src/mock_store.rs +++ b/util/test-chain-utils/src/mock_store.rs @@ -1,6 +1,7 @@ use ckb_db::RocksDB; use ckb_db_schema::COLUMNS; use ckb_store::{ChainDB, ChainStore}; +use ckb_systemtime::unix_time_as_millis; use ckb_types::core::error::OutPointError; use ckb_types::{ core::{ @@ -10,7 +11,6 @@ use ckb_types::{ packed::{Byte32, OutPoint}, prelude::*, }; -use faketime::unix_time_as_millis; use std::sync::Arc; use tempfile::TempDir; diff --git a/verification/Cargo.toml b/verification/Cargo.toml index d0fdf2bcc1..33e2d6ae5e 100644 --- a/verification/Cargo.toml +++ b/verification/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/nervosnetwork/ckb" ckb-types = { path = "../util/types", version = "= 0.107.0-pre" } ckb-script = { path = "../script", version = "= 0.107.0-pre" } ckb-pow = { path = "../pow", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../util/systemtime", version = "= 0.107.0-pre" } lru = "0.7.1" ckb-traits = { path = "../traits", version = "= 0.107.0-pre" } ckb-chain-spec = { path = "../spec", version = "= 0.107.0-pre" } @@ -25,3 +25,4 @@ ckb-verification-traits = { path = "./traits", version = "= 0.107.0-pre" } [dev-dependencies] ckb-test-chain-utils = { path = "../util/test-chain-utils", version = "= 0.107.0-pre" } ckb-resource = { path = "../resource", version = "= 0.107.0-pre" } +ckb-systemtime = {path = "../util/systemtime", version = "= 0.107.0-pre", features=["enable_faketime"]} diff --git a/verification/contextual/Cargo.toml b/verification/contextual/Cargo.toml index 60b5595502..7cfc6bc2a1 100644 --- a/verification/contextual/Cargo.toml +++ b/verification/contextual/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/nervosnetwork/ckb" [dependencies] ckb-types = { path = "../../util/types", version = "= 0.107.0-pre" } ckb-store = { path = "../../store", version = "= 0.107.0-pre" } -faketime = "0.2.0" +ckb-systemtime = { path = "../../util/systemtime", version = "= 0.107.0-pre" } rayon = "1.0" ckb-traits = { path = "../../traits", version = "= 0.107.0-pre" } ckb-chain-spec = { path = "../../spec", version = "= 0.107.0-pre" } @@ -31,4 +31,5 @@ ckb-chain = { path = "../../chain", version = "= 0.107.0-pre" } ckb-shared = { path = "../../shared", version = "= 0.107.0-pre" } ckb-launcher = { path = "../../util/launcher", version = "= 0.107.0-pre" } ckb-test-chain-utils = { path = "../../util/test-chain-utils", version = "= 0.107.0-pre" } +ckb-systemtime = { path = "../../util/systemtime", version = "= 0.107.0-pre", features = ["enable_faketime"]} rand = "0.7" diff --git a/verification/contextual/src/tests/uncle_verifier.rs b/verification/contextual/src/tests/uncle_verifier.rs index 5ffaf5fd0b..82e3506c68 100644 --- a/verification/contextual/src/tests/uncle_verifier.rs +++ b/verification/contextual/src/tests/uncle_verifier.rs @@ -59,8 +59,8 @@ fn create_cellbase(number: BlockNumber) -> TransactionView { } fn prepare() -> (Shared, Vec, Vec) { - let faketime_file = faketime::millis_tempfile(0).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(0); let mut consensus = Consensus::default(); consensus.max_block_proposals_limit = 3; @@ -72,7 +72,7 @@ fn prepare() -> (Shared, Vec, Vec) { let mut chain1: Vec = Vec::new(); let mut chain2: Vec = Vec::new(); - faketime::write_millis(&faketime_file, 10).expect("write millis"); + _faketime_guard.set_faketime(10); let genesis = shared .store() diff --git a/verification/src/header_verifier.rs b/verification/src/header_verifier.rs index d997829fdd..6c9857826e 100644 --- a/verification/src/header_verifier.rs +++ b/verification/src/header_verifier.rs @@ -5,10 +5,10 @@ use crate::{ use ckb_chain_spec::consensus::Consensus; use ckb_error::Error; use ckb_pow::PowEngine; +use ckb_systemtime::unix_time_as_millis; use ckb_traits::HeaderProvider; use ckb_types::core::{HeaderView, Version}; use ckb_verification_traits::Verifier; -use faketime::unix_time_as_millis; /// Context-dependent verification checks for block header /// diff --git a/verification/src/tests/header_verifier.rs b/verification/src/tests/header_verifier.rs index 7098991d15..48387b88ca 100644 --- a/verification/src/tests/header_verifier.rs +++ b/verification/src/tests/header_verifier.rs @@ -6,6 +6,7 @@ use crate::{ }; use ckb_error::assert_error_eq; use ckb_pow::PowEngine; +use ckb_systemtime::unix_time_as_millis; use ckb_test_chain_utils::{MockMedianTime, MOCK_MEDIAN_TIME_COUNT}; use ckb_types::{ constants::BLOCK_VERSION, @@ -13,7 +14,6 @@ use ckb_types::{ packed::Header, prelude::*, }; -use faketime::unix_time_as_millis; use super::BuilderBaseOnBlockNumber; @@ -42,8 +42,8 @@ pub fn test_version() { #[cfg(not(disable_faketime))] #[test] fn test_timestamp() { - let faketime_file = faketime::millis_tempfile(100_000).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(100_000); let fake_block_median_time_context = mock_median_time_context(); let parent_hash = fake_block_median_time_context.get_block_hash(99); let timestamp = unix_time_as_millis() + 1; @@ -63,8 +63,8 @@ fn test_timestamp() { #[cfg(not(disable_faketime))] #[test] fn test_timestamp_too_old() { - let faketime_file = faketime::millis_tempfile(100_000).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(100_000); let fake_block_median_time_context = mock_median_time_context(); let parent_hash = fake_block_median_time_context.get_block_hash(99); @@ -92,8 +92,8 @@ fn test_timestamp_too_old() { #[cfg(not(disable_faketime))] #[test] fn test_timestamp_too_new() { - let faketime_file = faketime::millis_tempfile(100_000).expect("create faketime file"); - faketime::enable(&faketime_file); + let _faketime_guard = ckb_systemtime::faketime(); + _faketime_guard.set_faketime(100_000); let fake_block_median_time_context = mock_median_time_context(); let parent_hash = fake_block_median_time_context.get_block_hash(99);