diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f26b86096d..c3885deb9b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ #### Bugs * Fix #4590: only using a builder if there are visitors * Fix #4159: ensure the token refresh obeys how the Config was created +* Fix #4447: `isSupported` doesn't check all of the applicable API Groups * Fix #4491: added a more explicit shutdown exception for okhttp * Fix #4510: Fix StackOverflow on cyclic references involving collections. * Fix #4534: Java Generator CLI default handling of skipGeneratedAnnotations diff --git a/extensions/camel-k/client/pom.xml b/extensions/camel-k/client/pom.xml index f6a1d4c6e0b..a038c366735 100644 --- a/extensions/camel-k/client/pom.xml +++ b/extensions/camel-k/client/pom.xml @@ -84,7 +84,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java index 3ecd8096b56..d2c386bce70 100644 --- a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java +++ b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java @@ -18,11 +18,12 @@ import io.fabric8.camelk.client.dsl.V1APIGroupDSL; import io.fabric8.camelk.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for CamelK client library. */ -public interface CamelKClient extends Client { +public interface CamelKClient extends Client, SupportTestingClient { /** * API entrypoint for camel.apache.org/v1 API group resources * diff --git a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java index 313c2998ff3..97a4d78ca1a 100644 --- a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java +++ b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java @@ -23,10 +23,9 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultCamelKClient extends ExtensionRootClientAdapter - implements NamespacedCamelKClient, SupportTestingClient { + implements NamespacedCamelKClient { public DefaultCamelKClient() { super(); @@ -62,7 +61,7 @@ public V1alpha1APIGroupDSL v1alpha1() { @Override public boolean isSupported() { - return hasApiGroup("camel.apache.org", true); + return hasApiGroup("camel.apache.org", false); } } diff --git a/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java b/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java new file mode 100644 index 00000000000..d146f2fefe8 --- /dev/null +++ b/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.camelk.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class CamelKClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(CamelKClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("camel.apache.org", true), + Arguments.of("test.camel.apache.org", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/certmanager/client/pom.xml b/extensions/certmanager/client/pom.xml index 9ed649cf928..502f406ee42 100644 --- a/extensions/certmanager/client/pom.xml +++ b/extensions/certmanager/client/pom.xml @@ -93,7 +93,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java index 9c582f0dec3..bb0805a5ae7 100644 --- a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java +++ b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java @@ -20,11 +20,12 @@ import io.fabric8.certmanager.client.dsl.V1alpha3APIGroupDSL; import io.fabric8.certmanager.client.dsl.V1beta1APIGroupDSL; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for CertManager Client library. */ -public interface CertManagerClient extends Client { +public interface CertManagerClient extends Client, SupportTestingClient { V1APIGroupDSL v1(); V1alpha2APIGroupDSL v1alpha2(); diff --git a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java index d173321f123..2694ba01f4e 100644 --- a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java +++ b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java @@ -71,4 +71,8 @@ public V1beta1APIGroupDSL v1beta1() { return adapt(V1beta1APIGroupClient.class); } + @Override + public boolean isSupported() { + return hasApiGroup("cert-manager.io", false); + } } diff --git a/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java b/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java new file mode 100644 index 00000000000..dc45a581ba0 --- /dev/null +++ b/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.certmanager.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class CertManagerClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(CertManagerClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("cert-manager.io", true), + Arguments.of("test.cert-manager.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/chaosmesh/client/pom.xml b/extensions/chaosmesh/client/pom.xml index d2f35dc8720..bf0ad115244 100644 --- a/extensions/chaosmesh/client/pom.xml +++ b/extensions/chaosmesh/client/pom.xml @@ -95,7 +95,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java index eaca971802f..6cc3bae49b7 100644 --- a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java +++ b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java @@ -42,11 +42,12 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Chaos Mesh Client. */ -public interface ChaosMeshClient extends Client { +public interface ChaosMeshClient extends Client, SupportTestingClient { // Serving /** diff --git a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java index 2093bc65b29..7b9ba9eeab3 100644 --- a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java +++ b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java @@ -47,10 +47,9 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultChaosMeshClient extends ExtensionRootClientAdapter - implements NamespacedChaosMeshClient, SupportTestingClient { + implements NamespacedChaosMeshClient { public DefaultChaosMeshClient() { super(); @@ -136,6 +135,6 @@ public MixedOperation> awsChaos() { @Override public boolean isSupported() { - return hasApiGroup("chaos-mesh.org", true); + return hasApiGroup("chaos-mesh.org", false); } } diff --git a/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java b/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java new file mode 100644 index 00000000000..6399195f6e1 --- /dev/null +++ b/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.chaosmesh.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class ChaosMeshClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(ChaosMeshClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("chaos-mesh.org", true), + Arguments.of("test.chaos-mesh.org", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/istio/client/pom.xml b/extensions/istio/client/pom.xml index 69e54afe582..aeb1263e9d9 100755 --- a/extensions/istio/client/pom.xml +++ b/extensions/istio/client/pom.xml @@ -82,6 +82,21 @@ junit-jupiter-engine test + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + org.projectlombok lombok diff --git a/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java b/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java index 5d765fc50cb..bd572066802 100644 --- a/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java +++ b/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java @@ -21,10 +21,9 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultIstioClient extends ExtensionRootClientAdapter - implements NamespacedIstioClient, SupportTestingClient { + implements NamespacedIstioClient { public DefaultIstioClient() { super(); @@ -60,6 +59,6 @@ public V1beta1APIGroupDSL v1beta1() { @Override public boolean isSupported() { - return hasApiGroup("networking.istio.io", true); + return hasApiGroup("istio.io", false); } } diff --git a/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java b/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java index b5ccc75be06..9dda03d635b 100644 --- a/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java +++ b/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java @@ -16,11 +16,12 @@ package io.fabric8.istio.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Istio Client. */ -public interface IstioClient extends Client { +public interface IstioClient extends Client, SupportTestingClient { /** * API entrypoint for istio.io/v1beta1 API group resources * diff --git a/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java b/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java new file mode 100644 index 00000000000..60e24c823f1 --- /dev/null +++ b/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.istio.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class IstioClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(IstioClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("istio.io", true), + Arguments.of("security.istio.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/knative/client/pom.xml b/extensions/knative/client/pom.xml index 394c172fb3f..87e5d1fdf94 100755 --- a/extensions/knative/client/pom.xml +++ b/extensions/knative/client/pom.xml @@ -80,7 +80,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java b/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java index 6d971b18fb5..5570179d94b 100644 --- a/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java +++ b/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java @@ -77,10 +77,9 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultKnativeClient extends ExtensionRootClientAdapter - implements NamespacedKnativeClient, SupportTestingClient { + implements NamespacedKnativeClient { public DefaultKnativeClient() { super(); @@ -241,6 +240,6 @@ public MixedOperation> ka @Override public boolean isSupported() { - return hasApiGroup("knative.dev", true); + return hasApiGroup("knative.dev", false); } } diff --git a/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java b/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java index de3dd88afe8..70d2bd66513 100644 --- a/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java +++ b/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java @@ -72,11 +72,12 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Knative Client. */ -public interface KnativeClient extends Client { +public interface KnativeClient extends Client, SupportTestingClient { // Serving /** diff --git a/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java b/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java new file mode 100644 index 00000000000..85af11902b1 --- /dev/null +++ b/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.knative.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class KnativeClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(KnativeClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("knative.dev", true), + Arguments.of("serving.knative.dev", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/open-cluster-management/client/pom.xml b/extensions/open-cluster-management/client/pom.xml index 2d097071b3c..db99ec8b824 100644 --- a/extensions/open-cluster-management/client/pom.xml +++ b/extensions/open-cluster-management/client/pom.xml @@ -127,7 +127,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java index 5e2c52e9e3a..129b0e88a51 100644 --- a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java +++ b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java @@ -21,7 +21,6 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAgentAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAppsAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementClustersAPIGroupDSL; @@ -31,7 +30,7 @@ import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementSearchAPIGroupDSL; public class DefaultOpenClusterManagementClient extends ExtensionRootClientAdapter - implements NamespacedOpenClusterManagementClient, SupportTestingClient { + implements NamespacedOpenClusterManagementClient { public DefaultOpenClusterManagementClient() { super(); diff --git a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java index b5f6ef5c763..2e4d5f232a7 100644 --- a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java +++ b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java @@ -16,6 +16,7 @@ package io.fabric8.openclustermanagement.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAgentAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAppsAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementClustersAPIGroupDSL; @@ -24,7 +25,7 @@ import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementPolicyAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementSearchAPIGroupDSL; -public interface OpenClusterManagementClient extends Client { +public interface OpenClusterManagementClient extends Client, SupportTestingClient { /** * API entrypoint for resources in apps.open-cluster-management.io apiGroup * diff --git a/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java b/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java new file mode 100644 index 00000000000..74c4a9a059f --- /dev/null +++ b/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.openclustermanagement.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class OpenClusterManagementClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(OpenClusterManagementClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("open-cluster-management.io", true), + Arguments.of("operator.open-cluster-management.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/service-catalog/client/pom.xml b/extensions/service-catalog/client/pom.xml index 1973333e9e8..86b6135fb58 100644 --- a/extensions/service-catalog/client/pom.xml +++ b/extensions/service-catalog/client/pom.xml @@ -94,7 +94,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java index a8efa61b474..d9315a5431e 100644 --- a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java +++ b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java @@ -24,7 +24,6 @@ import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.servicecatalog.api.model.ClusterServiceBroker; import io.fabric8.servicecatalog.api.model.ClusterServiceBrokerList; import io.fabric8.servicecatalog.api.model.ClusterServiceClass; @@ -48,7 +47,7 @@ import io.fabric8.servicecatalog.client.dsl.ServiceInstanceResource; public class DefaultServiceCatalogClient extends ExtensionRootClientAdapter - implements NamespacedServiceCatalogClient, SupportTestingClient { + implements NamespacedServiceCatalogClient { public DefaultServiceCatalogClient() { super(); @@ -114,6 +113,6 @@ public FunctionCallable withRequestConfig(Reques @Override public boolean isSupported() { - return hasApiGroup("servicecatalog.k8s.io", true); + return hasApiGroup("servicecatalog.k8s.io", false); } } diff --git a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java index 937c34d1778..8256a322049 100644 --- a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java +++ b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java @@ -19,6 +19,7 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.servicecatalog.api.model.ClusterServiceBroker; import io.fabric8.servicecatalog.api.model.ClusterServiceBrokerList; import io.fabric8.servicecatalog.api.model.ClusterServiceClass; @@ -44,7 +45,7 @@ /** * Main interface for Service Catalog Client. */ -public interface ServiceCatalogClient extends Client { +public interface ServiceCatalogClient extends Client, SupportTestingClient { /** * API entrypoint for ClusterServiceBroker(servicecatalog.k8s.io/v1beta1) diff --git a/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java b/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java new file mode 100644 index 00000000000..1f3e751b686 --- /dev/null +++ b/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.servicecatalog.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class ServiceCatalogClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(ServiceCatalogClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("servicecatalog.k8s.io", true), + Arguments.of("test.servicecatalog.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/tekton/client/pom.xml b/extensions/tekton/client/pom.xml index 72c2f188c92..bbdd4e75b60 100644 --- a/extensions/tekton/client/pom.xml +++ b/extensions/tekton/client/pom.xml @@ -92,7 +92,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java index 4d992425e68..26f8305f415 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java @@ -21,12 +21,11 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.tekton.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.tekton.client.dsl.V1beta1APIGroupDSL; public class DefaultTektonClient extends ExtensionRootClientAdapter - implements NamespacedTektonClient, SupportTestingClient { + implements NamespacedTektonClient { public DefaultTektonClient() { super(); @@ -62,7 +61,7 @@ public V1alpha1APIGroupDSL v1alpha1() { @Override public boolean isSupported() { - return hasApiGroup("tekton.dev", true); + return hasApiGroup("tekton.dev", false); } } diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java index 5e81e589c11..be2d5b61328 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java @@ -16,13 +16,14 @@ package io.fabric8.tekton.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.tekton.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.tekton.client.dsl.V1beta1APIGroupDSL; /** * Main interface for Tekton client library. */ -public interface TektonClient extends Client { +public interface TektonClient extends Client, SupportTestingClient { /** * API entrypoint for tekton.dev/v1beta1 API group resources * diff --git a/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java b/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java new file mode 100644 index 00000000000..7de4f8311a8 --- /dev/null +++ b/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.tekton.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class TektonClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(TektonClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("tekton.dev", true), + Arguments.of("triggers.tekton.dev", true), + Arguments.of("knative.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/verticalpodautoscaler/client/pom.xml b/extensions/verticalpodautoscaler/client/pom.xml index 659cdd009ca..19e36a35ef8 100644 --- a/extensions/verticalpodautoscaler/client/pom.xml +++ b/extensions/verticalpodautoscaler/client/pom.xml @@ -81,7 +81,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java index b23be40334c..aa8ee877bef 100644 --- a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java +++ b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java @@ -21,11 +21,10 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.verticalpodautoscaler.client.dsl.V1APIGroupDSL; public class DefaultVerticalPodAutoscalerClient extends ExtensionRootClientAdapter - implements NamespacedVerticalPodAutoscalerClient, SupportTestingClient { + implements NamespacedVerticalPodAutoscalerClient { public DefaultVerticalPodAutoscalerClient() { super(); @@ -56,7 +55,7 @@ public V1APIGroupDSL v1() { @Override public boolean isSupported() { - return getClient().hasApiGroup(VerticalPodAutoscalerExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VerticalPodAutoscalerExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java index f01ff72eb87..ef2c70c3c86 100644 --- a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java +++ b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java @@ -16,8 +16,9 @@ package io.fabric8.verticalpodautoscaler.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.verticalpodautoscaler.client.dsl.V1APIGroupDSL; -public interface VerticalPodAutoscalerClient extends Client { +public interface VerticalPodAutoscalerClient extends Client, SupportTestingClient { V1APIGroupDSL v1(); } diff --git a/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java b/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java new file mode 100644 index 00000000000..77f0f45a022 --- /dev/null +++ b/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.verticalpodautoscaler.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VerticalPodAutoscalerClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VerticalPodAutoscalerClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("autoscaling.k8s.io", true), + Arguments.of("test.autoscaling.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/volcano/client/pom.xml b/extensions/volcano/client/pom.xml index 3cfd95f3a2a..5e86cc627ab 100644 --- a/extensions/volcano/client/pom.xml +++ b/extensions/volcano/client/pom.xml @@ -79,6 +79,21 @@ junit-jupiter-engine test + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + org.projectlombok lombok diff --git a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java index 61ed326ac9e..e333da9c2fa 100644 --- a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java +++ b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java @@ -23,7 +23,6 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volcano.client.dsl.V1beta1APIGroupDSL; import io.fabric8.volcano.scheduling.v1beta1.PodGroup; import io.fabric8.volcano.scheduling.v1beta1.PodGroupList; @@ -31,7 +30,7 @@ import io.fabric8.volcano.scheduling.v1beta1.QueueList; public class DefaultVolcanoClient extends ExtensionRootClientAdapter - implements NamespacedVolcanoClient, SupportTestingClient { + implements NamespacedVolcanoClient { public DefaultVolcanoClient() { super(); @@ -75,6 +74,6 @@ public V1beta1APIGroupDSL v1beta1() { @Override public boolean isSupported() { - return getClient().hasApiGroup(VolcanoExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VolcanoExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java index 841752c102d..071d3f70997 100644 --- a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java +++ b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java @@ -18,6 +18,7 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volcano.client.dsl.V1beta1APIGroupDSL; import io.fabric8.volcano.scheduling.v1beta1.PodGroup; import io.fabric8.volcano.scheduling.v1beta1.PodGroupList; @@ -27,7 +28,7 @@ /** * Main interface for Volcano client library. */ -public interface VolcanoClient extends Client { +public interface VolcanoClient extends Client, SupportTestingClient { MixedOperation> podGroups(); MixedOperation> queues(); diff --git a/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java b/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java new file mode 100644 index 00000000000..add33604af6 --- /dev/null +++ b/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.volcano.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VolcanoClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VolcanoClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("scheduling.volcano.sh", true), + Arguments.of("test.scheduling.volcano.sh", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/volumesnapshot/client/pom.xml b/extensions/volumesnapshot/client/pom.xml index 7baec1138d2..ee817762a8b 100644 --- a/extensions/volumesnapshot/client/pom.xml +++ b/extensions/volumesnapshot/client/pom.xml @@ -94,7 +94,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java index 2f389016b0d..bc9114f85e0 100644 --- a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java +++ b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java @@ -23,7 +23,6 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volumesnapshot.api.model.VolumeSnapshot; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClass; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClassList; @@ -32,7 +31,7 @@ import io.fabric8.volumesnapshot.api.model.VolumeSnapshotList; public class DefaultVolumeSnapshotClient extends ExtensionRootClientAdapter - implements NamespacedVolumeSnapshotClient, SupportTestingClient { + implements NamespacedVolumeSnapshotClient { public DefaultVolumeSnapshotClient() { super(); @@ -73,6 +72,6 @@ public FunctionCallable withRequestConfig(Reques @Override public boolean isSupported() { - return getClient().hasApiGroup(VolumeSnapshotExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VolumeSnapshotExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java index b0047f086af..6d0317ed1a0 100644 --- a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java +++ b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java @@ -18,6 +18,7 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volumesnapshot.api.model.VolumeSnapshot; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClass; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClassList; @@ -28,7 +29,7 @@ /** * Main interface for VolumeSnapshot Client library. */ -public interface VolumeSnapshotClient extends Client { +public interface VolumeSnapshotClient extends Client, SupportTestingClient { /** * API entrypoint for dealing with VolumeSnapshotClass(snapshot.storage.k8s.io/v1) diff --git a/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java b/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java new file mode 100644 index 00000000000..ad9b1d8056f --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.volumesnapshot.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VolumeSnapshotClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VolumeSnapshotClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("snapshot.storage.k8s.io", true), + Arguments.of("serving.snapshot.storage.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline