re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / distribution / engine / rest / MsoRestClientTest.java
1 package org.openecomp.sdc.be.components.distribution.engine.rest;
2
3 import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
4 import com.github.tomakehurst.wiremock.junit.WireMockRule;
5 import com.github.tomakehurst.wiremock.matching.AnythingPattern;
6 import com.github.tomakehurst.wiremock.matching.UrlPattern;
7 import fj.data.Either;
8 import org.apache.http.HttpHeaders;
9 import org.junit.Before;
10 import org.junit.ClassRule;
11 import org.junit.Test;
12 import org.openecomp.sdc.be.components.distribution.engine.DistributionStatusNotificationEnum;
13 import org.openecomp.sdc.be.components.distribution.engine.DummyDistributionConfigurationManager;
14 import org.openecomp.sdc.be.config.ConfigurationManager;
15 import org.openecomp.sdc.common.api.ConfigurationSource;
16 import org.openecomp.sdc.common.http.client.api.HttpResponse;
17 import org.openecomp.sdc.common.http.config.*;
18 import org.openecomp.sdc.common.impl.ExternalConfiguration;
19 import org.openecomp.sdc.common.impl.FSConfigurationSource;
20 import org.openecomp.sdc.security.SecurityUtil;
21
22 import static com.github.tomakehurst.wiremock.client.WireMock.*;
23 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.mockito.Mockito.when;
26
27 public class MsoRestClientTest {
28
29     private static final String MSO_HOST = "127.0.0.1";
30     private static final String MSO_API_URL = "onap/mso/infra/modelDistributions/v1";
31     private static final String DISTRIBUTION_ID = "1000";
32
33     private MSORestClient msoRestClient;
34     static ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), "src/test/resources/config/catalog-be");
35     static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
36
37
38     @ClassRule
39     public static WireMockRule msoRestServer = new WireMockRule(options()
40             .dynamicPort()
41             .bindAddress(MSO_HOST));
42
43     @Before
44     public void setupMsoServer() throws Exception {
45         String encodedPw = "";
46         Either<String, String> passkey = SecurityUtil.INSTANCE.decrypt(getPwd());
47         if(passkey.isLeft()) {
48             encodedPw = passkey.left().value();
49         }
50         else {
51             throw new IllegalArgumentException(passkey.right().value());
52         }
53         
54         msoRestServer.resetToDefaultMappings();
55         msoRestServer.stubFor(patch(urlMatching(String.format("/%s%s/(.*)", MSO_API_URL, getDistributionsUrl())))
56                 .withBasicAuth(getUserName(), encodedPw)
57                 .withHeader(HttpHeaders.CONTENT_TYPE, containing("application/json"))
58                 .withRequestBody(matchingJsonPath("$.status"))
59                 .withRequestBody(matchingJsonPath("$.errorReason", new AnythingPattern()))//error reason is not mandatory
60                 .willReturn(aResponse().withStatus(200)));
61     }
62
63     @Before
64     public void setUp() throws Exception {
65         DummyDistributionConfigurationManager distributionEngineConfigurationMock = new DummyDistributionConfigurationManager();
66         when(distributionEngineConfigurationMock.getConfigurationMock().getMsoConfig()).thenReturn(new MsoDummyConfig(msoRestServer.port()));
67         msoRestClient = new MSORestClient();
68     }
69
70     @Test
71     public void notifyDistributionComplete_emptyErrReason() throws Exception {
72         HttpResponse<String> response = msoRestClient.notifyDistributionComplete(DISTRIBUTION_ID, DistributionStatusNotificationEnum.DISTRIBUTION_COMPLETE_OK, "");
73         assertThat(response.getStatusCode()).isEqualTo(200);
74     }
75
76     private int getNumOfRetries() {
77         return ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getMsoConfig().getHttpClientConfig().getNumOfRetries();
78     }
79
80     @Test
81     public void notifyDistributionComplete_noErrReason() throws Exception {
82         HttpResponse<String> response = msoRestClient.notifyDistributionComplete(DISTRIBUTION_ID, DistributionStatusNotificationEnum.DISTRIBUTION_COMPLETE_OK, null);
83         assertThat(response.getStatusCode()).isEqualTo(200);
84     }
85
86     @Test
87     public void notifyDistributionComplete_completeWithError() throws Exception {
88         HttpResponse<String> response = msoRestClient.notifyDistributionComplete(DISTRIBUTION_ID, DistributionStatusNotificationEnum.DISTRIBUTION_COMPLETE_ERROR, "my reason");
89         assertThat(response.getStatusCode()).isEqualTo(200);
90     }
91
92     @Test
93     public void testRetries() throws Exception {
94         int readTimeout = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getMsoConfig().getHttpClientConfig().getTimeouts().getReadTimeoutMs();
95         int expectedNumOfRetries = getNumOfRetries();
96
97         UrlPattern msoReqUrlPattern = urlMatching(String.format("/%s%s/(.*)", MSO_API_URL, getDistributionsUrl()));
98         msoRestServer.stubFor(patch(msoReqUrlPattern)
99                 .willReturn(new ResponseDefinitionBuilder().withFixedDelay(readTimeout + 1)));
100         HttpResponse<String> response = msoRestClient.notifyDistributionComplete(DISTRIBUTION_ID, DistributionStatusNotificationEnum.DISTRIBUTION_COMPLETE_ERROR, "my reason");
101         verify(expectedNumOfRetries + 1, patchRequestedFor(msoReqUrlPattern));
102         assertThat(response.getStatusCode()).isEqualTo(500);
103     }
104
105     private static String getDistributionsUrl() {
106         return "/distributions";
107     }
108
109     private static String getUserName() {
110         return "asdc";
111     }
112
113     private static String getPwd() {
114         return "OTLEp5lfVhYdyw5EAtTUBQ==";
115     }
116
117     private static class MsoDummyConfig extends ExternalServiceConfig {
118         int port;
119
120         MsoDummyConfig(int port) {
121             this.port = port;
122
123             BasicAuthorization basicAuthorization = new BasicAuthorization();
124             basicAuthorization.setUserName(MsoRestClientTest.getUserName());
125             basicAuthorization.setPassword(getPwd());
126             HttpClientConfig httpClientConfig = new HttpClientConfig(new Timeouts(500, 2000), basicAuthorization);
127             httpClientConfig.setNumOfRetries(getNumOfRetries());
128             super.setHttpClientConfig(httpClientConfig);
129
130             HttpRequestConfig httpRequestConfig = new HttpRequestConfig();
131             httpRequestConfig.setServerRootUrl(String.format("http://%s:%s/%s", MSO_HOST, this.port, MSO_API_URL));
132             httpRequestConfig.getResourceNamespaces().put(MSORestClient.DISTRIBUTIONS_RESOURCE_CONFIG_PARAM, getDistributionsUrl());
133             super.setHttpRequestConfig(httpRequestConfig);
134         }
135
136         int getNumOfRetries() {
137             return 1;
138         }
139     }
140
141 }