|
77 | 77 | import java.io.IOException; |
78 | 78 | import java.time.Duration; |
79 | 79 | import java.time.Instant; |
80 | | -import java.util.ArrayList; |
81 | 80 | import java.util.List; |
82 | 81 | import java.util.concurrent.CompletableFuture; |
| 82 | +import java.util.concurrent.CopyOnWriteArrayList; |
83 | 83 | import java.util.concurrent.ExecutionException; |
84 | 84 | import java.util.concurrent.Executors; |
85 | 85 | import java.util.concurrent.ScheduledExecutorService; |
@@ -448,23 +448,44 @@ public void refreshConfigTest() throws Exception { |
448 | 448 |
|
449 | 449 | sessionPool.start(request, new Metadata()); |
450 | 450 |
|
451 | | - Thread.sleep(500); |
| 451 | + long deadline = System.currentTimeMillis() + 10_000; |
| 452 | + boolean conditionMet = false; |
| 453 | + List<SessionRequest> requests = null; |
| 454 | + boolean containsHeader = false; |
| 455 | + |
| 456 | + while (System.currentTimeMillis() < deadline) { |
| 457 | + requests = fakeService.getSessionRequests(); |
| 458 | + List<Metadata> headers = headerInterceptor.getHeadersList(); |
| 459 | + |
| 460 | + boolean matchesRefreshRequest = false; |
| 461 | + for (SessionRequest r : requests) { |
| 462 | + if (OPEN_SESSION_REQUEST_CORRESPONDENCE.compare(r, refreshRequest)) { |
| 463 | + matchesRefreshRequest = true; |
| 464 | + break; |
| 465 | + } |
| 466 | + } |
| 467 | + |
| 468 | + containsHeader = false; |
| 469 | + for (Metadata header : headers) { |
| 470 | + if (header.containsKey(metadataKey) && "refresh_value".equals(header.get(metadataKey))) { |
| 471 | + containsHeader = true; |
| 472 | + break; |
| 473 | + } |
| 474 | + } |
452 | 475 |
|
453 | | - List<SessionRequest> requests = fakeService.getSessionRequests(); |
| 476 | + if (requests.size() > 1 && matchesRefreshRequest && containsHeader) { |
| 477 | + conditionMet = true; |
| 478 | + break; |
| 479 | + } |
| 480 | + |
| 481 | + Thread.sleep(50); |
| 482 | + } |
| 483 | + |
| 484 | + assertThat(conditionMet).isTrue(); |
454 | 485 | assertThat(requests.size()).isGreaterThan(1); |
455 | 486 | assertThat(requests) |
456 | 487 | .comparingElementsUsing(OPEN_SESSION_REQUEST_CORRESPONDENCE) |
457 | 488 | .contains(refreshRequest); |
458 | | - |
459 | | - // Verify headers |
460 | | - List<Metadata> headers = headerInterceptor.getHeadersList(); |
461 | | - boolean containsHeader = false; |
462 | | - for (Metadata header : headers) { |
463 | | - if (header.containsKey(metadataKey)) { |
464 | | - containsHeader = true; |
465 | | - assertThat(header.get(metadataKey)).isEqualTo("refresh_value"); |
466 | | - } |
467 | | - } |
468 | 489 | assertThat(containsHeader).isTrue(); |
469 | 490 | } |
470 | 491 |
|
@@ -519,7 +540,7 @@ public Deadline getObservedDeadline() { |
519 | 540 | } |
520 | 541 |
|
521 | 542 | private static class HeaderInterceptor implements ServerInterceptor { |
522 | | - private final List<Metadata> headersList = new ArrayList<>(); |
| 543 | + private final List<Metadata> headersList = new CopyOnWriteArrayList<>(); |
523 | 544 |
|
524 | 545 | @Override |
525 | 546 | public <ReqT, RespT> io.grpc.ServerCall.Listener<ReqT> interceptCall( |
|
0 commit comments