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