Changes for checkstyle 8.32
[policy/apex-pdp.git] / examples / examples-myfirstpolicy / src / test / java / org / onap / policy / apex / examples / myfirstpolicy / MfpUseCaseTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.apex.examples.myfirstpolicy;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27
28 import com.google.gson.GsonBuilder;
29 import com.google.gson.JsonObject;
30 import java.io.IOException;
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.Map;
34 import org.junit.AfterClass;
35 import org.junit.BeforeClass;
36 import org.junit.Test;
37 import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
38 import org.onap.policy.apex.context.parameters.ContextParameterConstants;
39 import org.onap.policy.apex.context.parameters.ContextParameters;
40 import org.onap.policy.apex.context.parameters.SchemaParameters;
41 import org.onap.policy.apex.core.engine.EngineParameters;
42 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineFactory;
43 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineImpl;
44 import org.onap.policy.apex.core.engine.event.EnEvent;
45 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
46 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
47 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
48 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
49 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
50 import org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters;
51 import org.onap.policy.apex.plugins.executor.mvel.MvelExecutorParameters;
52 import org.onap.policy.common.parameters.ParameterService;
53 import org.onap.policy.common.utils.resources.ResourceUtils;
54
55 /**
56  * Test MyFirstPolicy Use Case.
57  */
58 public class MfpUseCaseTest {
59     // CHECKSTYLE:OFF: MagicNumber
60
61     private static ApexEngineImpl apexEngine;
62
63     /**
64      * Test MFP use case setup.
65      */
66     @BeforeClass
67     public static void testMfpUseCaseSetup() {
68         final AxArtifactKey key = new AxArtifactKey("MyFirstPolicyApexEngine", "0.0.1");
69         apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
70     }
71
72     private static ContextParameters contextParameters;
73     private static SchemaParameters schemaParameters;
74     private static EngineParameters engineParameters;
75
76     /**
77      * Before test.
78      */
79     @BeforeClass
80     public static void beforeTest() {
81         schemaParameters = new SchemaParameters();
82
83         schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
84         schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
85
86         ParameterService.register(schemaParameters);
87
88         contextParameters = new ContextParameters();
89
90         contextParameters.setName(ContextParameterConstants.MAIN_GROUP_NAME);
91         contextParameters.getDistributorParameters().setName(ContextParameterConstants.DISTRIBUTOR_GROUP_NAME);
92         contextParameters.getLockManagerParameters().setName(ContextParameterConstants.LOCKING_GROUP_NAME);
93         contextParameters.getPersistorParameters().setName(ContextParameterConstants.PERSISTENCE_GROUP_NAME);
94
95         ParameterService.register(contextParameters);
96         ParameterService.register(contextParameters.getDistributorParameters());
97         ParameterService.register(contextParameters.getLockManagerParameters());
98         ParameterService.register(contextParameters.getPersistorParameters());
99
100         engineParameters = new EngineParameters();
101         engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
102         engineParameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
103         ParameterService.register(engineParameters);
104     }
105
106     /**
107      * After test.
108      */
109     @AfterClass
110     public static void afterTest() {
111         ParameterService.deregister(engineParameters);
112
113         ParameterService.deregister(contextParameters.getDistributorParameters());
114         ParameterService.deregister(contextParameters.getLockManagerParameters());
115         ParameterService.deregister(contextParameters.getPersistorParameters());
116         ParameterService.deregister(contextParameters);
117
118         ParameterService.deregister(schemaParameters);
119     }
120
121     /**
122      * Test MyFirstPolicy#1 use case.
123      *
124      * @throws ApexException if there is an Apex error
125      * @throws InterruptedException if there is an Interruption.
126      * @throws IOException Signals that an I/O exception has occurred.
127      */
128     @Test
129     public void testMfp1Case() throws ApexException, InterruptedException, IOException {
130         final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1PolicyModel();
131         assertNotNull(apexPolicyModel);
132
133         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
134         apexEngine.addEventListener("listener", listener);
135         apexEngine.updateModel(apexPolicyModel, false);
136         apexEngine.start();
137
138         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
139         assertNotNull(axEventin);
140         final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
141         assertNotNull(axEventout);
142
143         EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
144         apexEngine.handleEvent(event);
145         EnEvent resultout = listener.getResult();
146         EnEvent resulexpected =
147                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
148         assertEquals(resulexpected, resultout);
149
150         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
151         apexEngine.handleEvent(event);
152         resultout = listener.getResult();
153         resulexpected =
154                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
155         assertEquals(resulexpected, resultout);
156         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
157
158         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
159         apexEngine.handleEvent(event);
160         resultout = listener.getResult();
161         resulexpected =
162                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
163         assertEquals(resulexpected, resultout);
164         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
165
166         apexEngine.stop();
167     }
168
169     /**
170      * Test MyFirstPolicy#1 use case.
171      *
172      * @throws ApexException if there is an Apex error
173      * @throws InterruptedException if there is an Interruption.
174      * @throws IOException Signals that an I/O exception has occurred.
175      */
176     @Test
177     public void testMfp1AltCase() throws ApexException, InterruptedException, IOException {
178         final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1AltPolicyModel();
179         assertNotNull(apexPolicyModel);
180
181         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
182         apexEngine.addEventListener("listener", listener);
183         apexEngine.updateModel(apexPolicyModel, false);
184         apexEngine.start();
185
186         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
187         assertNotNull(axEventin);
188         final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
189         assertNotNull(axEventout);
190
191         EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
192         apexEngine.handleEvent(event);
193         EnEvent resultout = listener.getResult();
194         EnEvent resulexpected =
195                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
196         resultout.put("message", "");
197         resulexpected.put("message", "");
198         assertEquals(resulexpected, resultout);
199
200         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
201         apexEngine.handleEvent(event);
202         resultout = listener.getResult();
203         resulexpected =
204                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
205         resultout.put("message", "");
206         resulexpected.put("message", "");
207         assertEquals(resulexpected, resultout);
208         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
209
210         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
211         apexEngine.handleEvent(event);
212         resultout = listener.getResult();
213         resulexpected =
214                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
215         resultout.put("message", "");
216         resulexpected.put("message", "");
217         assertEquals(resulexpected, resultout);
218         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
219
220         apexEngine.stop();
221     }
222
223     /**
224      * Test MyFirstPolicy#2 use case.
225      *
226      * @throws ApexException if there is an Apex error
227      * @throws InterruptedException if there is an Interruption.
228      * @throws IOException Signals that an I/O exception has occurred.
229      */
230     @Test
231     public void testMfp2Case() throws ApexException, InterruptedException, IOException {
232         final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp2PolicyModel();
233         assertNotNull(apexPolicyModel);
234
235         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
236         apexEngine.addEventListener("listener", listener);
237         apexEngine.updateModel(apexPolicyModel, false);
238         apexEngine.start();
239
240         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
241         assertNotNull(axEventin);
242         final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
243         assertNotNull(axEventout);
244
245         EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
246         apexEngine.handleEvent(event);
247         EnEvent resultout = listener.getResult();
248         EnEvent resultexpected =
249                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
250         assertEquals(resultexpected, resultout);
251         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
252
253         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
254         apexEngine.handleEvent(event);
255         resultout = listener.getResult();
256         resultexpected =
257                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
258         assertEquals(resultexpected, resultout);
259         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
260
261         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
262         apexEngine.handleEvent(event);
263         resultout = listener.getResult();
264         resultexpected =
265                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
266         assertEquals(resultexpected, resultout);
267         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
268
269         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
270         apexEngine.handleEvent(event);
271         resultout = listener.getResult();
272         resultexpected =
273                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_101433CET_thurs.json");
274         assertEquals(resultexpected, resultout);
275         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
276
277         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
278         apexEngine.handleEvent(event);
279         resultout = listener.getResult();
280         resultexpected =
281                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_171937CET_sun.json");
282         assertEquals(resultexpected, resultout);
283         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
284
285         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
286         apexEngine.handleEvent(event);
287         resultout = listener.getResult();
288         resultexpected =
289                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_NonBoozeItem_111309CET_mon.json");
290         assertEquals(resultexpected, resultout);
291         assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
292
293         apexEngine.stop();
294     }
295
296     /**
297      * Fill trigger event for test.
298      *
299      * @param event the event
300      * @param inputFile the input file
301      * @return the filled event
302      */
303     private EnEvent fillTriggerEvent(final AxEvent event, final String inputFile) {
304         final EnEvent ret = new EnEvent(event.getKey());
305         final GsonBuilder gb = new GsonBuilder();
306         gb.serializeNulls().enableComplexMapKeySerialization();
307         final JsonObject jsonObject =
308                 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
309         assertNotNull(jsonObject);
310         assertTrue(jsonObject.has("name"));
311         assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
312         assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
313         assertTrue(jsonObject.has("nameSpace"));
314         assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
315         assertTrue(jsonObject.has("version"));
316         assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
317         final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
318         for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
319             if (reserved.contains(e.getKey())) {
320                 continue;
321             }
322             assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
323                     + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
324             if (jsonObject.get(e.getKey()).isJsonNull()) {
325                 ret.put(e.getKey(), null);
326             }
327         }
328         for (final AxField field : event.getFields()) {
329             if (!field.getOptional()) {
330                 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
331                         + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
332             } else {
333                 ret.put(field.getKey().getLocalName(), null);
334             }
335         }
336         if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
337             ret.put("time", jsonObject.get("time").getAsLong());
338         }
339         if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
340             ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
341         }
342         if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
343             ret.put("amount", jsonObject.get("amount").getAsDouble());
344         }
345         if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
346             ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
347         }
348         if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
349             ret.put("quantity", jsonObject.get("quantity").getAsInt());
350         }
351         if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
352             ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
353         }
354         if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
355             ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
356         }
357         if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
358             ret.put("notes", jsonObject.get("notes").getAsString());
359         }
360         return ret;
361     }
362
363     /**
364      * Fill result event for test.
365      *
366      * @param event the event
367      * @param inputFile the input file
368      * @return the filled event
369      */
370     private EnEvent fillResultEvent(final AxEvent event, final String inputFile) {
371         final EnEvent ret = new EnEvent(event.getKey());
372         final GsonBuilder gb = new GsonBuilder();
373         gb.serializeNulls().enableComplexMapKeySerialization();
374         final JsonObject jsonObject =
375                 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
376         assertNotNull(jsonObject);
377         assertTrue(jsonObject.has("name"));
378         assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
379         assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
380         assertTrue(jsonObject.has("nameSpace"));
381         assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
382         assertTrue(jsonObject.has("version"));
383         assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
384         final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
385         for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
386             if (reserved.contains(e.getKey())) {
387                 continue;
388             }
389             assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
390                     + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
391             if (jsonObject.get(e.getKey()).isJsonNull()) {
392                 ret.put(e.getKey(), null);
393             }
394         }
395         for (final AxField field : event.getFields()) {
396             if (!field.getOptional()) {
397                 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
398                         + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
399             } else {
400                 ret.put(field.getKey().getLocalName(), null);
401             }
402         }
403         if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
404             ret.put("time", jsonObject.get("time").getAsLong());
405         }
406         if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
407             ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
408         }
409         if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
410             ret.put("amount", jsonObject.get("amount").getAsDouble());
411         }
412         if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
413             ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
414         }
415         if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
416             ret.put("quantity", jsonObject.get("quantity").getAsInt());
417         }
418         if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
419             ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
420         }
421         if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
422             ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
423         }
424         if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
425             ret.put("notes", jsonObject.get("notes").getAsString());
426         }
427         if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
428             ret.put("authorised", jsonObject.get("authorised").getAsString());
429         }
430         if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
431             ret.put("message", jsonObject.get("message").getAsString());
432         }
433         return ret;
434     }
435 }