From 888ac26f07e9d133d773f173642ddc592acabdc0 Mon Sep 17 00:00:00 2001 From: erabii Date: Mon, 29 Aug 2022 15:43:08 +0300 Subject: [PATCH] Watcher revert wiremock tests (#1064) * very dirty still * revert tests * revert two properties --- pom.xml | 4 +- .../pom.xml | 51 ++----- ...asedConfigMapWatchChangeDetectorTests.java | 125 ++++++++++++------ ...pBasedSecretsWatchChangeDetectorTests.java | 111 ++++++++++------ 4 files changed, 168 insertions(+), 123 deletions(-) diff --git a/pom.xml b/pom.xml index 45ebb8d9..0f4660c4 100644 --- a/pom.xml +++ b/pom.xml @@ -149,13 +149,13 @@ import - + org.codehaus.groovy diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml index 1f4138e6..c33ef0a0 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml @@ -12,8 +12,6 @@ spring-cloud-kubernetes-configuration-watcher - 1.8.0 - openjdk:8u222-slim springcloud 4.1.0 @@ -44,12 +42,19 @@ org.springframework.boot spring-boot-starter-test test + + + + org.mockito + mockito-core + + - + io.projectreactor reactor-test @@ -65,6 +70,11 @@ junit-vintage-engine test + + org.mockito + mockito-inline + test + @@ -131,39 +141,6 @@ springcloud/${project.artifactId}:${project.version} - - jib - - - - com.google.cloud.tools - jib-maven-plugin - ${jib.version} - - - ${base.image} - - - spring-cloud/${project.artifactId} - - - nobody:nogroup - - - - - - - package - - dockerBuild - - - - - - - diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java index 3a421c6e..7f674124 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java @@ -21,20 +21,28 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1EndpointAddress; import io.kubernetes.client.openapi.models.V1EndpointPort; import io.kubernetes.client.openapi.models.V1ObjectMeta; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import io.kubernetes.client.util.ClientBuilder; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.client.KubernetesClientUtils; import org.springframework.cloud.kubernetes.client.config.KubernetesClientConfigMapPropertySourceLocator; import org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; @@ -46,6 +54,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.reactive.function.client.WebClient; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; import static org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider.NAMESPACE_PROPERTY; @@ -53,20 +62,17 @@ import static org.springframework.cloud.kubernetes.commons.KubernetesNamespacePr * @author Ryan Baxter * @author Kris Iyer */ -// FIXME: 4.0.0 contract wiremock -@Ignore("waiting for compatible contract wiremock") -@RunWith(MockitoJUnitRunner.class) -public class HttpBasedConfigMapWatchChangeDetectorTests { +@ExtendWith(MockitoExtension.class) +class HttpBasedConfigMapWatchChangeDetectorTests { - // @Rule - // public WireMockRule wireMockRule = new WireMockRule(0); + private static MockedStatic clientUtilsMock; + + private static final WireMockServer WIRE_MOCK_SERVER = new WireMockServer( + WireMockConfiguration.options().dynamicPort()); @Mock private CoreV1Api coreV1Api; - @Mock - private ConfigurationUpdateStrategy updateStrategy; - @Mock private KubernetesClientConfigMapPropertySourceLocator configMapPropertySourceLocator; @@ -80,64 +86,78 @@ public class HttpBasedConfigMapWatchChangeDetectorTests { private ConfigurationWatcherConfigurationProperties configurationWatcherConfigurationProperties; - @Before - public void setup() { - V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); - fooEndpointAddress.setIp("127.0.0.1"); - fooEndpointAddress.setHostname("localhost"); - V1EndpointPort fooEndpointPort = new V1EndpointPort(); - // fooEndpointPort.setPort(wireMockRule.port()); - List instances = new ArrayList<>(); - KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", - fooEndpointAddress.getIp(), fooEndpointPort.getPort(), new HashMap<>(), false); - instances.add(fooServiceInstance); - when(reactiveDiscoveryClient.getInstances(eq("foo"))).thenReturn(Flux.fromIterable(instances)); + @BeforeAll + static void beforeAll() { + WIRE_MOCK_SERVER.start(); + clientUtilsMock = mockStatic(KubernetesClientUtils.class); + clientUtilsMock.when(KubernetesClientUtils::createApiClientForInformerClient) + .thenReturn(new ClientBuilder().setBasePath(WIRE_MOCK_SERVER.baseUrl()).build()); + } + + @AfterAll + static void teardown() { + clientUtilsMock.close(); + } + + @BeforeEach + void setup() { + MockEnvironment mockEnvironment = new MockEnvironment(); mockEnvironment.setProperty(NAMESPACE_PROPERTY, "default"); ConfigReloadProperties configReloadProperties = new ConfigReloadProperties(); configurationWatcherConfigurationProperties = new ConfigurationWatcherConfigurationProperties(); WebClient webClient = WebClient.builder().build(); + + ConfigurationUpdateStrategy strategy = new ConfigurationUpdateStrategy("refresh", () -> { + + }); + changeDetector = new HttpBasedConfigMapWatchChangeDetector(coreV1Api, mockEnvironment, configReloadProperties, - updateStrategy, configMapPropertySourceLocator, new KubernetesNamespaceProvider(mockEnvironment), + strategy, configMapPropertySourceLocator, new KubernetesNamespaceProvider(mockEnvironment), configurationWatcherConfigurationProperties, threadPoolTaskExecutor, webClient, reactiveDiscoveryClient); } @Test - public void triggerConfigMapRefresh() { + void triggerConfigMapRefresh() { + stubReactiveCall(); V1ConfigMap configMap = new V1ConfigMap(); V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); configMap.setMetadata(objectMeta); - // WireMock.configureFor("localhost", wireMockRule.port()); - // stubFor(post(WireMock.urlEqualTo("/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/actuator/refresh"))); + WireMock.configureFor("localhost", WIRE_MOCK_SERVER.port()); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/actuator/refresh"))); } @Test - public void triggerConfigMapRefreshWithPropertiesBasedActuatorPath() throws InterruptedException { + void triggerConfigMapRefreshWithPropertiesBasedActuatorPath() { + stubReactiveCall(); configurationWatcherConfigurationProperties.setActuatorPath("/my/custom/actuator"); V1ConfigMap configMap = new V1ConfigMap(); V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); configMap.setMetadata(objectMeta); - // WireMock.configureFor("localhost", wireMockRule.port()); - // stubFor(post(WireMock.urlEqualTo("/my/custom/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/my/custom/actuator/refresh"))); + WireMock.configureFor("localhost", WIRE_MOCK_SERVER.port()); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/my/custom/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/my/custom/actuator/refresh"))); } @Test - public void triggerConfigMapRefreshWithAnnotationActuatorPath() { + void triggerConfigMapRefreshWithAnnotationActuatorPath() { + int port = WIRE_MOCK_SERVER.port(); + WireMock.configureFor("localhost", port); Map metadata = new HashMap<>(); - // metadata.put(ANNOTATION_KEY, "http://:" + wireMockRule.port() + - // "/my/custom/actuator"); + metadata.put(HttpBasedConfigMapWatchChangeDetector.ANNOTATION_KEY, "http://:" + port + "/my/custom/actuator"); V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); fooEndpointAddress.setIp("127.0.0.1"); fooEndpointAddress.setHostname("localhost"); V1EndpointPort fooEndpointPort = new V1EndpointPort(); - // fooEndpointPort.setPort(wireMockRule.port()); + fooEndpointPort.setPort(port); List instances = new ArrayList<>(); KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", fooEndpointAddress.getIp(), fooEndpointPort.getPort(), metadata, false); @@ -147,9 +167,26 @@ public class HttpBasedConfigMapWatchChangeDetectorTests { V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); configMap.setMetadata(objectMeta); - // stubFor(post(WireMock.urlEqualTo("/my/custom/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/my/custom/actuator/refresh"))); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/my/custom/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(configMap)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/my/custom/actuator/refresh"))); + } + + private void stubReactiveCall() { + + V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); + fooEndpointAddress.setIp("127.0.0.1"); + fooEndpointAddress.setHostname("localhost"); + + V1EndpointPort fooEndpointPort = new V1EndpointPort(); + fooEndpointPort.setPort(WIRE_MOCK_SERVER.port()); + + List instances = new ArrayList<>(); + KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", + fooEndpointAddress.getIp(), fooEndpointPort.getPort(), new HashMap<>(), false); + instances.add(fooServiceInstance); + when(reactiveDiscoveryClient.getInstances(eq("foo"))).thenReturn(Flux.fromIterable(instances)); } } diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java index d9543e8b..58c96595 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java @@ -21,20 +21,28 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1EndpointAddress; import io.kubernetes.client.openapi.models.V1EndpointPort; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1Secret; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import io.kubernetes.client.util.ClientBuilder; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.client.KubernetesClientUtils; import org.springframework.cloud.kubernetes.client.config.KubernetesClientSecretsPropertySourceLocator; import org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; @@ -46,6 +54,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.reactive.function.client.WebClient; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; import static org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider.NAMESPACE_PROPERTY; @@ -53,13 +62,13 @@ import static org.springframework.cloud.kubernetes.commons.KubernetesNamespacePr * @author Ryan Baxter * @author Kris Iyer */ -// FIXME: 4.0.0 contract wiremock -@Ignore("waiting for compatible contract wiremock") -@RunWith(MockitoJUnitRunner.class) -public class HttpBasedSecretsWatchChangeDetectorTests { +@ExtendWith(MockitoExtension.class) +class HttpBasedSecretsWatchChangeDetectorTests { - // @Rule - // public WireMockRule wireMockRule = new WireMockRule(0); + private static MockedStatic clientUtilsMock; + + private static final WireMockServer WIRE_MOCK_SERVER = new WireMockServer( + WireMockConfiguration.options().dynamicPort()); @Mock private CoreV1Api coreV1Api; @@ -80,18 +89,8 @@ public class HttpBasedSecretsWatchChangeDetectorTests { private ConfigurationWatcherConfigurationProperties configurationWatcherConfigurationProperties; - @Before - public void setup() { - V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); - fooEndpointAddress.setIp("127.0.0.1"); - fooEndpointAddress.setHostname("localhost"); - V1EndpointPort fooEndpointPort = new V1EndpointPort(); - // fooEndpointPort.setPort(wireMockRule.port()); - List instances = new ArrayList<>(); - KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", - fooEndpointAddress.getIp(), fooEndpointPort.getPort(), new HashMap<>(), false); - instances.add(fooServiceInstance); - when(reactiveDiscoveryClient.getInstances(eq("foo"))).thenReturn(Flux.fromIterable(instances)); + @BeforeEach + void setup() { MockEnvironment mockEnvironment = new MockEnvironment(); mockEnvironment.setProperty(NAMESPACE_PROPERTY, "default"); ConfigReloadProperties configReloadProperties = new ConfigReloadProperties(); @@ -103,41 +102,59 @@ public class HttpBasedSecretsWatchChangeDetectorTests { reactiveDiscoveryClient); } + @BeforeAll + static void beforeAll() { + WIRE_MOCK_SERVER.start(); + clientUtilsMock = mockStatic(KubernetesClientUtils.class); + clientUtilsMock.when(KubernetesClientUtils::createApiClientForInformerClient) + .thenReturn(new ClientBuilder().setBasePath(WIRE_MOCK_SERVER.baseUrl()).build()); + } + + @AfterAll + static void teardown() { + clientUtilsMock.close(); + } + @Test - public void triggerSecretRefresh() throws InterruptedException { + void triggerSecretRefresh() { + stubReactiveCall(); V1Secret secret = new V1Secret(); V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); secret.setMetadata(objectMeta); - // WireMock.configureFor("localhost", wireMockRule.port()); - // stubFor(post(WireMock.urlEqualTo("/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/actuator/refresh"))); + WireMock.configureFor("localhost", WIRE_MOCK_SERVER.port()); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/actuator/refresh"))); } @Test - public void triggerSecretRefreshWithPropertiesBasedActuatorPath() throws InterruptedException { + void triggerSecretRefreshWithPropertiesBasedActuatorPath() { + stubReactiveCall(); configurationWatcherConfigurationProperties.setActuatorPath("/my/custom/actuator"); V1Secret secret = new V1Secret(); V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); secret.setMetadata(objectMeta); - // WireMock.configureFor("localhost", wireMockRule.port()); - // stubFor(post(WireMock.urlEqualTo("/my/custom/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/my/custom/actuator/refresh"))); + WireMock.configureFor("localhost", WIRE_MOCK_SERVER.port()); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/my/custom/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/my/custom/actuator/refresh"))); } @Test - public void triggerSecretRefreshWithAnnotationActuatorPath() { + void triggerSecretRefreshWithAnnotationActuatorPath() { + WireMock.configureFor("localhost", WIRE_MOCK_SERVER.port()); Map metadata = new HashMap<>(); - // metadata.put(ANNOTATION_KEY, "http://:" + wireMockRule.port() + - // "/my/custom/actuator"); + metadata.put(HttpBasedConfigMapWatchChangeDetector.ANNOTATION_KEY, + "http://:" + WIRE_MOCK_SERVER.port() + "/my/custom/actuator"); V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); fooEndpointAddress.setIp("127.0.0.1"); fooEndpointAddress.setHostname("localhost"); V1EndpointPort fooEndpointPort = new V1EndpointPort(); - // fooEndpointPort.setPort(wireMockRule.port()); + fooEndpointPort.setPort(WIRE_MOCK_SERVER.port()); List instances = new ArrayList<>(); KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", fooEndpointAddress.getIp(), fooEndpointPort.getPort(), metadata, false); @@ -147,9 +164,23 @@ public class HttpBasedSecretsWatchChangeDetectorTests { V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.setName("foo"); secret.setMetadata(objectMeta); - // stubFor(post(WireMock.urlEqualTo("/my/custom/actuator/refresh")).willReturn(aResponse().withStatus(200))); - // StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); - // verify(postRequestedFor(urlEqualTo("/my/custom/actuator/refresh"))); + WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/my/custom/actuator/refresh")) + .willReturn(WireMock.aResponse().withStatus(200))); + StepVerifier.create(changeDetector.triggerRefresh(secret)).verifyComplete(); + WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/my/custom/actuator/refresh"))); + } + + private void stubReactiveCall() { + V1EndpointAddress fooEndpointAddress = new V1EndpointAddress(); + fooEndpointAddress.setIp("127.0.0.1"); + fooEndpointAddress.setHostname("localhost"); + V1EndpointPort fooEndpointPort = new V1EndpointPort(); + fooEndpointPort.setPort(WIRE_MOCK_SERVER.port()); + List instances = new ArrayList<>(); + KubernetesServiceInstance fooServiceInstance = new KubernetesServiceInstance("foo", "foo", + fooEndpointAddress.getIp(), fooEndpointPort.getPort(), new HashMap<>(), false); + instances.add(fooServiceInstance); + when(reactiveDiscoveryClient.getInstances(eq("foo"))).thenReturn(Flux.fromIterable(instances)); } }