| 
25 | 25 | import java.time.Duration;  | 
26 | 26 | import java.time.temporal.ChronoUnit;  | 
27 | 27 | import java.util.Collections;  | 
 | 28 | +import java.util.List;  | 
28 | 29 | import java.util.concurrent.CountDownLatch;  | 
29 | 30 | import java.util.concurrent.TimeUnit;  | 
30 | 31 | import java.util.concurrent.atomic.AtomicInteger;  | 
@@ -353,4 +354,160 @@ void throwsExceptionForInvalidContext() {  | 
353 | 354 |           .hasMessageContaining("no such frame");  | 
354 | 355 |     }  | 
355 | 356 |   }  | 
 | 357 | + | 
 | 358 | +  @Test  | 
 | 359 | +  @NeedsFreshDriver  | 
 | 360 | +  void canAddDataCollector() {  | 
 | 361 | +    try (Network network = new Network(driver)) {  | 
 | 362 | +      AddDataCollectorParameters parameters =  | 
 | 363 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 1024);  | 
 | 364 | + | 
 | 365 | +      String collector = network.addDataCollector(parameters);  | 
 | 366 | +      assertThat(collector).isNotNull();  | 
 | 367 | +    }  | 
 | 368 | +  }  | 
 | 369 | + | 
 | 370 | +  @Test  | 
 | 371 | +  @NeedsFreshDriver  | 
 | 372 | +  void canAddDataCollectorWithCollectorType() {  | 
 | 373 | +    try (Network network = new Network(driver)) {  | 
 | 374 | +      AddDataCollectorParameters parameters =  | 
 | 375 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 2048).collectorType("blob");  | 
 | 376 | + | 
 | 377 | +      String collector = network.addDataCollector(parameters);  | 
 | 378 | +      assertThat(collector).isNotNull();  | 
 | 379 | +    }  | 
 | 380 | +  }  | 
 | 381 | + | 
 | 382 | +  @Test  | 
 | 383 | +  @NeedsFreshDriver  | 
 | 384 | +  void canAddDataCollectorWithContexts() {  | 
 | 385 | +    try (Network network = new Network(driver)) {  | 
 | 386 | +      String contextId = driver.getWindowHandle();  | 
 | 387 | +      AddDataCollectorParameters parameters =  | 
 | 388 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 1024)  | 
 | 389 | +              .contexts(List.of(contextId));  | 
 | 390 | + | 
 | 391 | +      String collector = network.addDataCollector(parameters);  | 
 | 392 | +      assertThat(collector).isNotNull();  | 
 | 393 | +    }  | 
 | 394 | +  }  | 
 | 395 | + | 
 | 396 | +  @Test  | 
 | 397 | +  @NeedsFreshDriver  | 
 | 398 | +  void canGetDataWithoutCollector() throws InterruptedException {  | 
 | 399 | +    try (Network network = new Network(driver)) {  | 
 | 400 | +      CountDownLatch latch = new CountDownLatch(1);  | 
 | 401 | + | 
 | 402 | +      network.onResponseCompleted(  | 
 | 403 | +          responseDetails -> {  | 
 | 404 | +            String requestId = responseDetails.getRequest().getRequestId();  | 
 | 405 | +            GetDataParameters parameters = new GetDataParameters(DataType.RESPONSE, requestId);  | 
 | 406 | + | 
 | 407 | +            // browsers don't store body bytes for responses without a collector  | 
 | 408 | +            assertThatThrownBy(() -> network.getData(parameters))  | 
 | 409 | +                .isInstanceOf(BiDiException.class)  | 
 | 410 | +                .hasMessageContaining("no such network data");  | 
 | 411 | + | 
 | 412 | +            latch.countDown();  | 
 | 413 | +          });  | 
 | 414 | + | 
 | 415 | +      BrowsingContext browsingContext = new BrowsingContext(driver, driver.getWindowHandle());  | 
 | 416 | +      browsingContext.navigate(  | 
 | 417 | +          appServer.whereIs("/bidi/logEntryAdded.html"), ReadinessState.COMPLETE);  | 
 | 418 | + | 
 | 419 | +      boolean countdown = latch.await(5, TimeUnit.SECONDS);  | 
 | 420 | +      assertThat(countdown).isTrue();  | 
 | 421 | +    }  | 
 | 422 | +  }  | 
 | 423 | + | 
 | 424 | +  @Test  | 
 | 425 | +  @NeedsFreshDriver  | 
 | 426 | +  void canGetDataWithCollector() throws InterruptedException {  | 
 | 427 | +    try (Network network = new Network(driver)) {  | 
 | 428 | +      AddDataCollectorParameters collectorParams =  | 
 | 429 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 1024);  | 
 | 430 | +      String collector = network.addDataCollector(collectorParams);  | 
 | 431 | + | 
 | 432 | +      CountDownLatch latch = new CountDownLatch(1);  | 
 | 433 | + | 
 | 434 | +      network.onResponseCompleted(  | 
 | 435 | +          responseDetails -> {  | 
 | 436 | +            String requestId = responseDetails.getRequest().getRequestId();  | 
 | 437 | +            GetDataParameters parameters =  | 
 | 438 | +                new GetDataParameters(DataType.RESPONSE, requestId).collector(collector);  | 
 | 439 | + | 
 | 440 | +            BytesValue result = network.getData(parameters);  | 
 | 441 | +            assertThat(result).isNotNull();  | 
 | 442 | +            assertThat(result.getValue()).isNotNull();  | 
 | 443 | + | 
 | 444 | +            latch.countDown();  | 
 | 445 | +          });  | 
 | 446 | + | 
 | 447 | +      BrowsingContext browsingContext = new BrowsingContext(driver, driver.getWindowHandle());  | 
 | 448 | +      browsingContext.navigate(  | 
 | 449 | +          appServer.whereIs("/bidi/logEntryAdded.html"), ReadinessState.COMPLETE);  | 
 | 450 | + | 
 | 451 | +      boolean countdown = latch.await(5, TimeUnit.SECONDS);  | 
 | 452 | +      assertThat(countdown).isTrue();  | 
 | 453 | +    }  | 
 | 454 | +  }  | 
 | 455 | + | 
 | 456 | +  @Test  | 
 | 457 | +  @NeedsFreshDriver  | 
 | 458 | +  void canGetDataWithDisown() throws InterruptedException {  | 
 | 459 | +    try (Network network = new Network(driver)) {  | 
 | 460 | +      AddDataCollectorParameters collectorParams =  | 
 | 461 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 2048);  | 
 | 462 | +      String collector = network.addDataCollector(collectorParams);  | 
 | 463 | + | 
 | 464 | +      CountDownLatch latch = new CountDownLatch(1);  | 
 | 465 | + | 
 | 466 | +      network.onResponseCompleted(  | 
 | 467 | +          responseDetails -> {  | 
 | 468 | +            String requestId = responseDetails.getRequest().getRequestId();  | 
 | 469 | +            GetDataParameters disownParams =  | 
 | 470 | +                new GetDataParameters(DataType.RESPONSE, requestId)  | 
 | 471 | +                    .collector(collector)  | 
 | 472 | +                    .disown(true);  | 
 | 473 | + | 
 | 474 | +            // First fetch should succeed  | 
 | 475 | +            BytesValue result = network.getData(disownParams);  | 
 | 476 | +            assertThat(result).isNotNull();  | 
 | 477 | +            assertThat(result.getValue()).isNotNull();  | 
 | 478 | + | 
 | 479 | +            // Second fetch with same collector should fail, because disowned  | 
 | 480 | +            GetDataParameters secondParams =  | 
 | 481 | +                new GetDataParameters(DataType.RESPONSE, requestId).collector(collector);  | 
 | 482 | + | 
 | 483 | +            assertThatThrownBy(() -> network.getData(secondParams))  | 
 | 484 | +                .isInstanceOf(BiDiException.class)  | 
 | 485 | +                .hasMessageContaining("no such network data");  | 
 | 486 | + | 
 | 487 | +            latch.countDown();  | 
 | 488 | +          });  | 
 | 489 | + | 
 | 490 | +      BrowsingContext browsingContext = new BrowsingContext(driver, driver.getWindowHandle());  | 
 | 491 | +      browsingContext.navigate(  | 
 | 492 | +          appServer.whereIs("/bidi/logEntryAdded.html"), ReadinessState.COMPLETE);  | 
 | 493 | + | 
 | 494 | +      boolean countdown = latch.await(5, TimeUnit.SECONDS);  | 
 | 495 | +      assertThat(countdown).isTrue();  | 
 | 496 | +    }  | 
 | 497 | +  }  | 
 | 498 | + | 
 | 499 | +  @Test  | 
 | 500 | +  @NeedsFreshDriver  | 
 | 501 | +  void canRemoveDataCollector() {  | 
 | 502 | +    try (Network network = new Network(driver)) {  | 
 | 503 | +      AddDataCollectorParameters parameters =  | 
 | 504 | +          new AddDataCollectorParameters(List.of(DataType.RESPONSE), 1024);  | 
 | 505 | + | 
 | 506 | +      String collector = network.addDataCollector(parameters);  | 
 | 507 | +      assertThat(collector).isNotNull();  | 
 | 508 | + | 
 | 509 | +      // Remove the collector, should not throw any exception  | 
 | 510 | +      network.removeDataCollector(collector);  | 
 | 511 | +    }  | 
 | 512 | +  }  | 
356 | 513 | }  | 
0 commit comments