Skip to content

Commit 2615c54

Browse files
committed
serde tests
1 parent 68c6bfc commit 2615c54

File tree

13 files changed

+763
-36
lines changed

13 files changed

+763
-36
lines changed

Cargo.lock

Lines changed: 601 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,14 @@ edition = "2021"
1414
borsh = { version = "^1", default-features = false }
1515
const-crypto = { version = "^0.3", default-features = false }
1616

17+
# dev deps
18+
bs58 = { version = "^0.5", default-features = false }
19+
serde = { version = "^1", default-features = false }
20+
serde_json = { version = "^1", default-features = false }
21+
22+
# solana deps
23+
# group them together to ensure same version throughout
24+
# and to deal with dependency hell more easily
25+
solana-account-decoder-client-types = { version = "^2", default-features = false }
26+
1727
# workspace members

core/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,9 @@ edition.workspace = true
66
[dependencies]
77
borsh = { workspace = true, features = ["derive"] }
88
const-crypto = { workspace = true }
9+
10+
[dev-dependencies]
11+
bs58 = { workspace = true }
12+
serde = { workspace = true, features = ["derive"] }
13+
serde_json = { workspace = true }
14+
solana-account-decoder-client-types = { workspace = true }

core/tests/common/accounts.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use std::{fs::File, path::Path};
2+
3+
use serde::{Deserialize, Serialize};
4+
use solana_account_decoder_client_types::UiAccount;
5+
6+
use super::test_fixtures_dir;
7+
8+
/// This is the json format of
9+
/// `solana account -o <FILENAME>.json --output json <ACCOUNT-PUBKEY>`
10+
#[derive(Clone, Debug, Serialize, Deserialize)]
11+
pub struct KeyedUiAccount {
12+
pub pubkey: String,
13+
pub account: UiAccount,
14+
}
15+
16+
impl KeyedUiAccount {
17+
fn from_file<P: AsRef<Path>>(json_file_path: P) -> Self {
18+
let mut file = File::open(json_file_path).unwrap();
19+
serde_json::from_reader(&mut file).unwrap()
20+
}
21+
22+
/// Loads a KeyedUiAccount from `<test_fixtures_dir()>/relative_json_file_path.json`
23+
pub fn from_test_fixtures_file<P: AsRef<Path>>(relative_json_file_path: P) -> Self {
24+
Self::from_file(
25+
test_fixtures_dir()
26+
.join(relative_json_file_path)
27+
.with_extension("json"),
28+
)
29+
}
30+
31+
/// Assumes data is not `UiAccountData::Json`
32+
pub fn account_data(&self) -> Vec<u8> {
33+
self.account.data.decode().unwrap()
34+
}
35+
}

core/tests/common/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
mod accounts;
2+
mod paths;
3+
4+
pub use accounts::*;
5+
pub use paths::*;

core/tests/common/paths.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use std::path::{Path, PathBuf};
2+
3+
/// Copied from https://stackoverflow.com/a/74942075/5057425
4+
fn workspace_root_dir() -> PathBuf {
5+
let output = std::process::Command::new(env!("CARGO"))
6+
.arg("locate-project")
7+
.arg("--workspace")
8+
.arg("--message-format=plain")
9+
.output()
10+
.unwrap()
11+
.stdout;
12+
let cargo_path = Path::new(std::str::from_utf8(&output).unwrap().trim());
13+
cargo_path.parent().unwrap().to_path_buf()
14+
}
15+
16+
/// Returns `/path/to/workspace/root/test-fixtures`
17+
pub fn test_fixtures_dir() -> PathBuf {
18+
workspace_root_dir().join("test-fixtures")
19+
}

core/tests/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod common;
2+
mod tests;

core/tests/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mod state;

core/tests/tests/state.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use solido_legacy_core::{AccountType, Lido, ValidatorList, VALIDATOR_LIST_ADDR};
2+
3+
use crate::common::KeyedUiAccount;
4+
5+
#[test]
6+
fn lido_serde_roundtrip() {
7+
let account = KeyedUiAccount::from_test_fixtures_file("lido");
8+
let data = account.account_data();
9+
let deser = Lido::borsh_de(data.as_slice()).unwrap();
10+
11+
eprintln!("{deser:#?}");
12+
// sample some fields
13+
assert_eq!(deser.account_type, AccountType::Lido);
14+
assert_eq!(deser.validator_list, VALIDATOR_LIST_ADDR);
15+
16+
let mut ser = Vec::new();
17+
deser.borsh_ser(&mut ser).unwrap();
18+
assert_eq!(ser, data[..ser.len()]);
19+
}
20+
21+
#[test]
22+
fn validator_list_de() {
23+
let account = KeyedUiAccount::from_test_fixtures_file("validator-list");
24+
let data = account.account_data();
25+
let deser = ValidatorList::deserialize(data.as_slice()).unwrap();
26+
27+
// sample some fields
28+
assert_eq!(deser.header.account_type, AccountType::Validator);
29+
assert_eq!(deser.entries.len(), 14);
30+
31+
let largest_val = deser
32+
.entries
33+
.iter()
34+
.max_by_key(|val| val.effective_stake_balance())
35+
.unwrap();
36+
// `DdCNGDpP7qMgoAy6paFzhhak2EeyCZcgjH7ak5u5v28m`
37+
// check that this is indeed a vote account
38+
eprintln!(
39+
"{}",
40+
bs58::encode(largest_val.vote_account_address()).into_string()
41+
);
42+
}

test-fixtures/lido.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"pubkey": "49Yi1TKkNyYjPAFdR9LBvoHcUjuPX4Df5T5yv39w2XTn",
3+
"account": {
4+
"lamports": 56243760,
5+
"data": [
6+
"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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
7+
"base64"
8+
],
9+
"owner": "CrX7kMhLC3cSsXJdT7JDgqrRVWGnUpX3gfEfxxU2NVLi",
10+
"executable": false,
11+
"rentEpoch": 18446744073709551615,
12+
"space": 7953
13+
}
14+
}

0 commit comments

Comments
 (0)