forked from hyperledger-iroha/iroha
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoffline_peers.rs
97 lines (85 loc) · 2.8 KB
/
offline_peers.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use eyre::{OptionExt, Result};
use futures_util::stream::{FuturesUnordered, StreamExt};
use iroha::{
client::{self},
crypto::KeyPair,
data_model::{
peer::{Peer as DataModelPeer, PeerId},
prelude::*,
},
};
use iroha_primitives::addr::socket_addr;
use iroha_test_network::*;
use iroha_test_samples::ALICE_ID;
use tokio::task::spawn_blocking;
#[tokio::test]
async fn genesis_block_is_committed_with_some_offline_peers() -> Result<()> {
// Given
let alice_id = ALICE_ID.clone();
let roses = "rose#wonderland".parse()?;
let alice_has_roses = numeric!(13);
// When
let network = NetworkBuilder::new().with_peers(4).build();
let cfg = network.config();
let genesis = network.genesis();
network
.peers()
.iter()
// only 2 out of 4
.take(2)
.enumerate()
.map(|(i, peer)| peer.start(cfg.clone(), (i == 0).then_some(genesis)))
.collect::<FuturesUnordered<_>>()
.collect::<Vec<_>>()
.await;
network.ensure_blocks(1).await?;
// Then
let client = network
.peers()
.iter()
.find(|x| x.is_running())
.expect("there are two running peers")
.client();
spawn_blocking(move || -> Result<()> {
let assets = client
.query(FindAssets::new())
.filter_with(|asset| asset.id.account.eq(alice_id))
.execute_all()?;
let asset = assets
.iter()
.find(|asset| *asset.id().definition() == roses)
.ok_or_eyre("asset should be found")?;
assert_eq!(AssetValue::Numeric(alice_has_roses), *asset.value());
Ok(())
})
.await??;
Ok(())
}
#[tokio::test]
async fn register_offline_peer() -> Result<()> {
const N_PEERS: usize = 4;
let network = NetworkBuilder::new().with_peers(N_PEERS).start().await?;
check_status(&network, N_PEERS as u64 - 1).await;
let address = socket_addr!(128.0.0.2:8085);
let key_pair = KeyPair::random();
let public_key = key_pair.public_key().clone();
let peer_id = PeerId::new(address, public_key);
let register_peer = Register::peer(DataModelPeer::new(peer_id));
// Wait for some time to allow peers to connect
let client = network.client();
spawn_blocking(move || client.submit_blocking(register_peer)).await??;
network.ensure_blocks(2).await?;
// Make sure peers count hasn't changed
check_status(&network, N_PEERS as u64 - 1).await;
Ok(())
}
async fn check_status(network: &Network, expected_peers: u64) {
for peer in network.peers() {
let client = peer.client();
let status = spawn_blocking(move || client.get_status())
.await
.expect("no panic")
.expect("status should not fail");
assert_eq!(status.peers, expected_peers);
}
}