diff --git a/Cargo.toml b/Cargo.toml index 712358070..e860f4aad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,17 +62,20 @@ rpc = ["bitcoincore-rpc"] # Debug/Test features +testutils = [] test-blockchains = ["bitcoincore-rpc", "electrum-client"] test-electrum = ["electrum", "electrsd/electrs_0_8_10", "test-blockchains"] test-rpc = ["rpc", "electrsd/electrs_0_8_10", "test-blockchains"] test-esplora = ["esplora", "electrsd/legacy", "electrsd/esplora_a33e97e1", "test-blockchains"] test-md-docs = ["electrum"] +test-wallet = [] [dev-dependencies] lazy_static = "1.4" env_logger = "0.7" clap = "2.33" electrsd = { version= "0.8", features = ["trigger", "bitcoind_0_21_1"] } +bdk = { path = ".", default-features = false, features = ["testutils", "test-wallet"] } [[example]] name = "address_validator" diff --git a/src/lib.rs b/src/lib.rs index 09779fd13..fdd6dee6a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -262,9 +262,7 @@ pub fn version() -> &'static str { env!("CARGO_PKG_VERSION", "unknown") } -// We should consider putting this under a feature flag but we need the macro in doctets so we need -// to wait until https://github.com/rust-lang/rust/issues/67295 is fixed. -// +#[cfg(feature = "testutils")] // Stuff in here is too rough to document atm #[doc(hidden)] pub mod testutils; diff --git a/src/psbt/mod.rs b/src/psbt/mod.rs index bfb7402f6..9ca5e2db7 100644 --- a/src/psbt/mod.rs +++ b/src/psbt/mod.rs @@ -43,8 +43,8 @@ impl PsbtUtils for Psbt { mod test { use crate::bitcoin::TxIn; use crate::psbt::Psbt; - use crate::wallet::test::{get_funded_wallet, get_test_wpkh}; use crate::wallet::AddressIndex; + use crate::wallet::{get_funded_wallet, test::get_test_wpkh}; use crate::SignOptions; use std::str::FromStr; diff --git a/src/wallet/address_validator.rs b/src/wallet/address_validator.rs index 36e39be19..ba6753373 100644 --- a/src/wallet/address_validator.rs +++ b/src/wallet/address_validator.rs @@ -115,8 +115,8 @@ mod test { use std::sync::Arc; use super::*; - use crate::wallet::test::{get_funded_wallet, get_test_wpkh}; use crate::wallet::AddressIndex::New; + use crate::wallet::{get_funded_wallet, test::get_test_wpkh}; #[derive(Debug)] struct TestValidator; diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index f507d0e20..442a0986c 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -167,6 +167,11 @@ where secp, }) } + + /// Get the Bitcoin network the wallet is using. + pub fn network(&self) -> Network { + self.network + } } /// The address index selection strategy to use to derived an address from the wallet's external @@ -1534,11 +1539,6 @@ where &self.client } - /// Get the Bitcoin network the wallet is using. - pub fn network(&self) -> Network { - self.network - } - /// Broadcast a transaction to the network #[maybe_async] pub fn broadcast(&self, tx: Transaction) -> Result { @@ -1548,21 +1548,73 @@ where } } -#[cfg(test)] -pub(crate) mod test { +#[cfg(feature = "test-wallet")] +use crate::database::memory::MemoryDatabase; + +#[cfg(feature = "test-wallet")] +#[doc(hidden)] +/// Return a fake wallet that appears to be funded for testing. +pub fn get_funded_wallet( + descriptor: &str, +) -> ( + Wallet<(), MemoryDatabase>, + (String, Option), + bitcoin::Txid, +) { + use crate::testutils; use std::str::FromStr; + let descriptors = testutils!(@descriptors (descriptor)); + let wallet = Wallet::new_offline( + &descriptors.0, + None, + Network::Regtest, + MemoryDatabase::new(), + ) + .unwrap(); + + let funding_address_kix = 0; + + let tx_meta = testutils! { + @tx ( (@external descriptors, funding_address_kix) => 50_000 ) (@confirmations 1) + }; + + wallet + .database + .borrow_mut() + .set_script_pubkey( + &bitcoin::Address::from_str(&tx_meta.output.get(0).unwrap().to_address) + .unwrap() + .script_pubkey(), + KeychainKind::External, + funding_address_kix, + ) + .unwrap(); + wallet + .database + .borrow_mut() + .set_last_index(KeychainKind::External, funding_address_kix) + .unwrap(); + + let txid = crate::populate_test_db!(wallet.database.borrow_mut(), tx_meta, Some(100)); + + (wallet, descriptors, txid) +} + +#[cfg(test)] +pub(crate) mod test { use bitcoin::{util::psbt, Network}; - use crate::database::memory::MemoryDatabase; use crate::database::Database; use crate::types::KeychainKind; use super::*; use crate::signer::{SignOptions, SignerError}; - use crate::testutils; use crate::wallet::AddressIndex::{LastUnused, New, Peek, Reset}; + use crate::testutils; + use std::str::FromStr; + #[test] fn test_cache_addresses_fixed() { let db = MemoryDatabase::new(); @@ -1672,50 +1724,6 @@ pub(crate) mod test { "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100000)))" } - pub(crate) fn get_funded_wallet( - descriptor: &str, - ) -> ( - Wallet<(), MemoryDatabase>, - (String, Option), - bitcoin::Txid, - ) { - let descriptors = testutils!(@descriptors (descriptor)); - let wallet = Wallet::new_offline( - &descriptors.0, - None, - Network::Regtest, - MemoryDatabase::new(), - ) - .unwrap(); - - let funding_address_kix = 0; - - let tx_meta = testutils! { - @tx ( (@external descriptors, funding_address_kix) => 50_000 ) (@confirmations 1) - }; - - wallet - .database - .borrow_mut() - .set_script_pubkey( - &bitcoin::Address::from_str(&tx_meta.output.get(0).unwrap().to_address) - .unwrap() - .script_pubkey(), - KeychainKind::External, - funding_address_kix, - ) - .unwrap(); - wallet - .database - .borrow_mut() - .set_last_index(KeychainKind::External, funding_address_kix) - .unwrap(); - - let txid = crate::populate_test_db!(wallet.database.borrow_mut(), tx_meta, Some(100)); - - (wallet, descriptors, txid) - } - macro_rules! assert_fee_rate { ($tx:expr, $fees:expr, $fee_rate:expr $( ,@dust_change $( $dust_change:expr )* )* $( ,@add_signature $( $add_signature:expr )* )* ) => ({ let mut tx = $tx.clone();