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.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;
52 * Test MyFirstPolicy Use Case.
54 public class TestMFPUseCase {
55 // CHECKSTYLE:OFF: MagicNumber
57 private static ApexEngineImpl apexEngine;
60 * Test MFP use case setup.
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);
72 * Test MyFirstPolicy#1 use case.
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.
79 public void testMFP1Case() throws ApexException, InterruptedException, IOException {
80 final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP1PolicyModel();
81 assertNotNull(apexPolicyModel);
83 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
84 apexEngine.addEventListener("listener", listener);
85 apexEngine.updateModel(apexPolicyModel);
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);
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);
100 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
101 apexEngine.handleEvent(event);
102 resultout = listener.getResult();
104 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
105 assertEquals(resulexpected, resultout);
106 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
108 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
109 apexEngine.handleEvent(event);
110 resultout = listener.getResult();
112 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
113 assertEquals(resulexpected, resultout);
114 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
120 * Test MyFirstPolicy#2 use case.
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.
127 public void testMFP2Case() throws ApexException, InterruptedException, IOException {
128 final AxPolicyModel apexPolicyModel = new MFPDomainModelFactory().getMFP2PolicyModel();
129 assertNotNull(apexPolicyModel);
131 final TestSaleAuthListener listener = new TestSaleAuthListener("Test");
132 apexEngine.addEventListener("listener", listener);
133 apexEngine.updateModel(apexPolicyModel);
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);
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());
149 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_BoozeItem_201713GMT.json");
150 apexEngine.handleEvent(event);
151 resultout = listener.getResult();
153 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_BoozeItem_201713GMT.json");
154 assertEquals(resulexpected, resultout);
155 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
157 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/1/EventIn_NonBoozeItem_101309GMT.json");
158 apexEngine.handleEvent(event);
159 resultout = listener.getResult();
161 fillResultEvent(axEventout, "examples/events/MyFirstPolicy/1/EventOut_NonBoozeItem_101309GMT.json");
162 assertEquals(resulexpected, resultout);
163 assertEquals("ExecutionIDs are different", event.getExecutionID(), resultout.getExecutionID());
165 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_101433CET_thurs.json");
166 apexEngine.handleEvent(event);
167 resultout = listener.getResult();
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());
173 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_BoozeItem_171937CET_sun.json");
174 apexEngine.handleEvent(event);
175 resultout = listener.getResult();
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());
181 event = fillTriggerEvent(axEventin, "examples/events/MyFirstPolicy/2/EventIn_NonBoozeItem_111309CET_mon.json");
182 apexEngine.handleEvent(event);
183 resultout = listener.getResult();
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());
193 * Fill trigger event for test.
195 * @param event the event
196 * @param inputFile the input file
197 * @return the filled event
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())) {
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);
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()));
229 ret.put(field.getKey().getLocalName(), null);
232 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
233 ret.put("time", jsonObject.get("time").getAsLong());
235 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
236 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
238 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
239 ret.put("amount", jsonObject.get("amount").getAsDouble());
241 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
242 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
244 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
245 ret.put("quantity", jsonObject.get("quantity").getAsInt());
247 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
248 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
250 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
251 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
253 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
254 ret.put("notes", jsonObject.get("notes").getAsString());
260 * Fill result event for test.
262 * @param event the event
263 * @param inputFile the input file
264 * @return the filled event
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())) {
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);
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()));
296 ret.put(field.getKey().getLocalName(), null);
299 if (jsonObject.has("time") && !jsonObject.get("time").isJsonNull()) {
300 ret.put("time", jsonObject.get("time").getAsLong());
302 if (jsonObject.has("sale_ID") && !jsonObject.get("sale_ID").isJsonNull()) {
303 ret.put("sale_ID", jsonObject.get("sale_ID").getAsLong());
305 if (jsonObject.has("amount") && !jsonObject.get("amount").isJsonNull()) {
306 ret.put("amount", jsonObject.get("amount").getAsDouble());
308 if (jsonObject.has("item_ID") && !jsonObject.get("item_ID").isJsonNull()) {
309 ret.put("item_ID", jsonObject.get("item_ID").getAsLong());
311 if (jsonObject.has("quantity") && !jsonObject.get("quantity").isJsonNull()) {
312 ret.put("quantity", jsonObject.get("quantity").getAsInt());
314 if (jsonObject.has("assistant_ID") && !jsonObject.get("assistant_ID").isJsonNull()) {
315 ret.put("assistant_ID", jsonObject.get("assistant_ID").getAsLong());
317 if (jsonObject.has("branch_ID") && !jsonObject.get("branch_ID").isJsonNull()) {
318 ret.put("branch_ID", jsonObject.get("branch_ID").getAsLong());
320 if (jsonObject.has("notes") && !jsonObject.get("notes").isJsonNull()) {
321 ret.put("notes", jsonObject.get("notes").getAsString());
323 if (jsonObject.has("authorised") && !jsonObject.get("authorised").isJsonNull()) {
324 ret.put("authorised", jsonObject.get("authorised").getAsString());
326 if (jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
327 ret.put("message", jsonObject.get("message").getAsString());