f4030b208193f3ad90a34c2b0e28ec5e73d3e951
[policy/apex-pdp.git] /
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.BeforeClass;
36 import org.junit.Test;
37 import org.onap.policy.apex.core.engine.EngineParameters;
38 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineFactory;
39 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineImpl;
40 import org.onap.policy.apex.core.engine.event.EnEvent;
41 import org.onap.policy.apex.examples.myfirstpolicy.model.MFPDomainModelFactory;
42 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
43 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
44 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
45 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
46 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
47 import org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters;
48 import org.onap.policy.apex.plugins.executor.mvel.MVELExecutorParameters;
49 import org.onap.policy.common.utils.resources.ResourceUtils;
50
51 /**
52  * Test MyFirstPolicy Use Case.
53  */
54 public class TestMFPUseCase {
55     // CHECKSTYLE:OFF: MagicNumber
56
57     private static ApexEngineImpl apexEngine;
58
59     /**
60      * Test MFP use case setup.
61      */
62     @BeforeClass
63     public static void testMFPUseCaseSetup() {
64         final AxArtifactKey key = new AxArtifactKey("MyFirstPolicyApexEngine", "0.0.1");
65         final EngineParameters parameters = new EngineParameters();
66         parameters.getExecutorParameterMap().put("MVEL", new MVELExecutorParameters());
67         parameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
68         apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
69     }
70
71     /**
72      * Test MyFirstPolicy#1 use case.
73      *
74      * @throws ApexException if there is an Apex error
75      * @throws InterruptedException if there is an Interruption.
76      * @throws IOException Signals that an I/O exception has occurred.
77      */
78     @Test
79     public void testMFP1Case() throws ApexException, InterruptedException, IOException {
80         final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP1PolicyModel();
81         assertNotNull(apexPolicyModel);
82
83         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
84         apexEngine.addEventListener("listener", listener);
85         apexEngine.updateModel(apexPolicyModel);
86         apexEngine.start();
87
88         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
89         assertNotNull(axEventin);
90         final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
91         assertNotNull(axEventout);
92
93         EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
94         apexEngine.handleEvent(event);
95         EnEvent resultout = listener.getResult();
96         EnEvent resulexpected =
97                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
98         assertEquals(resulexpected, resultout);
99
100         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
101         apexEngine.handleEvent(event);
102         resultout = listener.getResult();
103         resulexpected =
104                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
105         assertEquals(resulexpected, resultout);
106         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
107
108         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
109         apexEngine.handleEvent(event);
110         resultout = listener.getResult();
111         resulexpected =
112                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
113         assertEquals(resulexpected, resultout);
114         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
115
116         apexEngine.stop();
117     }
118
119     /**
120      * Test MyFirstPolicy#2 use case.
121      *
122      * @throws ApexException if there is an Apex error
123      * @throws InterruptedException if there is an Interruption.
124      * @throws IOException Signals that an I/O exception has occurred.
125      */
126     @Test
127     public void testMFP2Case() throws ApexException, InterruptedException, IOException {
128         final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP2PolicyModel();
129         assertNotNull(apexPolicyModel);
130
131         final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
132         apexEngine.addEventListener("listener", listener);
133         apexEngine.updateModel(apexPolicyModel);
134         apexEngine.start();
135
136         final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
137         assertNotNull(axEventin);
138         final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
139         assertNotNull(axEventout);
140
141         EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
142         apexEngine.handleEvent(event);
143         EnEvent resultout = listener.getResult();
144         EnEvent resulexpected =
145                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
146         assertEquals(resulexpected, resultout);
147         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
148
149         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
150         apexEngine.handleEvent(event);
151         resultout = listener.getResult();
152         resulexpected =
153                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
154         assertEquals(resulexpected, resultout);
155         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
156
157         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
158         apexEngine.handleEvent(event);
159         resultout = listener.getResult();
160         resulexpected =
161                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
162         assertEquals(resulexpected, resultout);
163         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
164
165         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
166         apexEngine.handleEvent(event);
167         resultout = listener.getResult();
168         resulexpected =
169                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_101433CET_thurs.json");
170         assertEquals(resulexpected, resultout);
171         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
172
173         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
174         apexEngine.handleEvent(event);
175         resultout = listener.getResult();
176         resulexpected =
177                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_171937CET_sun.json");
178         assertEquals(resulexpected, resultout);
179         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
180
181         event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
182         apexEngine.handleEvent(event);
183         resultout = listener.getResult();
184         resulexpected =
185                 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_NonBoozeItem_111309CET_mon.json");
186         assertEquals(resulexpected, resultout);
187         assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
188
189         apexEngine.stop();
190     }
191
192     /**
193      * Fill trigger event for test.
194      *
195      * @param event the event
196      * @param inputFile the input file
197      * @return the filled event
198      */
199     private EnEvent fillTriggerEvent(final AxEvent event, final String inputFile) {
200         final EnEvent ret = new EnEvent(event.getKey());
201         final GsonBuilder gb = new GsonBuilder();
202         gb.serializeNulls().enableComplexMapKeySerialization();
203         final JsonObject jsonObject =
204                 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
205         assertNotNull(jsonObject);
206         assertTrue(jsonObject.has("name"));
207         assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
208         assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
209         assertTrue(jsonObject.has("nameSpace"));
210         assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
211         assertTrue(jsonObject.has("version"));
212         assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
213         final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
214         for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
215             if (reserved.contains(e.getKey())) {
216                 continue;
217             }
218             assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
219                     + event.getID(), (event.getParameterMap().containsKey(e.getKey())));
220             if (jsonObject.get(e.getKey()).isJsonNull()) {
221                 ret.put(e.getKey(), null);
222             }
223         }
224         for (final AxField field : event.getFields()) {
225             if (!field.getOptional()) {
226                 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
227                         + " for " + event.getID(), jsonObject.has(field.getKey().getLocalName()));
228             } else {
229                 ret.put(field.getKey().getLocalName(), null);
230             }
231         }
232         if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
233             ret.put("time", jsonObject.get("time").getAsLong());
234         }
235         if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
236             ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
237         }
238         if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
239             ret.put("amount", jsonObject.get("amount").getAsDouble());
240         }
241         if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
242             ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
243         }
244         if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
245             ret.put("quantity", jsonObject.get("quantity").getAsInt());
246         }
247         if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
248             ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
249         }
250         if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
251             ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
252         }
253         if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
254             ret.put("notes", jsonObject.get("notes").getAsString());
255         }
256         return ret;
257     }
258
259     /**
260      * Fill result event for test.
261      *
262      * @param event the event
263      * @param inputFile the input file
264      * @return the filled event
265      */
266     private EnEvent fillResultEvent(final AxEvent event, final String inputFile) {
267         final EnEvent ret = new EnEvent(event.getKey());
268         final GsonBuilder gb = new GsonBuilder();
269         gb.serializeNulls().enableComplexMapKeySerialization();
270         final JsonObject jsonObject =
271                 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
272         assertNotNull(jsonObject);
273         assertTrue(jsonObject.has("name"));
274         assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
275         assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
276         assertTrue(jsonObject.has("nameSpace"));
277         assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
278         assertTrue(jsonObject.has("version"));
279         assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
280         final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
281         for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
282             if (reserved.contains(e.getKey())) {
283                 continue;
284             }
285             assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
286                     + event.getID(), (event.getParameterMap().containsKey(e.getKey())));
287             if (jsonObject.get(e.getKey()).isJsonNull()) {
288                 ret.put(e.getKey(), null);
289             }
290         }
291         for (final AxField field : event.getFields()) {
292             if (!field.getOptional()) {
293                 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
294                         + " for " + event.getID(), jsonObject.has(field.getKey().getLocalName()));
295             } else {
296                 ret.put(field.getKey().getLocalName(), null);
297             }
298         }
299         if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
300             ret.put("time", jsonObject.get("time").getAsLong());
301         }
302         if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
303             ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
304         }
305         if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
306             ret.put("amount", jsonObject.get("amount").getAsDouble());
307         }
308         if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
309             ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
310         }
311         if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
312             ret.put("quantity", jsonObject.get("quantity").getAsInt());
313         }
314         if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
315             ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
316         }
317         if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
318             ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
319         }
320         if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
321             ret.put("notes", jsonObject.get("notes").getAsString());
322         }
323         if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
324             ret.put("authorised", jsonObject.get("authorised").getAsString());
325         }
326         if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
327             ret.put("message", jsonObject.get("message").getAsString());
328         }
329         return ret;
330     }
331 }