Skip to content

Commit f9cb358

Browse files
central_systest_blobs: sort hashsets when dumping
1 parent c0d0ac9 commit f9cb358

5 files changed

Lines changed: 50 additions & 17 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/central_systest_blobs/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ expect-test.workspace = true
1919
google-cloud-storage.workspace = true
2020
http.workspace = true
2121
mockall.workspace = true
22+
serde.workspace = true
2223
serde_json.workspace = true
2324
starknet_api = { workspace = true, features = ["testing"] }
2425
starknet_committer = { workspace = true, features = ["testing"] }
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4
1+
5
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
{
22
"block_number": 0,
3-
"round": 0,
4-
"write_iteration": 0,
53
"pre_confirmed_block": {
6-
"status": "PRE_CONFIRMED",
7-
"starknet_version": "0.14.3",
84
"l1_da_mode": "CALLDATA",
9-
"l1_gas_price": {
5+
"l1_data_gas_price": {
106
"price_in_fri": "0x1",
117
"price_in_wei": "0x1"
128
},
13-
"l1_data_gas_price": {
9+
"l1_gas_price": {
1410
"price_in_fri": "0x1",
1511
"price_in_wei": "0x1"
1612
},
1713
"l2_gas_price": {
1814
"price_in_fri": "0x1",
1915
"price_in_wei": "0x1"
2016
},
21-
"timestamp": 1000,
2217
"sequencer_address": "0x1000",
23-
"transactions": [],
18+
"starknet_version": "0.14.3",
19+
"status": "PRE_CONFIRMED",
20+
"timestamp": 1000,
2421
"transaction_receipts": [],
25-
"transaction_state_diffs": []
26-
}
27-
}
22+
"transaction_state_diffs": [],
23+
"transactions": []
24+
},
25+
"round": 0,
26+
"write_iteration": 0
27+
}

crates/central_systest_blobs/src/cende_blob_regression_test.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,38 @@ impl BlobFactory {
494494
// Blob file storage
495495
// =====================
496496

497+
/// Sorts arrays of HashSet-backed fields that have non-deterministic iteration order.
498+
/// Object keys are already deterministic because serde_json::Value uses BTreeMap.
499+
fn normalize_set_arrays(value: &mut serde_json::Value) {
500+
const SET_FIELDS: &[&str] =
501+
&["accessed_blocks", "accessed_contract_addresses", "accessed_storage_keys"];
502+
match value {
503+
serde_json::Value::Object(map) => {
504+
for (key, val) in map.iter_mut() {
505+
if SET_FIELDS.contains(&key.as_str()) {
506+
if let serde_json::Value::Array(arr) = val {
507+
arr.sort_by_key(|a| a.to_string());
508+
}
509+
} else {
510+
normalize_set_arrays(val);
511+
}
512+
}
513+
}
514+
serde_json::Value::Array(arr) => {
515+
for item in arr.iter_mut() {
516+
normalize_set_arrays(item);
517+
}
518+
}
519+
_ => {}
520+
}
521+
}
522+
523+
fn to_normalized_json(value: &impl serde::Serialize) -> String {
524+
let mut json_value = serde_json::to_value(value).unwrap();
525+
normalize_set_arrays(&mut json_value);
526+
format!("{}\n", serde_json::to_string_pretty(&json_value).unwrap())
527+
}
528+
497529
async fn gcs_client() -> Client {
498530
Client::new(ClientConfig::default().with_auth().await.expect(
499531
"Failed to create GCS client config. Did you run `gcloud auth application-default login`?",
@@ -534,8 +566,8 @@ async fn fetch_raw_blobs_at_generation(
534566
}
535567

536568
/// Pushes the blobs to GCS.
537-
async fn bump_generation_and_store_blob_file(blobs: &[AerospikeBlob], client: &Client) {
538-
let blobs_json = serde_json::to_string_pretty(blobs).unwrap();
569+
async fn bump_generation_and_store_blob_file(blobs: Vec<AerospikeBlob>, client: &Client) {
570+
let blobs_json = to_normalized_json(&blobs);
539571
let next_generation = find_next_available_blobs_generation(client).await;
540572
client
541573
.upload_object(
@@ -570,13 +602,12 @@ async fn test_make_data() {
570602
// TODO(Dori): create txs.
571603
let (blobs, preconfirmed_block) = blob_factory.finalize().await;
572604
expect_file![CHAIN_INFO_PATH].assert_eq(&serde_json::to_string_pretty(&chain_info).unwrap());
573-
expect_file![PRECONFIRMED_BLOCK_PATH]
574-
.assert_eq(&serde_json::to_string_pretty(&preconfirmed_block).unwrap());
605+
expect_file![PRECONFIRMED_BLOCK_PATH].assert_eq(&to_normalized_json(&preconfirmed_block));
575606

576607
// Upload or download blobs depending on the fix mode.
577608
let client = gcs_client().await;
578609
if env::var("UPDATE_EXPECT").is_ok() {
579-
bump_generation_and_store_blob_file(&blobs, &client).await;
610+
bump_generation_and_store_blob_file(blobs, &client).await;
580611
} else {
581612
let fetched_blobs = fetch_blob_file(&client).await;
582613
assert_eq!(

0 commit comments

Comments
 (0)