Improve code coverage in aai-client module 28/83628/5
authorJakub Dudycz <jakub.dudycz@nokia.com>
Thu, 28 Mar 2019 16:16:25 +0000 (17:16 +0100)
committerJakub Dudycz <jakub.dudycz@nokia.com>
Tue, 2 Apr 2019 12:23:57 +0000 (14:23 +0200)
Change-Id: I6c840e136d39fbeca72e943d81cb3638927f89b0
Signed-off-by: Jakub Dudycz <jakub.dudycz@nokia.com>
Issue-ID: DCAEGEN2-1375

16 files changed:
rest-services/aai-client/src/main/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/AaiHttpClientFactory.java
rest-services/aai-client/src/main/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiGetServiceInstanceClient.java
rest-services/aai-client/src/main/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiHttpGetClient.java
rest-services/aai-client/src/main/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/patch/AaiHttpPatchClient.java
rest-services/aai-client/src/main/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/put/AaiHttpPutClient.java
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/AaiClientConfigurations.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/AaiHttpClientFactoryTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/AbstractHttpClientTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiGetServiceInstanceClientTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiHttpGetClientTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/patch/AaiHttpPatchClientTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/put/AaiHttpPutClientTest.java [new file with mode: 0644]
rest-services/aai-client/src/test/resources/server.pass [new file with mode: 0644]
rest-services/aai-client/src/test/resources/server.pkcs12 [new file with mode: 0644]
rest-services/aai-client/src/test/resources/trust.pass [new file with mode: 0644]
rest-services/aai-client/src/test/resources/trust.pkcs12 [new file with mode: 0644]

index d2e109e..9c097ef 100644 (file)
@@ -22,6 +22,9 @@ package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service;
 
 import io.netty.handler.ssl.SslContext;
 import io.vavr.control.Try;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.UUID;
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.CloudHttpClient;
 import org.onap.dcaegen2.services.sdk.rest.services.model.logging.ImmutableRequestDiagnosticContext;
@@ -34,21 +37,20 @@ import org.onap.dcaegen2.services.sdk.security.ssl.SslFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Base64;
-import java.util.UUID;
-
 public class AaiHttpClientFactory {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AaiHttpClientFactory.class);
 
     private final AaiClientConfiguration configuration;
-    private final SslFactory sslFactory = new SslFactory();
-
+    private final SslFactory sslFactory;
 
     public AaiHttpClientFactory(AaiClientConfiguration configuration) {
+        this(configuration, new SslFactory());
+    }
+
+    public AaiHttpClientFactory(AaiClientConfiguration configuration, SslFactory sslFactory) {
         this.configuration = configuration;
+        this.sslFactory = sslFactory;
     }
 
     public CloudHttpClient build() {
index f8300eb..1838ce4 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.get;
 
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
+
 import io.vavr.collection.HashMap;
 import io.vavr.collection.Map;
 import org.apache.commons.text.StringSubstitutor;
@@ -31,20 +33,19 @@ import org.onap.dcaegen2.services.sdk.rest.services.model.AaiServiceInstanceQuer
 import org.onap.dcaegen2.services.sdk.rest.services.uri.URI;
 import reactor.core.publisher.Mono;
 
-import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
-
 public class AaiGetServiceInstanceClient implements
         AaiHttpClient<AaiServiceInstanceQueryModel, HttpResponse> {
 
     //variables for query "/business/customers/customer/${customer}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${serviceInstanceId}"
-    public static final String CUSTOMER = "customer";
-    public static final String SERVICE_TYPE = "serviceType";
-    public static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String CUSTOMER = "customer";
+    private static final String SERVICE_TYPE = "serviceType";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
 
-    private CloudHttpClient httpGetClient;
+    private final CloudHttpClient httpGetClient;
     private final AaiClientConfiguration configuration;
 
-    public AaiGetServiceInstanceClient(final AaiClientConfiguration configuration, final CloudHttpClient httpGetClient) {
+    public AaiGetServiceInstanceClient(final AaiClientConfiguration configuration,
+            final CloudHttpClient httpGetClient) {
         this.configuration = configuration;
         this.httpGetClient = httpGetClient;
     }
@@ -74,4 +75,4 @@ public class AaiGetServiceInstanceClient implements
                 .build()
                 .toString();
     }
-}
\ No newline at end of file
+}
index 1c3f20a..7d511a9 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.get;
 
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
+
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AaiHttpClient;
 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.CloudHttpClient;
