SDC Distribution Client code coverage increase 13/95013/1
authorPiotr Darosz <piotr.darosz@nokia.com>
Thu, 5 Sep 2019 09:20:25 +0000 (11:20 +0200)
committerPiotr Darosz <piotr.darosz@nokia.com>
Thu, 5 Sep 2019 09:20:50 +0000 (11:20 +0200)
Increase code coverage for SdcConnectorClient class

Change-Id: If57ab69bcaad3dbfa4dd62d449ed4773f090dc2c
Issue-ID: SDC-2326
Signed-off-by: Piotr Darosz <piotr.darosz@nokia.com>
sdc-distribution-client/src/main/java/org/onap/sdc/http/SdcConnectorClient.java
sdc-distribution-client/src/test/java/org/onap/sdc/http/SdcConnectorClientTest.java

index d294fef..33fedc7 100644 (file)
@@ -3,6 +3,7 @@
  * sdc-distribution-client
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications copyright (C) 2019 Nokia. 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.
@@ -58,7 +59,7 @@ import com.google.gson.reflect.TypeToken;
 import fj.data.Either;
 
 public class SdcConnectorClient {
-    private String contentDispositionHeader = "Content-Disposition";
+    String contentDispositionHeader = "Content-Disposition";
     private static Logger log = LoggerFactory.getLogger(SdcConnectorClient.class.getName());
     private IConfiguration configuration;
     private HttpAsdcClient httpClient = null;
@@ -164,7 +165,7 @@ public class SdcConnectorClient {
         DistributionClientResultImpl response = null;
 
         String requestId = UUID.randomUUID().toString();
-        HttpAsdcClient httpClient = new HttpAsdcClient(configuration);
+        HttpAsdcClient httpClient = createNewHttpClient();
         Map<String, String> requestHeaders = addHeadersToHttpRequest(requestId);
 
         RegistrationRequest registrationRequest = new RegistrationRequest(credential.getApiKey(), configuration.getEnvironmentName(), configuration.isConsumeProduceStatusTopic(), configuration.getMsgBusAddress());
@@ -191,6 +192,10 @@ public class SdcConnectorClient {
 
     }
 
+    HttpAsdcClient createNewHttpClient() {
+        return new HttpAsdcClient(configuration);
+    }
+
     public DistributionClientDownloadResultImpl dowloadArtifact(IArtifactInfo artifactInfo) {
         DistributionClientDownloadResultImpl response = new DistributionClientDownloadResultImpl(DistributionActionResultEnum.GENERAL_ERROR, "failed to download artifact from ASDC");
 
index ac156b1..e406825 100644 (file)
@@ -3,6 +3,7 @@
  * SDC
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications copyright (C) 2019 Nokia. 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.
 
 package org.onap.sdc.http;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.codec.digest.Md5Crypt;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpStatus;
@@ -40,12 +51,16 @@ import org.apache.http.client.methods.CloseableHttpResponse;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.mockito.Matchers;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.onap.sdc.api.results.IDistributionClientResult;
 import org.onap.sdc.impl.DistributionClientResultImpl;
 import org.onap.sdc.api.asdc.RegistrationRequest;
 import org.onap.sdc.api.consumer.IConfiguration;
+import org.onap.sdc.utils.DistributionActionResultEnum;
 import org.onap.sdc.utils.Pair;
 
 import com.att.nsa.apiClient.credentials.ApiCredential;
@@ -55,13 +70,13 @@ import com.google.gson.GsonBuilder;
 import fj.data.Either;
 
 public class SdcConnectorClientTest {
-       private Gson gson = new GsonBuilder().create();
+    private static Gson gson = new GsonBuilder().create();
        private static final String MOCK_ENV = "MockEnv";
        private static final String MOCK_API_KEY = "MockApikey";
-       private static HttpAsdcClient httpClient = Mockito.mock(HttpAsdcClient.class);
-       private static IConfiguration configuration = Mockito.mock(IConfiguration.class);
-       private static ApiCredential apiCredential = Mockito.mock(ApiCredential.class);
-       private static HttpAsdcResponse httpAsdcResponse = Mockito.mock(HttpAsdcResponse.class);
+       private static HttpAsdcClient httpClient = mock(HttpAsdcClient.class);
+       private static IConfiguration configuration = mock(IConfiguration.class);
+       private static ApiCredential apiCredential = mock(ApiCredential.class);
+       private static HttpAsdcResponse httpAsdcResponse = mock(HttpAsdcResponse.class);
        @SuppressWarnings("unchecked")
        private static Either<TopicRegistrationResponse, DistributionClientResultImpl> mockResponse = Mockito
                        .mock(Either.class);
@@ -71,6 +86,14 @@ public class SdcConnectorClientTest {
 
        private static SdcConnectorClient asdcClient = Mockito.spy(new SdcConnectorClient());
 
+    private static final String ARTIFACT_URL = "http://127.0.0.1/artifact/url";
+    private static final String IT_JUST_DIDN_T_WORK = "It just didn't work";
+       private static final List<String> ARTIFACT_TYPES = Arrays.asList( "Service", "Resource", "VF", "VFC");
+       private static final String VALID_JSON_PAYLOAD = gson.toJson(ARTIFACT_TYPES);
+       private static final int PORT = 49512;
+       private static final byte[] BYTES = new byte[] { 0xA, 0xB, 0xC, 0xD };
+
+
        @BeforeClass
        public static void beforeClass() {
                asdcClient.setConfiguration(configuration);
@@ -99,6 +122,35 @@ public class SdcConnectorClientTest {
                                Mockito.eq(mockHeaders), Mockito.eq(false));
        }
 
+       @Test(expected = IllegalStateException.class)
+       public void initAndCloseTest() {
+               IConfiguration conf = Mockito.mock(IConfiguration.class);
+               when(conf.getUser()).thenReturn("user");
+               when(conf.getPassword()).thenReturn("password");
+
+               when(conf.activateServerTLSAuth()).thenReturn(false);
+               SdcConnectorClient client = new SdcConnectorClient();
+               client.init(conf);
+               assertNotNull(client.getHttpClient());
+               client.close();
+
+               //check if client is really closed
+               client.getHttpClient().getRequest(AsdcUrls.POST_FOR_TOPIC_REGISTRATION, new HashMap<>());
+       }
+
+
+       @Test
+       public void getConfigurationTest() {
+               IConfiguration conf = asdcClient.getConfiguration();
+               assertEquals(configuration, conf);
+       }
+
+       @Test
+       public void getHttpClientTest() {
+               HttpAsdcClient httpAsdcClient = asdcClient.getHttpClient();
+               assertEquals(httpClient, httpAsdcClient);
+       }
+
        @Test
        public void testConsumeProduceStatusTopicFalse() throws UnsupportedOperationException, IOException {
 
@@ -117,7 +169,7 @@ public class SdcConnectorClientTest {
                when(configuration.isConsumeProduceStatusTopic()).thenReturn(isConsumeProduceStatusFlag);
                asdcClient.registerAsdcTopics(apiCredential);
                verify(httpClient, times(1)).postRequest(Mockito.eq(AsdcUrls.POST_FOR_TOPIC_REGISTRATION),
-                               Mockito.any(HttpEntity.class), Mockito.eq(mockHeaders), Mockito.eq(false));
+                               any(HttpEntity.class), Mockito.eq(mockHeaders), Mockito.eq(false));
                assertNotNull(lastHttpEntity);
                RegistrationRequest actualRegRequest = gson.fromJson(IOUtils.toString(lastHttpEntity.getContent(), StandardCharsets.UTF_8), RegistrationRequest.class);
                RegistrationRequest expectedRegRequest = gson.fromJson(excpectedStringBody(isConsumeProduceStatusFlag), RegistrationRequest.class);
@@ -127,8 +179,210 @@ public class SdcConnectorClientTest {
                assertTrue(actualRegRequest.getIsConsumerToSdcDistrStatusTopic()
                                .equals(expectedRegRequest.getIsConsumerToSdcDistrStatusTopic()));
        }
-       
-       
+
+       @Test
+       public void getValidArtifactTypesListHappyScenarioTest() throws IOException {
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               CloseableHttpResponse closeableHttpResponseMock = mock(CloseableHttpResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, closeableHttpResponseMock);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_OK);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(VALID_JSON_PAYLOAD.getBytes()));
+               when(httpClient.getRequest(eq(AsdcUrls.GET_VALID_ARTIFACT_TYPES), Matchers.any(), eq(false)))
+                               .thenReturn(responsePair);
+
+               Either<List<String>, IDistributionClientResult> result = asdcClient.getValidArtifactTypesList();
+               assertTrue(result.isLeft());
+               List<String> list = result.left().value();
+               assertEquals(ARTIFACT_TYPES, list);
+       }
+
+       @Test
+       public void getValidArtifactTypesListErrorResponseScenarioTest() throws IOException {
+        HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_GATEWAY_TIMEOUT);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(IT_JUST_DIDN_T_WORK.getBytes()));
+               when(httpClient.getRequest(eq(AsdcUrls.GET_VALID_ARTIFACT_TYPES), Matchers.any(), eq(false)))
+                               .thenReturn(responsePair);
+
+               Either<List<String>, IDistributionClientResult> result = asdcClient.getValidArtifactTypesList();
+               assertTrue(result.isRight());
+               IDistributionClientResult distributionClientResult = result.right().value();
+               assertEquals(DistributionActionResultEnum.ASDC_SERVER_TIMEOUT, distributionClientResult.getDistributionActionResult());
+       }
+
+
+       @Test
+       public void getValidArtifactTypesListExceptionDuringConnectionClosingTest() throws IOException {
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               CloseableHttpResponse closeableHttpResponseMock = mock(CloseableHttpResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, closeableHttpResponseMock);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_GATEWAY_TIMEOUT);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(VALID_JSON_PAYLOAD.getBytes()));
+               when(httpClient.getRequest(eq(AsdcUrls.GET_VALID_ARTIFACT_TYPES), Matchers.any(), eq(false)))
+                               .thenReturn(responsePair);
+
+               doThrow(new IOException("Test exception")).when(closeableHttpResponseMock).close();
+
+               Either<List<String>, IDistributionClientResult> result = asdcClient.getValidArtifactTypesList();
+               assertTrue(result.isRight());
+               IDistributionClientResult distributionClientResult = result.right().value();
+               assertEquals(DistributionActionResultEnum.ASDC_SERVER_TIMEOUT, distributionClientResult.getDistributionActionResult());
+       }
+
+       @Test
+       public void getValidArtifactTypesListParsingExceptionHandlingTest() throws IOException {
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               CloseableHttpResponse closeableHttpResponseMock = mock(CloseableHttpResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, closeableHttpResponseMock);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_OK);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ThrowingInputStreamForTesting());
+               when(httpClient.getRequest(eq(AsdcUrls.GET_VALID_ARTIFACT_TYPES), Matchers.any(), eq(false)))
+                               .thenReturn(responsePair);
+
+               Either<List<String>, IDistributionClientResult> result = asdcClient.getValidArtifactTypesList();
+               assertTrue(result.isRight());
+               IDistributionClientResult distributionClientResult = result.right().value();
+               assertEquals(DistributionActionResultEnum.GENERAL_ERROR, distributionClientResult.getDistributionActionResult());
+       }
+
+       @Test
+       public void unregisterTopicsErrorDuringProcessingTest() throws IOException {
+               when(configuration.getAsdcAddress()).thenReturn("127.0.0.1" + PORT);
+               when(configuration.isConsumeProduceStatusTopic()).thenReturn(false);
+               when(configuration.getMsgBusAddress()).thenReturn(Arrays.asList("http://127.0.0.1:45321/dmaap", "http://127.0.0.1:45321/dmaap"));
+
+               doReturn(httpClient).when(asdcClient).createNewHttpClient();
+
+               String failMessage = "It just didn't work";
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_BAD_GATEWAY);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(failMessage.getBytes()));
+               doReturn(responsePair)
+                       .when(httpClient).postRequest(eq(AsdcUrls.POST_FOR_UNREGISTER), any(HttpEntity.class), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.unregisterTopics(apiCredential);
+               assertEquals(DistributionActionResultEnum.ASDC_CONNECTION_FAILED, result.getDistributionActionResult());
+       }
+
+       @Test
+       public void unregisterTopicsHappyScenarioTest() throws IOException {
+               when(configuration.getAsdcAddress()).thenReturn("127.0.0.1" + PORT);
+               when(configuration.isConsumeProduceStatusTopic()).thenReturn(false);
+
+               doReturn(httpClient).when(asdcClient).createNewHttpClient();
+
+               String failMessage = "";
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_NO_CONTENT);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(failMessage.getBytes()));
+               doReturn(responsePair)
+                               .when(httpClient).postRequest(eq(AsdcUrls.POST_FOR_UNREGISTER), any(HttpEntity.class), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.unregisterTopics(apiCredential);
+               assertEquals(DistributionActionResultEnum.SUCCESS, result.getDistributionActionResult());
+       }
+
+       @Test
+       public void downloadArtifactHappyScenarioTest() throws IOException {
+               Map<String,String> headers = new HashMap<>();
+               headers.put(asdcClient.contentDispositionHeader, "SomeHeader");
+
+               IArtifactInfo artifactInfo = mock(IArtifactInfo.class);
+               when(artifactInfo.getArtifactURL()).thenReturn(ARTIFACT_URL);
+               when(artifactInfo.getArtifactChecksum()).thenReturn(Md5Crypt.md5Crypt(BYTES));
+
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_OK);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(responseMock.getHeadersMap()).thenReturn(headers);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(BYTES));
+               doReturn(responsePair)
+                               .when(httpClient).getRequest(eq(ARTIFACT_URL), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.dowloadArtifact(artifactInfo);
+               assertEquals(DistributionActionResultEnum.SUCCESS, result.getDistributionActionResult());
+       }
+
+       @Test
+       public void downloadArtifactDataIntegrityProblemTest() throws IOException {
+               IArtifactInfo artifactInfo = mock(IArtifactInfo.class);
+               when(artifactInfo.getArtifactURL()).thenReturn(ARTIFACT_URL);
+
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_OK);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ByteArrayInputStream(BYTES));
+               doReturn(responsePair)
+                               .when(httpClient).getRequest(eq(ARTIFACT_URL), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.dowloadArtifact(artifactInfo);
+               assertEquals(DistributionActionResultEnum.DATA_INTEGRITY_PROBLEM, result.getDistributionActionResult());
+       }
+
+       @Test
+       public void downloadArtifactExceptionDuringDownloadHandlingTest() throws IOException {
+               IArtifactInfo artifactInfo = mock(IArtifactInfo.class);
+               when(artifactInfo.getArtifactURL()).thenReturn(ARTIFACT_URL);
+
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_OK);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ThrowingInputStreamForTesting());
+               doReturn(responsePair)
+                               .when(httpClient).getRequest(eq(ARTIFACT_URL), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.dowloadArtifact(artifactInfo);
+               assertEquals(DistributionActionResultEnum.GENERAL_ERROR, result.getDistributionActionResult());
+       }
+
+       @Test
+       public void downloadArtifactHandleDownloadErrorTest() throws IOException {
+               IArtifactInfo artifactInfo = mock(IArtifactInfo.class);
+               when(artifactInfo.getArtifactURL()).thenReturn(ARTIFACT_URL);
+
+               HttpAsdcResponse responseMock = mock(HttpAsdcResponse.class);
+               HttpEntity messageMock = mock(HttpEntity.class);
+               Pair<HttpAsdcResponse, CloseableHttpResponse> responsePair = new Pair<>(responseMock, null);
+
+               when(responseMock.getStatus()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+               when(responseMock.getMessage()).thenReturn(messageMock);
+               when(messageMock.getContent()).thenReturn(new ThrowingInputStreamForTesting());
+               doReturn(responsePair)
+                               .when(httpClient).getRequest(eq(ARTIFACT_URL), any(), eq(false));
+
+               IDistributionClientResult result = asdcClient.dowloadArtifact(artifactInfo);
+               assertEquals(DistributionActionResultEnum.ASDC_SERVER_PROBLEM, result.getDistributionActionResult());
+       }
 
        private String excpectedStringBody(boolean isConsumeProduceStatusTopic) {
                String stringBodyTemplate = "{\r\n" + "  \"apiPublicKey\": \"MockApikey\",\r\n"
@@ -136,4 +390,11 @@ public class SdcConnectorClientTest {
                return String.format(stringBodyTemplate, isConsumeProduceStatusTopic);
 
        }
+
+       static class ThrowingInputStreamForTesting extends InputStream {
+               @Override
+               public int read() throws IOException {
+                       throw new IOException("Not implemented. This is expected as the implementation is for unit tests only.");
+               }
+       }
 }