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