84522ed10aacefd2844dda13eba5f38abd3fd9c3
[policy/apex-pdp.git] / services / services-engine / src / test / java / org / onap / policy / apex / service / engine / event / JsonEventHandlerForPojoTest.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.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.fail;
27
28 import java.io.ByteArrayInputStream;
29 import java.io.IOException;
30 import java.util.List;
31
32 import org.junit.AfterClass;
33 import org.junit.BeforeClass;
34 import org.junit.Test;
35 import org.onap.policy.apex.context.parameters.ContextParameterConstants;
36 import org.onap.policy.apex.context.parameters.SchemaParameters;
37 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
38 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
39 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
40 import org.onap.policy.apex.model.basicmodel.service.ModelService;
41 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
42 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.Apex2JsonEventConverter;
43 import org.onap.policy.apex.service.engine.event.impl.jsonprotocolplugin.JsonEventProtocolParameters;
44 import org.onap.policy.apex.service.engine.event.testpojos.DummyPojo;
45 import org.onap.policy.apex.service.engine.event.testpojos.DummyPojoList;
46 import org.onap.policy.common.parameters.ParameterService;
47 import org.onap.policy.common.utils.resources.TextFileUtils;
48 import org.slf4j.ext.XLogger;
49 import org.slf4j.ext.XLoggerFactory;
50
51 /**
52  * Test JSON Event Handler.
53  *
54  * @author Liam Fallon (liam.fallon@ericsson.com)
55  */
56 public class JsonEventHandlerForPojoTest {
57     private static final XLogger logger = XLoggerFactory.getXLogger(JsonEventHandlerForPojoTest.class);
58
59     /**
60      * Setup event model.
61      *
62      * @throws IOException Signals that an I/O exception has occurred.
63      * @throws ApexModelException the apex model exception
64      */
65     @BeforeClass
66     public static void setupEventModel() throws IOException, ApexModelException {
67         final String policyModelString =
68                 TextFileUtils.getTextFileAsString("src/test/resources/policymodels/PojoEventModel.json");
69         final ApexModelReader<AxPolicyModel> modelReader = new ApexModelReader<AxPolicyModel>(AxPolicyModel.class);
70         modelReader.setValidateFlag(false);
71         final AxPolicyModel apexPolicyModel = modelReader.read(new ByteArrayInputStream(policyModelString.getBytes()));
72
73         // Set up the models in the model service
74         apexPolicyModel.register();
75     }
76
77     /**
78      * Initialize default schema parameters.
79      */
80     @BeforeClass
81     public static void initializeDefaultSchemaParameters() {
82         ParameterService.clear();
83         final SchemaParameters schemaParameters = new SchemaParameters();
84         schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
85         ParameterService.register(schemaParameters);
86     }
87
88     /**
89      * Teardown default schema parameters.
90      */
91     @AfterClass
92     public static void teardownDefaultSchemaParameters() {
93         ParameterService.deregister(ContextParameterConstants.SCHEMA_GROUP_NAME);
94         ModelService.clear();
95     }
96
97     /**
98      * Test POJO to apex event and back.
99      *
100      * @throws ApexException the apex exception
101      * @throws IOException on IO exceptions
102      */
103     @Test
104     public void testJsonPojoToApexEvent() throws ApexException, IOException {
105         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
106         assertNotNull(jsonEventConverter);
107
108         JsonEventProtocolParameters pars = new JsonEventProtocolParameters();
109         pars.setPojoField("POJO_PAR");
110         jsonEventConverter.init(pars);
111
112         final String apexEventJsonStringIn =
113                 TextFileUtils.getTextFileAsString("src/test/resources/events/TestPojoEvent.json");
114
115         logger.debug("input event\n" + apexEventJsonStringIn);
116
117         final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent("PojoEvent", apexEventJsonStringIn);
118         assertEquals(1, apexEventList.size());
119         final ApexEvent apexEvent = apexEventList.get(0);
120         assertNotNull(apexEvent);
121
122         logger.debug(apexEvent.toString());
123
124         assertEquals("PojoEvent", apexEvent.getName());
125         assertEquals("0.0.1", apexEvent.getVersion());
126         assertEquals("org.onap.policy.apex.service.engine.event.testpojos", apexEvent.getNameSpace());
127         assertEquals("Outside", apexEvent.getSource());
128         assertEquals("Apex", apexEvent.getTarget());
129
130         DummyPojo testPojo = (DummyPojo) apexEvent.get("POJO_PAR");
131
132         assertEquals(1, testPojo.getAnInt());
133         assertEquals(2, testPojo.getAnInteger().intValue());
134         assertEquals("a string", testPojo.getSomeString());
135
136         assertEquals(10, testPojo.getTestSubPojo().getAnInt());
137         assertEquals(20, testPojo.getTestSubPojo().getAnInteger().intValue());
138         assertEquals("a sub string", testPojo.getTestSubPojo().getSomeString());
139
140         assertEquals(100, testPojo.getTestSubPojo().getTestSubSubPojo().getAnInt());
141         assertEquals(200, testPojo.getTestSubPojo().getTestSubSubPojo().getAnInteger().intValue());
142         assertEquals("a sub sub string", testPojo.getTestSubPojo().getTestSubSubPojo().getSomeString());
143
144         String eventBackInJson = (String) jsonEventConverter.fromApexEvent(apexEvent);
145         assertEquals(apexEventJsonStringIn.replaceAll("\\s+", ""), eventBackInJson.replaceAll("\\s+", ""));
146     }
147
148     /**
149      * Test POJO List to apex event and back.
150      *
151      * @throws ApexException the apex exception
152      * @throws IOException on IO exceptions
153      */
154     @Test
155     public void testJsonPojoListToApexEvent() throws ApexException, IOException {
156         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
157         assertNotNull(jsonEventConverter);
158
159         JsonEventProtocolParameters pars = new JsonEventProtocolParameters();
160         pars.setPojoField("POJO_LIST_PAR");
161         jsonEventConverter.init(pars);
162
163         final String apexEventJsonStringIn =
164                 TextFileUtils.getTextFileAsString("src/test/resources/events/TestPojoListEvent.json");
165
166         logger.debug("input event\n" + apexEventJsonStringIn);
167
168         final List<ApexEvent> apexEventList = jsonEventConverter.toApexEvent("PojoListEvent", apexEventJsonStringIn);
169         assertEquals(1, apexEventList.size());
170         final ApexEvent apexEvent = apexEventList.get(0);
171         assertNotNull(apexEvent);
172
173         logger.debug(apexEvent.toString());
174
175         assertEquals("PojoListEvent", apexEvent.getName());
176         assertEquals("0.0.1", apexEvent.getVersion());
177         assertEquals("org.onap.policy.apex.service.engine.event.testpojos", apexEvent.getNameSpace());
178         assertEquals("Outside", apexEvent.getSource());
179         assertEquals("Apex", apexEvent.getTarget());
180
181         DummyPojoList testPojoList = (DummyPojoList) apexEvent.get("POJO_LIST_PAR");
182
183         for (DummyPojo testPojo : testPojoList.getTestPojoList()) {
184             assertEquals(1, testPojo.getAnInt());
185             assertEquals(2, testPojo.getAnInteger().intValue());
186             assertEquals("a string", testPojo.getSomeString());
187
188             assertEquals(10, testPojo.getTestSubPojo().getAnInt());
189             assertEquals(20, testPojo.getTestSubPojo().getAnInteger().intValue());
190             assertEquals("a sub string", testPojo.getTestSubPojo().getSomeString());
191
192             assertEquals(100, testPojo.getTestSubPojo().getTestSubSubPojo().getAnInt());
193             assertEquals(200, testPojo.getTestSubPojo().getTestSubSubPojo().getAnInteger().intValue());
194             assertEquals("a sub sub string", testPojo.getTestSubPojo().getTestSubSubPojo().getSomeString());
195         }
196         String eventBackInJson = (String) jsonEventConverter.fromApexEvent(apexEvent);
197         assertEquals(apexEventJsonStringIn.replaceAll("\\s+", ""), eventBackInJson.replaceAll("\\s+", ""));
198     }
199
200     /**
201      * Test POJO event with bad configurations.
202      *
203      * @throws ApexException the apex exception
204      * @throws IOException on IO exceptions
205      */
206     @Test
207     public void testJsonBadPojoApexEvent() throws ApexException, IOException {
208         final Apex2JsonEventConverter jsonEventConverter = new Apex2JsonEventConverter();
209         assertNotNull(jsonEventConverter);
210
211         JsonEventProtocolParameters pars = new JsonEventProtocolParameters();
212         pars.setPojoField("BAD_POJO_PAR");
213         jsonEventConverter.init(pars);
214
215         final String apexEventJsonStringIn =
216                 TextFileUtils.getTextFileAsString("src/test/resources/events/TestPojoEvent.json");
217
218         logger.debug("input event\n" + apexEventJsonStringIn);
219
220         try {
221             jsonEventConverter.toApexEvent("PojoEvent", apexEventJsonStringIn);
222             fail("test should throw an exception");
223         } catch (Exception tae) {
224             assertEquals(
225                     "Failed to unmarshal JSON event: error parsing PojoEvent:0.0.1 event from Json. "
226                             + "Field BAD_POJO_PAR not found on POJO event definition.",
227                     tae.getMessage().substring(0, 133));
228         }
229
230         pars.setPojoField("POJO_PAR");
231         try {
232             jsonEventConverter.toApexEvent("PojoNoFieldEvent", apexEventJsonStringIn);
233             fail("test should throw an exception");
234         } catch (Exception tae) {
235             assertEquals(
236                     "Failed to unmarshal JSON event: error parsing PojoNoFieldEvent:0.0.1 event from Json, "
237                             + "Field POJO_PAR not found, no fields defined on event.",
238                     tae.getMessage().substring(0, 139));
239         }
240
241         try {
242             jsonEventConverter.toApexEvent("PojoTooManyFieldsEvent", apexEventJsonStringIn);
243             fail("test should throw an exception");
244         } catch (Exception tae) {
245             assertEquals(
246                     "Failed to unmarshal JSON event: error parsing PojoTooManyFieldsEvent:0.0.1 event from Json, "
247                             + "Field POJO_PAR, one and only one field may be defined on a POJO event definition.",
248                     tae.getMessage().substring(0, 173));
249         }
250     }
251 }