Skip to content

Commit

Permalink
dusk-core: add test vectors fro event json serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
herr-seppia committed Feb 25, 2025
1 parent eed11b4 commit c12f20d
Show file tree
Hide file tree
Showing 20 changed files with 314 additions and 42 deletions.
168 changes: 126 additions & 42 deletions core/tests/serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,24 @@ use piecrust_uplink::{ContractId, CONTRACT_ID_BYTES};
use rand::rngs::StdRng;
use rand::Rng;
use rand::{RngCore, SeedableRng};
use serde::Serialize;

fn assert_canonical_json<T>(
input: &T,
expected: &str,
) -> Result<String, Box<dyn std::error::Error>>
where
T: ?Sized + Serialize,
{
let serialized = serde_json::to_string(input)?;
let input_canonical: serde_json::Value = serialized.parse()?;
let expected_canonical: serde_json::Value = expected.parse()?;
assert_eq!(input_canonical, expected_canonical);
Ok(serialized)
}

#[test]
fn serde_stake_event() {
fn serde_stake_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut contract_id_bytes = [0; CONTRACT_ID_BYTES];
rng.fill_bytes(&mut contract_id_bytes);
Expand All @@ -48,31 +63,44 @@ fn serde_stake_event() {
locked: rng.next_u64(),
};

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/stake_1.json"),
)?;

let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/stake_2.json"),
)?;

let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}

#[test]
fn serde_slash_event() {
fn serde_slash_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let event = SlashEvent {
account: AccountPublicKey::from(&AccountSecretKey::random(&mut rng)),
value: rng.next_u64(),
next_eligibility: rng.next_u64(),
};
let ser = serde_json::to_string(&event).unwrap();
let deser = serde_json::from_str(&ser).unwrap();
let ser = assert_canonical_json(
&event,
include_str!("./serde/events/slash.json"),
)?;
let deser = serde_json::from_str(&ser)?;
assert_eq!(event, deser);
Ok(())
}

#[test]
fn serde_reward() {
fn serde_reward() -> Result<(), Box<dyn std::error::Error>> {
use RewardReason::*;
let mut rng = StdRng::seed_from_u64(42);
let account = AccountPublicKey::from(&AccountSecretKey::random(&mut rng));
Expand All @@ -84,17 +112,25 @@ fn serde_reward() {
reason,
});
}
let expected = vec![
include_str!("./serde/events/reward_extra.json"),
include_str!("./serde/events/reward_fixed.json"),
include_str!("./serde/events/reward_voter.json"),
include_str!("./serde/events/reward_other.json"),
];

let mut desers = vec![];
for event in &events {
let ser = serde_json::to_string(event).unwrap();
for (event, expected) in events.iter().zip(expected.iter()) {
let ser = assert_canonical_json(&event, &expected)?;
let deser = serde_json::from_str(&ser).unwrap();
desers.push(deser);
}
assert_eq!(events, desers);
Ok(())
}

#[test]
fn serde_withdraw_event() {
fn serde_withdraw_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut contract_id_bytes = [0; CONTRACT_ID_BYTES];
rng.fill_bytes(&mut contract_id_bytes);
Expand All @@ -116,18 +152,25 @@ fn serde_withdraw_event() {
value: rng.next_u64(),
};

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/withdraw_1.json"),
)?;
let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/withdraw_2.json"),
)?;
let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}

#[test]
fn serde_convert_event() {
fn serde_convert_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let scalar = JubJubScalar::random(&mut rng);
let account_pk =
Expand All @@ -146,18 +189,25 @@ fn serde_convert_event() {
value: rng.next_u64(),
};

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/convert_1.json"),
)?;
let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/convert_2.json"),
)?;
let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}

#[test]
fn serde_deposit_event() {
fn serde_deposit_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut contract_id_bytes = [0; CONTRACT_ID_BYTES];
rng.fill_bytes(&mut contract_id_bytes);
Expand All @@ -175,18 +225,27 @@ fn serde_deposit_event() {
value: rng.next_u64(),
};

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/deposit_1.json"),
)?;
let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/deposit_2.json"),
)?;

