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
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;
31 import java.io.IOException;
32 import java.util.Arrays;
33 import java.util.List;
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;
59 * Test MyFirstPolicy Use Case.
61 public class MfpUseCaseTest {
62 // CHECKSTYLE:OFF: MagicNumber
64 private static ApexEngineImpl apexEngine;
67 * Test MFP use case setup.
70 public static void testMfpUseCaseSetup() {
71 final AxArtifactKey key = new AxArtifactKey("MyFirstPolicyApexEngine", "0.0.1");
72 apexEngine = (ApexEngineImpl) new ApexEngineFactory().createApexEngine(key);
75 private static ContextParameters contextParameters;
76 private static SchemaParameters schemaParameters;
77 private static EngineParameters engineParameters;
83 public static void beforeTest() {
84 schemaParameters = new SchemaParameters();
86 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
87 schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
89 ParameterService.register(schemaParameters);
91 contextParameters = new ContextParameters();
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);
98 ParameterService.register(contextParameters);
99 ParameterService.register(contextParameters.getDistributorParameters());
100 ParameterService.register(contextParameters.getLockManagerParameters());
101 ParameterService.register(contextParameters.getPersistorParameters());
103 engineParameters = new EngineParameters();
104 engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
105 engineParameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
106 ParameterService.register(engineParameters);
113 public static void afterTest() {
114 ParameterService.deregister(engineParameters);
116 ParameterService.deregister(contextParameters.getDistributorParameters());
117 ParameterService.deregister(contextParameters.getLockManagerParameters());
118 ParameterService.deregister(contextParameters.getPersistorParameters());
119 ParameterService.deregister(contextParameters);
121 ParameterService.deregister(schemaParameters);
125 * Test MyFirstPolicy#1 use case.
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.
132 public void testMfp1Case() throws ApexException, InterruptedException, IOException {
133 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1PolicyModel();
134 assertNotNull(apexPolicyModel);
136 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
137 apexEngine.addEventListener("listener", listener);
138 apexEngine.updateModel(apexPolicyModel, false);
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);
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);
153 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
154 apexEngine.handleEvent(event);
155 resultout = listener.getResult();
157 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
158 assertEquals(resulexpected, resultout);
159 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
161 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
162 apexEngine.handleEvent(event);
163 resultout = listener.getResult();
165 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
166 assertEquals(resulexpected, resultout);
167 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
173 * Test MyFirstPolicy#2 use case.
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.
180 public void testMfp2Case() throws ApexException, InterruptedException, IOException {
181 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp2PolicyModel();
182 assertNotNull(apexPolicyModel);
184 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
185 apexEngine.addEventListener("listener", listener);
186 apexEngine.updateModel(apexPolicyModel, false);
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);
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());
202 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
203 apexEngine.handleEvent(event);
204 resultout = listener.getResult();
206 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
207 assertEquals(resultexpected, 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 assertEquals(resultexpected, resultout);
216 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
218 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
219 apexEngine.handleEvent(event);
220 resultout = listener.getResult();
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());
226 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
227 apexEngine.handleEvent(event);
228 resultout = listener.getResult();
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());
234 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
235 apexEngine.handleEvent(event);
236 resultout = listener.getResult();
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());
246 * Fill trigger event for test.
248 * @param event the event
249 * @param inputFile the input file
250 * @return the filled event
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())) {
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);
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()));
282 ret.put(field.getKey().getLocalName(), null);
285 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
286 ret.put("time", jsonObject.get("time").getAsLong());
288 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
289 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
291 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
292 ret.put("amount", jsonObject.get("amount").getAsDouble());
294 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
295 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
297 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
298 ret.put("quantity", jsonObject.get("quantity").getAsInt());
300 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
301 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
303 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
304 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
306 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
307 ret.put("notes", jsonObject.get("notes").getAsString());
313 * Fill result event for test.
315 * @param event the event
316 * @param inputFile the input file
317 * @return the filled event
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())) {
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);
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()));
349 ret.put(field.getKey().getLocalName(), null);
352 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
353 ret.put("time", jsonObject.get("time").getAsLong());
355 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
356 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
358 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
359 ret.put("amount", jsonObject.get("amount").getAsDouble());
361 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
362 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
364 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
365 ret.put("quantity", jsonObject.get("quantity").getAsInt());
367 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
368 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
370 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
371 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
373 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
374 ret.put("notes", jsonObject.get("notes").getAsString());
376 if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
377 ret.put("authorised", jsonObject.get("authorised").getAsString());
379 if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
380 ret.put("message", jsonObject.get("message").getAsString());