e4532cd8d782c5a15a257d0b592f5445df5954ab
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.apihandlerinfra;
22
23
24 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
25 import static com.github.tomakehurst.wiremock.client.WireMock.get;
26 import static com.github.tomakehurst.wiremock.client.WireMock.post;
27 import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertFalse;
30 import static org.junit.Assert.assertNotEquals;
31 import static org.junit.Assert.assertNull;
32 import static org.junit.Assert.assertTrue;
33 import static org.onap.so.logger.HttpHeadersConstants.ONAP_REQUEST_ID;
34 import static org.onap.so.logger.HttpHeadersConstants.REQUESTOR_ID;
35 import static org.onap.so.logger.MdcConstants.CLIENT_ID;
36 import java.io.IOException;
37 import java.net.MalformedURLException;
38 import java.net.URL;
39 import java.nio.file.Files;
40 import java.nio.file.Paths;
41 import java.util.List;
42 import javax.ws.rs.core.MediaType;
43 import org.apache.http.HttpStatus;
44 import org.junit.Before;
45 import org.junit.Test;
46 import org.onap.logging.ref.slf4j.ONAPLogConstants;
47 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
48 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
49 import org.onap.so.db.catalog.beans.Service;
50 import org.onap.so.db.request.beans.InfraActiveRequests;
51 import org.onap.so.logger.HttpHeadersConstants;
52 import org.onap.so.serviceinstancebeans.ModelInfo;
53 import org.onap.so.serviceinstancebeans.ModelType;
54 import org.onap.so.serviceinstancebeans.RequestDetails;
55 import org.onap.so.serviceinstancebeans.RequestInfo;
56 import org.onap.so.serviceinstancebeans.RequestParameters;
57 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
58 import org.springframework.beans.factory.annotation.Autowired;
59 import org.springframework.beans.factory.annotation.Value;
60 import org.springframework.http.HttpEntity;
61 import org.springframework.http.HttpHeaders;
62 import org.springframework.http.HttpMethod;
63 import org.springframework.http.ResponseEntity;
64 import org.springframework.web.util.UriComponentsBuilder;
65 import com.fasterxml.jackson.annotation.JsonInclude.Include;
66 import com.fasterxml.jackson.core.JsonParseException;
67 import com.fasterxml.jackson.core.JsonProcessingException;
68 import com.fasterxml.jackson.databind.DeserializationFeature;
69 import com.fasterxml.jackson.databind.JsonMappingException;
70 import com.fasterxml.jackson.databind.ObjectMapper;
71
72 public class RequestHandlerUtilsTest extends BaseTest {
73
74     private final ObjectMapper mapper = new ObjectMapper();
75     private ObjectMapper errorMapper = new ObjectMapper();
76
77     @Autowired
78     private RequestHandlerUtils requestHandlerUtils;
79
80     @Autowired
81     private CamundaRequestHandler camundaRequestHandler;
82
83     @Value("${wiremock.server.port}")
84     private String wiremockPort;
85
86     private URL initialUrl;
87     private int initialPort;
88     private HttpHeaders headers;
89
90     @Before
91     public void beforeClass() {
92         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
93         errorMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
94         errorMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
95         // set headers
96         headers = new HttpHeaders();
97         headers.set(ONAPLogConstants.Headers.PARTNER_NAME, "test_name");
98         headers.set(HttpHeadersConstants.TRANSACTION_ID, "32807a28-1a14-4b88-b7b3-2950918aa76d");
99         headers.set(ONAP_REQUEST_ID, "32807a28-1a14-4b88-b7b3-2950918aa76d");
100         headers.set(ONAPLogConstants.MDCs.REQUEST_ID, "32807a28-1a14-4b88-b7b3-2950918aa76d");
101         headers.set(CLIENT_ID, "VID");
102         headers.set(REQUESTOR_ID, "xxxxxx");
103         try { // generate one-time port number to avoid RANDOM port number later.
104             initialUrl = new URL(createURLWithPort(Constants.ORCHESTRATION_REQUESTS_PATH));
105             initialPort = initialUrl.getPort();
106         } catch (MalformedURLException e) {
107             e.printStackTrace();
108         }
109         wireMockServer.stubFor(post(urlMatching(".*/infraActiveRequests.*")).willReturn(aResponse()
110                 .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).withStatus(HttpStatus.SC_OK)));
111     }
112
113     public String inputStream(String JsonInput) throws IOException {
114         JsonInput = "src/test/resources/ServiceInstanceTest" + JsonInput;
115         return new String(Files.readAllBytes(Paths.get(JsonInput)));
116     }
117
118     public ResponseEntity<String> sendRequest(String requestJson, String uriPath, HttpMethod reqMethod,
119             HttpHeaders headers) {
120
121         if (!headers.containsKey(HttpHeaders.ACCEPT)) {
122             headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
123         }
124         if (!headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
125             headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
126         }
127
128         UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(uriPath, initialPort));
129
130         HttpEntity<String> request = new HttpEntity<>(requestJson, headers);
131
132         return restTemplate.exchange(builder.toUriString(), reqMethod, request, String.class);
133     }
134
135     public ResponseEntity<String> sendRequest(String requestJson, String uriPath, HttpMethod reqMethod) {
136         return sendRequest(requestJson, uriPath, reqMethod, new HttpHeaders());
137     }
138
139     @Test
140     public void test_mapJSONtoMSOStyle() throws IOException {
141         ObjectMapper mapper = new ObjectMapper();
142         mapper.setSerializationInclusion(Include.NON_NULL);
143         String testRequest = inputStream("/ServiceInstanceDefault.json");
144         String resultString = requestHandlerUtils.mapJSONtoMSOStyle(testRequest, null, false, null);
145         ServiceInstancesRequest sir = mapper.readValue(resultString, ServiceInstancesRequest.class);
146         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
147         assertEquals("f7ce78bb-423b-11e7-93f8-0050569a796", modelInfo.getModelCustomizationUuid());
148         assertEquals("modelInstanceName", modelInfo.getModelInstanceName());
149         assertEquals("f7ce78bb-423b-11e7-93f8-0050569a7965", modelInfo.getModelInvariantUuid());
150         assertEquals("10", modelInfo.getModelUuid());
151
152     }
153
154     @Test
155     public void test_mapJSONtoMSOStyleCustomWorkflowRequest() throws IOException {
156         ObjectMapper mapper = new ObjectMapper();
157         mapper.setSerializationInclusion(Include.NON_NULL);
158         String testRequest = inputStream("/CustomWorkflowRequest.json");
159         String resultString =
160                 requestHandlerUtils.mapJSONtoMSOStyle(testRequest, null, true, Action.inPlaceSoftwareUpdate);
161         ServiceInstancesRequest sir = mapper.readValue(resultString, ServiceInstancesRequest.class);
162         assertEquals(sir.getRequestDetails().getCloudConfiguration().getTenantId(), "88a6ca3ee0394ade9403f075db23167e");
163         assertNotEquals(sir.getRequestDetails().getRequestParameters().getUserParams().size(), 0);
164     }
165
166
167     @Test
168     public void test_mapJSONtoMSOStyleUsePreload() throws IOException {
169         ObjectMapper mapper = new ObjectMapper();
170         mapper.setSerializationInclusion(Include.NON_NULL);
171         String testRequest = inputStream("/ServiceInstanceDefault.json");
172         ServiceInstancesRequest sir = new ServiceInstancesRequest();
173         RequestDetails rd = new RequestDetails();
174         RequestParameters rp = new RequestParameters();
175         rp.setUsePreload(true);
176         rd.setRequestParameters(rp);
177         sir.setRequestDetails(rd);
178         String resultString = requestHandlerUtils.mapJSONtoMSOStyle(testRequest, sir, false, null);
179         ServiceInstancesRequest sir1 = mapper.readValue(resultString, ServiceInstancesRequest.class);
180         assertTrue(sir1.getRequestDetails().getRequestParameters().getUsePreload());
181     }
182
183     @Test
184     public void setServiceTypeTestALaCarte() throws JsonProcessingException {
185         String requestScope = ModelType.service.toString();
186         Boolean aLaCarteFlag = true;
187         ServiceInstancesRequest sir = new ServiceInstancesRequest();
188         RequestDetails requestDetails = new RequestDetails();
189         RequestInfo requestInfo = new RequestInfo();
190         requestInfo.setSource("VID");
191         requestDetails.setRequestInfo(requestInfo);
192         sir.setRequestDetails(requestDetails);
193         Service defaultService = new Service();
194         defaultService.setServiceType("testServiceTypeALaCarte");
195
196         wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
197                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
198                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
199
200         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
201         assertEquals(serviceType, "testServiceTypeALaCarte");
202     }
203
204     @Test
205     public void setServiceTypeTest() throws JsonProcessingException {
206         String requestScope = ModelType.service.toString();
207         Boolean aLaCarteFlag = false;
208         ServiceInstancesRequest sir = new ServiceInstancesRequest();
209         RequestDetails requestDetails = new RequestDetails();
210         RequestInfo requestInfo = new RequestInfo();
211         ModelInfo modelInfo = new ModelInfo();
212         modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
213         requestInfo.setSource("VID");
214         requestDetails.setModelInfo(modelInfo);
215         requestDetails.setRequestInfo(requestInfo);
216         sir.setRequestDetails(requestDetails);
217         Service defaultService = new Service();
218         defaultService.setServiceType("testServiceType");
219
220         wireMockServer.stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
221                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
222                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
223
224         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
225         assertEquals(serviceType, "testServiceType");
226     }
227
228     @Test
229     public void setServiceTypeTestDefault() throws JsonProcessingException {
230         String requestScope = ModelType.service.toString();
231         Boolean aLaCarteFlag = false;
232         ServiceInstancesRequest sir = new ServiceInstancesRequest();
233         RequestDetails requestDetails = new RequestDetails();
234         RequestInfo requestInfo = new RequestInfo();
235         ModelInfo modelInfo = new ModelInfo();
236         modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
237         requestInfo.setSource("VID");
238         requestDetails.setModelInfo(modelInfo);
239         requestDetails.setRequestInfo(requestInfo);
240         sir.setRequestDetails(requestDetails);
241         Service defaultService = new Service();
242         defaultService.setServiceType("testServiceType");
243
244         wireMockServer.stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
245                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
246                         .withStatus(HttpStatus.SC_NOT_FOUND)));
247         wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
248                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
249                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
250
251         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
252         assertEquals(serviceType, "testServiceType");
253     }
254
255     @Test
256     public void setServiceTypeTestNetwork() throws JsonProcessingException {
257         String requestScope = ModelType.network.toString();
258         Boolean aLaCarteFlag = null;
259         ServiceInstancesRequest sir = new ServiceInstancesRequest();
260         RequestDetails requestDetails = new RequestDetails();
261         RequestInfo requestInfo = new RequestInfo();
262         ModelInfo modelInfo = new ModelInfo();
263         modelInfo.setModelName("networkModelName");
264         requestInfo.setSource("VID");
265         requestDetails.setModelInfo(modelInfo);
266         requestDetails.setRequestInfo(requestInfo);
267         sir.setRequestDetails(requestDetails);
268
269         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
270         assertEquals(serviceType, "networkModelName");
271     }
272
273     @Test
274     public void setServiceInstanceIdInstanceGroupTest() throws JsonParseException, JsonMappingException, IOException {
275         String requestScope = "instanceGroup";
276         ServiceInstancesRequest sir =
277                 mapper.readValue(inputStream("/CreateInstanceGroup.json"), ServiceInstancesRequest.class);
278         assertEquals("ddcbbf3d-f2c1-4ca0-8852-76a807285efc",
279                 requestHandlerUtils.setServiceInstanceId(requestScope, sir));
280     }
281
282     @Test
283     public void setServiceInstanceIdTest() {
284         String requestScope = "vnf";
285         ServiceInstancesRequest sir = new ServiceInstancesRequest();
286         sir.setServiceInstanceId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
287         assertEquals("f0a35706-efc4-4e27-80ea-a995d7a2a40f",
288                 requestHandlerUtils.setServiceInstanceId(requestScope, sir));
289     }
290
291     @Test
292     public void setServiceInstanceIdReturnNullTest() {
293         String requestScope = "vnf";
294         ServiceInstancesRequest sir = new ServiceInstancesRequest();
295         assertNull(requestHandlerUtils.setServiceInstanceId(requestScope, sir));
296     }
297
298     @Test
299     public void camundaHistoryCheckTest() throws ContactCamundaException, RequestDbFailureException {
300         wireMockServer.stubFor(get(
301                 ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
302                         .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
303                                 .withBodyFile("Camunda/HistoryCheckResponse.json")
304                                 .withStatus(org.apache.http.HttpStatus.SC_OK)));
305
306         InfraActiveRequests duplicateRecord = new InfraActiveRequests();
307         duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
308         boolean inProgress = false;
309         inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
310         assertTrue(inProgress);
311     }
312
313     @Test
314     public void camundaHistoryCheckNoneFoundTest() throws ContactCamundaException, RequestDbFailureException {
315         wireMockServer.stubFor(get(
316                 ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
317                         .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
318                                 .withBody("[]").withStatus(org.apache.http.HttpStatus.SC_OK)));
319
320         InfraActiveRequests duplicateRecord = new InfraActiveRequests();
321         duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
322         boolean inProgress = false;
323         inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
324         assertFalse(inProgress);
325     }
326
327     @Test
328     public void camundaHistoryCheckNotInProgressTest() throws ContactCamundaException, RequestDbFailureException {
329         wireMockServer.stubFor(get(
330                 ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
331                         .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
332                                 .withBodyFile("Camunda/HistoryCheckResponseCompleted.json")
333                                 .withStatus(org.apache.http.HttpStatus.SC_OK)));
334
335         InfraActiveRequests duplicateRecord = new InfraActiveRequests();
336         duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
337         boolean inProgress = false;
338         inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
339         assertFalse(inProgress);
340     }
341
342     @Test
343     public void setCamundaHeadersTest() throws ContactCamundaException, RequestDbFailureException {
344         String encryptedAuth = "015E7ACF706C6BBF85F2079378BDD2896E226E09D13DC2784BA309E27D59AB9FAD3A5E039DF0BB8408"; // user:password
345         String key = "07a7159d3bf51a0e53be7a8f89699be7";
346         HttpHeaders headers = camundaRequestHandler.setCamundaHeaders(encryptedAuth, key);
347         List<org.springframework.http.MediaType> acceptedType = headers.getAccept();
348         String expectedAcceptedType = "application/json";
349         assertEquals(expectedAcceptedType, acceptedType.get(0).toString());
350         String basicAuth = headers.getFirst(HttpHeaders.AUTHORIZATION);
351         String expectedBasicAuth = "Basic dXNlcjpwYXNzd29yZA==";
352         assertEquals(expectedBasicAuth, basicAuth);
353     }
354
355 }