Skip to content

Commit d5524e1

Browse files
committed
Vibe code some async tests
Add some vibe coded tests for the async client to check that everything is functional. Tests are for development purposes only to catch simple errors like feature gates etc. and have not been reviewed.
1 parent 78c5f44 commit d5524e1

2 files changed

Lines changed: 210 additions & 0 deletions

File tree

integration_test/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,15 @@ TODO = [] # This is a dirty hack while writing the tests.
6262

6363
[dependencies]
6464
bitcoin = { version = "0.32.0", default-features = false, features = ["std", "serde"] }
65+
corepc-client = { version = "0.11.0", path = "../client", default-features = false, features = ["client-async"] }
6566
env_logger = "0.9.0"
6667
node = { package = "corepc-node", version = "0.11.0", path = "../node", default-features = false }
6768
rand = "0.8.5"
6869
# Just so we can enable the feature.
6970
types = { package = "corepc-types", version = "0.11.0", path = "../types", features = ["serde-deny-unknown-fields"] }
7071

7172
[dev-dependencies]
73+
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
7274

7375

7476
[patch.crates-io.corepc-client]
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
// SPDX-License-Identifier: CC0-1.0
2+
3+
//! Tests for the async client.
4+
5+
#![allow(non_snake_case)] // Test names intentionally use double underscore.
6+
7+
use corepc_client::client_async::Auth;
8+
use corepc_client::client_async::v17 as async_client;
9+
#[cfg(not(feature = "v18_and_below"))]
10+
use corepc_client::client_async::v19 as async_client_v19;
11+
#[cfg(not(feature = "v20_and_below"))]
12+
use corepc_client::client_async::v21 as async_client_v21;
13+
#[cfg(not(feature = "v23_and_below"))]
14+
use corepc_client::client_async::v24 as async_client_v24;
15+
#[cfg(not(feature = "v28_and_below"))]
16+
use corepc_client::client_async::v29 as async_client_v29;
17+
use integration_test::{Node, NodeExt as _, Wallet};
18+
19+
fn async_client_for(node: &Node) -> async_client::Client {
20+
async_client::Client::new_with_auth(&node.rpc_url(), auth_for(node)).expect("async client")
21+
}
22+
23+
#[tokio::test]
24+
async fn async_client__get_block_count_and_hash() {
25+
let node = Node::with_wallet(Wallet::None, &[]);
26+
let client = async_client_for(&node);
27+
28+
let count = client.get_block_count().await.expect("getblockcount");
29+
assert_eq!(count.0, 0);
30+
31+
let json = client.get_block_hash(0).await.expect("getblockhash");
32+
let model = json.into_model().expect("getblockhash model");
33+
let expected = node.client.best_block_hash().expect("best_block_hash");
34+
assert_eq!(model.0, expected);
35+
}
36+
37+
#[tokio::test]
38+
async fn async_client__get_block_variants() {
39+
let node = Node::with_wallet(Wallet::None, &[]);
40+
let client = async_client_for(&node);
41+
42+
let best_hash = node.client.best_block_hash().expect("best_block_hash");
43+
44+
let block = client.get_block(best_hash).await.expect("getblock");
45+
assert_eq!(block.block_hash(), best_hash);
46+
47+
let block_v0 = client
48+
.get_block_verbose_zero(best_hash)
49+
.await
50+
.expect("getblock verbose=0");
51+
let block_from_hex = block_v0.block().expect("getblock verbose=0 decode");
52+
assert_eq!(block_from_hex.block_hash(), best_hash);
53+
54+
#[cfg(feature = "v28_and_below")]
55+
{
56+
let block_v1 = client
57+
.get_block_verbose_one(best_hash)
58+
.await
59+
.expect("getblock verbose=1");
60+
assert_eq!(block_v1.hash, best_hash.to_string());
61+
62+
let block_info = client.get_block_info(best_hash).await.expect("getblock info");
63+
assert_eq!(block_info.hash, best_hash.to_string());
64+
}
65+
66+
#[cfg(not(feature = "v28_and_below"))]
67+
{
68+
let client = async_client_v29::Client::new_with_auth(&node.rpc_url(), auth_for(&node))
69+
.expect("async client v29");
70+
let block_v1 = client
71+
.get_block_verbose_one(best_hash)
72+
.await
73+
.expect("getblock verbose=1 v29");
74+
assert_eq!(block_v1.hash, best_hash.to_string());
75+
76+
let block_info = client.get_block_info(best_hash).await.expect("getblock info v29");
77+
assert_eq!(block_info.hash, best_hash.to_string());
78+
}
79+
}
80+
81+
#[tokio::test]
82+
async fn async_client__get_block_header_variants() {
83+
let node = Node::with_wallet(Wallet::None, &[]);
84+
let client = async_client_for(&node);
85+
86+
let best_hash = node.client.best_block_hash().expect("best_block_hash");
87+
let header = client.get_block_header(&best_hash).await.expect("getblockheader");
88+
assert!(!header.0.is_empty());
89+
90+
#[cfg(feature = "v28_and_below")]
91+
{
92+
let header_verbose = client
93+
.get_block_header_verbose(&best_hash)
94+
.await
95+
.expect("getblockheader verbose");
96+
97+
assert_eq!(header_verbose.hash, best_hash.to_string());
98+
assert_eq!(header_verbose.height, 0);
99+
100+
let header_info = client
101+
.get_block_header_info(&best_hash)
102+
.await
103+
.expect("getblockheader info");
104+
105+
assert_eq!(header_info.hash, best_hash.to_string());
106+
assert_eq!(header_info.height, 0);
107+
}
108+
109+
#[cfg(not(feature = "v28_and_below"))]
110+
{
111+
let client = async_client_v29::Client::new_with_auth(&node.rpc_url(), auth_for(&node))
112+
.expect("async client v29");
113+
let header_verbose = client
114+
.get_block_header_verbose(&best_hash)
115+
.await
116+
.expect("getblockheader verbose v29");
117+
118+
assert_eq!(header_verbose.hash, best_hash.to_string());
119+
assert_eq!(header_verbose.height, 0);
120+
121+
let header_info = client
122+
.get_block_header_info(&best_hash)
123+
.await
124+
.expect("getblockheader info v29");
125+
126+
assert_eq!(header_info.hash, best_hash.to_string());
127+
assert_eq!(header_info.height, 0);
128+
}
129+
}
130+
131+
#[tokio::test]
132+
async fn async_client__get_raw_mempool_variants() {
133+
let node = Node::with_wallet(Wallet::Default, &[]);
134+
node.fund_wallet();
135+
136+
let (_address, txid) = node.create_mempool_transaction();
137+
let txid_str = txid.to_string();
138+
let client = async_client_for(&node);
139+
140+
let mempool = client.get_raw_mempool().await.expect("getrawmempool");
141+
assert!(mempool.0.iter().any(|id| id == &txid_str));
142+
143+
#[cfg(feature = "v23_and_below")]
144+
{
145+
let mempool_verbose = client
146+
.get_raw_mempool_verbose()
147+
.await
148+
.expect("getrawmempool verbose");
149+
assert!(mempool_verbose.0.contains_key(&txid_str));
150+
}
151+
152+
#[cfg(not(feature = "v23_and_below"))]
153+
{
154+
let client = async_client_v24::Client::new_with_auth(&node.rpc_url(), auth_for(&node))
155+
.expect("async client v24");
156+
let mempool_verbose = client
157+
.get_raw_mempool_verbose()
158+
.await
159+
.expect("getrawmempool verbose v24");
160+
assert!(mempool_verbose.0.contains_key(&txid_str));
161+
}
162+
163+
#[cfg(not(feature = "v20_and_below"))]
164+
{
165+
let client = async_client_v21::Client::new_with_auth(&node.rpc_url(), auth_for(&node))
166+
.expect("async client v21");
167+
let mempool_sequence = client
168+
.get_raw_mempool_sequence()
169+
.await
170+
.expect("getrawmempool sequence");
171+
assert!(mempool_sequence.txids.iter().any(|id| id == &txid_str));
172+
assert!(mempool_sequence.mempool_sequence > 0);
173+
}
174+
}
175+
176+
#[tokio::test]
177+
async fn async_client__get_raw_transaction_variants() {
178+
let node = Node::with_wallet(Wallet::Default, &[]);
179+
node.fund_wallet();
180+
181+
let (_address, txid) = node.create_mempool_transaction();
182+
let client = async_client_for(&node);
183+
184+
let raw = client.get_raw_transaction(txid).await.expect("getrawtransaction");
185+
assert!(!raw.0.is_empty());
186+
187+
let verbose = client
188+
.get_raw_transaction_verbose(txid)
189+
.await
190+
.expect("getrawtransaction verbose");
191+
assert_eq!(verbose.txid, txid.to_string());
192+
assert!(!verbose.hex.is_empty());
193+
}
194+
195+
#[tokio::test]
196+
#[cfg(not(feature = "v18_and_below"))]
197+
async fn async_client__get_block_filter() {
198+
let node = Node::with_wallet(Wallet::Default, &["-blockfilterindex"]);
199+
node.mine_a_block();
200+
let client = async_client_v19::Client::new_with_auth(&node.rpc_url(), auth_for(&node))
201+
.expect("async client v19");
202+
203+
let best_hash = node.client.best_block_hash().expect("best_block_hash");
204+
let filter = client.get_block_filter(best_hash).await.expect("getblockfilter");
205+
assert!(!filter.filter.is_empty());
206+
}
207+
208+
fn auth_for(node: &Node) -> Auth { Auth::CookieFile(node.params.cookie_file.clone()) }

0 commit comments

Comments
 (0)