Skip to content

Commit 2317594

Browse files
committed
refactor(showcase): migrate Thread.sleep to Awaitility in integration tests
1 parent 06d0cde commit 2317594

5 files changed

Lines changed: 66 additions & 32 deletions

File tree

java-showcase/gapic-showcase/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@
256256
<version>${slf4j2-logback.version}</version>
257257
<scope>test</scope>
258258
</dependency>
259+
<dependency>
260+
<groupId>org.awaitility</groupId>
261+
<artifactId>awaitility</artifactId>
262+
<version>4.3.0</version>
263+
<scope>test</scope>
264+
</dependency>
259265

260266
</dependencies>
261267
<profiles>

java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITClientShutdown.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.showcase.v1beta1.EchoClient;
2525
import com.google.showcase.v1beta1.EchoRequest;
2626
import com.google.showcase.v1beta1.it.util.TestClientInitializer;
27+
import org.awaitility.Awaitility;
2728
import org.junit.jupiter.api.Test;
2829
import org.junit.jupiter.api.Timeout;
2930
import org.threeten.bp.Duration;
@@ -143,12 +144,10 @@ private void assertClientTerminated(EchoClient echoClient) throws InterruptedExc
143144
// check that everything is properly terminated after close() is called.
144145
echoClient.close();
145146

146-
// Loop until the client has terminated successfully. For tests that use this,
147-
// try to ensure there is a timeout associated, otherwise this may run forever.
148-
// Future enhancement: Use awaitility instead of busy waiting
149-
while (!echoClient.isTerminated()) {
150-
Thread.sleep(500L);
151-
}
147+
Awaitility.await()
148+
.atMost(java.time.Duration.ofMillis(DEFAULT_CLIENT_TERMINATION_MS))
149+
.pollInterval(java.time.Duration.ofMillis(500))
150+
.until(echoClient::isTerminated);
152151
// The busy-wait time won't be accurate, so account for a bit of buffer
153152
long end = System.currentTimeMillis();
154153

java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITCompositeTracer.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,11 @@
4949
import io.opentelemetry.sdk.trace.SdkTracerProvider;
5050
import io.opentelemetry.sdk.trace.data.SpanData;
5151
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
52+
import java.time.Duration;
5253
import java.util.Arrays;
5354
import java.util.Collection;
5455
import java.util.List;
56+
import org.awaitility.Awaitility;
5557
import org.junit.jupiter.api.AfterEach;
5658
import org.junit.jupiter.api.BeforeEach;
5759
import org.junit.jupiter.api.Test;
@@ -124,13 +126,12 @@ void testCompositeTracer() throws Exception {
124126
.get(AttributeKey.stringKey(ObservabilityAttributes.SERVER_ADDRESS_ATTRIBUTE)))
125127
.isEqualTo(SHOWCASE_SERVER_ADDRESS);
126128

127-
Thread.sleep(100);
128129
// Verify metric name and one basic attribute server.address
130+
Awaitility.await()
131+
.atMost(Duration.ofSeconds(10))
132+
.pollInterval(Duration.ofMillis(100))
133+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
129134
Collection<MetricData> actualMetrics = metricReader.collectAllMetrics();
130-
for (int i = 0; i < 10 && actualMetrics.isEmpty(); i++) {
131-
Thread.sleep(1000L);
132-
actualMetrics = metricReader.collectAllMetrics();
133-
}
134135

135136
assertThat(actualMetrics).isNotEmpty();
136137
MetricData metricData =

