6e462a3e11c95bc27459045e7d4881ed0da5d85c
[policy/apex-pdp.git] /
1 /*-
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
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
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.
16  * 
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.apex.service.engine.event;
22
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;
27
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;
33 import java.util.Map;
34
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;
53
54 /**
55  * Test JSON Event Handler.
56  * 
57  * @author Liam Fallon (liam.fallon@ericsson.com)
58  */
59 public class TestJsonEventHandler {
60     private static final XLogger logger = XLoggerFactory.getXLogger(TestJsonEventHandler.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 = 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()));
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         try {
107             final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
108             assertNotNull(jsonEventConverter);
109             jsonEventConverter.init(new JsonEventProtocolParameters());
110
111             final String apexEventJsonStringIn = JsonEventGenerator.jsonEvent();
112
113             logger.debug("input event\n" + apexEventJsonStringIn);
114
115             final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn);
116             for (final ApexEvent apexEvent : apexEventList) {
117                 assertNotNull(apexEvent);
118
119                 logger.debug(apexEvent.toString());
120
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"));
127
128                 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
129                 assertTrue(testMatchCaseSelected == null);
130             }
131         } catch (final Exception e) {
132             e.printStackTrace();
133             throw new ApexException("Exception reading Apex event JSON file", e);
134         }
135     }
136
137     /**
138      * Test JSON to apex bad event.
139      *
140      * @throws ApexException the apex exception
141      */
142     @Test
143     public void testJsontoApexBadEvent() throws ApexException {
144         try {
145             final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
146             assertNotNull(jsonEventConverter);
147             jsonEventConverter.init(new JsonEventProtocolParameters());
148
149             String apexEventJsonStringIn = null;
150
151             try {
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));
158             }
159
160             try {
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"));
167             }
168
169             try {
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));
176             }
177
178             apexEventJsonStringIn = JsonEventGenerator.jsonEventNoVersion();
179             ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
180             assertEquals("0.0.1", event.getVersion());
181
182             try {
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"));
189             }
190
191             try {
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"));
199             }
200
201             apexEventJsonStringIn = JsonEventGenerator.jsonEventNoNamespace();
202             event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
203             assertEquals("org.onap.policy.apex.sample.events", event.getNameSpace());
204
205             try {
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"));
212             }
213
214             try {
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"));
224             }
225
226             apexEventJsonStringIn = JsonEventGenerator.jsonEventNoSource();
227             event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
228             assertEquals("Outside", event.getSource());
229
230             try {
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"));
237             }
238
239             apexEventJsonStringIn = JsonEventGenerator.jsonEventNoTarget();
240             event = jsonEventConverter.toApexEvent(null, apexEventJsonStringIn).get(0);
241             assertEquals("Match", event.getTarget());
242
243             try {
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"));
250             }
251
252             try {
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."));
259             }
260
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"));
267
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);
274
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) {
282             e.printStackTrace();
283             throw new ApexException("Exception reading Apex event JSON file", e);
284         }
285     }
286
287     /**
288      * Test apex event to JSON.
289      *
290      * @throws ApexException the apex exception
291      */
292     @Test
293     public void testApexEventToJson() throws ApexException {
294         try {
295             final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
296             jsonEventConverter.init(new JsonEventProtocolParameters());
297             assertNotNull(jsonEventConverter);
298
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);
305
306             final ApexEvent apexEvent0000 = new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.sample.events",
307                             "test", "apex");
308             apexEvent0000.putAll(event0000DataMap);
309
310             final String apexEvent0000JsonString = (String) jsonEventConverter.fromApexEvent(apexEvent0000);
311
312             logger.debug(apexEvent0000JsonString);
313
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"));
323
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));
338
339             final ApexEvent apexEvent0004 = new ApexEvent("Event0004", "0.0.1", "org.onap.policy.apex.sample.events",
340                             "test", "apex");
341             apexEvent0004.putAll(event0004DataMap);
342
343             final String apexEvent0004JsonString = (String) jsonEventConverter.fromApexEvent(apexEvent0004);
344
345             logger.debug(apexEvent0004JsonString);
346
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) {
356             e.printStackTrace();
357             throw new ApexException("Exception reading Apex event JSON file", e);
358         }
359     }
360 }