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.
56 * @author Liam Fallon (liam.fallon@ericsson.com)
58 public class TestJSONEventHandler {
59 private static final XLogger logger = XLoggerFactory.getXLogger(TestJSONEventHandler.class);
62 public static void setupEventModel() throws IOException, ApexModelException {
63 final String policyModelString =
64 TextFileUtils.getTextFileAsString("src/test/resources/policymodels/SamplePolicyModelMVEL.json");
65 final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
66 final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
68 // Set up the models in the model service
69 apexPolicyModel.register();
73 public static void initializeDefaultSchemaParameters() {
74 ParameterService.clear();
75 final SchemaParameters schemaParameters = new SchemaParameters();
76 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
77 ParameterService.register(schemaParameters);
81 public static void teardownDefaultSchemaParameters() {
82 ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
86 public void testJSONtoApexEvent() throws ApexException {
88 final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
89 assertNotNull(jsonEventConverter);
90 jsonEventConverter.init(new JSONEventProtocolParameters());
92 final String apexEventJSONStringIn = JSONEventGenerator.jsonEvent();
94 logger.debug("input event\n" + apexEventJSONStringIn);
96 final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
97 for (final ApexEvent apexEvent : apexEventList) {
98 assertNotNull(apexEvent);
100 logger.debug(apexEvent.toString());
102 assertTrue(apexEvent.getName().equals("Event0000") || apexEvent.getName().equals("Event0100"));
103 assertTrue(apexEvent.getVersion().equals("0.0.1"));
104 assertTrue(apexEvent.getNameSpace().equals("org.onap.policy.apex.sample.events"));
105 assertTrue(apexEvent.getSource().equals("test"));
106 assertTrue(apexEvent.getTarget().equals("apex"));
107 assertTrue(apexEvent.get("TestSlogan").toString().startsWith("Test slogan for External Event"));
109 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
110 assertTrue(testMatchCaseSelected == null);
112 } catch (final Exception e) {
114 throw new ApexException("Exception reading Apex event JSON file", e);
119 public void testJSONtoApexBadEvent() throws ApexException {
121 final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
122 assertNotNull(jsonEventConverter);
123 jsonEventConverter.init(new JSONEventProtocolParameters());
125 String apexEventJSONStringIn = null;
128 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoName();
129 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
130 fail("Test should throw an exception here");
131 } catch (final ApexEventException e) {
132 assertEquals("Failed to unmarshal JSON event: event received without mandatory parameter \"name\" ",
133 e.getMessage().substring(0, 82));
137 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadName();
138 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
139 fail("Test should throw an exception here");
140 } catch (final ApexEventException e) {
141 assertTrue(e.getMessage()
142 .startsWith("Failed to unmarshal JSON event: field \"name\" with value \"%%%%\" is invalid"));
146 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExName();
147 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
148 fail("Test should throw an exception here");
149 } catch (final ApexEventException e) {
150 assertEquals("Failed to unmarshal JSON event: an event definition for an event named \"I_DONT_EXI",
151 e.getMessage().substring(0, 82));
154 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoVersion();
155 ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
156 assertEquals("0.0.1", event.getVersion());
159 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadVersion();
160 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
161 fail("Test should throw an exception here");
162 } catch (final ApexEventException e) {
163 assertTrue(e.getMessage().startsWith(
164 "Failed to unmarshal JSON event: field \"version\" with value \"#####\" is invalid"));
168 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExVersion();
169 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
170 fail("Test should throw an exception here");
171 } catch (final ApexEventException e) {
172 assertTrue(e.getMessage().startsWith(
173 "Failed to unmarshal JSON event: an event definition for an event named "
174 + "\"Event0000\" with version \"1.2.3\" not found in Apex model"));
177 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoNamespace();
178 event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
179 assertEquals("org.onap.policy.apex.sample.events", event.getNameSpace());
182 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadNamespace();
183 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
184 fail("Test should throw an exception here");
185 } catch (final ApexEventException e) {
186 assertTrue(e.getMessage().startsWith(
187 "Failed to unmarshal JSON event: field \"nameSpace\" with value \"hello.&&&&\" is invalid"));
191 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExNamespace();
192 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
193 fail("Test should throw an exception here");
194 } catch (final ApexEventException e) {
195 assertTrue(e.getMessage().startsWith(
196 "Failed to unmarshal JSON event: namespace \"pie.in.the.sky\" on event \"Event0000\" does not"
197 + " match namespace \"org.onap.policy.apex.sample.events\" for that event in the Apex model"));
200 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoSource();
201 event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
202 assertEquals("Outside", event.getSource());
205 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadSource();
206 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
207 fail("Test should throw an exception here");
208 } catch (final ApexEventException e) {
209 assertTrue(e.getMessage().startsWith(
210 "Failed to unmarshal JSON event: field \"source\" with value \"%!@**@!\" is invalid"));
213 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoTarget();
214 event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
215 assertEquals("Match", event.getTarget());
218 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadTarget();
219 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
220 fail("Test should throw an exception here");
221 } catch (final ApexEventException e) {
222 assertTrue(e.getMessage().startsWith(
223 "Failed to unmarshal JSON event: field \"target\" with value \"KNIO(*S)A(S)D\" is invalid"));
227 apexEventJSONStringIn = JSONEventGenerator.jsonEventMissingFields();
228 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
229 fail("Test should throw an exception here");
230 } catch (final ApexEventException e) {
231 assertTrue(e.getMessage().startsWith("Failed to unmarshal JSON event: error parsing Event0000:0.0.1 "
232 + "event from Json. Field \"TestMatchCase\" is missing, but is mandatory."));
235 apexEventJSONStringIn = JSONEventGenerator.jsonEventNullFields();
236 event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
237 assertEquals(event.get("TestSlogan"), null);
238 assertEquals(event.get("TestMatchCase"), (byte) -1);
239 assertEquals(event.get("TestTimestamp"), (long) -1);
240 assertEquals(event.get("TestTemperature"), -1.0);
242 // Set the missing fields as optional in the model
243 final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get("Event0000");
244 eventDefinition.getParameterMap().get("TestSlogan").setOptional(true);
245 eventDefinition.getParameterMap().get("TestMatchCase").setOptional(true);
246 eventDefinition.getParameterMap().get("TestTimestamp").setOptional(true);
247 eventDefinition.getParameterMap().get("TestTemperature").setOptional(true);
249 apexEventJSONStringIn = JSONEventGenerator.jsonEventMissingFields();
250 event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
251 assertEquals(null, event.get("TestSlogan"));
252 assertEquals(null, event.get("TestMatchCase"));
253 assertEquals(null, event.get("TestTimestamp"));
254 assertEquals(null, event.get("TestTemperature"));
255 } catch (final Exception e) {
257 throw new ApexException("Exception reading Apex event JSON file", e);
262 public void testApexEventToJSON() throws ApexException {
264 final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
265 assertNotNull(jsonEventConverter);
267 final Date event0000StartTime = new Date();
268 final Map<String, Object> event0000DataMap = new HashMap<String, Object>();
269 event0000DataMap.put("TestSlogan", "This is a test slogan");
270 event0000DataMap.put("TestMatchCase", 12345);
271 event0000DataMap.put("TestTimestamp", event0000StartTime.getTime());
272 event0000DataMap.put("TestTemperature", 34.5445667);
274 final ApexEvent apexEvent0000 =
275 new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
276 apexEvent0000.putAll(event0000DataMap);
278 final String apexEvent0000JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0000);
280 logger.debug(apexEvent0000JSONString);
282 assertTrue(apexEvent0000JSONString.contains("\"name\": \"Event0000\""));
283 assertTrue(apexEvent0000JSONString.contains("\"version\": \"0.0.1\""));
284 assertTrue(apexEvent0000JSONString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
285 assertTrue(apexEvent0000JSONString.contains("\"source\": \"test\""));
286 assertTrue(apexEvent0000JSONString.contains("\"target\": \"apex\""));
287 assertTrue(apexEvent0000JSONString.contains("\"TestSlogan\": \"This is a test slogan\""));
288 assertTrue(apexEvent0000JSONString.contains("\"TestMatchCase\": 12345"));
289 assertTrue(apexEvent0000JSONString.contains("\"TestTimestamp\": " + event0000StartTime.getTime()));
290 assertTrue(apexEvent0000JSONString.contains("\"TestTemperature\": 34.5445667"));
292 final Date event0004StartTime = new Date(1434363272000L);
293 final Map<String, Object> event0004DataMap = new HashMap<String, Object>();
294 event0004DataMap.put("TestSlogan", "Test slogan for External Event");
295 event0004DataMap.put("TestMatchCase", new Integer(2));
296 event0004DataMap.put("TestTimestamp", new Long(event0004StartTime.getTime()));
297 event0004DataMap.put("TestTemperature", new Double(1064.43));
298 event0004DataMap.put("TestMatchCaseSelected", new Integer(2));
299 event0004DataMap.put("TestMatchStateTime", new Long(1434370506078L));
300 event0004DataMap.put("TestEstablishCaseSelected", new Integer(0));
301 event0004DataMap.put("TestEstablishStateTime", new Long(1434370506085L));
302 event0004DataMap.put("TestDecideCaseSelected", new Integer(3));
303 event0004DataMap.put("TestDecideStateTime", new Long(1434370506092L));
304 event0004DataMap.put("TestActCaseSelected", new Integer(2));
305 event0004DataMap.put("TestActStateTime", new Long(1434370506095L));
307 final ApexEvent apexEvent0004 =
308 new ApexEvent("Event0004", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
309 apexEvent0004.putAll(event0004DataMap);
311 final String apexEvent0004JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0004);
313 logger.debug(apexEvent0004JSONString);
315 assertTrue(apexEvent0004JSONString.contains("\"name\": \"Event0004\""));
316 assertTrue(apexEvent0004JSONString.contains("\"version\": \"0.0.1\""));
317 assertTrue(apexEvent0004JSONString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
318 assertTrue(apexEvent0004JSONString.contains("\"source\": \"test\""));
319 assertTrue(apexEvent0004JSONString.contains("\"target\": \"apex\""));
320 assertTrue(apexEvent0004JSONString.contains("\"TestSlogan\": \"Test slogan for External Event\""));
321 assertTrue(apexEvent0004JSONString.contains("1434370506078"));
322 assertTrue(apexEvent0004JSONString.contains("1064.43"));
323 } catch (final Exception e) {
325 throw new ApexException("Exception reading Apex event JSON file", e);