Skip to content

Commit 87dfe15

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 f31f38e commit 87dfe15

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed

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

0 commit comments

Comments
 (0)