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