java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelGoldenMetrics.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import java.io.InputStream;
6464
import java.time.Duration;
6565
import java.util.Collection;
66+
import org.awaitility.Awaitility;
6667
import org.junit.jupiter.api.AfterEach;
6768
import org.junit.jupiter.api.BeforeEach;
6869
import org.junit.jupiter.api.Test;
@@ -106,7 +107,10 @@ void testMetrics_successfulEcho_grpc() throws Exception {
106107
// This is implemented by adding a TraceFinisher to ApiFuture as a callback in
107108
// TracedUnaryCallable,
108109
// which could be executed in a different thread.
109-
Thread.sleep(100);
110+
Awaitility.await()
111+
.atMost(Duration.ofSeconds(5))
112+
.pollInterval(Duration.ofMillis(10))
113+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
110114
Collection<MetricData> metrics = metricReader.collectAllMetrics();
111115
assertThat(metrics).isNotEmpty();
112116

@@ -192,7 +196,10 @@ public void sendMessage(ReqT message) {}
192196
UnavailableException.class,
193197
() -> client.echo(EchoRequest.newBuilder().setContent("metrics-test").build()));
194198

195-
Thread.sleep(100);
199+
Awaitility.await()
200+
.atMost(Duration.ofSeconds(5))
201+
.pollInterval(Duration.ofMillis(10))
202+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
196203
Collection<MetricData> metrics = metricReader.collectAllMetrics();
197204
assertThat(metrics).isNotEmpty();
198205