let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}

#[test]
fn serde_contract_to_contract_event() {
fn serde_contract_to_contract_event() -> Result<(), Box<dyn std::error::Error>>
{
let mut rng = StdRng::seed_from_u64(42);
let mut contract_id_bytes1 = [0; CONTRACT_ID_BYTES];
let mut contract_id_bytes2 = [0; CONTRACT_ID_BYTES];
Expand All @@ -201,13 +260,17 @@ fn serde_contract_to_contract_event() {
value: rng.next_u64(),
};

let ser = serde_json::to_string(&event).unwrap();
let deser = serde_json::from_str(&ser).unwrap();
let ser = assert_canonical_json(
&event,
include_str!("./serde/events/contract_to_contract.json"),
)?;
let deser = serde_json::from_str(&ser)?;
assert_eq!(event, deser);
Ok(())
}

#[test]
fn serde_contract_to_account_event() {
fn serde_contract_to_account_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut contract_id_bytes = [0; CONTRACT_ID_BYTES];
rng.fill_bytes(&mut contract_id_bytes);
Expand All @@ -220,9 +283,13 @@ fn serde_contract_to_account_event() {
value: rng.next_u64(),
};

let ser = serde_json::to_string(&event).unwrap();
let deser = serde_json::from_str(&ser).unwrap();
let ser = assert_canonical_json(
&event,
include_str!("./serde/events/contract_to_account.json"),
)?;
let deser = serde_json::from_str(&ser)?;
assert_eq!(event, deser);
Ok(())
}

fn rand_note() -> Note {
Expand All @@ -237,7 +304,7 @@ fn rand_note() -> Note {
}

#[test]
fn serde_phoenix_transaction_event() {
fn serde_phoenix_transaction_event() -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut nullifiers = vec![];
for _ in 0..rng.gen_range(0..10) {
Expand Down Expand Up @@ -265,18 +332,27 @@ fn serde_phoenix_transaction_event() {
refund_note: Some(rand_note()),
};

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/phoenix_tx_1.json"),
)?;
let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/phoenix_tx_2.json"),
)?;

let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}

#[test]
fn serde_moonlight_transaction_event_serde() {
fn serde_moonlight_transaction_event_serde(
) -> Result<(), Box<dyn std::error::Error>> {
let mut rng = StdRng::seed_from_u64(42);
let mut memo = vec![0; 50];
rng.fill_bytes(&mut memo);
Expand All @@ -298,12 +374,20 @@ fn serde_moonlight_transaction_event_serde() {
gas_spent: rng.next_u64(),
refund_info: None,
};
let ser1 = assert_canonical_json(
&event1,
include_str!("./serde/events/moonlight_tx_1.json"),
)?;
let ser2 = assert_canonical_json(
&event2,
include_str!("./serde/events/moonlight_tx_2.json"),
)?;

let deser1 = serde_json::from_str(&ser1)?;
let deser2 = serde_json::from_str(&ser2)?;

let ser1 = serde_json::to_string(&event1).unwrap();
let ser2 = serde_json::to_string(&event2).unwrap();
let deser1 = serde_json::from_str(&ser1).unwrap();
let deser2 = serde_json::from_str(&ser2).unwrap();
assert_eq!(event1, deser1);
assert_eq!(event2, deser2);
assert_ne!(deser1, deser2);
Ok(())
}
5 changes: 5 additions & 0 deletions core/tests/serde/events/contract_to_account.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sender": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967",
"receiver": "npqEQFrcGTwcf9EcVpBDtSEK9eykqwCYwsEWa8PZXGMYZNxbarpeSYRJN7R9d2rpw8vbVySdFDUkZRDSFfHpo8doPnzsUYtnSuKsUxg7QJmrFAgArqUiivJkEhikJLNR1Da",
"value": "7206207196509697618"
}
5 changes: 5 additions & 0 deletions core/tests/serde/events/contract_to_contract.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sender": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967",
"receiver": "ea9f11f8dfb0ca08a8810f9ea39c3a6afb780859e8d8c7bc37b78e2f9b8d68d9",
"value": "2421668070752551774"
}
7 changes: 7 additions & 0 deletions core/tests/serde/events/convert_1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"sender": null,
"receiver": {
"Moonlight": "yZHBarsMK2sJXNhAVkZG66W3ofCsxnNTSmtdbhdxLHf7WLj2vQ5hL8pfsuy6FtHfdCrapQVcaPWDSL6HNFaBKU1QLoWoW7SWjaxm1NqfB3gDYPUK4WDMLTLAzTpD7qjGdQB"
},
"value": "17007309290515904425"
}
7 changes: 7 additions & 0 deletions core/tests/serde/events/convert_2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"sender": "yZHBarsMK2sJXNhAVkZG66W3ofCsxnNTSmtdbhdxLHf7WLj2vQ5hL8pfsuy6FtHfdCrapQVcaPWDSL6HNFaBKU1QLoWoW7SWjaxm1NqfB3gDYPUK4WDMLTLAzTpD7qjGdQB",
"receiver": {
"Phoenix": "3W3Qo9AmU6nKQtb3nEf1PC5wcA3AciLkRo2QuELx1FnXtYGjcZaSxyPmBoGtk9MGE2hjEjd5GYwbEch6xQj97swC"
},
"value": "16035815693455724047"
}
5 changes: 5 additions & 0 deletions core/tests/serde/events/deposit_1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sender": null,
"receiver": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967",
"value": "7206207196509697618"
}
5 changes: 5 additions & 0 deletions core/tests/serde/events/deposit_2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sender": "npqEQFrcGTwcf9EcVpBDtSEK9eykqwCYwsEWa8PZXGMYZNxbarpeSYRJN7R9d2rpw8vbVySdFDUkZRDSFfHpo8doPnzsUYtnSuKsUxg7QJmrFAgArqUiivJkEhikJLNR1Da",
"receiver": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967",
"value": "2598777197943013338"
}
11 changes: 11 additions & 0 deletions core/tests/serde/events/moonlight_tx_1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"sender": "qQtrG5wyyEf9xhRPwPmQ7ePkoSzwkA1LZpgBMMhai921FLaT9Lya6F6ErnTnv7bFc6MnPnVk9ZKSJLhjACHRDDy5wCYxfpa35syPxkPQxUWDVL57inUh7MvwyjMXW6jdzbk",
"receiver": "qQtrG5wyyEf9xhRPwPmQ7ePkoSzwkA1LZpgBMMhai921FLaT9Lya6F6ErnTnv7bFc6MnPnVk9ZKSJLhjACHRDDy5wCYxfpa35syPxkPQxUWDVL57inUh7MvwyjMXW6jdzbk",
"value": "15096102855551345792",
"memo": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967ea9f11f8dfb0ca08a8810f9ea39c3a6afb78",
"gas_spent": "11747410698588460779",
"refund_info": [
"qQtrG5wyyEf9xhRPwPmQ7ePkoSzwkA1LZpgBMMhai921FLaT9Lya6F6ErnTnv7bFc6MnPnVk9ZKSJLhjACHRDDy5wCYxfpa35syPxkPQxUWDVL57inUh7MvwyjMXW6jdzbk",
"2958535045913594748"
]
}
8 changes: 8 additions & 0 deletions core/tests/serde/events/moonlight_tx_2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"sender": "qQtrG5wyyEf9xhRPwPmQ7ePkoSzwkA1LZpgBMMhai921FLaT9Lya6F6ErnTnv7bFc6MnPnVk9ZKSJLhjACHRDDy5wCYxfpa35syPxkPQxUWDVL57inUh7MvwyjMXW6jdzbk",
"receiver": null,
"value": "8528224383862144033",
"memo": "a22427226377cc867d51ad3f130af08ad13451de7160efa2b23076fd782de967ea9f11f8dfb0ca08a8810f9ea39c3a6afb78",
"gas_spent": "12214700206207188090",
"refund_info": null
}
Loading

0 comments on commit c12f20d

Please sign in to comment.