@@ -198,34 +198,39 @@ impl_error!(bitcoin::hashes::hex::Error, Hex, Error);
198
198
#[ cfg( test) ]
199
199
mod test {
200
200
use super :: * ;
201
- use bitcoin:: Amount ;
202
- use electrsd:: {
203
- bitcoind, bitcoind:: bitcoincore_rpc:: bitcoincore_rpc_json:: AddressType ,
204
- bitcoind:: bitcoincore_rpc:: RpcApi , bitcoind:: BitcoinD , ElectrsD ,
205
- } ;
206
- use electrum_client:: ElectrumApi ;
201
+ use electrsd:: { bitcoind, bitcoind:: BitcoinD , ElectrsD } ;
207
202
use lazy_static:: lazy_static;
208
203
use std:: env;
209
- use std:: sync:: { Mutex , Once } ;
210
- use std:: time:: Duration ;
204
+ use tokio:: sync:: Mutex ;
205
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
206
+ use {
207
+ bitcoin:: Amount ,
208
+ electrsd:: {
209
+ bitcoind:: bitcoincore_rpc:: bitcoincore_rpc_json:: AddressType ,
210
+ bitcoind:: bitcoincore_rpc:: RpcApi ,
211
+ } ,
212
+ electrum_client:: ElectrumApi ,
213
+ std:: time:: Duration ,
214
+ tokio:: sync:: OnceCell ,
215
+ } ;
211
216
212
217
lazy_static ! {
213
218
static ref BITCOIND : BitcoinD = {
214
219
let bitcoind_exe = env:: var( "BITCOIND_EXE" )
215
220
. ok( )
216
- . or ( bitcoind:: downloaded_exe_path( ) . ok( ) )
221
+ . or_else ( || bitcoind:: downloaded_exe_path( ) . ok( ) )
217
222
. expect(
218
- "you should provide env var BITCOIND_EXE or specifiy a bitcoind version feature" ,
223
+ "you need to provide an env var BITCOIND_EXE or specify a bitcoind version feature" ,
219
224
) ;
220
225
let conf = bitcoind:: Conf :: default ( ) ;
221
226
BitcoinD :: with_conf( bitcoind_exe, & conf) . unwrap( )
222
227
} ;
223
228
static ref ELECTRSD : ElectrsD = {
224
229
let electrs_exe = env:: var( "ELECTRS_EXE" )
225
230
. ok( )
226
- . or ( electrsd:: downloaded_exe_path( ) )
231
+ . or_else ( electrsd:: downloaded_exe_path)
227
232
. expect(
228
- "you should provide env var ELECTRS_EXE or specifiy a electrsd version feature" ,
233
+ "you need to provide env var ELECTRS_EXE or specify an electrsd version feature" ,
229
234
) ;
230
235
let mut conf = electrsd:: Conf :: default ( ) ;
231
236
conf. http_enabled = true ;
@@ -234,13 +239,17 @@ mod test {
234
239
static ref MINER : Mutex <( ) > = Mutex :: new( ( ) ) ;
235
240
}
236
241
237
- static PREMINE : Once = Once :: new ( ) ;
242
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
243
+ static PREMINE : OnceCell < ( ) > = OnceCell :: const_new ( ) ;
238
244
239
- fn setup_clients ( ) -> ( BlockingClient , AsyncClient ) {
240
- PREMINE . call_once ( || {
241
- let _miner = MINER . lock ( ) . unwrap ( ) ;
242
- generate_blocks_and_wait ( 101 ) ;
243
- } ) ;
245
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
246
+ async fn setup_clients ( ) -> ( BlockingClient , AsyncClient ) {
247
+ PREMINE
248
+ . get_or_init ( || async {
249
+ let _miner = MINER . lock ( ) . await ;
250
+ generate_blocks_and_wait ( 101 ) ;
251
+ } )
252
+ . await ;
244
253
245
254
let esplora_url = ELECTRSD . esplora_url . as_ref ( ) . unwrap ( ) ;
246
255
@@ -253,12 +262,14 @@ mod test {
253
262
( blocking_client, async_client)
254
263
}
255
264
265
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
256
266
fn generate_blocks_and_wait ( num : usize ) {
257
267
let cur_height = BITCOIND . client . get_block_count ( ) . unwrap ( ) ;
258
268
generate_blocks ( num) ;
259
269
wait_for_block ( cur_height as usize + num) ;
260
270
}
261
271
272
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
262
273
fn generate_blocks ( num : usize ) {
263
274
let address = BITCOIND
264
275
. client
@@ -270,6 +281,7 @@ mod test {
270
281
. unwrap ( ) ;
271
282
}
272
283
284
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
273
285
fn wait_for_block ( min_height : usize ) {
274
286
let mut header = ELECTRSD . client . block_headers_subscribe ( ) . unwrap ( ) ;
275
287
loop {
@@ -284,6 +296,7 @@ mod test {
284
296
}
285
297
}
286
298
299
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
287
300
fn exponential_backoff_poll < T , F > ( mut poll : F ) -> T
288
301
where
289
302
F : FnMut ( ) -> Option < T > ,
@@ -344,9 +357,10 @@ mod test {
344
357
) ;
345
358
}
346
359
360
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
347
361
#[ tokio:: test]
348
362
async fn test_get_tx ( ) {
349
- let ( blocking_client, async_client) = setup_clients ( ) ;
363
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
350
364
351
365
let address = BITCOIND
352
366
. client
@@ -365,17 +379,18 @@ mod test {
365
379
None ,
366
380
)
367
381
. unwrap ( ) ;
368
- let _miner = MINER . lock ( ) . unwrap ( ) ;
382
+ let _miner = MINER . lock ( ) . await ;
369
383
generate_blocks_and_wait ( 1 ) ;
370
384
371
385
let tx = blocking_client. get_tx ( & txid) . unwrap ( ) ;
372
386
let tx_async = async_client. get_tx ( & txid) . await . unwrap ( ) ;
373
387
assert_eq ! ( tx, tx_async) ;
374
388
}
375
389
390
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
376
391
#[ tokio:: test]
377
392
async fn test_get_tx_no_opt ( ) {
378
- let ( blocking_client, async_client) = setup_clients ( ) ;
393
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
379
394
380
395
let address = BITCOIND
381
396
. client
@@ -394,17 +409,18 @@ mod test {
394
409
None ,
395
410
)
396
411
. unwrap ( ) ;
397
- let _miner = MINER . lock ( ) . unwrap ( ) ;
412
+ let _miner = MINER . lock ( ) . await ;
398
413
generate_blocks_and_wait ( 1 ) ;
399
414
400
415
let tx_no_opt = blocking_client. get_tx_no_opt ( & txid) . unwrap ( ) ;
401
416
let tx_no_opt_async = async_client. get_tx_no_opt ( & txid) . await . unwrap ( ) ;
402
417
assert_eq ! ( tx_no_opt, tx_no_opt_async) ;
403
418
}
404
419
420
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
405
421
#[ tokio:: test]
406
422
async fn test_get_tx_status ( ) {
407
- let ( blocking_client, async_client) = setup_clients ( ) ;
423
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
408
424
409
425
let address = BITCOIND
410
426
. client
@@ -423,26 +439,28 @@ mod test {
423
439
None ,
424
440
)
425
441
. unwrap ( ) ;
426
- let _miner = MINER . lock ( ) . unwrap ( ) ;
442
+ let _miner = MINER . lock ( ) . await ;
427
443
generate_blocks_and_wait ( 1 ) ;
428
444
429
445
let tx_status = blocking_client. get_tx_status ( & txid) . unwrap ( ) . unwrap ( ) ;
430
446
let tx_status_async = async_client. get_tx_status ( & txid) . await . unwrap ( ) . unwrap ( ) ;
431
447
assert_eq ! ( tx_status, tx_status_async) ;
432
- assert_eq ! ( tx_status. confirmed, true ) ;
448
+ assert ! ( tx_status. confirmed) ;
433
449
}
434
450
451
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
435
452
#[ tokio:: test]
436
453
async fn test_get_header ( ) {
437
- let ( blocking_client, async_client) = setup_clients ( ) ;
454
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
438
455
let block_header = blocking_client. get_header ( 53 ) . unwrap ( ) ;
439
456
let block_header_async = async_client. get_header ( 53 ) . await . unwrap ( ) ;
440
457
assert_eq ! ( block_header, block_header_async) ;
441
458
}
442
459
460
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
443
461
#[ tokio:: test]
444
462
async fn test_get_merkle_proof ( ) {
445
- let ( blocking_client, async_client) = setup_clients ( ) ;
463
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
446
464
447
465
let address = BITCOIND
448
466
. client
@@ -461,7 +479,7 @@ mod test {
461
479
None ,
462
480
)
463
481
. unwrap ( ) ;
464
- let _miner = MINER . lock ( ) . unwrap ( ) ;
482
+ let _miner = MINER . lock ( ) . await ;
465
483
generate_blocks_and_wait ( 1 ) ;
466
484
467
485
let merkle_proof = blocking_client. get_merkle_proof ( & txid) . unwrap ( ) . unwrap ( ) ;
@@ -470,9 +488,10 @@ mod test {
470
488
assert ! ( merkle_proof. pos > 0 ) ;
471
489
}
472
490
491
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
473
492
#[ tokio:: test]
474
493
async fn test_get_output_status ( ) {
475
- let ( blocking_client, async_client) = setup_clients ( ) ;
494
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
476
495
477
496
let address = BITCOIND
478
497
. client
@@ -491,7 +510,7 @@ mod test {
491
510
None ,
492
511
)
493
512
. unwrap ( ) ;
494
- let _miner = MINER . lock ( ) . unwrap ( ) ;
513
+ let _miner = MINER . lock ( ) . await ;
495
514
generate_blocks_and_wait ( 1 ) ;
496
515
497
516
let output_status = blocking_client
@@ -507,26 +526,29 @@ mod test {
507
526
assert_eq ! ( output_status, output_status_async) ;
508
527
}
509
528
529
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
510
530
#[ tokio:: test]
511
531
async fn test_get_height ( ) {
512
- let ( blocking_client, async_client) = setup_clients ( ) ;
532
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
513
533
let block_height = blocking_client. get_height ( ) . unwrap ( ) ;
514
534
let block_height_async = async_client. get_height ( ) . await . unwrap ( ) ;
515
535
assert ! ( block_height > 0 ) ;
516
536
assert_eq ! ( block_height, block_height_async) ;
517
537
}
518
538
539
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
519
540
#[ tokio:: test]
520
541
async fn test_get_tip_hash ( ) {
521
- let ( blocking_client, async_client) = setup_clients ( ) ;
542
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
522
543
let tip_hash = blocking_client. get_tip_hash ( ) . unwrap ( ) ;
523
544
let tip_hash_async = async_client. get_tip_hash ( ) . await . unwrap ( ) ;
524
545
assert_eq ! ( tip_hash, tip_hash_async) ;
525
546
}
526
547
548
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
527
549
#[ tokio:: test]
528
550
async fn test_get_txid_at_block_index ( ) {
529
- let ( blocking_client, async_client) = setup_clients ( ) ;
551
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
530
552
531
553
let block_hash = BITCOIND . client . get_block_hash ( 23 ) . unwrap ( ) ;
532
554
@@ -542,17 +564,19 @@ mod test {
542
564
assert_eq ! ( txid_at_block_index, txid_at_block_index_async) ;
543
565
}
544
566
567
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
545
568
#[ tokio:: test]
546
569
async fn test_get_fee_estimates ( ) {
547
- let ( blocking_client, async_client) = setup_clients ( ) ;
570
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
548
571
let fee_estimates = blocking_client. get_fee_estimates ( ) . unwrap ( ) ;
549
572
let fee_estimates_async = async_client. get_fee_estimates ( ) . await . unwrap ( ) ;
550
573
assert_eq ! ( fee_estimates. len( ) , fee_estimates_async. len( ) ) ;
551
574
}
552
575
576
+ #[ cfg( all( feature = "blocking" , any( feature = "async" , feature = "async-https" ) ) ) ]
553
577
#[ tokio:: test]
554
578
async fn test_scripthash_txs ( ) {
555
- let ( blocking_client, async_client) = setup_clients ( ) ;
579
+ let ( blocking_client, async_client) = setup_clients ( ) . await ;
556
580
557
581
let address = BITCOIND
558
582
. client
@@ -571,7 +595,7 @@ mod test {
571
595
None ,
572
596
)
573
597
. unwrap ( ) ;
574
- let _miner = MINER . lock ( ) . unwrap ( ) ;
598
+ let _miner = MINER . lock ( ) . await ;
575
599
generate_blocks_and_wait ( 1 ) ;
576
600
577
601
let expected_tx = BITCOIND
0 commit comments