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;
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.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 MfpUseCaseTest {
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;
82 public static void beforeTest() {
83 schemaParameters = new SchemaParameters();
85 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
86 schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
88 ParameterService.register(schemaParameters);
90 contextParameters = new ContextParameters();
92 contextParameters.setName(ContextParameterConstants.MAIN_GROUP_NAME);
93 contextParameters.getDistributorParameters().setName(ContextParameterConstants.DISTRIBUTOR_GROUP_NAME);
94 contextParameters.getLockManagerParameters().setName(ContextParameterConstants.LOCKING_GROUP_NAME);
95 contextParameters.getPersistorParameters().setName(ContextParameterConstants.PERSISTENCE_GROUP_NAME);
97 ParameterService.register(contextParameters);
98 ParameterService.register(contextParameters.getDistributorParameters());
99 ParameterService.register(contextParameters.getLockManagerParameters());
100 ParameterService.register(contextParameters.getPersistorParameters());
102 engineParameters = new EngineParameters();
103 engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
104 engineParameters.getExecutorParameterMap().put("JAVASCRIPT", new JavascriptExecutorParameters());
105 ParameterService.register(engineParameters);
112 public static void afterTest() {
113 ParameterService.deregister(engineParameters);
115 ParameterService.deregister(contextParameters.getDistributorParameters());
116 ParameterService.deregister(contextParameters.getLockManagerParameters());
117 ParameterService.deregister(contextParameters.getPersistorParameters());
118 ParameterService.deregister(contextParameters);
120 ParameterService.deregister(schemaParameters);
124 * Test MyFirstPolicy#1 use case.
126 * @throws ApexException if there is an Apex error
127 * @throws InterruptedException if there is an Interruption.
128 * @throws IOException Signals that an I/O exception has occurred.
131 public void testMfp1Case() throws ApexException, InterruptedException, IOException {
132 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1PolicyModel();
133 assertNotNull(apexPolicyModel);
135 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
136 apexEngine.addEventListener("listener", listener);
137 apexEngine.updateModel(apexPolicyModel, false);
140 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
141 assertNotNull(axEventin);
142 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
143 assertNotNull(axEventout);
145 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
146 apexEngine.handleEvent(event);
147 EnEvent resultout = listener.getResult();
148 EnEvent resulexpected =
149 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
150 assertEquals(resulexpected, resultout);
152 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
153 apexEngine.handleEvent(event);
154 resultout = listener.getResult();
156 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
157 assertEquals(resulexpected, resultout);
158 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
160 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
161 apexEngine.handleEvent(event);
162 resultout = listener.getResult();
164 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
165 assertEquals(resulexpected, resultout);
166 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
172 * Test MyFirstPolicy#1 use case.
174 * @throws ApexException if there is an Apex error
175 * @throws InterruptedException if there is an Interruption.
176 * @throws IOException Signals that an I/O exception has occurred.
179 public void testMfp1AltCase() throws ApexException, InterruptedException, IOException {
180 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp1AltPolicyModel();
181 assertNotNull(apexPolicyModel);
183 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
184 apexEngine.addEventListener("listener", listener);
185 apexEngine.updateModel(apexPolicyModel, false);
188 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
189 assertNotNull(axEventin);
190 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
191 assertNotNull(axEventout);
193 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
194 apexEngine.handleEvent(event);
195 EnEvent resultout = listener.getResult();
196 EnEvent resulexpected =
197 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
198 resultout.put("message", "");
199 resulexpected.put("message", "");
200 assertEquals(resulexpected, resultout);
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 resultout.put("message", "");
208 resulexpected.put("message", "");
209 assertEquals(resulexpected, resultout);
210 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
212 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
213 apexEngine.handleEvent(event);
214 resultout = listener.getResult();
216 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
217 resultout.put("message", "");
218 resulexpected.put("message", "");
219 assertEquals(resulexpected, resultout);
220 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
226 * Test MyFirstPolicy#2 use case.
228 * @throws ApexException if there is an Apex error
229 * @throws InterruptedException if there is an Interruption.
230 * @throws IOException Signals that an I/O exception has occurred.
233 public void testMfp2Case() throws ApexException, InterruptedException, IOException {
234 final AxPolicyModel apexPolicyModel = new MfpDomainModelFactory().getMfp2PolicyModel();
235 assertNotNull(apexPolicyModel);
237 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
238 apexEngine.addEventListener("listener", listener);
239 apexEngine.updateModel(apexPolicyModel, false);
242 final AxEvent axEventin = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_INPUT:0.0.1"));
243 assertNotNull(axEventin);
244 final AxEvent axEventout = apexPolicyModel.getEvents().get(new AxArtifactKey("SALE_AUTH:0.0.1"));
245 assertNotNull(axEventout);
247 EnEvent event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_084106GMT.json");
248 apexEngine.handleEvent(event);
249 EnEvent resultout = listener.getResult();
250 EnEvent resultexpected =
251 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_084106GMT.json");
252 assertEquals(resultexpected, resultout);
253 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
255 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
256 apexEngine.handleEvent(event);
257 resultout = listener.getResult();
259 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
260 assertEquals(resultexpected, resultout);
261 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
263 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
264 apexEngine.handleEvent(event);
265 resultout = listener.getResult();
267 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
268 assertEquals(resultexpected, resultout);
269 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
271 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
272 apexEngine.handleEvent(event);
273 resultout = listener.getResult();
275 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_101433CET_thurs.json");
276 assertEquals(resultexpected, resultout);
277 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
279 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
280 apexEngine.handleEvent(event);
281 resultout = listener.getResult();
283 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_BoozeItem_171937CET_sun.json");
284 assertEquals(resultexpected, resultout);
285 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
287 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
288 apexEngine.handleEvent(event);
289 resultout = listener.getResult();
291 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/2/EventOut_NonBoozeItem_111309CET_mon.json");
292 assertEquals(resultexpected, resultout);
293 assertEquals("ExecutionIDs are different", event.getExecutionId(), resultout.getExecutionId());
299 * Fill trigger event for test.
301 * @param event the event
302 * @param inputFile the input file
303 * @return the filled event
305 private EnEvent fillTriggerEvent(final AxEvent event, final String inputFile) {
306 final EnEvent ret = new EnEvent(event.getKey());
307 final GsonBuilder gb = new GsonBuilder();
308 gb.serializeNulls().enableComplexMapKeySerialization();
309 final JsonObject jsonObject =
310 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
311 assertNotNull(jsonObject);
312 assertTrue(jsonObject.has("name"));
313 assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
314 assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
315 assertTrue(jsonObject.has("nameSpace"));
316 assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
317 assertTrue(jsonObject.has("version"));
318 assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
319 final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
320 for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
321 if (reserved.contains(e.getKey())) {
324 assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
325 + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
326 if (jsonObject.get(e.getKey()).isJsonNull()) {
327 ret.put(e.getKey(), null);
330 for (final AxField field : event.getFields()) {
331 if (!field.getOptional()) {
332 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
333 + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
335 ret.put(field.getKey().getLocalName(), null);
338 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
339 ret.put("time", jsonObject.get("time").getAsLong());
341 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
342 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
344 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
345 ret.put("amount", jsonObject.get("amount").getAsDouble());
347 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
348 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
350 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
351 ret.put("quantity", jsonObject.get("quantity").getAsInt());
353 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
354 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
356 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
357 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
359 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
360 ret.put("notes", jsonObject.get("notes").getAsString());
366 * Fill result event for test.
368 * @param event the event
369 * @param inputFile the input file
370 * @return the filled event
372 private EnEvent fillResultEvent(final AxEvent event, final String inputFile) {
373 final EnEvent ret = new EnEvent(event.getKey());
374 final GsonBuilder gb = new GsonBuilder();
375 gb.serializeNulls().enableComplexMapKeySerialization();
376 final JsonObject jsonObject =
377 gb.create().fromJson(ResourceUtils.getResourceAsString(inputFile), JsonObject.class);
378 assertNotNull(jsonObject);
379 assertTrue(jsonObject.has("name"));
380 assertTrue(ret.getName().equals(jsonObject.get("name").getAsString()));
381 assertTrue(ret.getAxEvent().getKey().getName().equals(jsonObject.get("name").getAsString()));
382 assertTrue(jsonObject.has("nameSpace"));
383 assertTrue(ret.getAxEvent().getNameSpace().equals(jsonObject.get("nameSpace").getAsString()));
384 assertTrue(jsonObject.has("version"));
385 assertTrue(ret.getAxEvent().getKey().getVersion().equals(jsonObject.get("version").getAsString()));
386 final List<String> reserved = Arrays.asList("name", "nameSpace", "version", "source", "target");
387 for (final Map.Entry<String, ?> e : jsonObject.entrySet()) {
388 if (reserved.contains(e.getKey())) {
391 assertTrue("Event file " + inputFile + " has a field " + e.getKey() + " but this is not defined for "
392 + event.getId(), (event.getParameterMap().containsKey(e.getKey())));
393 if (jsonObject.get(e.getKey()).isJsonNull()) {
394 ret.put(e.getKey(), null);
397 for (final AxField field : event.getFields()) {
398 if (!field.getOptional()) {
399 assertTrue("Event file " + inputFile + " is missing a mandatory field " + field.getKey().getLocalName()
400 + " for " + event.getId(), jsonObject.has(field.getKey().getLocalName()));
402 ret.put(field.getKey().getLocalName(), null);
405 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
406 ret.put("time", jsonObject.get("time").getAsLong());
408 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
409 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
411 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
412 ret.put("amount", jsonObject.get("amount").getAsDouble());
414 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
415 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
417 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
418 ret.put("quantity", jsonObject.get("quantity").getAsInt());
420 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
421 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
423 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
424 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
426 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
427 ret.put("notes", jsonObject.get("notes").getAsString());
429 if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
430 ret.put("authorised", jsonObject.get("authorised").getAsString());
432 if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
433 ret.put("message", jsonObject.get("message").getAsString());