|
2 | 2 | extern crate alloc; |
3 | 3 |
|
4 | 4 | use alloc::sync::Arc; |
| 5 | +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; |
5 | 6 |
|
| 7 | +use arc_swap::{ArcSwap, ArcSwapOption}; |
6 | 8 | use bitcoin::consensus::encode::serialize_hex; |
7 | 9 | use bitcoin::hashes::Hash as _; |
8 | 10 | use bitcoin::{Amount, OutPoint, ScriptBuf, Sequence, Transaction, TxIn, TxOut, Txid, Witness}; |
9 | 11 | use bitcoin_rs_chain::{ChainWork, NodeId, TipSnapshot}; |
10 | 12 | use bitcoin_rs_mempool::MempoolEntry; |
| 13 | +use bitcoin_rs_mempool::{Mempool, MempoolLimits}; |
| 14 | +use bitcoin_rs_p2p::PeerInfo; |
11 | 15 | use bitcoin_rs_primitives::Hash256; |
12 | | -use bitcoin_rs_rpc::{BlockRecord, Context, Handler, RpcError}; |
| 16 | +use bitcoin_rs_rpc::{BlockRecord, Context, Handler, NetworkState, RpcError}; |
| 17 | +use compact_str::CompactString; |
| 18 | +use hashbrown::HashMap; |
| 19 | +use parking_lot::RwLock; |
13 | 20 | use sonic_rs::{JsonContainerTrait as _, JsonValueTrait as _, json}; |
14 | 21 |
|
15 | 22 | #[test] |
@@ -102,6 +109,32 @@ fn all_required_handlers_return_core_shapes() -> Result<(), Box<dyn std::error:: |
102 | 109 | Ok(()) |
103 | 110 | } |
104 | 111 |
|
| 112 | +#[test] |
| 113 | +fn network_peer_methods_read_shared_peer_registry() -> Result<(), Box<dyn std::error::Error>> { |
| 114 | + let peers = Arc::new(RwLock::new(vec![PeerInfo { |
| 115 | + addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8333), |
| 116 | + version: 70_016, |
| 117 | + services: 0, |
| 118 | + user_agent: "/test/".into(), |
| 119 | + start_height: 0, |
| 120 | + conn_time: 0, |
| 121 | + inbound: true, |
| 122 | + }])); |
| 123 | + let handler = Handler::new(context_with_peers(peers)); |
| 124 | + |
| 125 | + let count = handler.dispatch("getconnectioncount", &json!([]))?; |
| 126 | + assert_eq!(count.as_u64(), Some(1)); |
| 127 | + |
| 128 | + let peer_info = handler.dispatch("getpeerinfo", &json!([]))?; |
| 129 | + let peer_info = peer_info |
| 130 | + .as_array() |
| 131 | + .ok_or("getpeerinfo must return array")?; |
| 132 | + let peer = peer_info.get(0).ok_or("getpeerinfo must return one peer")?; |
| 133 | + assert_eq!(peer_info.len(), 1); |
| 134 | + assert_eq!(peer.get("version").as_u64(), Some(70_016)); |
| 135 | + Ok(()) |
| 136 | +} |
| 137 | + |
105 | 138 | #[test] |
106 | 139 | fn signing_methods_are_disabled() -> Result<(), Box<dyn std::error::Error>> { |
107 | 140 | let handler = Handler::new(Arc::new(Context::new())); |
@@ -148,6 +181,18 @@ impl Fixture { |
148 | 181 | } |
149 | 182 | } |
150 | 183 |
|
| 184 | +fn context_with_peers(peers: Arc<RwLock<Vec<PeerInfo>>>) -> Arc<Context> { |
| 185 | + Arc::new(Context::from_handles( |
| 186 | + Arc::new(ArcSwapOption::empty()), |
| 187 | + Arc::new(RwLock::new(Mempool::new(MempoolLimits::default()))), |
| 188 | + Arc::new(RwLock::new(Vec::new())), |
| 189 | + Arc::new(RwLock::new(HashMap::new())), |
| 190 | + Arc::new(RwLock::new(NetworkState::default())), |
| 191 | + Arc::new(ArcSwap::from_pointee(CompactString::new("0"))), |
| 192 | + peers, |
| 193 | + )) |
| 194 | +} |
| 195 | + |
151 | 196 | fn tx(label: u8, script_pubkey: ScriptBuf) -> Transaction { |
152 | 197 | Transaction { |
153 | 198 | version: bitcoin::transaction::Version::TWO, |
|
0 commit comments