upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/sync/discovery.rs131
-rw-r--r--tests/sync/mod.rs10
2 files changed, 4 insertions, 137 deletions
diff --git a/tests/sync/discovery.rs b/tests/sync/discovery.rs
index 5fcda69..d45a290 100644
--- a/tests/sync/discovery.rs
+++ b/tests/sync/discovery.rs
@@ -3,10 +3,6 @@
3//! Tests for relay discovery from announcement events. 3//! Tests for relay discovery from announcement events.
4//! When a relay receives an announcement listing another relay, 4//! When a relay receives an announcement listing another relay,
5//! it should discover and connect to that relay to sync events. 5//! it should discover and connect to that relay to sync events.
6//!
7//! # Tests
8//! - Test 2: Direct Layer 3 discovery from Layer 2
9//! - Test 3: Recursive multi-hop Layer 3 discovery
10 6
11use std::time::Duration; 7use std::time::Duration;
12 8
@@ -240,130 +236,3 @@ async fn test_relay_discovery_via_announcements_with_historic_sync() {
240 ); 236 );
241} 237}
242 238
243/// Test 3: 3-relay recursive discovery - relay discovers third relay through bootstrap
244///
245/// Scenario:
246/// ```text
247/// relay_a (SUT) relay_b (bootstrap) relay_c (discovered)
248/// │ │ │
249/// │ │ has announcement_x │ has announcement_y
250/// │ │ listing A+B+C │ listing A+C
251/// │ │ │
252/// ├────connect──────────► │
253/// │◄───sync announcement_x───────────────────────
254/// │ │
255/// │ discovers relay_c from announcement_x │
256/// │ │
257/// ├─────────────connect─────────────────────────►
258/// │◄────────────sync announcement_y─────────────┘
259/// ```
260///
261/// This tests that relay_a:
262/// 1. Connects to relay_b (configured as bootstrap)
263/// 2. Receives announcement_x which lists relay_c
264/// 3. Discovers and connects to relay_c
265/// 4. Syncs announcement_y from relay_c
266///
267#[tokio::test]
268async fn test_recursive_relay_discovery_via_announcements_with_historic_sync() {
269 // 1. Start all three relays
270
271 // relay_b - will be the bootstrap relay, has announcement_x
272 let relay_b = TestRelay::start().await;
273 println!(
274 "relay_b (bootstrap) started at {} (domain: {})",
275 relay_b.url(),
276 relay_b.domain()
277 );
278
279 // relay_c - will be discovered via announcement_x, has announcement_y
280 let relay_c = TestRelay::start().await;
281 println!(
282 "relay_c (to be discovered) started at {} (domain: {})",
283 relay_c.url(),
284 relay_c.domain()
285 );
286
287 // relay_a - SUT, starts with relay_b as bootstrap
288 let relay_a = TestRelay::start_with_sync(Some(relay_b.url().to_string())).await;
289 println!(
290 "relay_a (SUT) started at {} (domain: {})",
291 relay_a.url(),
292 relay_a.domain()
293 );
294
295 // 2. Create test keys (one for each announcement)
296 let keys_x = Keys::generate();
297 let keys_y = Keys::generate();
298
299 // 3. Set up announcement_x on relay_b (lists all three relays: A+B+C) with git data
300 let domains_x = vec![relay_a.domain(), relay_b.domain(), relay_c.domain()];
301 let domain_refs_x: Vec<&str> = domains_x.iter().map(|s| s.as_str()).collect();
302
303 let (announcement_x, _git_dir_b) =
304 setup_announcement_on_relay(&relay_b, &keys_x, &domain_refs_x, "repo-x-all-relays").await;
305 let announcement_x_id = announcement_x.id;
306 println!("announcement_x {} set up on relay_b with git data (listing A+B+C)", announcement_x_id);
307
308 // 4. Set up announcement_y on relay_c (lists only A+C, NOT B) with git data
309 let domains_y = vec![relay_a.domain(), relay_c.domain()];
310 let domain_refs_y: Vec<&str> = domains_y.iter().map(|s| s.as_str()).collect();
311
312 let (announcement_y, _git_dir_c) =
313 setup_announcement_on_relay(&relay_c, &keys_y, &domain_refs_y, "repo-y-ac-only").await;
314 let announcement_y_id = announcement_y.id;
315 println!("announcement_y {} set up on relay_c with git data (listing A+C only)", announcement_y_id);
316
317 // 7. Wait for relay_a to:
318 // - Sync from bootstrap relay_b (gets announcement_x)
319 // - Discover relay_c from announcement_x's relays tag
320 // - Connect to relay_c and sync announcement_y
321 // With purgatory, each relay needs to: sync announcement → purgatory → sync state event →
322 // immediate purgatory sync → fetch git data → promote. Allow extra time for this.
323 println!("Waiting 12s for recursive relay discovery (with purgatory flow)...");
324 tokio::time::sleep(Duration::from_secs(12)).await;
325
326 // 8. Verify announcement_x was synced to relay_a (from bootstrap relay_b)
327 let filter_x = Filter::new()
328 .kind(Kind::GitRepoAnnouncement)
329 .author(keys_x.public_key());
330
331 let announcement_x_synced =
332 wait_for_event_on_relay(relay_a.url(), filter_x, Duration::from_secs(5)).await;
333
334 println!(
335 "announcement_x {} synced to relay_a: {}",
336 announcement_x_id, announcement_x_synced
337 );
338
339 // 9. Verify announcement_y was synced to relay_a (from discovered relay_c)
340 let filter_y = Filter::new()
341 .kind(Kind::GitRepoAnnouncement)
342 .author(keys_y.public_key());
343
344 let announcement_y_synced =
345 wait_for_event_on_relay(relay_a.url(), filter_y, Duration::from_secs(5)).await;
346
347 println!(
348 "announcement_y {} synced to relay_a: {}",
349 announcement_y_id, announcement_y_synced
350 );
351
352 // 10. Cleanup
353 relay_a.stop().await;
354 relay_b.stop().await;
355 relay_c.stop().await;
356
357 // 11. Assertions
358 assert!(
359 announcement_x_synced,
360 "announcement_x {} should have synced from bootstrap relay_b to relay_a",
361 announcement_x_id
362 );
363
364 assert!(
365 announcement_y_synced,
366 "announcement_y {} should have synced from discovered relay_c to relay_a (recursive discovery)",
367 announcement_y_id
368 );
369}
diff --git a/tests/sync/mod.rs b/tests/sync/mod.rs
index 400341f..70c6981 100644
--- a/tests/sync/mod.rs
+++ b/tests/sync/mod.rs
@@ -82,14 +82,12 @@
82//! **Example from `discovery.rs`:** 82//! **Example from `discovery.rs`:**
83//! ```rust 83//! ```rust
84//! #[tokio::test] 84//! #[tokio::test]
85//! async fn test_recursive_relay_discovery() { 85//! async fn test_discovers_layer3_via_layer2() {
86//! // Multi-relay orchestration 86//! // Multi-relay orchestration
87//! let relay1 = TestRelay::start().await; 87//! let relay_a = TestRelay::start().await;
88//! let relay2 = TestRelay::start().await; 88//! let relay_b = TestRelay::start_with_sync(None).await;
89//! let relay3 = TestRelay::start().await;
90//! 89//!
91//! // relay1 announces relay2, relay2 announces relay3 90//! // relay_b receives announcement listing relay_a, discovers and syncs from it
92//! // Verify relay1 discovers relay3 through chain
93//! } 91//! }
94//! ``` 92//! ```
95//! 93//!