2  * ============LICENSE_START=======================================================
 
   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
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.onap.so.apihandlerinfra;
 
  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;
 
  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;
 
  72 public class RequestHandlerUtilsTest extends BaseTest {
 
  74     private final ObjectMapper mapper = new ObjectMapper();
 
  75     private ObjectMapper errorMapper = new ObjectMapper();
 
  78     private RequestHandlerUtils requestHandlerUtils;
 
  81     private CamundaRequestHandler camundaRequestHandler;
 
  83     @Value("${wiremock.server.port}")
 
  84     private String wiremockPort;
 
  86     private URL initialUrl;
 
  87     private int initialPort;
 
  88     private HttpHeaders headers;
 
  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);
 
  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) {
 
 109         wireMockServer.stubFor(post(urlMatching(".*/infraActiveRequests.*")).willReturn(aResponse()
 
 110                 .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).withStatus(HttpStatus.SC_OK)));
 
 113     public String inputStream(String JsonInput) throws IOException {
 
 114         JsonInput = "src/test/resources/ServiceInstanceTest" + JsonInput;
 
 115         return new String(Files.readAllBytes(Paths.get(JsonInput)));
 
 118     public ResponseEntity<String> sendRequest(String requestJson, String uriPath, HttpMethod reqMethod,
 
 119             HttpHeaders headers) {
 
 121         if (!headers.containsKey(HttpHeaders.ACCEPT)) {
 
 122             headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
 
 124         if (!headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
 
 125             headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
 
 128         UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(uriPath, initialPort));
 
 130         HttpEntity<String> request = new HttpEntity<>(requestJson, headers);
 
 132         return restTemplate.exchange(builder.toUriString(), reqMethod, request, String.class);
 
 135     public ResponseEntity<String> sendRequest(String requestJson, String uriPath, HttpMethod reqMethod) {
 
 136         return sendRequest(requestJson, uriPath, reqMethod, new HttpHeaders());
 
 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());
 
 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);
 
 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());
 
 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");
 
 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)));
 
 200         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
 
 201         assertEquals(serviceType, "testServiceTypeALaCarte");
 
 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");
 
 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)));
 
 224         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
 
 225         assertEquals(serviceType, "testServiceType");
 
 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");
 
 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)));
 
 251         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
 
 252         assertEquals(serviceType, "testServiceType");
 
 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);
 
 269         String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
 
 270         assertEquals(serviceType, "networkModelName");
 
 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));
 
 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));
 
 292     public void setServiceInstanceIdReturnNullTest() {
 
 293         String requestScope = "vnf";
 
 294         ServiceInstancesRequest sir = new ServiceInstancesRequest();
 
 295         assertNull(requestHandlerUtils.setServiceInstanceId(requestScope, sir));
 
 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)));
 
 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);
 
 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)));
 
 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);
 
 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)));
 
 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);
 
 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);