Replace try/catch with assertj
[policy/apex-pdp.git] / services / services-engine / src / test / java / org / onap / policy / apex / service / engine / event / JsonEventHandlerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.apex.service.engine.event;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertTrue;
29
30 import java.io.ByteArrayInputStream;
31 import java.io.IOException;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Map;
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.service.engine.event.impl.jsonprotocolplugin.Apex2JsonEventConverter;
48 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.JsonEventProtocolParameters;
49 import org.onap.policy.common.parameters.ParameterService;
50 import org.onap.policy.common.utils.resources.TextFileUtils;
51 import org.slf4j.ext.XLogger;
52 import org.slf4j.ext.XLoggerFactory;
53
54 /**
55  * Test JSON Event Handler.
56  *
57  * @author Liam Fallon (liam.fallon@ericsson.com)
58  */
59 public class JsonEventHandlerTest {
60     private static final XLogger logger = XLoggerFactory.getXLogger(JsonEventHandlerTest.class);
61
62     /**
63      * Setup event model.
64      *
65      * @throws IOException Signals that an I/O exception has occurred.
66      * @throws ApexModelException the apex model exception
67      */
68     @BeforeClass
69     public static void setupEventModel() throws IOException, ApexModelException {
70         final String policyModelString =
71                 TextFileUtils.getTextFileAsString("src/test/resources/policymodels/SmallModel.json");
72         final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
73         final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
74
75         // Set up the models in the model service
76         apexPolicyModel.register();
77     }
78
79     /**
80      * Initialize default schema parameters.
81      */
82     @BeforeClass
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);
88     }
89
90     /**
91      * Teardown default schema parameters.
92      */
93     @AfterClass
94     public static void teardownDefaultSchemaParameters() {
95         ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
96         ModelService.clear();
97     }
98
99     /**
100      * Test JSON to apex event.
101      *
102      * @throws ApexException the apex exception
103      */
104     @Test
105     public void testJsontoApexEvent() throws ApexException {
106         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
107         assertNotNull(jsonEventConverter);
108         jsonEventConverter.init(new JsonEventProtocolParameters());
109
110         final String apexEventJsonStringIn = SupportJsonEventGenerator.jsonEvent();
111
112         logger.debug("input event\n" + apexEventJsonStringIn);
113
114         final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
115         for (final ApexEvent apexEvent : apexEventList) {
116             assertNotNull(apexEvent);
117
118             logger.debug(apexEvent.toString());
119
120             assertEquals("BasicEvent", apexEvent.getName());
121             assertEquals("0.0.1", apexEvent.getVersion());
122             assertEquals("org.onap.policy.apex.events", apexEvent.getNameSpace());
123             assertEquals("test", apexEvent.getSource());
124             assertEquals("apex", apexEvent.getTarget());
125             assertEquals(12345, apexEvent.get("intPar"));
126             final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
127             assertNull(testMatchCaseSelected);
128         }
129
130     }
131
132     /**
133      * Test JSON to apex bad event.
134      *
135      * @throws ApexException the apex exception
136      */
137     @Test
138     public void testJsontoApexBadEvent() throws ApexException {
139         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
140         assertNotNull(jsonEventConverter);
141         jsonEventConverter.init(new JsonEventProtocolParameters());
142
143         assertThatThrownBy(() -> {
144             String apexEventJsonStringIn = null;
145             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoName();
146             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
147         }).hasMessageContaining("Failed to unmarshal JSON event: event received without "
148                 + "mandatory parameter \"name\" ");
149         assertThatThrownBy(() -> {
150             String apexEventJsonStringIn = null;
151             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadName();
152             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
153         }).hasMessageContaining("Failed to unmarshal JSON event: field \"name\" with value \"%%%%\" is invalid");
154         assertThatThrownBy(() -> {
155             String apexEventJsonStringIn = null;
156             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExName();
157             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
158         }).hasMessageContaining("Failed to unmarshal JSON event: an event definition for an event named \"I_DONT_EXI");
159         String apexEventJsonStringIn1 = null;
160         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoVersion();
161         ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
162         assertEquals("0.0.1", event.getVersion());
163         assertThatThrownBy(() -> {
164             String apexEventJsonStringIn = null;
165             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadVersion();
166             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
167         }).hasMessageContaining("Failed to unmarshal JSON event: field \"version\" with value \"#####\" is invalid");
168         assertThatThrownBy(() -> {
169             String apexEventJsonStringIn = null;
170             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExVersion();
171             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
172         }).hasMessageContaining("Failed to unmarshal JSON event: an event definition for an event named "
173                 + "\"BasicEvent\" with version \"1.2.3\" not found in Apex model");
174         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoNamespace();
175         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
176         assertEquals("org.onap.policy.apex.events", event.getNameSpace());
177
178         assertThatThrownBy(() -> {
179             String apexEventJsonStringIn = null;
180             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadNamespace();
181             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
182         }).hasMessageContaining("Failed to unmarshal JSON event: " + "field \"nameSpace\" with value \"hello.&&&&\" "
183                 + "is invalid");
184         assertThatThrownBy(() -> {
185             String apexEventJsonStringIn = null;
186             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventNoExNamespace();
187             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
188         }).hasMessageContaining("Failed to unmarshal JSON event: namespace \"pie.in.the.sky\" "
189                 + "on event \"BasicEvent\" does not" + " match namespace \"org.onap.policy.apex.events\" "
190                 + "for that event in the Apex model");
191         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoSource();
192         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
193         assertEquals("source", event.getSource());
194
195         assertThatThrownBy(() -> {
196             String apexEventJsonStringIn = null;
197             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadSource();
198             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
199         }).hasMessageContaining("Failed to unmarshal JSON event: field \"source\" with value \"%!@**@!\" is invalid");
200         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNoTarget();
201         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
202         assertEquals("target", event.getTarget());
203
204         assertThatThrownBy(() -> {
205             String apexEventJsonStringIn = null;
206             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventBadTarget();
207             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
208         }).hasMessageContaining("Failed to unmarshal JSON event: field \"target\" with value \"KNIO(*S)A(S)D\" "
209                 + "is invalid");
210         assertThatThrownBy(() -> {
211             String apexEventJsonStringIn = null;
212             apexEventJsonStringIn = SupportJsonEventGenerator.jsonEventMissingFields();
213             jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
214         }).hasMessageContaining("Failed to unmarshal JSON event: error parsing BasicEvent:0.0.1 "
215                + "event from Json. Field \"intPar\" is missing, but is mandatory.");
216         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventNullFields();
217         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
218         assertEquals(null, event.get("TestSlogan"));
219         assertEquals(-1, event.get("intPar"));
220
221         // Set the missing fields as optional in the model
222         final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get("BasicEvent");
223         eventDefinition.getParameterMap().get("intPar").setOptional(true);
224
225         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventMissingFields();
226         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
227         assertEquals(null, event.get("TestSlogan"));
228         assertEquals(null, event.get("intPar"));
229     }
230
231     /**
232      * Test apex event to JSON.
233      *
234      * @throws ApexException the apex exception
235      */
236     @Test
237     public void testApexEventToJson() throws ApexException {
238         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
239         jsonEventConverter.init(new JsonEventProtocolParameters());
240         assertNotNull(jsonEventConverter);
241
242         final Map<String, Object> basicEventMap = new HashMap<String, Object>();
243         basicEventMap.put("intPar", 12345);
244
245         final ApexEvent basicEvent =
246                new ApexEvent("BasicEvent", "0.0.1", "org.onap.policy.apex.events", "test", "apex");
247         basicEvent.putAll(basicEventMap);
248
249         final String apexEvent0000JsonString = (String) jsonEventConverter.fromApexEvent(basicEvent);
250
251         logger.debug(apexEvent0000JsonString);
252
253         assertTrue(apexEvent0000JsonString.contains("\"name\": \"BasicEvent\""));
254         assertTrue(apexEvent0000JsonString.contains("\"version\": \"0.0.1\""));
255         assertTrue(apexEvent0000JsonString.contains("\"nameSpace\": \"org.onap.policy.apex.events\""));
256         assertTrue(apexEvent0000JsonString.contains("\"source\": \"test\""));
257         assertTrue(apexEvent0000JsonString.contains("\"target\": \"apex\""));
258         assertTrue(apexEvent0000JsonString.contains("\"intPar\": 12345"));
259     }
260 }