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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.apex.examples.myfirstpolicy;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
27 import com.google.gson.GsonBuilder;
28 import com.google.gson.JsonObject;
30 import java.io.IOException;
31 import java.util.Arrays;
32 import java.util.List;
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;
58 * Test MyFirstPolicy Use Case.
60 public class TestMFPUseCase {
61 // CHECKSTYLE:OFF: MagicNumber
63 private static ApexEngineImpl apexEngine;
66 * Test MFP use case setup.
69 public static void testMFPUseCaseSetup() {
70 final AxArtifactKey key = new AxArtifactKey("MyFirstPolicyApexEngine", "0.0.1");
71 apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
74 private static ContextParameters contextParameters;
75 private static SchemaParameters schemaParameters;
76 private static EngineParameters engineParameters;
79 public static void beforeTest() {
80 schemaParameters = new SchemaParameters();
82 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
83 schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
85 ParameterService.register(schemaParameters);
87 contextParameters = new ContextParameters();
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);
94 ParameterService.register(contextParameters);
95 ParameterService.register(contextParameters.getDistributorParameters());
96 ParameterService.register(contextParameters.getLockManagerParameters());
97 ParameterService.register(contextParameters.getPersistorParameters());
99 engineParameters = new EngineParameters();
100 engineParameters.getExecutorParameterMap().put("MVEL", new MVELExecutorParameters());
101 engineParameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
102 ParameterService.register(engineParameters);
106 public static void afterTest() {
107 ParameterService.deregister(engineParameters);
109 ParameterService.deregister(contextParameters.getDistributorParameters());
110 ParameterService.deregister(contextParameters.getLockManagerParameters());
111 ParameterService.deregister(contextParameters.getPersistorParameters());
112 ParameterService.deregister(contextParameters);
114 ParameterService.deregister(schemaParameters);
118 * Test MyFirstPolicy#1 use case.
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.
125 public void testMFP1Case() throws ApexException, InterruptedException, IOException {
126 final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP1PolicyModel();
127 assertNotNull(apexPolicyModel);
129 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
130 apexEngine.addEventListener("listener", listener);
131 apexEngine.updateModel(apexPolicyModel);
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);
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);
146 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
147 apexEngine.handleEvent(event);
148 resultout = listener.getResult();
150 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
151 assertEquals(resulexpected, resultout);
152 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
154 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
155 apexEngine.handleEvent(event);
156 resultout = listener.getResult();
158 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
159 assertEquals(resulexpected, resultout);
160 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
166 * Test MyFirstPolicy#2 use case.
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.
173 public void testMFP2Case() throws ApexException, InterruptedException, IOException {
174 final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP2PolicyModel();
175 assertNotNull(apexPolicyModel);
177 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
178 apexEngine.addEventListener("listener", listener);
179 apexEngine.updateModel(apexPolicyModel);
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);
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());
195 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
196 apexEngine.handleEvent(event);
197 resultout = listener.getResult();
199 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
200 assertEquals(resulexpected, resultout);
201 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
203 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
204 apexEngine.handleEvent(event);
205 resultout = listener.getResult();
207 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
208 assertEquals(resulexpected, resultout);
209 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
211 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
212 apexEngine.handleEvent(event);
213 resultout = listener.getResult();
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());
219 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
220 apexEngine.handleEvent(event);
221 resultout = listener.getResult();
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());
227 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
228 apexEngine.handleEvent(event);
229 resultout = listener.getResult();
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());
239 * Fill trigger event for test.
241 * @param event the event
242 * @param inputFile the input file
243 * @return the filled event
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())) {
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);
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()));
275 ret.put(field.getKey().getLocalName(), null);
278 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
279 ret.put("time", jsonObject.get("time").getAsLong());
281 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
282 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
284 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
285 ret.put("amount", jsonObject.get("amount").getAsDouble());
287 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
288 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
290 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
291 ret.put("quantity", jsonObject.get("quantity").getAsInt());
293 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
294 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
296 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
297 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
299 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
300 ret.put("notes", jsonObject.get("notes").getAsString());
306 * Fill result event for test.
308 * @param event the event
309 * @param inputFile the input file
310 * @return the filled event
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())) {
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);
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()));
342 ret.put(field.getKey().getLocalName(), null);
345 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
346 ret.put("time", jsonObject.get("time").getAsLong());
348 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
349 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
351 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
352 ret.put("amount", jsonObject.get("amount").getAsDouble());
354 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
355 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
357 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
358 ret.put("quantity", jsonObject.get("quantity").getAsInt());
360 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
361 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
363 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
364 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
366 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
367 ret.put("notes", jsonObject.get("notes").getAsString());
369 if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
370 ret.put("authorised", jsonObject.get("authorised").getAsString());
372 if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
373 ret.put("message", jsonObject.get("message").getAsString());