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