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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.apex.examples.myfirstpolicy;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
28 import com.google.gson.GsonBuilder;
29 import com.google.gson.JsonObject;
30 import java.io.IOException;
31 import java.util.Arrays;
32 import java.util.List;
34 import org.junit.AfterClass;
35 import org.junit.BeforeClass;
36 import org.junit.Test;
37 import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
38 import org.onap.policy.apex.context.parameters.ContextParameterConstants;
39 import org.onap.policy.apex.context.parameters.ContextParameters;
40 import org.onap.policy.apex.context.parameters.SchemaParameters;
41 import org.onap.policy.apex.core.engine.EngineParameters;
42 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineFactory;
43 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineImpl;
44 import org.onap.policy.apex.core.engine.event.EnEvent;
45 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
46 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
47 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
48 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
49 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
50 import org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters;
51 import org.onap.policy.apex.plugins.executor.mvel.MvelExecutorParameters;
52 import org.onap.policy.common.parameters.ParameterService;
53 import org.onap.policy.common.utils.resources.ResourceUtils;
56 * Test MyFirstPolicy Use Case.
58 public class MfpUseCaseTest {
59 // CHECKSTYLE:OFF: MagicNumber
61 private static ApexEngineImpl apexEngine;
64 * Test MFP use case setup.
67 public static void testMfpUseCaseSetup() {
68 final AxArtifactKey key = new AxArtifactKey("MyFirstPolicyApexEngine", "0.0.1");
69 apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
72 private static ContextParameters contextParameters;
73 private static SchemaParameters schemaParameters;
74 private static EngineParameters engineParameters;
80 public static void beforeTest() {
81 schemaParameters = new SchemaParameters();
83 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
84 schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
86 ParameterService.register(schemaParameters);
88 contextParameters = new ContextParameters();
90 contextParameters.setName(ContextParameterConstants.MAIN_GROUP_NAME);
91 contextParameters.getDistributorParameters().setName(ContextParameterConstants.DISTRIBUTOR_GROUP_NAME);
92 contextParameters.getLockManagerParameters().setName(ContextParameterConstants.LOCKING_GROUP_NAME);
93 contextParameters.getPersistorParameters().setName(ContextParameterConstants.PERSISTENCE_GROUP_NAME);
95 ParameterService.register(contextParameters);
96 ParameterService.register(contextParameters.getDistributorParameters());
97 ParameterService.register(contextParameters.getLockManagerParameters());
98 ParameterService.register(contextParameters.getPersistorParameters());
100 engineParameters = new EngineParameters();
101 engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
102 engineParameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
103 ParameterService.register(engineParameters);
110 public static void afterTest() {
111 ParameterService.deregister(engineParameters);
113 ParameterService.deregister(contextParameters.getDistributorParameters());
114 ParameterService.deregister(contextParameters.getLockManagerParameters());
115 ParameterService.deregister(contextParameters.getPersistorParameters());
116 ParameterService.deregister(contextParameters);
118 ParameterService.deregister(schemaParameters);
122 * Test MyFirstPolicy#1 use case.
124 * @throws ApexException if there is an Apex error
125 * @throws InterruptedException if there is an Interruption.
126 * @throws IOException Signals that an I/O exception has occurred.
129 public void testMfp1Case() throws ApexException, InterruptedException, IOException {
130 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1PolicyModel();
131 assertNotNull(apexPolicyModel);
133 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
134 apexEngine.addEventListener("listener", listener);
135 apexEngine.updateModel(apexPolicyModel, false);
138 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
139 assertNotNull(axEventin);
140 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
141 assertNotNull(axEventout);
143 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
144 apexEngine.handleEvent(event);
145 EnEvent resultout = listener.getResult();
146 EnEvent resulexpected =
147 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
148 assertEquals(resulexpected, resultout);
150 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
151 apexEngine.handleEvent(event);
152 resultout = listener.getResult();
154 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
155 assertEquals(resulexpected, resultout);
156 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
158 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
159 apexEngine.handleEvent(event);
160 resultout = listener.getResult();
162 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
163 assertEquals(resulexpected, resultout);
164 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
170 * Test MyFirstPolicy#1 use case.
172 * @throws ApexException if there is an Apex error
173 * @throws InterruptedException if there is an Interruption.
174 * @throws IOException Signals that an I/O exception has occurred.
177 public void testMfp1AltCase() throws ApexException, InterruptedException, IOException {
178 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1AltPolicyModel();
179 assertNotNull(apexPolicyModel);
181 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
182 apexEngine.addEventListener("listener", listener);
183 apexEngine.updateModel(apexPolicyModel, false);
186 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
187 assertNotNull(axEventin);
188 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
189 assertNotNull(axEventout);
191 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
192 apexEngine.handleEvent(event);
193 EnEvent resultout = listener.getResult();
194 EnEvent resulexpected =
195 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
196 resultout.put("message", "");
197 resulexpected.put("message", "");
198 assertEquals(resulexpected, resultout);
200 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
201 apexEngine.handleEvent(event);
202 resultout = listener.getResult();
204 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
205 resultout.put("message", "");
206 resulexpected.put("message", "");
207 assertEquals(resulexpected, resultout);
208 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
210 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
211 apexEngine.handleEvent(event);
212 resultout = listener.getResult();
214 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
215 resultout.put("message", "");
216 resulexpected.put("message", "");
217 assertEquals(resulexpected, resultout);
218 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
224 * Test MyFirstPolicy#2 use case.
226 * @throws ApexException if there is an Apex error
227 * @throws InterruptedException if there is an Interruption.
228 * @throws IOException Signals that an I/O exception has occurred.
231 public void testMfp2Case() throws ApexException, InterruptedException, IOException {
232 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp2PolicyModel();
233 assertNotNull(apexPolicyModel);
235 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
236 apexEngine.addEventListener("listener", listener);
237 apexEngine.updateModel(apexPolicyModel, false);
240 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
241 assertNotNull(axEventin);
242 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
243 assertNotNull(axEventout);
245 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
246 apexEngine.handleEvent(event);
247 EnEvent resultout = listener.getResult();
248 EnEvent resultexpected =
249 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
250 assertEquals(resultexpected, resultout);
251 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
253 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
254 apexEngine.handleEvent(event);
255 resultout = listener.getResult();
257 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
258 assertEquals(resultexpected, resultout);
259 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
261 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
262 apexEngine.handleEvent(event);
263 resultout = listener.getResult();
265 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
266 assertEquals(resultexpected, resultout);
267 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
269 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
270 apexEngine.handleEvent(event);
271 resultout = listener.getResult();
273 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_101433CET_thurs.json");
274 assertEquals(resultexpected, resultout);
275 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
277 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
278 apexEngine.handleEvent(event);
279 resultout = listener.getResult();
281 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_171937CET_sun.json");
282 assertEquals(resultexpected, resultout);
283 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
285 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
286 apexEngine.handleEvent(event);
287 resultout = listener.getResult();
289 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_NonBoozeItem_111309CET_mon.json");
290 assertEquals(resultexpected, resultout);
291 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
297 * Fill trigger event for test.
299 * @param event the event
300 * @param inputFile the input file
301 * @return the filled event
303 private EnEvent fillTriggerEvent(final AxEvent event, final String inputFile) {
304 final EnEvent ret = new EnEvent(event.getKey());
305 final GsonBuilder gb = new GsonBuilder();
306 gb.serializeNulls().enableComplexMapKeySerialization();
307 final JsonObject jsonObject =
308 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
309 assertNotNull(jsonObject);
310 assertTrue(jsonObject.has("name"));
311 assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
312 assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
313 assertTrue(jsonObject.has("nameSpace"));
314 assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
315 assertTrue(jsonObject.has("version"));
316 assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
317 final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
318 for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
319 if (reserved.contains(e.getKey())) {
322 assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
323 + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
324 if (jsonObject.get(e.getKey()).isJsonNull()) {
325 ret.put(e.getKey(), null);
328 for (final AxField field : event.getFields()) {
329 if (!field.getOptional()) {
330 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
331 + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
333 ret.put(field.getKey().getLocalName(), null);
336 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
337 ret.put("time", jsonObject.get("time").getAsLong());
339 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
340 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
342 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
343 ret.put("amount", jsonObject.get("amount").getAsDouble());
345 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
346 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
348 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
349 ret.put("quantity", jsonObject.get("quantity").getAsInt());
351 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
352 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
354 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
355 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
357 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
358 ret.put("notes", jsonObject.get("notes").getAsString());
364 * Fill result event for test.
366 * @param event the event
367 * @param inputFile the input file
368 * @return the filled event
370 private EnEvent fillResultEvent(final AxEvent event, final String inputFile) {
371 final EnEvent ret = new EnEvent(event.getKey());
372 final GsonBuilder gb = new GsonBuilder();
373 gb.serializeNulls().enableComplexMapKeySerialization();
374 final JsonObject jsonObject =
375 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
376 assertNotNull(jsonObject);
377 assertTrue(jsonObject.has("name"));
378 assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
379 assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
380 assertTrue(jsonObject.has("nameSpace"));
381 assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
382 assertTrue(jsonObject.has("version"));
383 assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
384 final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
385 for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
386 if (reserved.contains(e.getKey())) {
389 assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
390 + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
391 if (jsonObject.get(e.getKey()).isJsonNull()) {
392 ret.put(e.getKey(), null);
395 for (final AxField field : event.getFields()) {
396 if (!field.getOptional()) {
397 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
398 + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
400 ret.put(field.getKey().getLocalName(), null);
403 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
404 ret.put("time", jsonObject.get("time").getAsLong());
406 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
407 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
409 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
410 ret.put("amount", jsonObject.get("amount").getAsDouble());
412 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
413 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
415 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
416 ret.put("quantity", jsonObject.get("quantity").getAsInt());
418 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
419 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
421 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
422 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
424 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
425 ret.put("notes", jsonObject.get("notes").getAsString());
427 if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
428 ret.put("authorised", jsonObject.get("authorised").getAsString());
430 if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
431 ret.put("message", jsonObject.get("message").getAsString());