4f108922999e5f93d5f90fd69b18ae0396b36f29
[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  * @author Liam Fallon (liam.fallon@ericsson.com)
57  */
58 public class TestJSONEventHandler {
59     private static final XLogger logger = XLoggerFactory.getXLogger(TestJSONEventHandler.class);
60
61     @BeforeClass
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()));
67
68         // Set up the models in the model service
69         apexPolicyModel.register();
70     }
71
72     @BeforeClass
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);
78     }
79
80     @AfterClass
81     public static void teardownDefaultSchemaParameters() {
82         ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
83     }
84
85     @Test
86     public void testJSONtoApexEvent() throws ApexException {
87         try {
88             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
89             assertNotNull(jsonEventConverter);
90             jsonEventConverter.init(new JSONEventProtocolParameters());
91
92             final String apexEventJSONStringIn = JSONEventGenerator.jsonEvent();
93
94             logger.debug("input event\n" + apexEventJSONStringIn);
95
96             final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
97             for (final ApexEvent apexEvent : apexEventList) {
98                 assertNotNull(apexEvent);
99
100                 logger.debug(apexEvent.toString());
101
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"));
108
109                 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
110                 assertTrue(testMatchCaseSelected == null);
111             }
112         } catch (final Exception e) {
113             e.printStackTrace();
114             throw new ApexException("Exception reading Apex event JSON file", e);
115         }
116     }
117
118     @Test
119     public void testJSONtoApexBadEvent() throws ApexException {
120         try {
121             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
122             assertNotNull(jsonEventConverter);
123             jsonEventConverter.init(new JSONEventProtocolParameters());
124
125             String apexEventJSONStringIn = null;
126
127             try {
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));
134             }
135
136             try {
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"));
143             }
144
145             try {
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));
152             }
153
154             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoVersion();
155             ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
156             assertEquals("0.0.1", event.getVersion());
157
158             try {
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"));
165             }
166
167             try {
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"));
175             }
176
177             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoNamespace();
178             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
179             assertEquals("org.onap.policy.apex.sample.events", event.getNameSpace());
180
181             try {
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"));
188             }
189
190             try {
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"));
198             }
199
200             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoSource();
201             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
202             assertEquals("Outside", event.getSource());
203
204             try {
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"));
211             }
212
213             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoTarget();
214             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
215             assertEquals("Match", event.getTarget());
216
217             try {
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"));
224             }
225
226             try {
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."));
233             }
234
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);
241
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);
248
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) {
256             e.printStackTrace();
257             throw new ApexException("Exception reading Apex event JSON file", e);
258         }
259     }
260
261     @Test
262     public void testApexEventToJSON() throws ApexException {
263         try {
264             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
265             assertNotNull(jsonEventConverter);
266
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);
273
274             final ApexEvent apexEvent0000 =
275                     new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
276             apexEvent0000.putAll(event0000DataMap);
277
278             final String apexEvent0000JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0000);
279
280             logger.debug(apexEvent0000JSONString);
281
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"));
291
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));
306
307             final ApexEvent apexEvent0004 =
308                     new ApexEvent("Event0004", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
309             apexEvent0004.putAll(event0004DataMap);
310
311             final String apexEvent0004JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0004);
312
313             logger.debug(apexEvent0004JSONString);
314
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) {
324             e.printStackTrace();
325             throw new ApexException("Exception reading Apex event JSON file", e);
326         }
327     }
328 }