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