From 7fedac12598da2c13b368418b7a0ff9ead7c7860 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 29 Sep 2021 15:01:43 +0200 Subject: [PATCH] Improvements on Test Flakyness --- .../processing/retry/GenericRetryExecution.java | 4 ++-- .../processing/DefaultEventHandlerTest.java | 15 +++++++-------- .../operator/junit/OperatorExtension.java | 5 +++++ .../operator/SubResourceUpdateIT.java | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GenericRetryExecution.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GenericRetryExecution.java index a2c7a9a609..db06363ced 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GenericRetryExecution.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GenericRetryExecution.java @@ -6,8 +6,8 @@ public class GenericRetryExecution implements RetryExecution { private final GenericRetry genericRetry; - private int lastAttemptIndex = 0; - private long currentInterval; + private volatile int lastAttemptIndex = 0; + private volatile long currentInterval; public GenericRetryExecution(GenericRetry genericRetry) { this.genericRetry = genericRetry; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/DefaultEventHandlerTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/DefaultEventHandlerTest.java index 55e7a9cc54..591c7fa1e0 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/DefaultEventHandlerTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/DefaultEventHandlerTest.java @@ -152,14 +152,14 @@ public void executesTheControllerInstantlyAfterErrorIfEventsBuffered() { PostExecutionControl postExecutionControl = PostExecutionControl.exceptionDuringExecution(new RuntimeException("test")); + when(eventDispatcherMock.handleExecution(any())) + .thenReturn(postExecutionControl) + .thenReturn(PostExecutionControl.defaultDispatch()); + // start processing an event defaultEventHandlerWithRetry.handleEvent(event); - // buffer an another event + // buffer another event defaultEventHandlerWithRetry.handleEvent(event); - verify(eventDispatcherMock, timeout(SEPARATE_EXECUTION_TIMEOUT).times(1)) - .handleExecution(any()); - - defaultEventHandlerWithRetry.eventProcessingFinished(executionScope, postExecutionControl); ArgumentCaptor executionScopeArgumentCaptor = ArgumentCaptor.forClass(ExecutionScope.class); @@ -191,15 +191,14 @@ public void successfulExecutionResetsTheRetry() { ArgumentCaptor.forClass(ExecutionScope.class); defaultEventHandlerWithRetry.handleEvent(event); - verify(eventDispatcherMock, timeout(SEPARATE_EXECUTION_TIMEOUT).times(1)) .handleExecution(any()); - defaultEventHandlerWithRetry.handleEvent(event); + defaultEventHandlerWithRetry.handleEvent(event); verify(eventDispatcherMock, timeout(SEPARATE_EXECUTION_TIMEOUT).times(2)) .handleExecution(any()); - defaultEventHandlerWithRetry.handleEvent(event); + defaultEventHandlerWithRetry.handleEvent(event); verify(eventDispatcherMock, timeout(SEPARATE_EXECUTION_TIMEOUT).times(3)) .handleExecution(executionScopeArgumentCaptor.capture()); log.info("Finished successfulExecutionResetsTheRetry"); diff --git a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java index a14ddb36a9..743e2c7b72 100644 --- a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java +++ b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java @@ -135,6 +135,11 @@ public T replace(Class type, T resource) { return kubernetesClient.resources(type).inNamespace(namespace).replace(resource); } + public T get(Class type, String name) { + return kubernetesClient.resources(type).inNamespace(namespace).withName(name).get(); + } + + @SuppressWarnings("unchecked") protected void before(ExtensionContext context) { namespace = context.getRequiredTestClass().getSimpleName(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java index 90f3d3caed..c09982b639 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java @@ -12,9 +12,9 @@ import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResource; import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceController; import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceSpec; -import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceStatus; import io.javaoperatorsdk.operator.support.TestUtils; +import static io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceStatus.State.SUCCESS; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -87,7 +87,7 @@ public void updateCustomResourceAfterSubResourceChange() { awaitStatusUpdated(resource.getMetadata().getName()); // wait for sure, there are no more events - waitXms(200); + waitXms(500); // there is no event on status update processed assertThat(TestUtils.getNumberOfExecutions(operator)) .isEqualTo(3); @@ -104,7 +104,7 @@ void awaitStatusUpdated(String name) { assertThat(cr).isNotNull(); assertThat(cr.getStatus()).isNotNull(); assertThat(cr.getStatus().getState()) - .isEqualTo(SubResourceTestCustomResourceStatus.State.SUCCESS); + .isEqualTo(SUCCESS); }); }