@@ -28,11 +30,9 @@ import org.onap.dcaegen2.services.sdk.rest.services.model.AaiModel;
 import org.onap.dcaegen2.services.sdk.rest.services.uri.URI;
 import reactor.core.publisher.Mono;
 
-import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
-
 public final class AaiHttpGetClient implements AaiHttpClient<AaiModel, HttpResponse> {
 
-    private CloudHttpClient httpGetClient;
+    private final CloudHttpClient httpGetClient;
     private final AaiClientConfiguration configuration;
 
 
@@ -43,7 +43,8 @@ public final class AaiHttpGetClient implements AaiHttpClient<AaiModel, HttpRespo
 
     @Override
     public Mono<HttpResponse> getAaiResponse(AaiModel aaiModel) {
-        return httpGetClient.get(getUri(aaiModel.getCorrelationId()), createRequestDiagnosticContext(), configuration.aaiHeaders());
+        return httpGetClient
+                .get(getUri(aaiModel.getCorrelationId()), createRequestDiagnosticContext(), configuration.aaiHeaders());
     }
 
     private String getUri(String pnfName) {
@@ -53,5 +54,4 @@ public final class AaiHttpGetClient implements AaiHttpClient<AaiModel, HttpRespo
                 .port(configuration.aaiPort())
                 .path(configuration.aaiBasePath() + configuration.aaiPnfPath() + "/" + pnfName).build().toString();
     }
-
 }
index f92dba9..679d9f1 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.patch;
 
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
+
 import io.vavr.collection.HashMap;
 import io.vavr.collection.Map;
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
@@ -31,10 +33,8 @@ import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
 import org.onap.dcaegen2.services.sdk.rest.services.uri.URI;
 import reactor.core.publisher.Mono;
 
-
-import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
-
 public final class AaiHttpPatchClient implements AaiHttpClient<AaiModel, HttpResponse> {
+
     private final static Map<String, String> CONTENT_TYPE = HashMap.of("Content-Type", "application/merge-patch+json");
 
     private CloudHttpClient httpPatchClient;
@@ -42,7 +42,8 @@ public final class AaiHttpPatchClient implements AaiHttpClient<AaiModel, HttpRes
     private final JsonBodyBuilder jsonBodyBuilder;
 
 
-    public AaiHttpPatchClient(final AaiClientConfiguration configuration, JsonBodyBuilder jsonBodyBuilder, CloudHttpClient httpPatchClient) {
+    public AaiHttpPatchClient(final AaiClientConfiguration configuration, JsonBodyBuilder jsonBodyBuilder,
+            CloudHttpClient httpPatchClient) {
         this.configuration = configuration;
         this.jsonBodyBuilder = jsonBodyBuilder;
         this.httpPatchClient = httpPatchClient;
@@ -66,5 +67,4 @@ public final class AaiHttpPatchClient implements AaiHttpClient<AaiModel, HttpRes
                 .port(configuration.aaiPort())
                 .path(configuration.aaiBasePath() + configuration.aaiPnfPath() + "/" + pnfName).build().toString();
     }
-
-}
\ No newline at end of file
+}
index eb1a389..ce9eccc 100644 (file)
@@ -21,6 +21,8 @@
 
 package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.put;
 
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
+
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
 import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AaiHttpClient;
 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.CloudHttpClient;
@@ -29,8 +31,6 @@ import org.onap.dcaegen2.services.sdk.rest.services.model.AaiModel;
 import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
 import reactor.core.publisher.Mono;
 
