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;
 
  23 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
 
  24 import static com.github.tomakehurst.wiremock.client.WireMock.post;
 
  25 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
 
  26 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
 
  27 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 
  28 import static org.junit.Assert.assertEquals;
 
  29 import static org.junit.Assert.assertNotNull;
 
  30 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
 
  31 import static org.onap.logging.filter.base.Constants.HttpHeaders.ECOMP_REQUEST_ID;
 
  32 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.INVOCATION_ID;
 
  33 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.PARTNER_NAME;
 
  34 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.RESPONSE_CODE;
 
  35 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION;
 
  36 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.LOG_TIMESTAMP;
 
  37 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.SERVICE_NAME;
 
  38 import static org.onap.logging.ref.slf4j.ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE;
 
  39 import static org.onap.logging.filter.base.Constants.HttpHeaders.CLIENT_ID;
 
  40 import java.io.IOException;
 
  42 import javax.ws.rs.core.MediaType;
 
  43 import javax.ws.rs.core.Response;
 
  44 import org.apache.http.HttpStatus;
 
  45 import org.junit.Test;
 
  46 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 
  47 import org.onap.so.apihandlerinfra.tasksbeans.RequestDetails;
 
  48 import org.onap.so.apihandlerinfra.tasksbeans.RequestInfo;
 
  49 import org.onap.so.apihandlerinfra.tasksbeans.TaskRequestReference;
 
  50 import org.onap.so.apihandlerinfra.tasksbeans.TasksRequest;
 
  51 import org.onap.so.apihandlerinfra.tasksbeans.ValidResponses;
 
  52 import org.onap.so.serviceinstancebeans.RequestError;
 
  53 import org.onap.so.serviceinstancebeans.ServiceException;
 
  54 import org.springframework.http.HttpEntity;
 
  55 import org.springframework.http.HttpHeaders;
 
  56 import org.springframework.http.HttpMethod;
 
  57 import org.springframework.http.ResponseEntity;
 
  58 import org.springframework.web.util.UriComponentsBuilder;
 
  59 import com.fasterxml.jackson.databind.DeserializationFeature;
 
  60 import com.fasterxml.jackson.databind.ObjectMapper;
 
  61 import com.github.tomakehurst.wiremock.http.Fault;
 
  62 import ch.qos.logback.classic.spi.ILoggingEvent;
 
  65 public class ManualTasksTest extends BaseTest {
 
  67     private final String basePath = "/tasks/v1/";
 
  70     public void testCreateOpEnvObjectMapperError() throws IOException {
 
  71         TestAppender.events.clear();
 
  72         wireMockServer.stubFor(post(urlPathEqualTo("/sobpmnengine/task/55/complete"))
 
  73                 .willReturn(aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.SC_OK)));
 
  76         TasksRequest taskReq = new TasksRequest();
 
  77         RequestDetails reqDetail = new RequestDetails();
 
  78         RequestInfo reqInfo = new RequestInfo();
 
  79         reqInfo.setRequestorId("testId");
 
  80         reqInfo.setSource("testSource");
 
  81         reqInfo.setResponseValue(ValidResponses.skip);
 
  82         reqDetail.setRequestInfo(reqInfo);
 
  83         taskReq.setRequestDetails(reqDetail);
 
  86         TaskRequestReference expectedResponse = new TaskRequestReference();
 
  87         expectedResponse.setTaskId(taskId);
 
  88         HttpHeaders headers = new HttpHeaders();
 
  89         headers.set("Accept", MediaType.APPLICATION_JSON);
 
  90         headers.set("Content-Type", MediaType.APPLICATION_JSON);
 
  91         headers.set(ECOMP_REQUEST_ID, "987654321");
 
  92         headers.set(CLIENT_ID, "VID");
 
  93         HttpEntity<TasksRequest> entity = new HttpEntity<TasksRequest>(taskReq, headers);
 
  95         UriComponentsBuilder builder =
 
  96                 UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + taskId + "/complete");
 
  97         ResponseEntity<String> response =
 
  98                 restTemplate.exchange(builder.toUriString(), HttpMethod.POST, entity, String.class);
 
 101         ObjectMapper mapper = new ObjectMapper();
 
 102         mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
 
 103         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
 105         TaskRequestReference realResponse = mapper.readValue(response.getBody(), TaskRequestReference.class);
 
 109         assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatusCode().value());
 
 110         assertThat(realResponse, sameBeanAs(expectedResponse));
 
 112         for (ILoggingEvent logEvent : TestAppender.events)
 
 113             if (logEvent.getLoggerName().equals("org.onap.so.logging.jaxrs.filter.SOAuditLogContainerFilter")
 
 114                     && logEvent.getMarker() != null && logEvent.getMarker().getName().equals("ENTRY")) {
 
 115                 Map<String, String> mdc = logEvent.getMDCPropertyMap();
 
 116                 assertNotNull(mdc.get(ONAPLogConstants.MDCs.ENTRY_TIMESTAMP));
 
 117                 assertNotNull(mdc.get(ONAPLogConstants.MDCs.REQUEST_ID));
 
 118                 assertNotNull(mdc.get(INVOCATION_ID));
 
 119                 assertEquals("UNKNOWN", mdc.get(PARTNER_NAME));
 
 120                 assertEquals("tasks/v1/55/complete", mdc.get(SERVICE_NAME));
 
 121                 assertEquals("INPROGRESS", mdc.get(RESPONSE_STATUS_CODE));
 
 122             } else if (logEvent.getLoggerName().equals("org.onap.so.logging.jaxrs.filter.SOAuditLogContainerFilter")
 
 123                     && logEvent.getMarker() != null && logEvent.getMarker().getName().equals("EXIT")) {
 
 124                 Map<String, String> mdc = logEvent.getMDCPropertyMap();
 
 125                 assertNotNull(mdc.get(ONAPLogConstants.MDCs.ENTRY_TIMESTAMP));
 
 126                 assertNotNull(mdc.get(LOG_TIMESTAMP));
 
 127                 assertNotNull(mdc.get(ONAPLogConstants.MDCs.REQUEST_ID));
 
 128                 assertNotNull(mdc.get(INVOCATION_ID));
 
 129                 assertEquals("202", mdc.get(RESPONSE_CODE));
 
 130                 assertEquals("UNKNOWN", mdc.get(PARTNER_NAME));
 
 131                 assertEquals("tasks/v1/55/complete", mdc.get(SERVICE_NAME));
 
 132                 assertEquals("COMPLETE", mdc.get(RESPONSE_STATUS_CODE));
 
 133                 assertNotNull(mdc.get(RESPONSE_DESCRIPTION));
 
 134                 assertEquals("application/json", response.getHeaders().get(HttpHeaders.CONTENT_TYPE).get(0));
 
 135                 assertEquals("0", response.getHeaders().get("X-MinorVersion").get(0));
 
 136                 assertEquals("0", response.getHeaders().get("X-PatchVersion").get(0));
 
 137                 assertEquals("1.0.0", response.getHeaders().get("X-LatestVersion").get(0));
 
 142     public void completeTaskMappingError() throws IOException {
 
 143         String invalidRequest = "test";
 
 144         RequestError expectedResponse = new RequestError();
 
 145         ServiceException se = new ServiceException();
 
 146         se.setMessageId("SVC0002");
 
 147         se.setText("Mapping of request to JSON object failed: Unrecognized token \'test\': "
 
 148                 + "was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: (String)\"test\"; line: 1, column: 9]");
 
 149         expectedResponse.setServiceException(se);
 
 151         HttpHeaders headers = new HttpHeaders();
 
 152         headers.set("Accept", MediaType.APPLICATION_JSON);
 
 153         headers.set("Content-Type", MediaType.APPLICATION_JSON);
 
 154         headers.set(ECOMP_REQUEST_ID, "987654321");
 
 155         headers.set(CLIENT_ID, "VID");
 
 156         HttpEntity<String> entity = new HttpEntity<String>(invalidRequest, headers);
 
 158         UriComponentsBuilder builder =
 
 159                 UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + "55" + "/complete");
 
 160         ResponseEntity<String> response =
 
 161                 restTemplate.exchange(builder.toUriString(), HttpMethod.POST, entity, String.class);
 
 163         ObjectMapper mapper = new ObjectMapper();
 
 164         mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
 
 165         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
 167         RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
 
 168         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatusCode().value());
 
 169         assertThat(realResponse, sameBeanAs(expectedResponse));
 
 173     public void completeTaskValidationError() throws IOException {
 
 174         String taskId = "55";
 
 175         TasksRequest taskReq = new TasksRequest();
 
 176         RequestDetails reqDetail = new RequestDetails();
 
 177         RequestInfo reqInfo = new RequestInfo();
 
 178         reqInfo.setSource("testSource");
 
 179         reqInfo.setResponseValue(ValidResponses.skip);
 
 180         reqDetail.setRequestInfo(reqInfo);
 
 181         taskReq.setRequestDetails(reqDetail);
 
 183         RequestError expectedResponse = new RequestError();
 
 184         ServiceException se = new ServiceException();
 
 185         se.setMessageId("SVC0002");
 
 186         se.setText("Mapping of request to JSON Object failed. No valid requestorId is specified");
 
 187         expectedResponse.setServiceException(se);
 
 188         HttpHeaders headers = new HttpHeaders();
 
 189         headers.set("Accept", MediaType.APPLICATION_JSON);
 
 190         headers.set("Content-Type", MediaType.APPLICATION_JSON);
 
 191         headers.set(ECOMP_REQUEST_ID, "987654321");
 
 192         headers.set(CLIENT_ID, "VID");
 
 193         HttpEntity<TasksRequest> entity = new HttpEntity<TasksRequest>(taskReq, headers);
 
 195         UriComponentsBuilder builder =
 
 196                 UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + taskId + "/complete");
 
 197         ResponseEntity<String> response =
 
 198                 restTemplate.exchange(builder.toUriString(), HttpMethod.POST, entity, String.class);
 
 200         ObjectMapper mapper = new ObjectMapper();
 
 201         mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
 
 202         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
 204         RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
 
 205         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatusCode().value());
 
 206         assertThat(realResponse, sameBeanAs(expectedResponse));
 
 210     public void completeTaskBpelResponseError() throws IOException {
 
 211         wireMockServer.stubFor(post(urlPathEqualTo("/sobpmnengine/task/55/complete")).willReturn(
 
 212                 aResponse().withHeader("Content-Type", "application/json").withFault(Fault.EMPTY_RESPONSE)));
 
 214         String taskId = "55";
 
 215         TasksRequest taskReq = new TasksRequest();
 
 216         RequestDetails reqDetail = new RequestDetails();
 
 217         RequestInfo reqInfo = new RequestInfo();
 
 218         reqInfo.setRequestorId("testId");
 
 219         reqInfo.setSource("testSource");
 
 220         reqInfo.setResponseValue(ValidResponses.skip);
 
 221         reqDetail.setRequestInfo(reqInfo);
 
 222         taskReq.setRequestDetails(reqDetail);
 
 224         RequestError expectedResponse = new RequestError();
 
 225         ServiceException se = new ServiceException();
 
 226         se.setMessageId("SVC1000");
 
 227         se.setText("Request Failed due to BPEL error with HTTP Status = 502");
 
 228         expectedResponse.setServiceException(se);
 
 229         HttpHeaders headers = new HttpHeaders();
 
 230         headers.set("Accept", MediaType.APPLICATION_JSON);
 
 231         headers.set("Content-Type", MediaType.APPLICATION_JSON);
 
 232         headers.set(ECOMP_REQUEST_ID, "987654321");
 
 233         headers.set(CLIENT_ID, "VID");
 
 234         HttpEntity<TasksRequest> entity = new HttpEntity<TasksRequest>(taskReq, headers);
 
 236         UriComponentsBuilder builder =
 
 237                 UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + taskId + "/complete");
 
 238         ResponseEntity<String> response =
 
 239                 restTemplate.exchange(builder.toUriString(), HttpMethod.POST, entity, String.class);
 
 242         ObjectMapper mapper = new ObjectMapper();
 
 243         mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
 
 244         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
 246         RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
 
 247         assertEquals(Response.Status.BAD_GATEWAY.getStatusCode(), response.getStatusCode().value());
 
 248         assertThat(realResponse, sameBeanAs(expectedResponse));