2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 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 org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNull;
25 import static org.mockito.Mockito.doReturn;
26 import static org.mockito.Mockito.doThrow;
27 import static org.mockito.Mockito.times;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30 import java.io.IOException;
31 import java.nio.file.Files;
32 import java.nio.file.Paths;
33 import java.util.ArrayList;
34 import java.util.List;
35 import org.camunda.bpm.engine.impl.persistence.entity.HistoricActivityInstanceEntity;
36 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
37 import org.junit.Before;
38 import org.junit.Rule;
39 import org.junit.Test;
40 import org.junit.rules.ExpectedException;
41 import org.junit.runner.RunWith;
42 import org.mockito.InjectMocks;
43 import org.mockito.Mock;
44 import org.mockito.Spy;
45 import org.mockito.junit.MockitoJUnitRunner;
46 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
47 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
48 import org.springframework.core.ParameterizedTypeReference;
49 import org.springframework.core.env.Environment;
50 import org.springframework.http.HttpEntity;
51 import org.springframework.http.HttpHeaders;
52 import org.springframework.http.HttpMethod;
53 import org.springframework.http.HttpStatus;
54 import org.springframework.http.ResponseEntity;
55 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
56 import org.springframework.web.client.HttpClientErrorException;
57 import org.springframework.web.client.HttpStatusCodeException;
58 import org.springframework.web.client.ResourceAccessException;
59 import org.springframework.web.client.RestClientException;
60 import org.springframework.web.client.RestTemplate;
61 import com.fasterxml.jackson.core.type.TypeReference;
62 import com.fasterxml.jackson.databind.DeserializationFeature;
63 import com.fasterxml.jackson.databind.ObjectMapper;
65 @RunWith(MockitoJUnitRunner.class)
66 public class CamundaRequestHandlerUnitTest {
69 private RestTemplate restTemplate;
72 private RestTemplate restTemplateRetry;
75 private Environment env;
79 private CamundaRequestHandler camundaRequestHandler;
82 public ExpectedException thrown = ExpectedException.none();
84 private static final String REQUEST_ID = "eca3a1b1-43ab-457e-ab1c-367263d148b4";
85 private ResponseEntity<List<HistoricActivityInstanceEntity>> activityInstanceResponse = null;
86 private ResponseEntity<List<HistoricProcessInstanceEntity>> processInstanceResponse = null;
87 private List<HistoricActivityInstanceEntity> activityInstanceList = null;
88 private List<HistoricProcessInstanceEntity> processInstanceList = null;
93 public void setup() throws IOException {
94 ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
95 activityInstanceList = mapper.readValue(
96 new String(Files.readAllBytes(
97 Paths.get("src/test/resources/OrchestrationRequest/ActivityInstanceHistoryResponse.json"))),
98 new TypeReference<List<HistoricActivityInstanceEntity>>() {});
99 processInstanceList = mapper.readValue(
100 new String(Files.readAllBytes(
101 Paths.get("src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json"))),
102 new TypeReference<List<HistoricProcessInstanceEntity>>() {});
103 processInstanceResponse =
104 new ResponseEntity<List<HistoricProcessInstanceEntity>>(processInstanceList, HttpStatus.ACCEPTED);
105 activityInstanceResponse =
106 new ResponseEntity<List<HistoricActivityInstanceEntity>>(activityInstanceList, HttpStatus.ACCEPTED);
108 doReturn("/sobpmnengine/history/process-instance").when(env).getProperty("mso.camunda.rest.history.uri");
109 doReturn("/sobpmnengine/history/activity-instance").when(env).getProperty("mso.camunda.rest.activity.uri");
110 doReturn("auth").when(env).getRequiredProperty("mso.camundaAuth");
111 doReturn("key").when(env).getRequiredProperty("mso.msoKey");
112 doReturn("http://localhost:8089").when(env).getProperty("mso.camundaURL");
114 HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
115 factory.setReadTimeout(30000);
116 factory.setConnectTimeout(30000);
117 restTemplate.setRequestFactory(factory);
118 doReturn(restTemplate).when(camundaRequestHandler).getRestTemplate(false);
120 HttpComponentsClientHttpRequestFactory factoryRetry = new HttpComponentsClientHttpRequestFactory();
121 factoryRetry.setReadTimeout(15000);
122 factoryRetry.setConnectTimeout(15000);
123 restTemplate.setRequestFactory(factoryRetry);
124 doReturn(restTemplateRetry).when(camundaRequestHandler).getRestTemplate(true);
127 public HttpHeaders setHeaders() {
128 HttpHeaders headers = new HttpHeaders();
129 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
130 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
131 headers.setAccept(acceptableMediaTypes);
132 headers.add(HttpHeaders.AUTHORIZATION, "auth");
138 public void getActivityNameTest() throws IOException {
139 String expectedActivityName = "Last task executed: BB to Execute";
140 String actualActivityName = camundaRequestHandler.getActivityName(activityInstanceList);
142 assertEquals(expectedActivityName, actualActivityName);
146 public void getActivityNameNullActivityNameTest() throws IOException {
147 String expectedActivityName = "Task name is null.";
148 HistoricActivityInstanceEntity activityInstance = new HistoricActivityInstanceEntity();
149 List<HistoricActivityInstanceEntity> activityInstanceList = new ArrayList<>();
150 activityInstanceList.add(activityInstance);
152 String actualActivityName = camundaRequestHandler.getActivityName(activityInstanceList);
154 assertEquals(expectedActivityName, actualActivityName);
158 public void getActivityNameNullListTest() throws IOException {
159 String expectedActivityName = "No results returned on activityInstance history lookup.";
160 List<HistoricActivityInstanceEntity> activityInstanceList = null;
161 String actualActivityName = camundaRequestHandler.getActivityName(activityInstanceList);
163 assertEquals(expectedActivityName, actualActivityName);
167 public void getActivityNameEmptyListTest() throws IOException {
168 String expectedActivityName = "No results returned on activityInstance history lookup.";
169 List<HistoricActivityInstanceEntity> activityInstanceList = new ArrayList<>();
170 String actualActivityName = camundaRequestHandler.getActivityName(activityInstanceList);
172 assertEquals(expectedActivityName, actualActivityName);
176 public void getCamundActivityHistoryNullTest() throws IOException, ContactCamundaException {
177 HistoricProcessInstanceEntity processInstance = new HistoricProcessInstanceEntity();
178 processInstance.setId("c4c6b647-a26e-11e9-b144-0242ac14000b");
179 List<HistoricProcessInstanceEntity> processInstanceList = new ArrayList<>();
180 processInstanceList.add(processInstance);
181 ResponseEntity<List<HistoricProcessInstanceEntity>> response =
182 new ResponseEntity<>(processInstanceList, HttpStatus.OK);
183 doReturn(null).when(camundaRequestHandler).getCamundaActivityHistory("c4c6b647-a26e-11e9-b144-0242ac14000b");
185 String actualTaskName = camundaRequestHandler.getTaskInformation(response, REQUEST_ID);
187 assertNull(actualTaskName);
191 public void getCamundActivityHistoryErrorTest() throws IOException, ContactCamundaException {
192 HistoricProcessInstanceEntity processInstance = new HistoricProcessInstanceEntity();
193 processInstance.setId("c4c6b647-a26e-11e9-b144-0242ac14000b");
194 List<HistoricProcessInstanceEntity> processInstanceList = new ArrayList<>();
195 processInstanceList.add(processInstance);
196 ResponseEntity<List<HistoricProcessInstanceEntity>> response =
197 new ResponseEntity<>(processInstanceList, HttpStatus.OK);
198 doThrow(RestClientException.class).when(camundaRequestHandler)
199 .getCamundaActivityHistory("c4c6b647-a26e-11e9-b144-0242ac14000b");
201 String actualTaskName = camundaRequestHandler.getTaskInformation(response, REQUEST_ID);
203 assertNull(actualTaskName);
207 public void getTaskName() throws IOException, ContactCamundaException {
208 doReturn(processInstanceResponse).when(camundaRequestHandler).getCamundaProcessInstanceHistory(REQUEST_ID,
210 doReturn(activityInstanceResponse).when(camundaRequestHandler)
211 .getCamundaActivityHistory("c2fd4066-a26e-11e9-b144-0242ac14000b");
212 doReturn("Last task executed: BB to Execute").when(camundaRequestHandler).getActivityName(activityInstanceList);
213 String expectedTaskName = "Last task executed: BB to Execute";
215 String actualTaskName = camundaRequestHandler.getTaskName(REQUEST_ID);
217 assertEquals(expectedTaskName, actualTaskName);
221 public void getTaskNameNullProcessInstanceListTest() throws IOException, ContactCamundaException {
222 ResponseEntity<List<HistoricProcessInstanceEntity>> response = new ResponseEntity<>(null, HttpStatus.OK);
224 String actual = camundaRequestHandler.getTaskInformation(response, REQUEST_ID);
230 public void getTaskNameNullProcessInstanceIdTest() throws IOException, ContactCamundaException {
231 HistoricProcessInstanceEntity processInstance = new HistoricProcessInstanceEntity();
232 List<HistoricProcessInstanceEntity> processInstanceList = new ArrayList<>();
233 processInstanceList.add(processInstance);
234 ResponseEntity<List<HistoricProcessInstanceEntity>> response =
235 new ResponseEntity<>(processInstanceList, HttpStatus.OK);
237 String actual = camundaRequestHandler.getTaskInformation(response, REQUEST_ID);
243 public void getTaskNameEmptyProcessInstanceListTest() throws IOException, ContactCamundaException {
244 List<HistoricProcessInstanceEntity> processInstanceList = new ArrayList<>();
245 ResponseEntity<List<HistoricProcessInstanceEntity>> response =
246 new ResponseEntity<>(processInstanceList, HttpStatus.OK);
248 String actual = camundaRequestHandler.getTaskInformation(response, REQUEST_ID);
254 public void getTaskNameProcessInstanceLookupFailureTest() throws IOException, ContactCamundaException {
255 doThrow(HttpClientErrorException.class).when(camundaRequestHandler).getCamundaProcessInstanceHistory(REQUEST_ID,
258 String result = camundaRequestHandler.getTaskName(REQUEST_ID);
263 public void getCamundaActivityHistoryTest() throws IOException, ContactCamundaException {
264 HttpHeaders headers = setHeaders();
265 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
267 "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId=c4c6b647-a26e-11e9-b144-0242ac14000b&maxResults=1";
268 doReturn(activityInstanceResponse).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
269 new ParameterizedTypeReference<List<HistoricActivityInstanceEntity>>() {});
270 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
271 ResponseEntity<List<HistoricActivityInstanceEntity>> actualResponse =
272 camundaRequestHandler.getCamundaActivityHistory("c4c6b647-a26e-11e9-b144-0242ac14000b");
273 assertEquals(activityInstanceResponse, actualResponse);
277 public void getCamundaActivityHistoryErrorTest() {
278 HttpHeaders headers = setHeaders();
279 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
281 "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId=c4c6b647-a26e-11e9-b144-0242ac14000b&maxResults=1";
282 doThrow(new ResourceAccessException("IOException")).when(restTemplate).exchange(targetUrl, HttpMethod.GET,
283 requestEntity, new ParameterizedTypeReference<List<HistoricActivityInstanceEntity>>() {});
284 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
286 thrown.expect(ResourceAccessException.class);
287 camundaRequestHandler.getCamundaActivityHistory("c4c6b647-a26e-11e9-b144-0242ac14000b");
289 verify(restTemplate, times(1)).exchange(targetUrl, HttpMethod.GET, requestEntity,
290 new ParameterizedTypeReference<List<HistoricActivityInstanceEntity>>() {});
294 public void getCamundaProccesInstanceHistoryTest() throws IOException, ContactCamundaException {
295 HttpHeaders headers = setHeaders();
296 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
297 String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
298 + REQUEST_ID + "&active=true&maxResults=1";
299 doReturn(processInstanceResponse).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
300 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
301 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
303 ResponseEntity<List<HistoricProcessInstanceEntity>> actualResponse =
304 camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false, true, false);
305 assertEquals(processInstanceResponse, actualResponse);
309 public void getCamundaProccesInstanceHistoryRetryTest() {
310 HttpHeaders headers = setHeaders();
311 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
312 String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
313 + REQUEST_ID + "&active=true&maxResults=1";
314 doThrow(new ResourceAccessException("I/O error")).when(restTemplateRetry).exchange(targetUrl, HttpMethod.GET,
315 requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
316 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
318 thrown.expect(ResourceAccessException.class);
319 camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true, true, false);
321 verify(restTemplateRetry, times(2)).exchange(targetUrl, HttpMethod.GET, requestEntity,
322 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
326 public void getCamundaProccesInstanceHistoryNoRetryTest() {
327 HttpHeaders headers = setHeaders();
328 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
329 String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
330 + REQUEST_ID + "&sortBy=startTime&sortOrder=desc&maxResults=1";
331 doThrow(HttpClientErrorException.class).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
332 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
333 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
335 thrown.expect(HttpStatusCodeException.class);
336 camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false, false, true);
338 verify(restTemplate, times(1)).exchange(targetUrl, HttpMethod.GET, requestEntity,
339 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
343 public void getCamundaProccesInstanceHistoryFailThenSuccessTest() throws IOException, ContactCamundaException {
344 HttpHeaders headers = setHeaders();
345 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
346 String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
347 + REQUEST_ID + "&sortBy=startTime&sortOrder=desc&maxResults=1";
348 when(restTemplateRetry.exchange(targetUrl, HttpMethod.GET, requestEntity,
349 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {}))
350 .thenThrow(new ResourceAccessException("I/O Exception")).thenReturn(processInstanceResponse);
351 doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
353 ResponseEntity<List<HistoricProcessInstanceEntity>> actualResponse =
354 camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true, false, true);
356 assertEquals(processInstanceResponse, actualResponse);
357 verify(restTemplateRetry, times(2)).exchange(targetUrl, HttpMethod.GET, requestEntity,
358 new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
362 public void setCamundaHeadersTest() throws ContactCamundaException, RequestDbFailureException {
363 String encryptedAuth = "015E7ACF706C6BBF85F2079378BDD2896E226E09D13DC2784BA309E27D59AB9FAD3A5E039DF0BB8408"; // user:password
364 String key = "07a7159d3bf51a0e53be7a8f89699be7";
366 HttpHeaders headers = camundaRequestHandler.setCamundaHeaders(encryptedAuth, key);
367 List<org.springframework.http.MediaType> acceptedType = headers.getAccept();
369 String expectedAcceptedType = "application/json";
370 assertEquals(expectedAcceptedType, acceptedType.get(0).toString());
371 String basicAuth = headers.getFirst(HttpHeaders.AUTHORIZATION);
372 String expectedBasicAuth = "Basic dXNlcjpwYXNzd29yZA==";
374 assertEquals(expectedBasicAuth, basicAuth);