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.service.engine.event;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
26 import static org.junit.Assert.fail;
28 import java.io.ByteArrayInputStream;
29 import java.io.IOException;
30 import java.util.Date;
31 import java.util.HashMap;
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.parameters.ContextParameterConstants;
39 import org.onap.policy.apex.context.parameters.SchemaParameters;
40 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
41 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
42 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
43 import org.onap.policy.apex.model.basicmodel.service.ModelService;
44 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
45 import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
46 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
47 import org.onap.policy.apex.model.utilities.TextFileUtils;
48 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.Apex2JsonEventConverter;
49 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.JsonEventProtocolParameters;
50 import org.onap.policy.common.parameters.ParameterService;
51 import org.slf4j.ext.XLogger;
52 import org.slf4j.ext.XLoggerFactory;
55 * Test JSON Event Handler.
57 * @author Liam Fallon (liam.fallon@ericsson.com)
59 public class TestJsonEventHandler {
60 private static final XLogger logger = XLoggerFactory.getXLogger(TestJsonEventHandler.class);
65 * @throws IOException Signals that an I/O exception has occurred.
66 * @throws ApexModelException the apex model exception
69 public static void setupEventModel() throws IOException, ApexModelException {
70 final String policyModelString = TextFileUtils
71 .getTextFileAsString("src/test/resources/policymodels/SamplePolicyModelMVEL.json");
72 final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
73 final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
75 // Set up the models in the model service
76 apexPolicyModel.register();
80 * Initialize default schema parameters.
83 public static void initializeDefaultSchemaParameters() {
84 ParameterService.clear();
85 final SchemaParameters schemaParameters = new SchemaParameters();
86 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
87 ParameterService.register(schemaParameters);
91 * Teardown default schema parameters.
94 public static void teardownDefaultSchemaParameters() {
95 ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
100 * Test JSON to apex event.
102 * @throws ApexException the apex exception
105 public void testJsontoApexEvent() throws ApexException {
107 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
108 assertNotNull(jsonEventConverter);
109 jsonEventConverter.init(new JsonEventProtocolParameters());
111 final String apexEventJsonStringIn = JsonEventGenerator.jsonEvent();
113 logger.debug("input event\n" + apexEventJsonStringIn);
115 final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
116 for (final ApexEvent apexEvent : apexEventList) {
117 assertNotNull(apexEvent);
119 logger.debug(apexEvent.toString());
121 assertTrue(apexEvent.getName().equals("Event0000") || apexEvent.getName().equals("Event0100"));
122 assertTrue(apexEvent.getVersion().equals("0.0.1"));
123 assertTrue(apexEvent.getNameSpace().equals("org.onap.policy.apex.sample.events"));
124 assertTrue(apexEvent.getSource().equals("test"));
125 assertTrue(apexEvent.getTarget().equals("apex"));
126 assertTrue(apexEvent.get("TestSlogan").toString().startsWith("Test slogan for External Event"));
128 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
129 assertTrue(testMatchCaseSelected == null);
131 } catch (final Exception e) {
133 throw new ApexException("Exception reading Apex event JSON file", e);
138 * Test JSON to apex bad event.
140 * @throws ApexException the apex exception
143 public void testJsontoApexBadEvent() throws ApexException {
145 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
146 assertNotNull(jsonEventConverter);
147 jsonEventConverter.init(new JsonEventProtocolParameters());
149 String apexEventJsonStringIn = null;
152 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoName();
153 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
154 fail("Test should throw an exception here");
155 } catch (final ApexEventException e) {
156 assertEquals("Failed to unmarshal JSON event: event received without mandatory parameter \"name\" ",
157 e.getMessage().substring(0, 82));
161 apexEventJsonStringIn = JsonEventGenerator.jsonEventBadName();
162 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
163 fail("Test should throw an exception here");
164 } catch (final ApexEventException e) {
165 assertTrue(e.getMessage().startsWith(
166 "Failed to unmarshal JSON event: field \"name\" with value \"%%%%\" is invalid"));
170 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoExName();
171 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
172 fail("Test should throw an exception here");
173 } catch (final ApexEventException e) {
174 assertEquals("Failed to unmarshal JSON event: an event definition for an event named \"I_DONT_EXI",
175 e.getMessage().substring(0, 82));
178 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoVersion();
179 ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
180 assertEquals("0.0.1", event.getVersion());
183 apexEventJsonStringIn = JsonEventGenerator.jsonEventBadVersion();
184 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
185 fail("Test should throw an exception here");
186 } catch (final ApexEventException e) {
187 assertTrue(e.getMessage().startsWith(
188 "Failed to unmarshal JSON event: field \"version\" with value \"#####\" is invalid"));
192 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoExVersion();
193 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
194 fail("Test should throw an exception here");
195 } catch (final ApexEventException e) {
196 assertTrue(e.getMessage()
197 .startsWith("Failed to unmarshal JSON event: an event definition for an event named "
198 + "\"Event0000\" with version \"1.2.3\" not found in Apex model"));
201 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoNamespace();
202 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
203 assertEquals("org.onap.policy.apex.sample.events", event.getNameSpace());
206 apexEventJsonStringIn = JsonEventGenerator.jsonEventBadNamespace();
207 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
208 fail("Test should throw an exception here");
209 } catch (final ApexEventException e) {
210 assertTrue(e.getMessage().startsWith("Failed to unmarshal JSON event: field \"nameSpace\" "
211 + "with value \"hello.&&&&\" is invalid"));
215 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoExNamespace();
216 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
217 fail("Test should throw an exception here");
218 } catch (final ApexEventException e) {
219 assertTrue(e.getMessage()
220 .startsWith("Failed to unmarshal JSON event: namespace \"pie.in.the.sky\" "
221 + "on event \"Event0000\" does not"
222 + " match namespace \"org.onap.policy.apex.sample.events\" "
223 + "for that event in the Apex model"));
226 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoSource();
227 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
228 assertEquals("Outside", event.getSource());
231 apexEventJsonStringIn = JsonEventGenerator.jsonEventBadSource();
232 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
233 fail("Test should throw an exception here");
234 } catch (final ApexEventException e) {
235 assertTrue(e.getMessage().startsWith(
236 "Failed to unmarshal JSON event: field \"source\" with value \"%!@**@!\" is invalid"));
239 apexEventJsonStringIn = JsonEventGenerator.jsonEventNoTarget();
240 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
241 assertEquals("Match", event.getTarget());
244 apexEventJsonStringIn = JsonEventGenerator.jsonEventBadTarget();
245 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
246 fail("Test should throw an exception here");
247 } catch (final ApexEventException e) {
248 assertTrue(e.getMessage().startsWith("Failed to unmarshal JSON event: field \"target\" "
249 + "with value \"KNIO(*S)A(S)D\" is invalid"));
253 apexEventJsonStringIn = JsonEventGenerator.jsonEventMissingFields();
254 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
255 fail("Test should throw an exception here");
256 } catch (final ApexEventException e) {
257 assertTrue(e.getMessage().startsWith("Failed to unmarshal JSON event: error parsing Event0000:0.0.1 "
258 + "event from Json. Field \"TestMatchCase\" is missing, but is mandatory."));
261 apexEventJsonStringIn = JsonEventGenerator.jsonEventNullFields();
262 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
263 assertEquals(null, event.get("TestSlogan"));
264 assertEquals((byte) -1, event.get("TestMatchCase"));
265 assertEquals((long) -1, event.get("TestTimestamp"));
266 assertEquals(-1.0, event.get("TestTemperature"));
268 // Set the missing fields as optional in the model
269 final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get("Event0000");
270 eventDefinition.getParameterMap().get("TestSlogan").setOptional(true);
271 eventDefinition.getParameterMap().get("TestMatchCase").setOptional(true);
272 eventDefinition.getParameterMap().get("TestTimestamp").setOptional(true);
273 eventDefinition.getParameterMap().get("TestTemperature").setOptional(true);
275 apexEventJsonStringIn = JsonEventGenerator.jsonEventMissingFields();
276 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
277 assertEquals(null, event.get("TestSlogan"));
278 assertEquals(null, event.get("TestMatchCase"));
279 assertEquals(null, event.get("TestTimestamp"));
280 assertEquals(null, event.get("TestTemperature"));
281 } catch (final Exception e) {
283 throw new ApexException("Exception reading Apex event JSON file", e);
288 * Test apex event to JSON.
290 * @throws ApexException the apex exception
293 public void testApexEventToJson() throws ApexException {
295 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
296 jsonEventConverter.init(new JsonEventProtocolParameters());
297 assertNotNull(jsonEventConverter);
299 final Date event0000StartTime = new Date();
300 final Map<String, Object> event0000DataMap = new HashMap<String, Object>();
301 event0000DataMap.put("TestSlogan", "This is a test slogan");
302 event0000DataMap.put("TestMatchCase", 12345);
303 event0000DataMap.put("TestTimestamp", event0000StartTime.getTime());
304 event0000DataMap.put("TestTemperature", 34.5445667);
306 final ApexEvent apexEvent0000 = new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.sample.events",
308 apexEvent0000.putAll(event0000DataMap);
310 final String apexEvent0000JsonString = (String) jsonEventConverter.fromApexEvent(apexEvent0000);
312 logger.debug(apexEvent0000JsonString);
314 assertTrue(apexEvent0000JsonString.contains("\"name\": \"Event0000\""));
315 assertTrue(apexEvent0000JsonString.contains("\"version\": \"0.0.1\""));
316 assertTrue(apexEvent0000JsonString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
317 assertTrue(apexEvent0000JsonString.contains("\"source\": \"test\""));
318 assertTrue(apexEvent0000JsonString.contains("\"target\": \"apex\""));
319 assertTrue(apexEvent0000JsonString.contains("\"TestSlogan\": \"This is a test slogan\""));
320 assertTrue(apexEvent0000JsonString.contains("\"TestMatchCase\": 12345"));
321 assertTrue(apexEvent0000JsonString.contains("\"TestTimestamp\": " + event0000StartTime.getTime()));
322 assertTrue(apexEvent0000JsonString.contains("\"TestTemperature\": 34.5445667"));
324 final Date event0004StartTime = new Date(1434363272000L);
325 final Map<String, Object> event0004DataMap = new HashMap<String, Object>();
326 event0004DataMap.put("TestSlogan", "Test slogan for External Event");
327 event0004DataMap.put("TestMatchCase", new Integer(2));
328 event0004DataMap.put("TestTimestamp", new Long(event0004StartTime.getTime()));
329 event0004DataMap.put("TestTemperature", new Double(1064.43));
330 event0004DataMap.put("TestMatchCaseSelected", new Integer(2));
331 event0004DataMap.put("TestMatchStateTime", new Long(1434370506078L));
332 event0004DataMap.put("TestEstablishCaseSelected", new Integer(0));
333 event0004DataMap.put("TestEstablishStateTime", new Long(1434370506085L));
334 event0004DataMap.put("TestDecideCaseSelected", new Integer(3));
335 event0004DataMap.put("TestDecideStateTime", new Long(1434370506092L));
336 event0004DataMap.put("TestActCaseSelected", new Integer(2));
337 event0004DataMap.put("TestActStateTime", new Long(1434370506095L));
339 final ApexEvent apexEvent0004 = new ApexEvent("Event0004", "0.0.1", "org.onap.policy.apex.sample.events",
341 apexEvent0004.putAll(event0004DataMap);
343 final String apexEvent0004JsonString = (String) jsonEventConverter.fromApexEvent(apexEvent0004);
345 logger.debug(apexEvent0004JsonString);
347 assertTrue(apexEvent0004JsonString.contains("\"name\": \"Event0004\""));
348 assertTrue(apexEvent0004JsonString.contains("\"version\": \"0.0.1\""));
349 assertTrue(apexEvent0004JsonString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
350 assertTrue(apexEvent0004JsonString.contains("\"source\": \"test\""));
351 assertTrue(apexEvent0004JsonString.contains("\"target\": \"apex\""));
352 assertTrue(apexEvent0004JsonString.contains("\"TestSlogan\": \"Test slogan for External Event\""));
353 assertTrue(apexEvent0004JsonString.contains("1434370506078"));
354 assertTrue(apexEvent0004JsonString.contains("1064.43"));
355 } catch (final Exception e) {
357 throw new ApexException("Exception reading Apex event JSON file", e);