Skip to content

Commit df111b1

Browse files
authored
e2e: add client tests (#88)
* e2e: add client tests * improve ux * bump deps * async thread safe Signed-off-by: Sam Batschelet <[email protected]>
1 parent 59ddab1 commit df111b1

File tree

9 files changed

+242
-110
lines changed

9 files changed

+242
-110
lines changed

scripts/tests.e2e.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
#!/usr/bin/env bash
22
set -e
33

4-
# build spacesvm-rs binary
4+
# build spacesvm binary
55
# ./scripts/build.release.sh
66
#
77
# download from github, keep network running
8-
# VM_PLUGIN_PATH=$(pwd)/target/release/spacesvm-rs ./scripts/tests.e2e.sh
8+
# VM_PLUGIN_PATH=$(pwd)/target/release/spacesvm ./scripts/tests.e2e.sh
99
#
1010
# download from github, shut down network
11-
# NETWORK_RUNNER_ENABLE_SHUTDOWN=1 VM_PLUGIN_PATH=$(pwd)/target/release/spacesvm-rs ./scripts/tests.e2e.sh
11+
# NETWORK_RUNNER_ENABLE_SHUTDOWN=1 VM_PLUGIN_PATH=$(pwd)/target/release/spacesvm ./scripts/tests.e2e.sh
1212
#
1313
# use custom avalanchego binary
14-
# VM_PLUGIN_PATH=$(pwd)/target/release/timestampvm ./scripts/tests.e2e.sh ~/go/src/github.com/ava-labs/avalanchego/build/avalanchego
14+
# VM_PLUGIN_PATH=$(pwd)/target/release/spacesvm ./scripts/tests.e2e.sh ~/go/src/github.com/ava-labs/avalanchego/build/avalanchego
1515
#
1616
if ! [[ "$0" =~ scripts/tests.e2e.sh ]]; then
1717
echo "must be run from repository root"

spaces-cli/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ clap = { version = "4.0", features = ["derive"] }
1717
hex = "0.4.3"
1818
jsonrpc-core = "18.0.0"
1919
log = "0.4.17"
20-
serde = { version = "1.0.147", features = ["derive"] }
21-
serde_json = "1.0.87"
20+
serde = { version = "1.0.148", features = ["derive"] }
21+
serde_json = "1.0.89"
2222
spacesvm = { path = "../spacesvm" }
23-
tokio = { version = "1.22.0", features = ["full"] }
23+
tokio = { version = "1.22.0", features = [] }

spaces-cli/src/bin/spaces-cli/main.rs

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ use std::error;
33
use clap::{Parser, Subcommand};
44
use jsonrpc_core::futures;
55
use spacesvm::{
6-
api::{
7-
client::{claim_tx, delete_tx, get_or_create_pk, set_tx, Client, Uri},
8-
DecodeTxArgs, IssueTxArgs, ResolveArgs,
9-
},
10-
chain::tx::{decoder, unsigned::TransactionData},
6+
api::client::{claim_tx, delete_tx, get_or_create_pk, set_tx, Client, Uri},
7+
chain::tx::unsigned::TransactionData,
118
};
129

1310
#[derive(Subcommand, Debug)]
@@ -46,51 +43,44 @@ struct Cli {
4643
#[command(subcommand)]
4744
command: Command,
4845
}
49-
5046
#[tokio::main]
5147
async fn main() -> Result<(), Box<dyn error::Error>> {
5248
let cli = Cli::parse();
5349

54-
let secret_key = get_or_create_pk(&cli.private_key_file)?;
50+
let private_key = get_or_create_pk(&cli.private_key_file)?;
5551
let uri = cli.endpoint.parse::<Uri>()?;
56-
let mut client = Client::new(uri);
52+
let client = Client::new(uri);
53+
client.set_private_key(private_key).await;
5754

5855
if let Command::Get { space, key } = &cli.command {
59-
let resp = futures::executor::block_on(client.resolve(ResolveArgs {
60-
space: space.as_bytes().to_vec(),
61-
key: key.as_bytes().to_vec(),
62-
}))
63-
.map_err(|e| e.to_string())?;
56+
let resp = client
57+
.resolve(space, key)
58+
.await
59+
.map_err(|e| e.to_string())?;
6460
log::debug!("resolve response: {:?}", resp);
6561

6662
println!("{}", serde_json::to_string(&resp)?);
6763
return Ok(());
6864
}
6965

7066
if let Command::Ping {} = &cli.command {
71-
let resp = futures::executor::block_on(client.ping()).map_err(|e| e.to_string())?;
67+
let resp = client.ping().await.map_err(|e| e.to_string())?;
7268

7369
println!("{}", serde_json::to_string(&resp)?);
7470
return Ok(());
7571
}
7672

7773
// decode tx
7874
let tx_data = command_to_tx(cli.command)?;
79-
let resp = futures::executor::block_on(client.decode_tx(DecodeTxArgs { tx_data }))
80-
.map_err(|e| e.to_string())?;
75+
let resp = futures::executor::block_on(client.decode_tx(tx_data)).map_err(|e| e.to_string())?;
8176

8277
let typed_data = &resp.typed_data;
8378

84-
// create signature
85-
let dh = decoder::hash_structured_data(typed_data)?;
86-
let sig = secret_key.sign_digest(&dh.as_bytes())?;
87-
8879
// issue tx
89-
let resp = futures::executor::block_on(client.issue_tx(IssueTxArgs {
90-
typed_data: resp.typed_data,
91-
signature: sig.to_bytes().to_vec(),
92-
}))
93-
.map_err(|e| e.to_string())?;
80+
let resp = client
81+
.issue_tx(typed_data)
82+
.await
83+
.map_err(|e| e.to_string())?;
9484
println!("{}", serde_json::to_string(&resp)?);
9585

9686
Ok(())
@@ -99,9 +89,9 @@ async fn main() -> Result<(), Box<dyn error::Error>> {
9989
/// Takes a TX command and returns transaction data.
10090
fn command_to_tx(command: Command) -> std::io::Result<TransactionData> {
10191
match command {
102-
Command::Claim { space } => Ok(claim_tx(space)),
103-
Command::Set { space, key, value } => Ok(set_tx(space, key, value.as_bytes().to_vec())),
104-
Command::Delete { space, key } => Ok(delete_tx(space, key)),
92+
Command::Claim { space } => Ok(claim_tx(&space)),
93+
Command::Set { space, key, value } => Ok(set_tx(&space, &key, &value)),
94+
Command::Delete { space, key } => Ok(delete_tx(&space, &key)),
10595
_ => Err(std::io::Error::new(
10696
std::io::ErrorKind::Other,
10797
"not a supported tx",

spacesvm/Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,40 @@ name = "spacesvm"
1515
path = "src/bin/spaces/main.rs"
1616

1717
[dependencies]
18-
avalanche-types = { version = "0.0.140", features = ["subnet"] }
18+
avalanche-types = { version = "0.0.144", features = ["subnet"] }
1919
byteorder = "1.4.3"
20-
chrono = "0.4.22"
20+
chrono = "0.4.23"
2121
crossbeam-channel = "0.5.6"
2222
derivative = "2.2.0"
2323
dyn-clone = "1.0.9"
2424
ethereum-types = { version = "0.14.0" }
25-
clap = { version = "4.0.22", features = ["cargo", "derive"] }
25+
clap = { version = "4.0.27", features = ["cargo", "derive"] }
2626
eip-712 = "0.1.0"
27-
env_logger = "0.9.3"
27+
env_logger = "0.10.0"
2828
hex = "0.4.3"
2929
http = "0.2.8"
3030
hyper = "0.14.23"
3131
jsonrpc-core = "18.0.0"
3232
jsonrpc-core-client = { version = "18.0.0" }
3333
jsonrpc-derive = "18.0"
3434
log = "0.4.17"
35-
lru = "0.8.0"
35+
lru = "0.8.1"
3636
prost = "0.11.2"
3737
ripemd = "0.1.3"
3838
semver = "1.0.14"
39-
serde = { version = "1.0.147", features = ["derive"] }
40-
serde_json = "1.0.87"
39+
serde = { version = "1.0.148", features = ["derive"] }
40+
serde_json = "1.0.89"
4141
serde_yaml = "0.9.14"
4242
sha3 = "0.10.6"
43-
tokio = { version = "1.21.2", features = ["fs", "rt-multi-thread"] }
43+
tokio = { version = "1.22.0", features = ["fs", "rt-multi-thread"] }
4444
tokio-stream = { version = "0.1.11", features = ["net"] }
4545
tonic = { version = "0.8.2", features = ["gzip"] }
4646
tonic-health = "0.7"
4747
typetag = "0.2"
4848

4949
[dev-dependencies]
5050
jsonrpc-tcp-server = "18.0.0"
51-
futures-test = "0.3.24"
51+
futures-test = "0.3.25"
5252

5353
[[test]]
5454
name = "integration"

0 commit comments

Comments
 (0)