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