a724b6da2dd030ce3c213b6cead5ca35173da948
[policy/apex-pdp.git] /
1 /*-
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.apex.service.engine.event;
24
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;
30
31 import java.io.ByteArrayInputStream;
32 import java.io.IOException;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Map;
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;
55
56 /**
57  * Test JSON Event Handler.
58  *
59  * @author Liam Fallon (liam.fallon@ericsson.com)
60  */
61 public class JsonEventHandlerTest {
62     private static final XLogger logger = XLoggerFactory.getXLogger(JsonEventHandlerTest.class);
63
64     /**
65      * Setup event model.
66      *
67      * @throws IOException Signals that an I/O exception has occurred.
68      * @throws ApexModelException the apex model exception
69      */
70     @BeforeClass
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()));
76
77         // Set up the models in the model service
78         apexPolicyModel.register();
79     }
80
81     /**
82      * Initialize default schema parameters.
83      */
84     @BeforeClass
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);
90     }
91
92     /**
93      * Teardown default schema parameters.
94      */
95     @AfterClass
96     public static void teardownDefaultSchemaParameters() {
97         ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
98         ModelService.clear();
99     }
100
101     /**
102      * Test JSON to apex event.
103      *
104      * @throws ApexException the apex exception
105      */
106     @Test
107     public void testJsontoApexEvent() throws ApexException {
108         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
109         assertNotNull(jsonEventConverter);
110         jsonEventConverter.init(new JsonEventProtocolParameters());
111
112         final String apexEventJsonStringIn = SupportJsonEventGenerator.jsonEvent();
113
114         logger.debug("input event\n" + apexEventJsonStringIn);
115
116         final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
117         for (final ApexEvent apexEvent : apexEventList) {
118             assertNotNull(apexEvent);
119
120             logger.debug(apexEvent.toString());
121
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);
130         }
131
132     }
133
134     /**
135      * Test JSON to apex bad event.
136      *
137      * @throws ApexException the apex exception
138      */
139     @SuppressWarnings("deprecation")
140     @Test
141     public void testJsontoApexBadEvent() throws ApexException {
142         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
143         assertNotNull(jsonEventConverter);
144         jsonEventConverter.init(new JsonEventProtocolParameters());
145
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());
184
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());
202
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());
212
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"));
230
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);
234
235         apexEventJsonStringIn1 = SupportJsonEventGenerator.jsonEventMissingFields();
236         event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn1).get(0);
237         assertEquals(null, event.get("TestSlogan"));
238         assertEquals(null, event.get("intPar"));
239     }
240
241     /**
242      * Test apex event to JSON.
243      *
244      * @throws ApexException the apex exception
245      */
246     @Test
247     public void testApexEventToJson() throws ApexException {
248         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
249         jsonEventConverter.init(new JsonEventProtocolParameters());
250         assertNotNull(jsonEventConverter);
251
252         final Map<String, Object> basicEventMap = new HashMap<String, Object>();
253         basicEventMap.put("intPar", 12345);
254
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);
259
260         final String apexEvent0000JsonString = (String) jsonEventConverter.fromApexEvent(basicEvent);
261
262         logger.debug(apexEvent0000JsonString);
263
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\""));
271     }
272 }