upleb.uk

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

summaryrefslogtreecommitdiff
path: root/tests/sync/discovery.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-18 23:17:08 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-23 12:05:05 +0000
commit49b9405dfcbb872686acdd7abc12dc9c94adc2ab (patch)
tree2bd54765aad3853dddd68119c9143626ba3bfdaa /tests/sync/discovery.rs
parent63865548b07e44d69321af3b03ca2c29aa60d74d (diff)
test: update sync tests to set up git data for purgatory flow
All sync tests now create a local git repo, send announcement + state event to the source relay, and push git data to release both from purgatory before the syncing relay starts bootstrap sync.
Diffstat (limited to 'tests/sync/discovery.rs')
-rw-r--r--tests/sync/discovery.rs164
1 files changed, 50 insertions, 114 deletions
diff --git a/tests/sync/discovery.rs b/tests/sync/discovery.rs
index 8ed80b5..5fcda69 100644
--- a/tests/sync/discovery.rs
+++ b/tests/sync/discovery.rs
@@ -62,29 +62,26 @@ async fn test_discovers_layer3_via_layer2() {
62 // 3. Create test keys 62 // 3. Create test keys
63 let keys = Keys::generate(); 63 let keys = Keys::generate();
64 64
65 // 4. Create a repository announcement that lists BOTH relays 65 // 4. Set up repository announcement on relay_a with git data
66 let announcement = create_repo_announcement( 66 // (purgatory requires git data before announcements are accepted)
67 &keys, 67 let repo_id = "test-repo-discovery";
68 &[&relay_a.domain(), &relay_b.domain()], 68 let domains = vec![relay_a.domain(), relay_b.domain()];
69 "test-repo-discovery", 69 let domain_refs: Vec<&str> = domains.iter().map(|s| s.as_str()).collect();
70 ); 70
71 let (announcement, _git_dir_a) =
72 setup_announcement_on_relay(&relay_a, &keys, &domain_refs, repo_id).await;
71 let announcement_id = announcement.id; 73 let announcement_id = announcement.id;
72
73 println!( 74 println!(
74 "Created announcement {} (kind {})", 75 "Announcement {} set up on relay_a with git data",
75 announcement_id, 76 announcement_id
76 announcement.kind.as_u16()
77 ); 77 );
78 for tag in announcement.tags.iter() {
79 println!(" Tag: {:?}", tag.as_slice());
80 }
81 78
82 // 5. Build the repo coordinate for the 'a' tag in the patch 79 // 5. Build the repo coordinate for the 'a' tag in the patch
83 let repo_coord = format!( 80 let repo_coord = format!(
84 "{}:{}:{}", 81 "{}:{}:{}",
85 Kind::GitRepoAnnouncement.as_u16(), 82 Kind::GitRepoAnnouncement.as_u16(),
86 keys.public_key().to_hex(), 83 keys.public_key().to_hex(),
87 "test-repo-discovery" 84 repo_id
88 ); 85 );
89 86
90 // 6. Create a patch event (Layer 2) that references the announcement 87 // 6. Create a patch event (Layer 2) that references the announcement
@@ -97,22 +94,13 @@ async fn test_discovers_layer3_via_layer2() {
97 let patch_id = patch.id; 94 let patch_id = patch.id;
98 95
99 println!("Created patch {} (kind {})", patch_id, patch.kind.as_u16()); 96 println!("Created patch {} (kind {})", patch_id, patch.kind.as_u16());
100 for tag in patch.tags.iter() {
101 println!(" Tag: {:?}", tag.as_slice());
102 }
103 97
104 // 7. Send announcement and patch to relay_a ONLY 98 // 7. Send patch to relay_a
105 let client_a = TestClient::new(relay_a.url(), keys.clone()) 99 let client_a = TestClient::new(relay_a.url(), keys.clone())
106 .await 100 .await
107 .expect("Failed to connect to relay_a"); 101 .expect("Failed to connect to relay_a");
108 102
109 client_a 103 client_a
110 .send_event(&announcement)
111 .await
112 .expect("Failed to send announcement to relay_a");
113 println!("Announcement sent to relay_a");
114
115 client_a
116 .send_event(&patch) 104 .send_event(&patch)
117 .await 105 .await
118 .expect("Failed to send patch to relay_a"); 106 .expect("Failed to send patch to relay_a");
@@ -120,18 +108,10 @@ async fn test_discovers_layer3_via_layer2() {
120 108
121 client_a.disconnect().await; 109 client_a.disconnect().await;
122 110
123 // 8. Send announcement to relay_b directly (triggers discovery of relay_a) 111 // 8. Set up announcement on relay_b (triggers discovery of relay_a)
124 let client_b = TestClient::new(relay_b.url(), keys.clone()) 112 let (_announcement_b, _git_dir_b) =
125 .await 113 setup_announcement_on_relay(&relay_b, &keys, &domain_refs, repo_id).await;
126 .expect("Failed to connect to relay_b"); 114 println!("Announcement set up on relay_b (should trigger discovery of relay_a)");
127
128 client_b
129 .send_event(&announcement)
130 .await
131 .expect("Failed to send announcement to relay_b");
132 println!("Announcement sent to relay_b (should trigger discovery of relay_a)");
133
134 client_b.disconnect().await;
135 115
136 // 9. Wait for relay_b to discover relay_a and sync the patch 116 // 9. Wait for relay_b to discover relay_a and sync the patch
137 println!("Waiting 3s for relay_b to discover relay_a and sync patch..."); 117 println!("Waiting 3s for relay_b to discover relay_a and sync patch...");
@@ -197,19 +177,20 @@ async fn test_relay_discovery_via_announcements_with_historic_sync() {
197 // 3. Create test keys 177 // 3. Create test keys
198 let keys = Keys::generate(); 178 let keys = Keys::generate();
199 179
200 // 4. Create the event chain on relay_a: 180 // 4. Set up repository on relay_a with git data and a Layer 2 issue
201 181
202 // Layer 1: Repository announcement 182 // Layer 1: Set up announcement with git data
203 let announcement = create_repo_announcement( 183 let domains = vec![relay_a.domain(), relay_b.domain()];
204 &keys, 184 let domain_refs: Vec<&str> = domains.iter().map(|s| s.as_str()).collect();
205 &[&relay_a.domain(), &relay_b.domain()], 185 let repo_id = "test-repo-chain";
206 "test-repo-chain", 186
207 ); 187 let (announcement, _git_dir_a) =
188 setup_announcement_on_relay(&relay_a, &keys, &domain_refs, repo_id).await;
208 let announcement_id = announcement.id; 189 let announcement_id = announcement.id;
209 println!("Created announcement {} (Layer 1)", announcement_id); 190 println!("Announcement {} set up on relay_a with git data (Layer 1)", announcement_id);
210 191
211 // Build repo coordinate for Layer 2 reference 192 // Build repo coordinate for Layer 2 reference
212 let repo_coord = repo_coord(&keys, "test-repo-chain"); 193 let repo_coord = repo_coord(&keys, repo_id);
213 194
214 // Layer 2: Issue referencing the repo 195 // Layer 2: Issue referencing the repo
215 let issue = build_layer2_issue_event(&keys, &repo_coord, "Test issue for chain discovery") 196 let issue = build_layer2_issue_event(&keys, &repo_coord, "Test issue for chain discovery")
@@ -217,35 +198,23 @@ async fn test_relay_discovery_via_announcements_with_historic_sync() {
217 let issue_id = issue.id; 198 let issue_id = issue.id;
218 println!("Created issue {} (Layer 2)", issue_id); 199 println!("Created issue {} (Layer 2)", issue_id);
219 200
220 // 5. Send all events to relay_a 201 // 5. Send issue to relay_a
221 let client_a = TestClient::new(relay_a.url(), keys.clone()) 202 let client_a = TestClient::new(relay_a.url(), keys.clone())
222 .await 203 .await
223 .expect("Failed to connect to relay_a"); 204 .expect("Failed to connect to relay_a");
224 205
225 client_a 206 client_a
226 .send_event(&announcement)
227 .await
228 .expect("Failed to send announcement");
229 client_a
230 .send_event(&issue) 207 .send_event(&issue)
231 .await 208 .await
232 .expect("Failed to send issue"); 209 .expect("Failed to send issue");
233 210
234 println!("Events sent to relay_a"); 211 println!("Issue sent to relay_a");
235 client_a.disconnect().await; 212 client_a.disconnect().await;
236 213
237 // 6. Send only the announcement to relay_b (triggers discovery) 214 // 6. Set up announcement on relay_b (triggers discovery of relay_a)
238 let client_b = TestClient::new(relay_b.url(), keys.clone()) 215 let (_announcement_b, _git_dir_b) =
239 .await 216 setup_announcement_on_relay(&relay_b, &keys, &domain_refs, repo_id).await;
240 .expect("Failed to connect to relay_b"); 217 println!("Announcement set up on relay_b (should trigger discovery of relay_a)");
241
242 client_b
243 .send_event(&announcement)
244 .await
245 .expect("Failed to send announcement to relay_b");
246 println!("Announcement sent to relay_b (should trigger discovery)");
247
248 client_b.disconnect().await;
249 218
250 // 7. Wait for sync 219 // 7. Wait for sync
251 println!("Waiting 3s for Layer 2 sync..."); 220 println!("Waiting 3s for Layer 2 sync...");
@@ -327,65 +296,32 @@ async fn test_recursive_relay_discovery_via_announcements_with_historic_sync() {
327 let keys_x = Keys::generate(); 296 let keys_x = Keys::generate();
328 let keys_y = Keys::generate(); 297 let keys_y = Keys::generate();
329 298
330 // 3. Create announcement_x on relay_b (lists all three relays: A+B+C) 299 // 3. Set up announcement_x on relay_b (lists all three relays: A+B+C) with git data
331 let announcement_x = create_repo_announcement( 300 let domains_x = vec![relay_a.domain(), relay_b.domain(), relay_c.domain()];
332 &keys_x, 301 let domain_refs_x: Vec<&str> = domains_x.iter().map(|s| s.as_str()).collect();
333 &[&relay_a.domain(), &relay_b.domain(), &relay_c.domain()],
334 "repo-x-all-relays",
335 );
336 let announcement_x_id = announcement_x.id;
337 println!("Created announcement_x {} listing A+B+C", announcement_x_id);
338 for tag in announcement_x.tags.iter() {
339 println!(" Tag: {:?}", tag.as_slice());
340 }
341
342 // 4. Create announcement_y on relay_c (lists only A+C, NOT B)
343 let announcement_y = create_repo_announcement(
344 &keys_y,
345 &[&relay_a.domain(), &relay_c.domain()],
346 "repo-y-ac-only",
347 );
348 let announcement_y_id = announcement_y.id;
349 println!(
350 "Created announcement_y {} listing A+C only",
351 announcement_y_id
352 );
353 for tag in announcement_y.tags.iter() {
354 println!(" Tag: {:?}", tag.as_slice());
355 }
356
357 // 5. Send announcement_x to relay_b only
358 let client_b = TestClient::new(relay_b.url(), keys_x.clone())
359 .await
360 .expect("Failed to connect to relay_b");
361
362 client_b
363 .send_event(&announcement_x)
364 .await
365 .expect("Failed to send announcement_x to relay_b");
366 println!("announcement_x sent to relay_b");
367
368 client_b.disconnect().await;
369 302
370 // 6. Send announcement_y to relay_c only 303 let (announcement_x, _git_dir_b) =
371 let client_c = TestClient::new(relay_c.url(), keys_y.clone()) 304 setup_announcement_on_relay(&relay_b, &keys_x, &domain_refs_x, "repo-x-all-relays").await;
372 .await 305 let announcement_x_id = announcement_x.id;
373 .expect("Failed to connect to relay_c"); 306 println!("announcement_x {} set up on relay_b with git data (listing A+B+C)", announcement_x_id);
374 307
375 client_c 308 // 4. Set up announcement_y on relay_c (lists only A+C, NOT B) with git data
376 .send_event(&announcement_y) 309 let domains_y = vec![relay_a.domain(), relay_c.domain()];
377 .await 310 let domain_refs_y: Vec<&str> = domains_y.iter().map(|s| s.as_str()).collect();
378 .expect("Failed to send announcement_y to relay_c");
379 println!("announcement_y sent to relay_c");
380 311
381 client_c.disconnect().await; 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);
382 316
383 // 7. Wait for relay_a to: 317 // 7. Wait for relay_a to:
384 // - Sync from bootstrap relay_b (gets announcement_x) 318 // - Sync from bootstrap relay_b (gets announcement_x)
385 // - Discover relay_c from announcement_x's relays tag 319 // - Discover relay_c from announcement_x's relays tag
386 // - Connect to relay_c and sync announcement_y 320 // - Connect to relay_c and sync announcement_y
387 println!("Waiting 5s for recursive relay discovery..."); 321 // With purgatory, each relay needs to: sync announcement → purgatory → sync state event →
388 tokio::time::sleep(Duration::from_secs(5)).await; 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;
389 325
390 // 8. Verify announcement_x was synced to relay_a (from bootstrap relay_b) 326 // 8. Verify announcement_x was synced to relay_a (from bootstrap relay_b)
391 let filter_x = Filter::new() 327 let filter_x = Filter::new()