3eb7acd91afa1a39275b9f4f8bd7caedbe9eba87
[so.git] / bpmn / MSOCommonBPMN / src / test / java / org / openecomp / mso / bpmn / common / SDNCAdapterV1Test.java
1 /*- \r
2  * ============LICENSE_START======================================================= \r
3  * OPENECOMP - MSO \r
4  * ================================================================================ \r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. \r
6  * ================================================================================ \r
7  * Licensed under the Apache License, Version 2.0 (the "License"); \r
8  * you may not use this file except in compliance with the License. \r
9  * You may obtain a copy of the License at \r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0 \r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software \r
14  * distributed under the License is distributed on an "AS IS" BASIS, \r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r
16  * See the License for the specific language governing permissions and \r
17  * limitations under the License. \r
18  * ============LICENSE_END========================================================= \r
19  */ \r
20 \r
21 package org.openecomp.mso.bpmn.common;\r
22 \r
23 import static org.junit.Assert.assertEquals;\r
24 import static org.junit.Assert.assertFalse;\r
25 import static org.junit.Assert.assertNotNull;\r
26 import static org.junit.Assert.assertTrue;\r
27 import static org.openecomp.mso.bpmn.mock.StubResponseDatabase.mockUpdateRequestDB;\r
28 import static org.openecomp.mso.bpmn.mock.StubResponseSDNCAdapter.mockSDNCAdapter;\r
29 \r
30 import java.io.IOException;\r
31 import java.util.HashMap;\r
32 import java.util.Map;\r
33 \r
34 import javax.ws.rs.core.Response;\r
35 \r
36 import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;\r
37 import org.camunda.bpm.engine.runtime.Job;\r
38 import org.camunda.bpm.engine.test.Deployment;\r
39 import org.camunda.bpm.engine.variable.impl.VariableMapImpl;\r
40 import org.junit.Assert;\r
41 import org.junit.Test;\r
42 import org.openecomp.mso.bpmn.common.adapter.sdnc.CallbackHeader;\r
43 import org.openecomp.mso.bpmn.common.adapter.sdnc.SDNCAdapterCallbackRequest;\r
44 import org.openecomp.mso.bpmn.common.adapter.sdnc.SDNCAdapterResponse;\r
45 import org.openecomp.mso.bpmn.common.workflow.service.SDNCAdapterCallbackServiceImpl;\r
46 import org.openecomp.mso.bpmn.common.workflow.service.SDNCAdapterCallbackServiceImpl.SDNCAdapterErrorResponse;\r
47 import org.openecomp.mso.bpmn.common.workflow.service.WorkflowResource;\r
48 import org.openecomp.mso.bpmn.common.workflow.service.WorkflowResponse;\r
49 import org.openecomp.mso.bpmn.core.PropertyConfigurationSetup;\r
50 import org.openecomp.mso.bpmn.mock.FileUtil;\r
51 \r
52 /**\r
53  * Unit test cases for SDNCAdapterV1.bpmn\r
54  */\r
55 public class SDNCAdapterV1Test extends WorkflowTest {\r
56 \r
57         private String sdncAdapterWorkflowRequest;\r
58         private String sdncAdapterWorkflowRequestAct;\r
59         private String sdncAdapterCallbackRequestData;\r
60         private String sdncAdapterCallbackRequestDataNonfinal;\r
61 \r
62         public SDNCAdapterV1Test() throws IOException {\r
63                 sdncAdapterWorkflowRequest = FileUtil.readResourceFile("sdncadapterworkflowrequest.xml");\r
64                 sdncAdapterWorkflowRequestAct = FileUtil.readResourceFile("sdncadapterworkflowrequest-act.xml");\r
65                 sdncAdapterCallbackRequestData = FileUtil.readResourceFile("sdncadaptercallbackrequestdata.text");\r
66                 sdncAdapterCallbackRequestDataNonfinal = FileUtil.readResourceFile("sdncadaptercallbackrequestdata-nonfinal.text");\r
67         }\r
68 \r
69         /**\r
70          * End-to-End flow - Unit test for SDNCAdapterV1.bpmn\r
71          *  - String input & String response\r
72          */\r
73 \r
74         private WorkflowResponse invokeFlow(String workflowRequest) {\r
75 \r
76                 Map<String, Object>valueMap = new HashMap<String, Object>();\r
77                 valueMap.put("value", workflowRequest);\r
78                 Map<String, Object> variables = new HashMap<String, Object>();\r
79                 variables.put("sdncAdapterWorkflowRequest", valueMap);\r
80 \r
81                 Map<String, Object> valueMap2 = new HashMap<String, Object>();\r
82                 valueMap2.put("value", "true");\r
83                 variables.put("isDebugLogEnabled", valueMap2);\r
84 \r
85                 VariableMapImpl varMap = new VariableMapImpl();\r
86                 varMap.put("variables", variables);\r
87 \r
88                 //System.out.println("Invoking the flow");\r
89 \r
90                 WorkflowResource workflowResource = new WorkflowResource();\r
91                 workflowResource.setProcessEngineServices4junit(processEngineRule);\r
92 \r
93                 Response response = workflowResource.startProcessInstanceByKey("sdncAdapter", varMap);\r
94                 WorkflowResponse workflowResponse = (WorkflowResponse) response.getEntity();\r
95 \r
96                 //String pid = workflowResponse.getProcessInstanceID();\r
97                 //System.out.println("Back from executing process instance with pid=" + pid);\r
98                 return workflowResponse;\r
99         }\r
100 \r
101         @Test\r
102         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
103                         "subprocess/GenericNotificationService.bpmn"\r
104                         })\r
105         public void sunnyDay() throws InterruptedException {\r
106 \r
107                 mockSDNCAdapter(200);\r
108 \r
109                 //System.out.println("SDNCAdapter sunny day flow Started!");\r
110 \r
111                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequest);\r
112                 thread.start();\r
113                 waitForExecutionToStart("sdncAdapter", 3);\r
114                 String pid = getPid();\r
115 \r
116                 assertProcessInstanceNotFinished(pid);\r
117 \r
118                 System.out.println("Injecting SDNC Adapter asynchronous callback message to continue processing");\r
119                 String generatedRequestId = (String) processEngineRule.getRuntimeService().getVariable(pid, "SDNCA_requestId");\r
120                 CallbackHeader callbackHeader = new CallbackHeader();\r
121                 callbackHeader.setRequestId(generatedRequestId);\r
122                 callbackHeader.setResponseCode("200");\r
123                 callbackHeader.setResponseMessage("OK");\r
124                 SDNCAdapterCallbackRequest sdncAdapterCallbackRequest = new SDNCAdapterCallbackRequest();\r
125                 sdncAdapterCallbackRequest.setCallbackHeader(callbackHeader);\r
126                 sdncAdapterCallbackRequest.setRequestData(sdncAdapterCallbackRequestData);\r
127                 SDNCAdapterCallbackServiceImpl callbackService = new SDNCAdapterCallbackServiceImpl();\r
128                 callbackService.setProcessEngineServices4junit(processEngineRule);\r
129                 SDNCAdapterResponse sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
130                 //System.out.println("Back from executing process again");\r
131 \r
132                 assertFalse(sdncAdapterResponse instanceof SDNCAdapterErrorResponse);\r
133                 assertProcessInstanceFinished(pid);\r
134 \r
135                 //System.out.println("SDNCAdapter sunny day flow Completed!");\r
136         }\r
137 \r
138         @Test\r
139         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
140                         "subprocess/GenericNotificationService.bpmn"\r
141                         })\r
142         public void nonFinalWithTimeout() throws InterruptedException {\r
143 \r
144                 mockSDNCAdapter(200);\r
145                 mockUpdateRequestDB(200, "Database/DBAdapter.xml");\r
146 \r
147                 //System.out.println("SDNCAdapter interim status processing flow Started!");\r
148 \r
149                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequestAct);\r
150                 thread.start();\r
151                 waitForExecutionToStart("sdncAdapter", 3);\r
152                 String pid = getPid();\r
153 \r
154                 assertProcessInstanceNotFinished(pid);\r
155 \r
156                 //System.out.println("Injecting SDNC Adapter asynchronous callback message to continue processing");\r
157                 String generatedRequestId = (String) processEngineRule.getRuntimeService().getVariable(pid, "SDNCA_requestId");\r
158                 CallbackHeader callbackHeader = new CallbackHeader();\r
159                 callbackHeader.setRequestId(generatedRequestId);\r
160                 callbackHeader.setResponseCode("200");\r
161                 callbackHeader.setResponseMessage("OK");\r
162                 SDNCAdapterCallbackRequest sdncAdapterCallbackRequest = new SDNCAdapterCallbackRequest();\r
163                 sdncAdapterCallbackRequest.setCallbackHeader(callbackHeader);\r
164                 sdncAdapterCallbackRequest.setRequestData(sdncAdapterCallbackRequestDataNonfinal);\r
165                 SDNCAdapterCallbackServiceImpl callbackService = new SDNCAdapterCallbackServiceImpl();\r
166                 callbackService.setProcessEngineServices4junit(processEngineRule);\r
167                 SDNCAdapterResponse sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
168                 //System.out.println("Back from executing process again");\r
169 \r
170                 assertFalse(sdncAdapterResponse instanceof SDNCAdapterErrorResponse);\r
171                 assertProcessInstanceNotFinished(pid);\r
172 \r
173                 checkForTimeout(pid);\r
174 \r
175                 assertEquals(true, (Boolean) (getVariable(pid, "continueListening")));\r
176 \r
177 \r
178                 //System.out.println("SDNCAdapter interim status processing flow Completed!");\r
179         }\r
180 \r
181         @Test\r
182         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
183                         "subprocess/GenericNotificationService.bpmn"\r
184                         })\r
185         public void nonFinalThenFinal() throws InterruptedException {\r
186 \r
187                 mockSDNCAdapter(200);\r
188                 mockUpdateRequestDB(200, "Database/DBAdapter.xml");\r
189 \r
190                 //System.out.println("SDNCAdapter non-final then final processing flow Started!");\r
191 \r
192                 // Start the flow\r
193                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequestAct);\r
194                 thread.start();\r
195                 waitForExecutionToStart("sdncAdapter", 3);\r
196                 String pid = getPid();\r
197 \r
198                 assertProcessInstanceNotFinished(pid);\r
199 \r
200                 // Inject a "non-final" SDNC Adapter asynchronous callback message\r
201                 //System.out.println("Injecting SDNC Adapter asynchronous callback message to continue processing");\r
202                 String generatedRequestId = (String) processEngineRule.getRuntimeService().getVariable(pid, "SDNCA_requestId");\r
203                 CallbackHeader callbackHeader = new CallbackHeader();\r
204                 callbackHeader.setRequestId(generatedRequestId);\r
205                 callbackHeader.setResponseCode("200");\r
206                 callbackHeader.setResponseMessage("OK");\r
207                 SDNCAdapterCallbackRequest sdncAdapterCallbackRequest = new SDNCAdapterCallbackRequest();\r
208                 sdncAdapterCallbackRequest.setCallbackHeader(callbackHeader);\r
209                 sdncAdapterCallbackRequest.setRequestData(sdncAdapterCallbackRequestDataNonfinal);\r
210                 SDNCAdapterCallbackServiceImpl callbackService = new SDNCAdapterCallbackServiceImpl();\r
211                 callbackService.setProcessEngineServices4junit(processEngineRule);\r
212                 SDNCAdapterResponse sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
213                 //System.out.println("Back from executing process again");\r
214 \r
215                 assertFalse(sdncAdapterResponse instanceof SDNCAdapterErrorResponse);\r
216                 assertProcessInstanceNotFinished(pid);\r
217                 assertEquals(true, (Boolean) (getVariable(pid, "continueListening")));\r
218 \r
219                 // Inject a "final" SDNC Adapter asynchronous callback message\r
220                 sdncAdapterCallbackRequest.setRequestData(sdncAdapterCallbackRequestData);\r
221                 sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
222                 //System.out.println("Back from executing process again");\r
223 \r
224                 assertFalse(sdncAdapterResponse instanceof SDNCAdapterErrorResponse);\r
225                 assertProcessInstanceFinished(pid);\r
226                 assertEquals(false, (Boolean) (getVariable(pid, "continueListening")));\r
227 \r
228                 //System.out.println("SDNCAdapter non-final then final processing flow Completed!");\r
229         }\r
230 \r
231         \r
232 \r
233         private void waitForExecutionToStart(String processDefintion, int count) throws InterruptedException {\r
234                 //System.out.println(processEngineRule.getRuntimeService().createExecutionQuery().processDefinitionKey(processDefintion).count());\r
235                 while (processEngineRule.getRuntimeService().createExecutionQuery().processDefinitionKey(processDefintion).count() != count) {\r
236                         Thread.sleep(200);\r
237                 }\r
238         }\r
239 \r
240         @Test\r
241         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
242                         "subprocess/GenericNotificationService.bpmn"\r
243                         })\r
244         public void badCorrelationIdTest() throws InterruptedException, IOException {\r
245 \r
246                 mockSDNCAdapter(200);\r
247 \r
248                 Map<String, String> urnProperties = PropertyConfigurationSetup.createBpmnUrnProperties();\r
249                 urnProperties.put("mso.correlation.timeout", "5");\r
250                 PropertyConfigurationSetup.addProperties(urnProperties, 10000);\r
251 \r
252                 //System.out.println("SDNCAdapter bad RequestId test Started!");\r
253 \r
254                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequest);\r
255                 thread.start();\r
256                 waitForExecutionToStart("sdncAdapter", 3);\r
257                 String pid = getPid();\r
258                 assertProcessInstanceNotFinished(pid);\r
259 \r
260                 //System.out.println("Injecting SDNC Adapter asynchronous callback message to continue processing");\r
261                 String badRequestId = "This is not the RequestId that was used";\r
262                 CallbackHeader callbackHeader = new CallbackHeader();\r
263                 callbackHeader.setRequestId(badRequestId);\r
264                 callbackHeader.setResponseCode("200");\r
265                 callbackHeader.setResponseMessage("OK");\r
266                 SDNCAdapterCallbackRequest sdncAdapterCallbackRequest = new SDNCAdapterCallbackRequest();\r
267                 sdncAdapterCallbackRequest.setCallbackHeader(callbackHeader);\r
268                 sdncAdapterCallbackRequest.setRequestData(sdncAdapterCallbackRequestData);\r
269                 SDNCAdapterCallbackServiceImpl callbackService = new SDNCAdapterCallbackServiceImpl();\r
270                 callbackService.setProcessEngineServices4junit(processEngineRule);\r
271                 SDNCAdapterResponse sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
272                 //System.out.println("Back from executing process again");\r
273 \r
274                 assertTrue(sdncAdapterResponse instanceof SDNCAdapterErrorResponse);\r
275                 assertTrue(((SDNCAdapterErrorResponse) sdncAdapterResponse).getError().contains("No process is waiting for sdncAdapterCallbackRequest"));\r
276                 assertProcessInstanceNotFinished(pid);\r
277 \r
278                 //System.out.println("SDNCAdapter bad RequestId test Completed!");\r
279         }\r
280 \r
281         @Test\r
282         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
283                         "subprocess/GenericNotificationService.bpmn"\r
284                         })\r
285         public void badSynchronousResponse() throws IOException, InterruptedException {\r
286 \r
287                 mockSDNCAdapter(404);\r
288 \r
289                 //System.out.println("SDNCAdapter bad synchronous response flow Started!");\r
290 \r
291                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequest);\r
292                 thread.start();\r
293                 while (thread.isAlive()) {\r
294                         Thread.sleep(200);\r
295                 }\r
296                 WorkflowResponse response = thread.workflowResponse;\r
297                 Assert.assertNotNull(response);\r
298                 Assert.assertEquals("404 error", response.getMessageCode(),7000);\r
299 //              assertProcessInstanceFinished(response.getProcessInstanceID());\r
300                 //System.out.println("SDNCAdapter bad synchronous response flow Completed!");\r
301         }\r
302 \r
303         @Test\r
304         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
305                         "subprocess/GenericNotificationService.bpmn"\r
306                         })\r
307         public void sdncNotFound() throws IOException, InterruptedException {\r
308                 mockSDNCAdapter(200);\r
309                 mockSDNCAdapter("/sdncAdapterMock/404", 400, "sdncCallbackErrorResponse.xml");\r
310 \r
311                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequest);\r
312                 thread.start();\r
313                 waitForExecutionToStart("sdncAdapter", 3);\r
314                 String pid = getPid();\r
315 \r
316                 //System.out.println("Injecting SDNC Adapter asynchronous callback message to continue processing");\r
317                 String generatedRequestId = (String) processEngineRule.getRuntimeService().getVariable(pid, "SDNCA_requestId");\r
318                 CallbackHeader callbackHeader = new CallbackHeader();\r
319                 callbackHeader.setRequestId(generatedRequestId);\r
320                 callbackHeader.setResponseCode("404");\r
321                 callbackHeader.setResponseMessage("Error processing request to SDNC. Not Found. https://sdncodl.it.us.aic.cip.com:8443/restconf/config/L3SDN-API:services/layer3-service-list/AS%2FVLXM%2F000199%2F%2FSB_INTERNET. SDNC Returned-[error-type:application, error-tag:data-missing, error-message:Request could not be completed because the relevant data model content does not exist.]");\r
322                 SDNCAdapterCallbackRequest sdncAdapterCallbackRequest = new SDNCAdapterCallbackRequest();\r
323                 sdncAdapterCallbackRequest.setCallbackHeader(callbackHeader);\r
324                 SDNCAdapterCallbackServiceImpl callbackService = new SDNCAdapterCallbackServiceImpl();\r
325                 callbackService.setProcessEngineServices4junit(processEngineRule);\r
326                 SDNCAdapterResponse sdncAdapterResponse = callbackService.sdncAdapterCallback(sdncAdapterCallbackRequest);\r
327                 //System.out.println("Back from executing process again");\r
328 \r
329                 assertProcessInstanceFinished(pid);\r
330                 assertNotNull(sdncAdapterResponse);\r
331                 //TODO query history to see SDNCA_ResponseCode, SDNCA_ErrorResponse\r
332                 //System.out.println("SDNCAdapter SDNC Notfound test Completed!");\r
333         }\r
334 \r
335         @Test\r
336         @Deployment(resources = {"subprocess/SDNCAdapterV1.bpmn",\r
337                         "subprocess/GenericNotificationService.bpmn"\r
338                         })\r
339         public void asynchronousMessageTimeout() throws IOException, InterruptedException {\r
340                 mockSDNCAdapter(200);\r
341                 //System.out.println("SDNCAdapter asynchronous message timeout flow Started!");\r
342                 ProcessExecutionThread thread = new ProcessExecutionThread(sdncAdapterWorkflowRequest);\r
343                 thread.start();\r
344                 waitForExecutionToStart("sdncAdapter", 3);\r
345                 checkForTimeout(getPid());\r
346         }\r
347 \r
348         private void checkForTimeout(String pid) throws InterruptedException {\r
349 \r
350                 assertProcessInstanceNotFinished(pid);\r
351 \r
352                 ProcessEngineConfigurationImpl processEngineConfiguration =\r
353                         (ProcessEngineConfigurationImpl) processEngineRule.getProcessEngine().getProcessEngineConfiguration();\r
354                 assertTrue(processEngineConfiguration.getJobExecutor().isActive());\r
355 \r
356             Job timerJob = processEngineRule.getManagementService().createJobQuery().processInstanceId(pid).singleResult();\r
357             assertNotNull(timerJob);\r
358 \r
359             processEngineRule.getManagementService().executeJob(timerJob.getId());\r
360 \r
361             assertProcessInstanceFinished(pid);\r
362 \r
363                 //System.out.println("SDNCAdapter asynchronous message timeout flow Completed!");\r
364         }\r
365 \r
366         class ProcessExecutionThread extends Thread {\r
367 \r
368                 private String workflowRequest;\r
369                 private WorkflowResponse workflowResponse;\r
370 \r
371                 public ProcessExecutionThread(String workflowRequest) {\r
372                         this.workflowRequest = workflowRequest;\r
373                 }\r
374 \r
375                 public void run() {\r
376                         workflowResponse = invokeFlow(workflowRequest);\r
377                         workflowResponse.getProcessInstanceID();\r
378                 }\r
379         }\r
380 \r
381         private String getPid() {\r
382                 return processEngineRule.getHistoryService().createHistoricProcessInstanceQuery().list().get(0).getId();\r
383         }\r
384 \r
385         private Object getVariable(String pid, String variableName) {\r
386                 try {\r
387                         return\r
388                                 processEngineRule\r
389                                         .getHistoryService()\r
390                                         .createHistoricVariableInstanceQuery()\r
391                                         .processInstanceId(pid).variableName(variableName)\r
392                                         .singleResult()\r
393                                         .getValue();\r
394                 } catch(Exception ex) {\r
395                         return null;\r
396                 }\r
397         }\r
398 \r
399         private void assertProcessInstanceFinished(String pid) {\r
400             assertEquals(1, processEngineRule.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(pid).finished().count());\r
401         }\r
402 \r
403         private void assertProcessInstanceNotFinished(String pid) {\r
404             assertEquals(0, processEngineRule.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(pid).finished().count());\r
405         }\r
406 \r
407 }\r