decec767f61f02a2228424487c824993601bfd15
[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.Before;
36 import org.junit.BeforeClass;
37 import org.junit.Test;
38 import org.onap.policy.apex.context.parameters.SchemaParameters;
39 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
40 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
41 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
42 import org.onap.policy.apex.model.basicmodel.service.ModelService;
43 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
44 import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
45 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
46 import org.onap.policy.apex.model.utilities.TextFileUtils;
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.slf4j.ext.XLogger;
50 import org.slf4j.ext.XLoggerFactory;
51
52 /**
53  * Test JSON Event Handler.
54  * @author Liam Fallon (liam.fallon@ericsson.com)
55  */
56 public class TestJSONEventHandler {
57     private static final XLogger logger = XLoggerFactory.getXLogger(TestJSONEventHandler.class);
58
59     @BeforeClass
60     public static void setupEventModel() throws IOException, ApexModelException {
61         final String policyModelString =
62                 TextFileUtils.getTextFileAsString("src/test/resources/policymodels/SamplePolicyModelMVEL.json");
63         final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
64         final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
65
66         // Set up the models in the model service
67         apexPolicyModel.register();
68     }
69
70     @Before
71     public void initializeDefaultSchemaParameters() {
72         new SchemaParameters();
73     }
74
75     @Test
76     public void testJSONtoApexEvent() throws ApexException {
77         try {
78             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
79             assertNotNull(jsonEventConverter);
80             jsonEventConverter.init(new JSONEventProtocolParameters());
81
82             final String apexEventJSONStringIn = JSONEventGenerator.jsonEvent();
83
84             logger.debug("input event\n" + apexEventJSONStringIn);
85
86             final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
87             for (final ApexEvent apexEvent : apexEventList) {
88                 assertNotNull(apexEvent);
89
90                 logger.debug(apexEvent.toString());
91
92                 assertTrue(apexEvent.getName().equals("Event0000") || apexEvent.getName().equals("Event0100"));
93                 assertTrue(apexEvent.getVersion().equals("0.0.1"));
94                 assertTrue(apexEvent.getNameSpace().equals("org.onap.policy.apex.sample.events"));
95                 assertTrue(apexEvent.getSource().equals("test"));
96                 assertTrue(apexEvent.getTarget().equals("apex"));
97                 assertTrue(apexEvent.get("TestSlogan").toString().startsWith("Test slogan for External Event"));
98
99                 final Object testMatchCaseSelected = apexEvent.get("TestMatchCaseSelected");
100                 assertTrue(testMatchCaseSelected == null);
101             }
102         } catch (final Exception e) {
103             e.printStackTrace();
104             throw new ApexException("Exception reading Apex event JSON file", e);
105         }
106     }
107
108     @Test
109     public void testJSONtoApexBadEvent() throws ApexException {
110         try {
111             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
112             assertNotNull(jsonEventConverter);
113             jsonEventConverter.init(new JSONEventProtocolParameters());
114
115             String apexEventJSONStringIn = null;
116
117             try {
118                 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoName();
119                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
120                 fail("Test should throw an exception here");
121             } catch (final ApexEventException e) {
122                 assertEquals("Failed to unmarshal JSON event: event received without mandatory parameter \"name\" ",
123                         e.getMessage().substring(0, 82));
124             }
125
126             try {
127                 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadName();
128                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
129                 fail("Test should throw an exception here");
130             } catch (final ApexEventException e) {
131                 assertTrue(e.getMessage()
132                         .startsWith("Failed to unmarshal JSON event: field \"name\" with value \"%%%%\" is invalid"));
133             }
134
135             try {
136                 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExName();
137                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
138                 fail("Test should throw an exception here");
139             } catch (final ApexEventException e) {
140                 assertEquals("Failed to unmarshal JSON event: an event definition for an event named \"I_DONT_EXI",
141                         e.getMessage().substring(0, 82));
142             }
143
144             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoVersion();
145             ApexEvent event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
146             assertEquals("0.0.1", event.getVersion());
147
148             try {
149                 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadVersion();
150                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
151                 fail("Test should throw an exception here");
152             } catch (final ApexEventException e) {
153                 assertTrue(e.getMessage().startsWith(
154                         "Failed to unmarshal JSON event: field \"version\" with value \"#####\" is invalid"));
155             }
156
157             try {
158                 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExVersion();
159                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
160                 fail("Test should throw an exception here");
161             } catch (final ApexEventException e) {
162                 assertTrue(e.getMessage().startsWith(
163                         "Failed to unmarshal JSON event: an event definition for an event named "
164                         + "\"Event0000\" with version \"1.2.3\" not found in Apex model"));
165             }
166
167             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoNamespace();
168             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
169             assertEquals("org.onap.policy.apex.sample.events", event.getNameSpace());
170
171             try {
172                 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadNamespace();
173                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
174                 fail("Test should throw an exception here");
175             } catch (final ApexEventException e) {
176                 assertTrue(e.getMessage().startsWith(
177                         "Failed to unmarshal JSON event: field \"nameSpace\" with value \"hello.&&&&\" is invalid"));
178             }
179
180             try {
181                 apexEventJSONStringIn = JSONEventGenerator.jsonEventNoExNamespace();
182                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
183                 fail("Test should throw an exception here");
184             } catch (final ApexEventException e) {
185                 assertTrue(e.getMessage().startsWith(
186                         "Failed to unmarshal JSON event: namespace \"pie.in.the.sky\" on event \"Event0000\" does not"
187                         + " match namespace \"org.onap.policy.apex.sample.events\" for that event in the Apex model"));
188             }
189
190             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoSource();
191             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
192             assertEquals("Outside", event.getSource());
193
194             try {
195                 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadSource();
196                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
197                 fail("Test should throw an exception here");
198             } catch (final ApexEventException e) {
199                 assertTrue(e.getMessage().startsWith(
200                         "Failed to unmarshal JSON event: field \"source\" with value \"%!@**@!\" is invalid"));
201             }
202
203             apexEventJSONStringIn = JSONEventGenerator.jsonEventNoTarget();
204             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
205             assertEquals("Match", event.getTarget());
206
207             try {
208                 apexEventJSONStringIn = JSONEventGenerator.jsonEventBadTarget();
209                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
210                 fail("Test should throw an exception here");
211             } catch (final ApexEventException e) {
212                 assertTrue(e.getMessage().startsWith(
213                         "Failed to unmarshal JSON event: field \"target\" with value \"KNIO(*S)A(S)D\" is invalid"));
214             }
215
216             try {
217                 apexEventJSONStringIn = JSONEventGenerator.jsonEventMissingFields();
218                 jsonEventConverter.toApexEvent(null, apexEventJSONStringIn);
219                 fail("Test should throw an exception here");
220             } catch (final ApexEventException e) {
221                 assertTrue(e.getMessage().startsWith("Failed to unmarshal JSON event: error parsing Event0000:0.0.1 "
222                         + "event from Json. Field \"TestMatchCase\" is missing, but is mandatory."));
223             }
224
225             apexEventJSONStringIn = JSONEventGenerator.jsonEventNullFields();
226             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
227             assertEquals(event.get("TestSlogan"), null);
228             assertEquals(event.get("TestMatchCase"), (byte) -1);
229             assertEquals(event.get("TestTimestamp"), (long) -1);
230             assertEquals(event.get("TestTemperature"), -1.0);
231
232             // Set the missing fields as optional in the model
233             final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get("Event0000");
234             eventDefinition.getParameterMap().get("TestSlogan").setOptional(true);
235             eventDefinition.getParameterMap().get("TestMatchCase").setOptional(true);
236             eventDefinition.getParameterMap().get("TestTimestamp").setOptional(true);
237             eventDefinition.getParameterMap().get("TestTemperature").setOptional(true);
238
239             apexEventJSONStringIn = JSONEventGenerator.jsonEventMissingFields();
240             event = jsonEventConverter.toApexEvent(null, apexEventJSONStringIn).get(0);
241             assertEquals(null, event.get("TestSlogan"));
242             assertEquals(null, event.get("TestMatchCase"));
243             assertEquals(null, event.get("TestTimestamp"));
244             assertEquals(null, event.get("TestTemperature"));
245         } catch (final Exception e) {
246             e.printStackTrace();
247             throw new ApexException("Exception reading Apex event JSON file", e);
248         }
249     }
250
251     @Test
252     public void testApexEventToJSON() throws ApexException {
253         try {
254             final Apex2JSONEventConverter jsonEventConverter = new Apex2JSONEventConverter();
255             assertNotNull(jsonEventConverter);
256
257             final Date event0000StartTime = new Date();
258             final Map<String, Object> event0000DataMap = new HashMap<String, Object>();
259             event0000DataMap.put("TestSlogan", "This is a test slogan");
260             event0000DataMap.put("TestMatchCase", 12345);
261             event0000DataMap.put("TestTimestamp", event0000StartTime.getTime());
262             event0000DataMap.put("TestTemperature", 34.5445667);
263
264             final ApexEvent apexEvent0000 =
265                     new ApexEvent("Event0000", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
266             apexEvent0000.putAll(event0000DataMap);
267
268             final String apexEvent0000JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0000);
269
270             logger.debug(apexEvent0000JSONString);
271
272             assertTrue(apexEvent0000JSONString.contains("\"name\": \"Event0000\""));
273             assertTrue(apexEvent0000JSONString.contains("\"version\": \"0.0.1\""));
274             assertTrue(apexEvent0000JSONString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
275             assertTrue(apexEvent0000JSONString.contains("\"source\": \"test\""));
276             assertTrue(apexEvent0000JSONString.contains("\"target\": \"apex\""));
277             assertTrue(apexEvent0000JSONString.contains("\"TestSlogan\": \"This is a test slogan\""));
278             assertTrue(apexEvent0000JSONString.contains("\"TestMatchCase\": 12345"));
279             assertTrue(apexEvent0000JSONString.contains("\"TestTimestamp\": " + event0000StartTime.getTime()));
280             assertTrue(apexEvent0000JSONString.contains("\"TestTemperature\": 34.5445667"));
281
282             final Date event0004StartTime = new Date(1434363272000L);
283             final Map<String, Object> event0004DataMap = new HashMap<String, Object>();
284             event0004DataMap.put("TestSlogan", "Test slogan for External Event");
285             event0004DataMap.put("TestMatchCase", new Integer(2));
286             event0004DataMap.put("TestTimestamp", new Long(event0004StartTime.getTime()));
287             event0004DataMap.put("TestTemperature", new Double(1064.43));
288             event0004DataMap.put("TestMatchCaseSelected", new Integer(2));
289             event0004DataMap.put("TestMatchStateTime", new Long(1434370506078L));
290             event0004DataMap.put("TestEstablishCaseSelected", new Integer(0));
291             event0004DataMap.put("TestEstablishStateTime", new Long(1434370506085L));
292             event0004DataMap.put("TestDecideCaseSelected", new Integer(3));
293             event0004DataMap.put("TestDecideStateTime", new Long(1434370506092L));
294             event0004DataMap.put("TestActCaseSelected", new Integer(2));
295             event0004DataMap.put("TestActStateTime", new Long(1434370506095L));
296
297             final ApexEvent apexEvent0004 =
298                     new ApexEvent("Event0004", "0.0.1", "org.onap.policy.apex.sample.events", "test", "apex");
299             apexEvent0004.putAll(event0004DataMap);
300
301             final String apexEvent0004JSONString = (String) jsonEventConverter.fromApexEvent(apexEvent0004);
302
303             logger.debug(apexEvent0004JSONString);
304
305             assertTrue(apexEvent0004JSONString.contains("\"name\": \"Event0004\""));
306             assertTrue(apexEvent0004JSONString.contains("\"version\": \"0.0.1\""));
307             assertTrue(apexEvent0004JSONString.contains("\"nameSpace\": \"org.onap.policy.apex.sample.events\""));
308             assertTrue(apexEvent0004JSONString.contains("\"source\": \"test\""));
309             assertTrue(apexEvent0004JSONString.contains("\"target\": \"apex\""));
310             assertTrue(apexEvent0004JSONString.contains("\"TestSlogan\": \"Test slogan for External Event\""));
311             assertTrue(apexEvent0004JSONString.contains("1434370506078"));
312             assertTrue(apexEvent0004JSONString.contains("1064.43"));
313         } catch (final Exception e) {
314             e.printStackTrace();
315             throw new ApexException("Exception reading Apex event JSON file", e);
316         }
317     }
318 }