@@ -8,7 +8,7 @@ use pallas_network::{
8
8
miniprotocols:: {
9
9
localstate:: {
10
10
queries_v16:: {
11
- self , Addr , Addrs , PostAlonsoTransactionOutput , StakeSnapshot , Stakes ,
11
+ self , Addr , Addrs , Genesis , PostAlonsoTransactionOutput , StakeSnapshot , Stakes ,
12
12
TransactionOutput , UTxOByAddress ,
13
13
} ,
14
14
Client ,
@@ -271,6 +271,41 @@ impl PallasChainObserver {
271
271
. with_context ( || "PallasChainObserver failed to convert kes period" ) ?)
272
272
}
273
273
274
+ /// Fetches the current chain point using the provided `statequery` client.
275
+ async fn do_get_chain_point_state_query ( & self , statequery : & mut Client ) -> StdResult < Point > {
276
+ let chain_point = queries_v16:: get_chain_point ( statequery)
277
+ . await
278
+ . map_err ( |err| anyhow ! ( err) )
279
+ . with_context ( || "PallasChainObserver failed to get chain point" ) ?;
280
+
281
+ println ! ( "Chain point: {:?}" , chain_point) ;
282
+
283
+ Ok ( chain_point)
284
+ }
285
+
286
+ async fn do_get_current_era_state_query ( & self , statequery : & mut Client ) -> StdResult < u16 > {
287
+ let era = queries_v16:: get_current_era ( statequery)
288
+ . await
289
+ . map_err ( |err| anyhow ! ( err) )
290
+ . with_context ( || "PallasChainObserver failed to get current era" ) ?;
291
+
292
+ Ok ( era)
293
+ }
294
+
295
+ /// Fetches the current genesis config using the provided `statequery` client.
296
+ async fn do_get_genesis_config_state_query (
297
+ & self ,
298
+ statequery : & mut Client ,
299
+ ) -> StdResult < Vec < Genesis > > {
300
+ let era = self . do_get_current_era_state_query ( statequery) . await ?;
301
+ let genesis_config = queries_v16:: get_genesis_config ( statequery, era)
302
+ . await
303
+ . map_err ( |err| anyhow ! ( err) )
304
+ . with_context ( || "PallasChainObserver failed to get genesis config" ) ?;
305
+
306
+ Ok ( genesis_config)
307
+ }
308
+
274
309
/// Fetches chain point and genesis config through the local statequery.
275
310
/// The KES period is calculated afterwards.
276
311
async fn get_kes_period (
@@ -285,20 +320,9 @@ impl PallasChainObserver {
285
320
. map_err ( |err| anyhow ! ( err) )
286
321
. with_context ( || "PallasChainObserver failed to acquire statequery" ) ?;
287
322
288
- let chain_point = queries_v16:: get_chain_point ( statequery)
289
- . await
290
- . map_err ( |err| anyhow ! ( err) )
291
- . with_context ( || "PallasChainObserver failed to get chain point" ) ?;
292
-
293
- let era = queries_v16:: get_current_era ( statequery)
294
- . await
295
- . map_err ( |err| anyhow ! ( err) )
296
- . with_context ( || "PallasChainObserver failed to get current era" ) ?;
323
+ let chain_point = self . do_get_chain_point_state_query ( statequery) . await ?;
297
324
298
- let genesis_config = queries_v16:: get_genesis_config ( statequery, era)
299
- . await
300
- . map_err ( |err| anyhow ! ( err) )
301
- . with_context ( || "PallasChainObserver failed to get genesis config" ) ?;
325
+ let genesis_config = self . do_get_genesis_config_state_query ( statequery) . await ?;
302
326
303
327
let config = genesis_config
304
328
. first ( )
@@ -580,7 +604,7 @@ mod tests {
580
604
}
581
605
582
606
/// Sets up a mock server.
583
- async fn setup_server ( socket_path : PathBuf ) -> tokio:: task:: JoinHandle < ( ) > {
607
+ async fn setup_server ( socket_path : PathBuf , intersections : u32 ) -> tokio:: task:: JoinHandle < ( ) > {
584
608
tokio:: spawn ( {
585
609
async move {
586
610
if socket_path. exists ( ) {
@@ -595,22 +619,18 @@ mod tests {
595
619
server. statequery ( ) . recv_while_idle ( ) . await . unwrap ( ) ;
596
620
server. statequery ( ) . send_acquired ( ) . await . unwrap ( ) ;
597
621
598
- let result = mock_server ( & mut server) . await ;
599
- server. statequery ( ) . send_result ( result) . await . unwrap ( ) ;
600
-
601
- let result = mock_server ( & mut server) . await ;
602
- server. statequery ( ) . send_result ( result) . await . unwrap ( ) ;
603
-
604
- let result = mock_server ( & mut server) . await ;
605
- server. statequery ( ) . send_result ( result) . await . unwrap ( ) ;
622
+ for _ in 0 ..intersections {
623
+ let result = mock_server ( & mut server) . await ;
624
+ server. statequery ( ) . send_result ( result) . await . unwrap ( ) ;
625
+ }
606
626
}
607
627
} )
608
628
}
609
629
610
630
#[ tokio:: test]
611
631
async fn get_current_epoch ( ) {
612
632
let socket_path = create_temp_dir ( "get_current_epoch" ) . join ( "node.socket" ) ;
613
- let server = setup_server ( socket_path. clone ( ) ) . await ;
633
+ let server = setup_server ( socket_path. clone ( ) , 2 ) . await ;
614
634
let client = tokio:: spawn ( async move {
615
635
let observer =
616
636
PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
@@ -625,7 +645,7 @@ mod tests {
625
645
#[ tokio:: test]
626
646
async fn get_current_datums ( ) {
627
647
let socket_path = create_temp_dir ( "get_current_datums" ) . join ( "node.socket" ) ;
628
- let server = setup_server ( socket_path. clone ( ) ) . await ;
648
+ let server = setup_server ( socket_path. clone ( ) , 2 ) . await ;
629
649
let client = tokio:: spawn ( async move {
630
650
let observer =
631
651
PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
@@ -642,7 +662,7 @@ mod tests {
642
662
#[ tokio:: test]
643
663
async fn get_current_stake_distribution ( ) {
644
664
let socket_path = create_temp_dir ( "get_current_stake_distribution" ) . join ( "node.socket" ) ;
645
- let server = setup_server ( socket_path. clone ( ) ) . await ;
665
+ let server = setup_server ( socket_path. clone ( ) , 2 ) . await ;
646
666
let client = tokio:: spawn ( async move {
647
667
let observer =
648
668
super :: PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
@@ -672,7 +692,7 @@ mod tests {
672
692
#[ tokio:: test]
673
693
async fn get_current_kes_period ( ) {
674
694
let socket_path = create_temp_dir ( "get_current_kes_period" ) . join ( "node.socket" ) ;
675
- let server = setup_server ( socket_path. clone ( ) ) . await ;
695
+ let server = setup_server ( socket_path. clone ( ) , 3 ) . await ;
676
696
let client = tokio:: spawn ( async move {
677
697
let observer =
678
698
PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
@@ -718,4 +738,52 @@ mod tests {
718
738
719
739
assert_eq ! ( 413 , current_kes_period) ;
720
740
}
741
+
742
+ #[ tokio:: test]
743
+ async fn get_chain_point ( ) {
744
+ let socket_path = create_temp_dir ( "get_chain_point" ) . join ( "node.socket" ) ;
745
+ let server = setup_server ( socket_path. clone ( ) , 1 ) . await ;
746
+ let client = tokio:: spawn ( async move {
747
+ let observer =
748
+ PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
749
+ let mut client = observer. get_client ( ) . await . unwrap ( ) ;
750
+ let statequery = client. statequery ( ) ;
751
+ statequery. acquire ( None ) . await . unwrap ( ) ;
752
+ let chain_point = observer
753
+ . do_get_chain_point_state_query ( statequery)
754
+ . await
755
+ . unwrap ( ) ;
756
+ observer. post_process_statequery ( & mut client) . await . unwrap ( ) ;
757
+ client. abort ( ) . await ;
758
+ chain_point
759
+ } ) ;
760
+
761
+ let ( _, client_res) = tokio:: join!( server, client) ;
762
+ let chain_point = client_res. expect ( "Client failed" ) ;
763
+ assert_eq ! ( chain_point, Point :: Specific ( 52851885 , vec![ 1 , 2 , 3 ] ) ) ;
764
+ }
765
+
766
+ #[ tokio:: test]
767
+ async fn get_genesis_config ( ) {
768
+ let socket_path = create_temp_dir ( "get_genesis_config" ) . join ( "node.socket" ) ;
769
+ let server = setup_server ( socket_path. clone ( ) , 2 ) . await ;
770
+ let client = tokio:: spawn ( async move {
771
+ let observer =
772
+ PallasChainObserver :: new ( socket_path. as_path ( ) , CardanoNetwork :: TestNet ( 10 ) ) ;
773
+ let mut client = observer. get_client ( ) . await . unwrap ( ) ;
774
+ let statequery = client. statequery ( ) ;
775
+ statequery. acquire ( None ) . await . unwrap ( ) ;
776
+ let genesis_config = observer
777
+ . do_get_genesis_config_state_query ( statequery)
778
+ . await
779
+ . unwrap ( ) ;
780
+ observer. post_process_statequery ( & mut client) . await . unwrap ( ) ;
781
+ client. abort ( ) . await ;
782
+ genesis_config
783
+ } ) ;
784
+
785
+ let ( _, client_res) = tokio:: join!( server, client) ;
786
+ let genesis_config = client_res. expect ( "Client failed" ) ;
787
+ assert_eq ! ( genesis_config, get_fake_genesis_config( ) ) ;
788
+ }
721
789
}
0 commit comments