aboutsummaryrefslogtreecommitdiffstats
path: root/src/simtest/timing.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/simtest/timing.rs')
-rw-r--r--src/simtest/timing.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/simtest/timing.rs b/src/simtest/timing.rs
index fd76a17..daa588f 100644
--- a/src/simtest/timing.rs
+++ b/src/simtest/timing.rs
@@ -1,5 +1,5 @@
//! The timing rules of `peers.md` on whole nodes: joining and converging, dormancy and
-//! return, and late messages that must not undo what newer ones said.
+//! return, a restart, and late messages that must not undo what newer ones said.
use std::time::Duration;
@@ -46,6 +46,28 @@ async fn three_nodes_join_and_converge() {
}
}
+/// A node that restarts without a document file (its process gone, a new one on the
+/// same ID) joins again and gets the document; what its earlier run sends on is lost.
+#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
+async fn restarted_node_joins_again() {
+ let sim = Sim::new(9);
+ let a = sim.start("a", &[], Start::Genesis);
+ let b = sim.start("b", &["a"], Start::Join);
+ sim.wait_ready(&[&a, &b], SOON).await;
+ write(&a, "before", json!(1)).await;
+ sim.wait_converged(&[&a, &b], SOON).await;
+
+ let b = sim.restart_with("b", &["a"], Start::Join, |_| {});
+ sim.wait_ready(&[&b], SOON).await;
+ let b = &b;
+ sim.wait_until("b has the document again", SOON, move || async move {
+ read(b, "before").await == Some(json!(1))
+ })
+ .await;
+ write(b, "after", json!(2)).await;
+ sim.wait_converged(&[&a, b], SOON).await;
+}
+
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn converges_with_duplicated_and_reordered_messages() {
let sim = Sim::new(2);