|
| 1 | +mod common; |
| 2 | +use common::Result; |
| 3 | + |
| 4 | +use bitcoind::bitcoincore_rpc::RpcApi; |
| 5 | +use electrumd::jsonrpc::serde_json::json; |
| 6 | +use electrumd::ElectrumD; |
| 7 | + |
| 8 | +use electrs::chain::Address; |
| 9 | + |
| 10 | +#[test] |
| 11 | +fn test_electrum() -> Result<()> { |
| 12 | + // Spawn the Electrs Electrum RPC server |
| 13 | + let (electrum_server, electrum_addr, mut tester) = common::init_electrum_tester().unwrap(); |
| 14 | + |
| 15 | + // Spawn headless Electrum wallet RPC server |
| 16 | + let mut electrum_wallet_conf = electrumd::Conf::default(); |
| 17 | + let server_arg = format!("{}:t", electrum_addr.to_string()); |
| 18 | + electrum_wallet_conf.args = vec!["-v", "--server", &server_arg]; |
| 19 | + electrum_wallet_conf.view_stdout = true; |
| 20 | + let electrum_wallet = |
| 21 | + ElectrumD::with_conf(electrumd::downloaded_exe_path()?, &electrum_wallet_conf)?; |
| 22 | + |
| 23 | + let notify_wallet = || { |
| 24 | + electrum_server.notify(); |
| 25 | + std::thread::sleep(std::time::Duration::from_millis(200)); |
| 26 | + }; |
| 27 | + |
| 28 | + let assert_balance = |confirmed: f64, unconfirmed: f64| { |
| 29 | + let balance = electrum_wallet.call("getbalance", &json!([])).unwrap(); |
| 30 | + log::info!("balance: {}", balance); |
| 31 | + |
| 32 | + assert_eq!( |
| 33 | + balance["confirmed"].as_str(), |
| 34 | + Some(confirmed.to_string().as_str()) |
| 35 | + ); |
| 36 | + if unconfirmed != 0.0 { |
| 37 | + assert_eq!( |
| 38 | + balance["unconfirmed"].as_str(), |
| 39 | + Some(unconfirmed.to_string().as_str()) |
| 40 | + ); |
| 41 | + } else { |
| 42 | + assert!(balance["unconfirmed"].is_null()) |
| 43 | + } |
| 44 | + }; |
| 45 | + |
| 46 | + let newaddress = || -> Address { |
| 47 | + electrum_wallet |
| 48 | + .call("createnewaddress", &json!([])) |
| 49 | + .unwrap() |
| 50 | + .as_str() |
| 51 | + .expect("missing address") |
| 52 | + .parse() |
| 53 | + .expect("valid address") |
| 54 | + }; |
| 55 | + |
| 56 | + log::info!( |
| 57 | + "Electrum wallet version: {:?}", |
| 58 | + electrum_wallet.call("version", &json!([]))? |
| 59 | + ); |
| 60 | + |
| 61 | + // Send some funds and verify that the balance checks out |
| 62 | + let addr1 = newaddress(); |
| 63 | + let addr2 = newaddress(); |
| 64 | + |
| 65 | + assert_balance(0.0, 0.0); |
| 66 | + |
| 67 | + let txid1 = tester.send(&addr1, "0.1 BTC".parse().unwrap())?; |
| 68 | + notify_wallet(); |
| 69 | + assert_balance(0.0, 0.1); |
| 70 | + |
| 71 | + tester.mine()?; |
| 72 | + notify_wallet(); |
| 73 | + assert_balance(0.1, 0.0); |
| 74 | + |
| 75 | + let txid2 = tester.send(&addr2, "0.2 BTC".parse().unwrap())?; |
| 76 | + notify_wallet(); |
| 77 | + assert_balance(0.1, 0.2); |
| 78 | + |
| 79 | + tester.mine()?; |
| 80 | + notify_wallet(); |
| 81 | + assert_balance(0.3, 0.0); |
| 82 | + |
| 83 | + // Verify that the transaction history checks out |
| 84 | + let history = electrum_wallet.call("onchain_history", &json!([]))?; |
| 85 | + log::debug!("history = {:#?}", history); |
| 86 | + assert_eq!( |
| 87 | + history["transactions"][0]["txid"].as_str(), |
| 88 | + Some(txid1.to_string().as_str()) |
| 89 | + ); |
| 90 | + assert_eq!(history["transactions"][0]["height"].as_u64(), Some(102)); |
| 91 | + assert_eq!(history["transactions"][0]["bc_value"].as_str(), Some("0.1")); |
| 92 | + |
| 93 | + assert_eq!( |
| 94 | + history["transactions"][1]["txid"].as_str(), |
| 95 | + Some(txid2.to_string().as_str()) |
| 96 | + ); |
| 97 | + assert_eq!(history["transactions"][1]["height"].as_u64(), Some(103)); |
| 98 | + assert_eq!(history["transactions"][1]["bc_value"].as_str(), Some("0.2")); |
| 99 | + |
| 100 | + // Send an outgoing payment |
| 101 | + electrum_wallet.call( |
| 102 | + "broadcast", |
| 103 | + &json!([ electrum_wallet.call( |
| 104 | + "payto", |
| 105 | + &json!({ |
| 106 | + "destination": tester.bitcoind().get_new_address(None, None)?, |
| 107 | + "amount": 0.16, |
| 108 | + "fee": 0.001, |
| 109 | + }), |
| 110 | + )? ]), |
| 111 | + )?; |
| 112 | + notify_wallet(); |
| 113 | + assert_balance(0.3, -0.161); |
| 114 | + |
| 115 | + tester.mine()?; |
| 116 | + notify_wallet(); |
| 117 | + assert_balance(0.139, 0.0); |
| 118 | + |
| 119 | + Ok(()) |
| 120 | +} |
0 commit comments