-import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.AaiHttpClientFactory.createRequestDiagnosticContext;
-
 public class AaiHttpPutClient implements AaiHttpClient<AaiModel, HttpResponse> {
 
     private CloudHttpClient httpPutClient;
@@ -38,7 +38,8 @@ public class AaiHttpPutClient implements AaiHttpClient<AaiModel, HttpResponse> {
     private final JsonBodyBuilder jsonBodyBuilder;
     private final String uri;
 
-    public AaiHttpPutClient(final AaiClientConfiguration configuration, JsonBodyBuilder jsonBodyBuilder, String uri, CloudHttpClient httpPutClient) {
+    public AaiHttpPutClient(final AaiClientConfiguration configuration, JsonBodyBuilder jsonBodyBuilder, String uri,
+            CloudHttpClient httpPutClient) {
         this.configuration = configuration;
         this.jsonBodyBuilder = jsonBodyBuilder;
         this.uri = uri;
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/AaiClientConfigurations.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/AaiClientConfigurations.java
new file mode 100644 (file)
index 0000000..ce8c07f
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.ImmutableAaiClientConfiguration;
+
+public final class AaiClientConfigurations {
+
+    private AaiClientConfigurations() {
+    }
+
+    public static AaiClientConfiguration secureConfiguration() {
+        return secureConfiguration(new HashMap<>());
+    }
+
+    public static AaiClientConfiguration secureConfiguration(Map<String, String> headers) {
+        return validConfiguration(headers, true);
+    }
+
+    public static AaiClientConfiguration insecureConfiguration() {
+        return validConfiguration(new HashMap<>(), false);
+    }
+
+    private static AaiClientConfiguration validConfiguration(Map<String, String> headers, boolean secure) {
+        return new ImmutableAaiClientConfiguration.Builder()
+                .aaiHost("sample-host")
+                .aaiUserName("sample-username")
+                .aaiUserPassword("sample-password")
+                .aaiIgnoreSslCertificateErrors(false)
+                .trustStorePath("/trust.pkcs12")
+                .trustStorePasswordPath("/trust.pass")
+                .keyStorePath("/server.pkcs12")
+                .keyStorePasswordPath("/server.pass")
+                .enableAaiCertAuth(secure)
+                .aaiHeaders(headers)
+                .aaiProtocol("sample-protocol")
+                .aaiPort(8080)
+                .aaiBasePath("sample-base-path")
+                .aaiPnfPath("sample-pnf-path")
+                .aaiServiceInstancePath("sample-instance-path")
+                .build();
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/AaiHttpClientFactoryTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/AaiHttpClientFactoryTest.java
new file mode 100644 (file)
index 0000000..7f5096e
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.insecureConfiguration;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.secureConfiguration;
+
+import io.netty.handler.ssl.SslContext;
+import javax.net.ssl.SSLException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.onap.dcaegen2.services.sdk.security.ssl.SecurityKeys;
+import org.onap.dcaegen2.services.sdk.security.ssl.SslFactory;
+
+class AaiHttpClientFactoryTest {
+
+    private SslFactory sslFactory;
+
+    @BeforeEach
+    void setup() {
+        this.sslFactory = Mockito.mock(SslFactory.class);
+    }
+
+    @Test
+    void createRequestDiagnosticContext_shouldReturnNonNullContext() {
+        assertNotNull(AaiHttpClientFactory.createRequestDiagnosticContext());
+    }
+
+    @Test
+    void build_onSecureConfigurationProvided_shouldReturnSecureClient() throws SSLException {
+        when(sslFactory.createSecureClientContext(any())).thenReturn(SslContext.newClientContext());
+        AaiHttpClientFactory cut = new AaiHttpClientFactory(secureConfiguration(), sslFactory);
+
+        cut.build();
+
+        verify(sslFactory).createSecureClientContext(any(SecurityKeys.class));
+        verify(sslFactory, never()).createInsecureClientContext();
+    }
+
+    @Test
+    void build_onInsecureConfigurationProvided_shouldReturnInsecureClient() throws SSLException {
+        when(sslFactory.createInsecureClientContext()).thenReturn(SslContext.newClientContext());
+        AaiHttpClientFactory cut = new AaiHttpClientFactory(insecureConfiguration(), sslFactory);
+
+        cut.build();
+
+        verify(sslFactory).createInsecureClientContext();
+        verify(sslFactory, never()).createSecureClientContext(any(SecurityKeys.class));
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/AbstractHttpClientTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/AbstractHttpClientTest.java
new file mode 100644 (file)
index 0000000..ee42871
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http;
+
+import static org.mockito.Mockito.mock;
+
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
+import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.CloudHttpClient;
+import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpResponse;
+import org.onap.dcaegen2.services.sdk.rest.services.model.AaiModel;
+import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
+import org.onap.dcaegen2.services.sdk.rest.services.uri.URI;
+
+public class AbstractHttpClientTest {
+
+    protected final AaiModel aaiModel = () -> "test-id";
+    protected final CloudHttpClient httpClient = mock(CloudHttpClient.class);
+    protected final JsonBodyBuilder bodyBuilder = mock(JsonBodyBuilder.class);
+    protected final HttpResponse response = mock(HttpResponse.class);
+
+
+    protected String constructAaiUri(AaiClientConfiguration configuration, String pnfName) {
+        return new URI.URIBuilder()
+                .scheme(configuration.aaiProtocol())
+                .host(configuration.aaiHost())
+                .port(configuration.aaiPort())
+                .path(configuration.aaiBasePath() + configuration.aaiPnfPath() + "/" + pnfName)
+                .build().toString();
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiGetServiceInstanceClientTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiGetServiceInstanceClientTest.java
new file mode 100644 (file)
index 0000000..d6199ac
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.get;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.secureConfiguration;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AbstractHttpClientTest;
+import org.onap.dcaegen2.services.sdk.rest.services.model.AaiServiceInstanceQueryModel;
+import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+class AaiGetServiceInstanceClientTest extends AbstractHttpClientTest {
+
+    @Test
+    void getAaiResponse_shouldCallGetMethod_withGivenAaiHeaders() {
+        AaiServiceInstanceQueryModel model = mock(AaiServiceInstanceQueryModel.class);
+        Map<String, String> headers = new HashMap<>();
+        AaiGetServiceInstanceClient cut = new AaiGetServiceInstanceClient(secureConfiguration(headers), httpClient);
+
+        given(httpClient.get(anyString(), any(RequestDiagnosticContext.class), anyMap()))
+                .willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(model))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient)
+                .get(anyString(), any(RequestDiagnosticContext.class), eq(headers));
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiHttpGetClientTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/get/AaiHttpGetClientTest.java
new file mode 100644 (file)
index 0000000..1dddc27
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.get;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.verify;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.secureConfiguration;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AbstractHttpClientTest;
+import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+class AaiHttpGetClientTest extends AbstractHttpClientTest {
+
+    @Test
+    void getAaiResponse_shouldCallGetMethod_withGivenAaiHeaders() {
+        Map<String, String> headers = new HashMap<>();
+        AaiHttpGetClient cut = new AaiHttpGetClient(secureConfiguration(headers), httpClient);
+
+        given(httpClient.get(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap()
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).get(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                eq(headers)
+        );
+    }
+
+    @Test
+    void getAaiResponse_shouldCallGetMethod_withProperUri() {
+        AaiClientConfiguration configuration = secureConfiguration();
+        String expectedUri = constructAaiUri(configuration, aaiModel.getCorrelationId());
+        AaiHttpGetClient cut = new AaiHttpGetClient(configuration, httpClient);
+
+        given(httpClient.get(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap()
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).get(
+                eq(expectedUri),
+                any(RequestDiagnosticContext.class),
+                anyMap()
+        );
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/patch/AaiHttpPatchClientTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/patch/AaiHttpPatchClientTest.java
new file mode 100644 (file)
index 0000000..302395a
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.patch;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.verify;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.secureConfiguration;
+
+import io.vavr.collection.HashMap;
+import io.vavr.collection.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AbstractHttpClientTest;
+import org.onap.dcaegen2.services.sdk.rest.services.model.AaiModel;
+import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
+import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+class AaiHttpPatchClientTest extends AbstractHttpClientTest {
+
+    private final Map<String, String> DEFAULT_PATCH_HEADERS =
+            HashMap.of("Content-Type", "application/merge-patch+json");
+
+    @Test
+    void getAaiResponse_shouldCallPatchMethod_withGivenHeaders_combinedWithContentType() {
+
+        Map<String, String> headers = HashMap.of("sample-key", "sample-value");
+        Map<String, String> expectedHeaders = DEFAULT_PATCH_HEADERS.merge(headers);
+        AaiHttpPatchClient cut =
+                new AaiHttpPatchClient(secureConfiguration(headers.toJavaMap()), bodyBuilder, httpClient);
+
+        given(httpClient.patch(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                any(JsonBodyBuilder.class),
+                any(AaiModel.class)
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).patch(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                eq(expectedHeaders.toJavaMap()),
+                eq(bodyBuilder),
+                eq(aaiModel)
+        );
+    }
+
+    @Test
+    void getAaiResponse_shouldCallPatchMethod_withProperUri() {
+        AaiClientConfiguration configuration = secureConfiguration();
+        String expectedUri = constructAaiUri(configuration, aaiModel.getCorrelationId());
+        AaiHttpPatchClient cut = new AaiHttpPatchClient(configuration, bodyBuilder, httpClient);
+
+        given(httpClient.patch(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                any(JsonBodyBuilder.class),
+                any(AaiModel.class)
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).patch(
+                eq(expectedUri),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                eq(bodyBuilder),
+                eq(aaiModel)
+        );
+    }
+}
diff --git a/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/put/AaiHttpPutClientTest.java b/rest-services/aai-client/src/test/java/org/onap/dcaegen2/services/sdk/rest/services/aai/client/service/http/put/AaiHttpPutClientTest.java
new file mode 100644 (file)
index 0000000..7ce47a0
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.put;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.verify;
+import static org.onap.dcaegen2.services.sdk.rest.services.aai.client.AaiClientConfigurations.secureConfiguration;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.rest.services.aai.client.service.http.AbstractHttpClientTest;
+import org.onap.dcaegen2.services.sdk.rest.services.model.AaiModel;
+import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
+import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+class AaiHttpPutClientTest extends AbstractHttpClientTest {
+
+    @Test
+    void getAaiResponse_shouldCallPutMethod_withGivenAaiHeaders() {
+        Map<String, String> headers = new HashMap<>();
+        AaiHttpPutClient cut = new AaiHttpPutClient(secureConfiguration(headers), bodyBuilder, "", httpClient);
+
+        given(httpClient.put(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                any(JsonBodyBuilder.class),
+                any(AaiModel.class)
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).put(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                eq(headers),
+                eq(bodyBuilder),
+                eq(aaiModel)
+        );
+    }
+
+    @Test
+    void getAaiResponse_shouldCallPutMethod_withProperUri() {
+        String uri = "test-uri";
+        AaiHttpPutClient cut = new AaiHttpPutClient(secureConfiguration(), bodyBuilder, uri, httpClient);
+
+        given(httpClient.put(
+                anyString(),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                any(JsonBodyBuilder.class),
+                any(AaiModel.class)
+        )).willReturn(Mono.just(response));
+
+        StepVerifier
+                .create(cut.getAaiResponse(aaiModel))
+                .expectNext(response)
+                .verifyComplete();
+
+        verify(httpClient).put(
+                eq(uri),
+                any(RequestDiagnosticContext.class),
+                anyMap(),
+                eq(bodyBuilder),
+                eq(aaiModel)
+        );
+    }
+}
diff --git a/rest-services/aai-client/src/test/resources/server.pass b/rest-services/aai-client/src/test/resources/server.pass
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/rest-services/aai-client/src/test/resources/server.pkcs12 b/rest-services/aai-client/src/test/resources/server.pkcs12
new file mode 100644 (file)
index 0000000..40e2593
--- /dev/null
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC225TsqniWsqLQ
+YmOmmZxlpzBwhzU4pXiRfIZBUuT+ajPQVFx+zVv6ecEjXEFgQfNR60VZ3h6Zus32
+bVD7XKlwuL6U5P7Mt1k/K5RFPrr9WGFT/K9I8V69VmfLBnMTo4YjDEaTKiJqAC0W
+pN6Jm7ZLXzHNmHmm+CdufeNcKQ0kKFI0/C5V4X8o2wYo7ptC2PnKrLleapNqq86N
+GSw+pudWmlhMnsrEP9yWp2Crz2QynbwGDfvfLnenf643ViCV8MRBqdX6VtKfnxzl
+IYzAdWuYJDwyKVOvDBOgWSd8SWW9aqly0qZFIrTCFmUlsecTYXIn7J8VsoWX54Xf
+Bp8VNy3/AgMBAAECggEATzN4o7GKnast/hg/lU9/gEAUKQlHMgvp1woalHy1FsUl
+QBzqGzoTlr/Zudkhr/Gg1GCVH0Gn+2n//7aFlvohoeNDGPa+rijUDRpxFDUBhO4c
+6eXOfkedg2DDgBqBCYaQeOm+P8vGMCd3YBF1GiFJqgfHaIecWYeufJsmOSrGuFvK
+1OvHpvg4/FLLQqgVcVO812kD4UwSOKnZVnPuZ3pzQviUZvO8ZxI/LkzQB1EdH6u3
+rBtiGslYkiKl5cGpH39/Dx2nKhHfvSnkfsm7koB00Bl41yy61GPwdl4XUwg8LUhX
+TbsuoIPGTJX/2FUMn0UnAdDJm29hE4eyHyYOhew8gQKBgQDlAeUcnFr9uxe0i7cg
+6ctJlNIKJjlA1tH4qIMEytdn06STo9g2j8X5HVE0FX/3+gAYDtEVICTF66w8Y474
+aeazvf+TCfkxtEOiH2afvaNkIkfzKR0ceB48DECT0DCF7xha5rJVf/W4GpCz2WkZ
+ojDzw5ZVvzbx/FaF9A/IseJ63wKBgQDMaSjiephhdlCERGPdwWMg3AfthEX/VHM0
+YugbVjjYjDbn2pMkntW2hUuVXP8HD+9DnQZo0/c/hxe28Q5b+2fjZephdctnY8tL
+XWbaEerM2lxEjmrpA4jYTBZJ9nMsxkEYHGHb5I586aS2YaZ12e7DoKMFdl0EZzvi
+zGPIxSzQ4QKBgAxVv8t8uIH2M96rr997+FEsTOvzBx5w87pbCUOW0WdsRO8W4ix+
+LgGvDJKrncrzklG5apWit5hZi1ttWWQUADMqRrvay6tbtFDlNBfilQxttEZqroC8
+D5TYbBoKGrL8H+m1h2GHlOqns6ecTEbvL4fRvyU7OXBrURXCAZ+jxTktAoGACbQI
+O9AEAcRjCBRTBUjT0tB/E9hOllNE8LytNfb+1dC6HoFysK9Vh8eGEf4LISOxgO0o
+S7ucJgjcqFODEfy6LsI8wQmdcTf8g4RYiIuHMNhAvwRfsNX5HgNmn3Yye3Khzmoy
+fwS3etiAeCPkif2hZunuMykuOzJHVnnLVtF9UiECgYEA41d7FgUcnfPIyA5xLg7K
+lRgjFMsc68uzoCBQww2kio0HNJpdOPBJlg6oHHfYKriv2r9793jETRVwjSNPlKZb
+vqm9yhnbXuahYBZSgdo2W+NbhP6IbJ0vrF4t9g6byjancQptaCjNIr9St9g+Ugly
+8m0n3gIT/+Lr+it63cgk8SA=
+-----END PRIVATE KEY-----
diff --git a/rest-services/aai-client/src/test/resources/trust.pass b/rest-services/aai-client/src/test/resources/trust.pass
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/rest-services/aai-client/src/test/resources/trust.pkcs12 b/rest-services/aai-client/src/test/resources/trust.pkcs12
new file mode 100644 (file)
index 0000000..01b6137
Binary files /dev/null and b/rest-services/aai-client/src/test/resources/trust.pkcs12 differ