@@ -224,7 +231,10 @@ void testMetrics_successfulEcho_httpjson() throws Exception {
224231

225232
client.echo(EchoRequest.newBuilder().setContent("metrics-test").build());
226233

227-
Thread.sleep(100);
234+
Awaitility.await()
235+
.atMost(Duration.ofSeconds(5))
236+
.pollInterval(Duration.ofMillis(10))
237+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
228238
Collection<MetricData> metrics = metricReader.collectAllMetrics();
229239
assertThat(metrics).isNotEmpty();
230240

@@ -366,7 +376,10 @@ public String getHeaderValue(int index) {
366376
UnavailableException.class,
367377
() -> client.echo(EchoRequest.newBuilder().setContent("metrics-test").build()));
368378

369-
Thread.sleep(100);
379+
Awaitility.await()
380+
.atMost(Duration.ofSeconds(5))
381+
.pollInterval(Duration.ofMillis(10))
382+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
370383
Collection<MetricData> metrics = metricReader.collectAllMetrics();
371384
assertThat(metrics).isNotEmpty();
372385

@@ -415,7 +428,10 @@ void testMetrics_clientTimeout_grpc() throws Exception {
415428
Exception.class,
416429
() -> client.echo(EchoRequest.newBuilder().setContent("metrics-test").build()));
417430

418-
Thread.sleep(100);
431+
Awaitility.await()
432+
.atMost(Duration.ofSeconds(5))
433+
.pollInterval(Duration.ofMillis(10))
434+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
419435
Collection<MetricData> metrics = metricReader.collectAllMetrics();
420436
assertThat(metrics).isNotEmpty();
421437

@@ -458,7 +474,10 @@ void testMetrics_clientTimeout_httpjson() throws Exception {
458474
Exception.class,
459475
() -> client.echo(EchoRequest.newBuilder().setContent("metrics-test").build()));
460476

461-
Thread.sleep(100);
477+
Awaitility.await()
478+
.atMost(Duration.ofSeconds(5))
479+
.pollInterval(Duration.ofMillis(10))
480+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
462481
Collection<MetricData> metrics = metricReader.collectAllMetrics();
463482
assertThat(metrics).isNotEmpty();
464483

@@ -538,7 +557,10 @@ public void sendMessage(ReqT message) {}
538557

539558
assertThat(attemptCount.get()).isEqualTo(3);
540559

541-
Thread.sleep(100);
560+
Awaitility.await()
561+
.atMost(Duration.ofSeconds(5))
562+
.pollInterval(Duration.ofMillis(10))
563+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
542564
Collection<MetricData> metrics = metricReader.collectAllMetrics();
543565
assertThat(metrics).hasSize(1);
544566

@@ -709,7 +731,10 @@ public String getHeaderValue(int index) {
709731

710732
assertThat(requestCount.get()).isEqualTo(3);
711733

712-
Thread.sleep(100);
734+
Awaitility.await()
735+
.atMost(Duration.ofSeconds(5))
736+
.pollInterval(Duration.ofMillis(10))
737+
.until(() -> !metricReader.collectAllMetrics().isEmpty());
713738
Collection<MetricData> metrics = metricReader.collectAllMetrics();
714739
assertThat(metrics).hasSize(1);
715740

java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelMetrics.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import java.util.concurrent.TimeUnit;
8484
import java.util.function.Predicate;
8585
import java.util.stream.Collectors;
86+
import org.awaitility.Awaitility;
8687
import org.junit.jupiter.api.AfterEach;
8788
import org.junit.jupiter.api.Assertions;
8889
import org.junit.jupiter.api.BeforeEach;
@@ -296,18 +297,20 @@ private List<MetricData> getMetricDataList() throws InterruptedException {
296297
*/
297298
private List<MetricData> getMetricDataList(InMemoryMetricReader metricReader)
298299
throws InterruptedException {
299-
for (int i = 0; i < NUM_DEFAULT_FLUSH_ATTEMPTS; i++) {
300-
Thread.sleep(1000L);
301-
List<MetricData> metricData = new ArrayList<>(metricReader.collectAllMetrics());
302-
// Depending on the OpenTelemetry instance (i.e. OpenTelemetry, GrpcOpenTelemetry, etc.)
303-
// there may be additional metrics recorded. Only check to ensure the Gax Metrics
304-
// are recorded properly. Any additional metrics are fine to be passed.
305-
if (metricData.size() >= NUM_GAX_OTEL_METRICS && areAllGaxMetricsRecorded(metricData)) {
306-
return metricData;
307-
}
300+
try {
301+
Awaitility.await()
302+
.atMost(java.time.Duration.ofSeconds(NUM_DEFAULT_FLUSH_ATTEMPTS))
303+
.pollInterval(java.time.Duration.ofSeconds(1))
304+
.until(
305+
() -> {
306+
List<MetricData> metricData = new ArrayList<>(metricReader.collectAllMetrics());
307+
return metricData.size() >= NUM_GAX_OTEL_METRICS && areAllGaxMetricsRecorded(metricData);
308+
});
309+
return new ArrayList<>(metricReader.collectAllMetrics());
310+
} catch (org.awaitility.core.ConditionTimeoutException e) {
311+
Assertions.fail("Unable to collect all the GAX metrics required for the test", e);
312+
return new ArrayList<>();
308313
}
309-
Assertions.fail("Unable to collect all the GAX metrics required for the test");
310-
return new ArrayList<>();
311314
}
312315

313316
private boolean areAllGaxMetricsRecorded(List<MetricData> metricData) {
@@ -370,7 +373,7 @@ void testGrpc_operationCancelled_recordsMetrics() throws Exception {
370373
UnaryCallable<BlockRequest, BlockResponse> blockCallable = grpcClient.blockCallable();
371374
ApiFuture<BlockResponse> blockResponseApiFuture = blockCallable.futureCall(blockRequest);
372375
// Sleep 1s before cancelling to let the request go through
373-
Thread.sleep(1000);
376+
Awaitility.await().pollDelay(java.time.Duration.ofSeconds(1)).until(() -> true);
374377
blockResponseApiFuture.cancel(true);
375378

376379
List<MetricData> actualMetricDataList = getMetricDataList();
@@ -397,7 +400,7 @@ void testHttpJson_operationCancelled_recordsMetrics() throws Exception {
397400
UnaryCallable<BlockRequest, BlockResponse> blockCallable = httpClient.blockCallable();
398401
ApiFuture<BlockResponse> blockResponseApiFuture = blockCallable.futureCall(blockRequest);
399402
// Sleep 1s before cancelling to let the request go through
400-
Thread.sleep(1000);
403+
Awaitility.await().pollDelay(java.time.Duration.ofSeconds(1)).until(() -> true);
401404
blockResponseApiFuture.cancel(true);
402405

403406
List<MetricData> actualMetricDataList = getMetricDataList();

0 commit comments

Comments
 (0)