Skip to content

Commit 78c2f6e

Browse files
committed
test(e2e): add weight queue crash recovery tests
- test_duplicate_epoch_rejected: verify dedup contract - test_crash_recovery_persistence: verify queue survives process kill - test_hotkey_rotation_clears_queue: verify hotkey change clears queue
1 parent 5c98246 commit 78c2f6e

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

tests/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ path = "channel_overflow_test.rs"
5757
name = "retry_queue_integration_test"
5858
path = "retry_queue_integration_test.rs"
5959

60+
[[test]]
61+
name = "weight_queue_tests"
62+
path = "weight_queue_tests.rs"
63+
6064
[dependencies]
6165
platform-core = { path = "../crates/core" }
6266
platform-storage = { path = "../crates/storage" }

tests/weight_queue_tests.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//! E2E tests for weight submission queue.
2+
//!
3+
//! Tests for WeightSubmissionQueue durability and state management.
4+
5+
use platform_storage::{PendingWeight, Storage, WeightSubmissionQueue};
6+
use tempfile::TempDir;
7+
8+
fn create_test_queue() -> (WeightSubmissionQueue, Storage, TempDir) {
9+
let dir = tempfile::tempdir().expect("Failed to create tempdir");
10+
let storage = Storage::open(dir.path()).expect("Failed to open storage");
11+
let queue = WeightSubmissionQueue::new(storage.db()).expect("Failed to create queue");
12+
(queue, storage, dir)
13+
}
14+
15+
fn create_test_weight(epoch: u64) -> PendingWeight {
16+
PendingWeight {
17+
epoch,
18+
weights: vec![(0, vec![1, 2, 3], vec![100, 200, 300])],
19+
attempt: 0,
20+
enqueued_at: 1000,
21+
}
22+
}
23+
24+
#[test]
25+
fn test_duplicate_epoch_rejected() {
26+
let (queue, _storage, _dir) = create_test_queue();
27+
28+
let weight = create_test_weight(10);
29+
queue.enqueue(weight).expect("First enqueue should succeed");
30+
31+
let duplicate = create_test_weight(10);
32+
let result = queue.enqueue(duplicate);
33+
34+
assert!(result.is_err(), "Second enqueue should fail");
35+
let err = result.expect_err("Should have error");
36+
let err_msg = err.to_string();
37+
assert!(
38+
err_msg.contains("Duplicate epoch"),
39+
"Error should contain 'Duplicate epoch', got: {}",
40+
err_msg
41+
);
42+
}
43+
44+
#[test]
45+
fn test_crash_recovery_persistence() {
46+
let dir = tempfile::tempdir().expect("Failed to create tempdir");
47+
let db_path = dir.path().to_path_buf();
48+
49+
{
50+
let storage = Storage::open(&db_path).expect("Failed to open storage");
51+
let queue = WeightSubmissionQueue::new(storage.db()).expect("Failed to create queue");
52+
let weight = create_test_weight(10);
53+
queue.enqueue(weight).expect("Enqueue should succeed");
54+
}
55+
56+
{
57+
let storage = Storage::open(&db_path).expect("Failed to reopen storage");
58+
let queue = WeightSubmissionQueue::new(storage.db()).expect("Failed to recreate queue");
59+
60+
let recovered = queue
61+
.dequeue()
62+
.expect("Dequeue should succeed")
63+
.expect("Should have recovered weight");
64+
assert_eq!(recovered.epoch, 10, "Should recover epoch 10");
65+
}
66+
}
67+
68+
#[test]
69+
fn test_hotkey_rotation_clears_queue() {
70+
let (queue, _storage, _dir) = create_test_queue();
71+
72+
queue
73+
.enqueue(create_test_weight(10))
74+
.expect("Enqueue epoch 10 should succeed");
75+
queue
76+
.enqueue(create_test_weight(20))
77+
.expect("Enqueue epoch 20 should succeed");
78+
79+
queue.clear().expect("Clear should succeed");
80+
81+
let dequeued = queue.dequeue().expect("Dequeue after clear should succeed");
82+
assert!(dequeued.is_none(), "Queue should be empty after clear");
83+
84+
let result = queue.enqueue(create_test_weight(10));
85+
assert!(
86+
result.is_ok(),
87+
"Enqueue epoch 10 after clear should succeed"
88+
);
89+
}

0 commit comments

Comments
 (0)