diff options
Diffstat (limited to 'tests/sync/discovery.rs')
| -rw-r--r-- | tests/sync/discovery.rs | 164 |
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() |