ab911499adf0e08c7216f9b7a214450e58f65aed
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2020 Nordix Foundation
5  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.apex.plugins.event.protocol.yaml;
24
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertTrue;
28
29 import java.io.IOException;
30 import java.util.List;
31 import org.junit.AfterClass;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
35 import org.onap.policy.apex.context.parameters.SchemaParameters;
36 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
37 import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
38 import org.onap.policy.apex.model.basicmodel.service.ModelService;
39 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
40 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchemas;
41 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
42 import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
43 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
44 import org.onap.policy.apex.service.engine.event.ApexEvent;
45 import org.onap.policy.apex.service.engine.event.ApexEventException;
46 import org.onap.policy.common.parameters.ParameterService;
47
48 /**
49  * The Class TestYamlPluginStability.
50  */
51 public class YamlPluginStabilityTest {
52     static AxEvent testEvent;
53
54     /**
55      * Register test events and schemas.
56      *
57      * @throws IOException Signals that an I/O exception has occurred.
58      */
59     @BeforeClass
60     public static void registerTestEventsAndSchemas() throws IOException {
61         SchemaParameters schemaParameters = new SchemaParameters();
62         schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
63         ParameterService.register(schemaParameters);
64
65         AxContextSchemas schemas = new AxContextSchemas();
66
67         AxContextSchema simpleIntSchema = new AxContextSchema(new AxArtifactKey("SimpleIntSchema", "0.0.1"), "JAVA",
68                         "java.lang.Integer");
69         schemas.getSchemasMap().put(simpleIntSchema.getKey(), simpleIntSchema);
70
71         AxContextSchema simpleDoubleSchema = new AxContextSchema(new AxArtifactKey("SimpleDoubleSchema", "0.0.1"),
72                         "JAVA", "java.lang.Double");
73         schemas.getSchemasMap().put(simpleDoubleSchema.getKey(), simpleDoubleSchema);
74
75         AxContextSchema simpleStringSchema = new AxContextSchema(new AxArtifactKey("SimpleStringSchema", "0.0.1"),
76                         "JAVA", "java.lang.String");
77         schemas.getSchemasMap().put(simpleStringSchema.getKey(), simpleStringSchema);
78
79         ModelService.registerModel(AxContextSchemas.class, schemas);
80
81         testEvent = new AxEvent(new AxArtifactKey("TestEvent", "0.0.1"));
82         testEvent.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
83         AxField teField0 = new AxField(new AxReferenceKey(testEvent.getKey(), "intValue"), simpleIntSchema.getKey());
84         testEvent.getParameterMap().put("intValue", teField0);
85         AxField teField1 = new AxField(new AxReferenceKey(testEvent.getKey(), "doubleValue"),
86                         simpleDoubleSchema.getKey());
87         testEvent.getParameterMap().put("doubleValue", teField1);
88         AxField teField2 = new AxField(new AxReferenceKey(testEvent.getKey(), "stringValue"),
89                         simpleStringSchema.getKey(), true);
90         testEvent.getParameterMap().put("stringValue", teField2);
91
92         AxEvents events = new AxEvents();
93         events.getEventMap().put(testEvent.getKey(), testEvent);
94
95         ModelService.registerModel(AxEvents.class, events);
96     }
97
98     /**
99      * Unregister test events and schemas.
100      */
101     @AfterClass
102     public static void unregisterTestEventsAndSchemas() {
103         ModelService.clear();
104         ParameterService.clear();
105     }
106
107     /**
108      * Test stability.
109      *
110      * @throws ApexEventException the apex event exception
111      */
112     @Test
113     public void testStability() throws ApexEventException {
114         Apex2YamlEventConverter converter = new Apex2YamlEventConverter();
115
116         assertThatThrownBy(() -> converter.init(null))
117             .hasMessage("specified consumer properties are not applicable to the YAML event protocol");
118         YamlEventProtocolParameters pars = new YamlEventProtocolParameters();
119         converter.init(pars);
120
121         assertThatThrownBy(() -> converter.toApexEvent("NonExistantEvent", ""))
122             .hasMessageContaining("Failed to unmarshal YAML event")
123             .getCause().hasMessageStartingWith("an event definition for an event named \"NonExistantEvent\"");
124         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", null))
125             .hasMessage("event processing failed, event is null");
126         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", 1))
127             .hasMessage("error converting event \"1\" to a string");
128         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", ""))
129             .getCause().hasMessageContaining("Field \"doubleValue\" is missing");
130         assertThatThrownBy(() -> converter.fromApexEvent(null))
131             .hasMessage("event processing failed, Apex event is null");
132         ApexEvent apexEvent = new ApexEvent(testEvent.getKey().getName(), testEvent.getKey().getVersion(),
133                         testEvent.getNameSpace(), testEvent.getSource(), testEvent.getTarget());
134         apexEvent.put("doubleValue", 123.45);
135         apexEvent.put("intValue", 123);
136         apexEvent.put("stringValue", "123.45");
137
138         apexEvent.setExceptionMessage("my wonderful exception message");
139         String yamlString = (String) converter.fromApexEvent(apexEvent);
140         assertTrue(yamlString.contains("my wonderful exception message"));
141
142         apexEvent.remove("intValue");
143         assertThatThrownBy(() -> converter.fromApexEvent(apexEvent))
144             .hasMessageContaining("error parsing TestEvent:0.0.1 event to Json. Field \"intValue\" is missing");
145         assertThatThrownBy(() -> converter.toApexEvent(null, ""))
146             .hasMessageStartingWith("Failed to unmarshal YAML event")
147             .getCause().hasMessageStartingWith("event received without mandatory parameter \"name\"");
148         pars.setNameAlias("TheNameField");
149         assertThatThrownBy(() -> converter.toApexEvent(null, ""))
150             .hasMessageStartingWith("Failed to unmarshal YAML event")
151             .getCause().hasMessageStartingWith("event received without mandatory parameter \"name\"");
152         apexEvent.put("intValue", 123);
153
154         apexEvent.remove("stringValue");
155         yamlString = (String) converter.fromApexEvent(apexEvent);
156         apexEvent.put("stringValue", "123.45");
157
158         String yamlInputString = "doubleValue: 123.45\n" + "intValue: 123";
159
160         List<ApexEvent> eventList = converter.toApexEvent("TestEvent", yamlInputString);
161         assertEquals(123.45, eventList.get(0).get("doubleValue"));
162
163         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: null";
164
165         eventList = converter.toApexEvent("TestEvent", yamlInputString);
166         assertEquals(null, eventList.get(0).get("stringValue"));
167
168         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: TestEvent";
169         pars.setNameAlias("stringValue");
170         eventList = converter.toApexEvent(null, yamlInputString);
171         assertEquals("TestEvent", eventList.get(0).get("stringValue"));
172
173         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: SomeOtherEvent";
174         eventList = converter.toApexEvent("TestEvent", yamlInputString);
175         assertEquals("SomeOtherEvent", eventList.get(0).get("stringValue"));
176
177         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: 0.0.1";
178         pars.setNameAlias(null);
179         pars.setVersionAlias("stringValue");
180         eventList = converter.toApexEvent("TestEvent", yamlInputString);
181         assertEquals("0.0.1", eventList.get(0).get("stringValue"));
182
183         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: org.some.other.namespace";
184         pars.setVersionAlias(null);
185         pars.setNameSpaceAlias("stringValue");
186         final String yamlInputStringCopy = yamlInputString;
187         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", yamlInputStringCopy))
188             .hasMessageStartingWith("Failed to unmarshal YAML event")
189             .getCause().hasMessageStartingWith("namespace \"org.some.other.namespace\" on event");
190         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n"
191                         + "stringValue: org.onap.policy.apex.plugins.event.protocol.yaml";
192         eventList = converter.toApexEvent("TestEvent", yamlInputString);
193         assertEquals("org.onap.policy.apex.plugins.event.protocol.yaml", eventList.get(0).getNameSpace());
194
195         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MySource";
196         pars.setNameSpaceAlias(null);
197         pars.setSourceAlias("stringValue");
198         eventList = converter.toApexEvent("TestEvent", yamlInputString);
199         assertEquals("MySource", eventList.get(0).getSource());
200
201         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MyTarget";
202         pars.setSourceAlias(null);
203         pars.setTargetAlias("stringValue");
204         eventList = converter.toApexEvent("TestEvent", yamlInputString);
205         assertEquals("MyTarget", eventList.get(0).getTarget());
206         pars.setTargetAlias(null);
207
208         yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MyString";
209         pars.setSourceAlias(null);
210         pars.setTargetAlias("intValue");
211         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", yamlInputStringCopy))
212             .hasMessageStartingWith("Failed to unmarshal YAML event")
213             .getCause().hasMessageStartingWith("field \"target\" with type \"java.lang.Integer\"");
214         pars.setTargetAlias(null);
215
216         assertThatThrownBy(() -> converter.toApexEvent("TestEvent", "doubleValue: 123.45\n" + "intValue: ~\n"
217             + "stringValue: MyString")).getCause().hasMessageStartingWith("mandatory field \"intValue\" is missing");
218     }
219 }