2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2016-2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2020,2023 Nordix Foundation.
5 * Modifications Copyright (C) 2022 Bell Canada. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.apex.service.engine.event;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
31 import java.io.ByteArrayInputStream;
32 import java.io.IOException;
33 import java.util.HashMap;
34 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.parameters.ContextParameterConstants;
40 import org.onap.policy.apex.context.parameters.SchemaParameters;
41 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
42 import org.onap.policy.apex.model.basicmodel.concepts.AxToscaPolicyProcessingStatus;
43 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
44 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
45 import org.onap.policy.apex.model.basicmodel.service.ModelService;
46 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
47 import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
48 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
49 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.Apex2JsonEventConverter;
50 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.JsonEventProtocolParameters;
51 import org.onap.policy.common.parameters.ParameterService;
52 import org.onap.policy.common.utils.resources.TextFileUtils;
53 import org.slf4j.ext.XLogger;
54 import org.slf4j.ext.XLoggerFactory;
57 * Test JSON Event Handler.
59 * @author Liam Fallon (liam.fallon@ericsson.com)
61 public class JsonEventHandlerTest {
62 private static final XLogger logger = XLoggerFactory.getXLogger(JsonEventHandlerTest.class);
67 * @throws IOException Signals that an I/O exception has occurred.
68 * @throws ApexModelException the apex model exception
71 public static void setupEventModel() throws IOException, ApexModelException {
72 final String policyModelString =
73 TextFileUtils.getTextFileAsString("src/test/resources/policymodels/SmallModel.json");
74 final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
75 final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
77 // Set up the models in the model service
78 apexPolicyModel.register();
82 * Initialize default schema parameters.
85 public static void initializeDefaultSchemaParameters() {
86 ParameterService.clear();
87 final SchemaParameters schemaParameters = new SchemaParameters();
88 schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
89 ParameterService.register(schemaParameters);
93 * Teardown default schema parameters.
96 public static void teardownDefaultSchemaParameters() {
97 ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
102 * Test JSON to apex event.
104 * @throws ApexException the apex exception
107 public void testJsontoApexEvent() throws ApexException {
108 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
109 assertNotNull(jsonEventConverter);
110 jsonEventConverter.init(new JsonEventProtocolParameters());
112 final String apexEventJsonStringIn = SupportJsonEventGenerator.jsonEvent();
114 logger.debug("input event\n" + apexEventJsonStringIn);
116 final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
117 for (final ApexEvent apexEvent : apexEventList) {
118 assertNotNull(apexEvent);
120 logger.debug(apexEvent.toString());
122 assertEquals("BasicEvent", apexEvent.getName());
123 assertEquals("0.0.1", apexEvent.getVersion());
124 assertEquals("org.onap.policy.apex.events", apexEvent.getNameSpace());
125 assertEquals("test", apexEvent.getSource());
126 assertEquals("apex", apexEvent.getTarget());
127 assertEquals(12345, apexEvent.get("intPar"));
128 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
129 assertNull(testMatchCaseSelected);
135 * Test JSON to apex bad event.
137 * @throws ApexException the apex exception
139 @SuppressWarnings("deprecation")
141 public void testJsontoApexBadEvent() throws ApexException {
142 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
143 assertNotNull(jsonEventConverter);
144 jsonEventConverter.init(new JsonEventProtocolParameters());
146 assertThatThrownBy(() -> {
147 String apexEventJsonStringIn = null;
148 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoName();
149 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
150 }).hasMessageStartingWith("Failed to unmarshal JSON event")
151 .getCause().hasMessageStartingWith("event received without mandatory parameter \"name\" ");
152 assertThatThrownBy(() -> {
153 String apexEventJsonStringIn = null;
154 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadName();
155 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
156 }).hasMessageStartingWith("Failed to unmarshal JSON event")
157 .getCause().hasMessageStartingWith("field \"name\" with value \"%%%%\" is invalid");
158 assertThatThrownBy(() -> {
159 String apexEventJsonStringIn = null;
160 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExName();
161 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
162 }).hasMessageStartingWith("Failed to unmarshal JSON event")
163 .getCause().hasMessageStartingWith("an event definition for an event named \"I_DONT_EXI");
164 String apexEventJsonStringIn1 = null;
165 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoVersion();
166 ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
167 assertEquals("0.0.1", event.getVersion());
168 assertThatThrownBy(() -> {
169 String apexEventJsonStringIn = null;
170 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadVersion();
171 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
172 }).hasMessageStartingWith("Failed to unmarshal JSON event")
173 .getCause().hasMessageStartingWith("field \"version\" with value \"#####\" is invalid");
174 assertThatThrownBy(() -> {
175 String apexEventJsonStringIn = null;
176 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExVersion();
177 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
178 }).hasMessageStartingWith("Failed to unmarshal JSON event")
179 .getCause().hasMessageStartingWith("an event definition for an event named "
180 + "\"BasicEvent\" with version \"1.2.3\" not found in Apex model");
181 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoNamespace();
182 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
183 assertEquals("org.onap.policy.apex.events", event.getNameSpace());
185 assertThatThrownBy(() -> {
186 String apexEventJsonStringIn = null;
187 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadNamespace();
188 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
189 }).hasMessageStartingWith("Failed to unmarshal JSON event")
190 .getCause().hasMessageStartingWith("field \"nameSpace\" with value \"hello.&&&&\" is invalid");
191 assertThatThrownBy(() -> {
192 String apexEventJsonStringIn = null;
193 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExNamespace();
194 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
195 }).hasMessageStartingWith("Failed to unmarshal JSON event")
196 .getCause().hasMessageStartingWith("namespace \"pie.in.the.sky\" "
197 + "on event \"BasicEvent\" does not" + " match namespace \"org.onap.policy.apex.events\" "
198 + "for that event in the Apex model");
199 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoSource();
200 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
201 assertEquals("source", event.getSource());
203 assertThatThrownBy(() -> {
204 String apexEventJsonStringIn = null;
205 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadSource();
206 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
207 }).hasMessageStartingWith("Failed to unmarshal JSON event")
208 .getCause().hasMessageStartingWith("field \"source\" with value \"%!@**@!\" is invalid");
209 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoTarget();
210 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
211 assertEquals("target", event.getTarget());
213 assertThatThrownBy(() -> {
214 String apexEventJsonStringIn = null;
215 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadTarget();
216 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
217 }).hasMessageStartingWith("Failed to unmarshal JSON event")
218 .getCause().hasMessageStartingWith("field \"target\" with value \"KNIO(*S)A(S)D\" is invalid");
219 assertThatThrownBy(() -> {
220 String apexEventJsonStringIn = null;
221 apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventMissingFields();
222 jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
223 }).hasMessageStartingWith("Failed to unmarshal JSON event")
224 .getCause().hasMessageStartingWith("error parsing BasicEvent:0.0.1 "
225 + "event from Json. Field \"intPar\" is missing, but is mandatory.");
226 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNullFields();
227 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
228 assertEquals(null, event.get("TestSlogan"));
229 assertEquals(-1, event.get("intPar"));
231 // Set the missing fields as optional in the model
232 final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get("BasicEvent");
233 eventDefinition.getParameterMap().get("intPar").setOptional(true);
235 apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventMissingFields();
236 event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
237 assertEquals(null, event.get("TestSlogan"));
238 assertEquals(null, event.get("intPar"));
242 * Test apex event to JSON.
244 * @throws ApexException the apex exception
247 public void testApexEventToJson() throws ApexException {
248 final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
249 jsonEventConverter.init(new JsonEventProtocolParameters());
250 assertNotNull(jsonEventConverter);
252 final Map<String, Object> basicEventMap = new HashMap<String, Object>();
253 basicEventMap.put("intPar", 12345);
255 final ApexEvent basicEvent =
256 new ApexEvent("BasicEvent", "0.0.1", "org.onap.policy.apex.events", "test", "apex",
257 AxToscaPolicyProcessingStatus.ENTRY.name());
258 basicEvent.putAll(basicEventMap);
260 final String apexEvent0000JsonString = (String) jsonEventConverter.fromApexEvent(basicEvent);
262 logger.debug(apexEvent0000JsonString);
264 assertTrue(apexEvent0000JsonString.contains("\"name\": \"BasicEvent\""));
265 assertTrue(apexEvent0000JsonString.contains("\"version\": \"0.0.1\""));
266 assertTrue(apexEvent0000JsonString.contains("\"nameSpace\": \"org.onap.policy.apex.events\""));
267 assertTrue(apexEvent0000JsonString.contains("\"source\": \"test\""));
268 assertTrue(apexEvent0000JsonString.contains("\"target\": \"apex\""));
269 assertTrue(apexEvent0000JsonString.contains("\"intPar\": 12345"));
270 assertTrue(apexEvent0000JsonString.contains("\"toscaPolicyState\": \"ENTRY\""));