a7da29d5c4b969eb3a2914f112ff752886541a6e
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.openecomp.sdc.vendorsoftwareproduct.impl;
24
25 import org.apache.commons.collections.CollectionUtils;
26 import org.junit.Assert;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.mockito.InjectMocks;
30 import org.mockito.MockitoAnnotations;
31 import org.mockito.Spy;
32 import org.openecomp.core.utilities.file.FileUtils;
33 import org.openecomp.sdc.common.errors.CoreException;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NetworkEntity;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspQuestionnaireEntity;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityId;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Network;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.NetworkCompositionSchemaInput;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
44 import org.openecomp.sdc.versioning.dao.types.Version;
45
46 import java.util.ArrayList;
47 import java.util.Collection;
48 import java.util.List;
49 import java.util.Map;
50
51 import static org.mockito.Mockito.doReturn;
52
53 public class CompositionEntityDataManagerImplTest {
54   private static final String VSP1 = "vsp1";
55   private static final Version VERSION = new Version(0, 1);
56   private static final String COMPONENT1 = "component1";
57   private static final String NIC1 = "nic1";
58   private static final String SIMPLE_SCHEMA = "{\n" +
59       "  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n" +
60       "  \"type\": \"object\",\n" +
61       "  \"properties\": {\n" +
62       "    \"a\": {\n" +
63       "      \"type\": \"number\"\n" +
64       "    }\n" +
65       "  }\n" +
66       "}";
67   private static final String NETWORK_COMPOSITION_SCHEMA = "{\n" +
68       "  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n" +
69       "  \"type\": \"object\",\n" +
70       "  \"properties\": {\n" +
71       "    \"name\": {\n" +
72       "      \"type\": \"string\",\n" +
73       "      \"enum\": [\n" +
74       "        \"network1 name\"\n" +
75       "      ],\n" +
76       "      \"default\": \"network1 name\"\n" +
77       "    },\n" +
78       "    \"dhcp\": {\n" +
79       "      \"type\": \"boolean\",\n" +
80       "      \"enum\": [\n" +
81       "        true\n" +
82       "      ],\n" +
83       "      \"default\": true\n" +
84       "    }\n" +
85       "  },\n" +
86       "  \"additionalProperties\": false,\n" +
87       "  \"required\": [\n" +
88       "    \"name\",\n" +
89       "    \"dhcp\"\n" +
90       "  ]\n" +
91       "}";
92
93   private Map<CompositionEntityId, Collection<String>> errorsById;
94   @InjectMocks
95   @Spy
96   private CompositionEntityDataManagerImpl compositionEntityDataManager;
97
98   @Before
99   public void setUp() throws Exception {
100     MockitoAnnotations.initMocks(this);
101   }
102
103   @Test(expected = CoreException.class)
104   public void testAddNullEntity_negative() {
105     compositionEntityDataManager.addEntity(null, null);
106   }
107
108   @Test
109   public void testAddEntity() {
110     compositionEntityDataManager
111         .addEntity(new VspQuestionnaireEntity(VSP1, VERSION), null);
112
113     String invalidQuestionnaireData = "{\"a\": \"b\"}";
114
115     ComponentEntity component = new ComponentEntity(VSP1, VERSION, COMPONENT1);
116     component.setQuestionnaireData(invalidQuestionnaireData);
117     compositionEntityDataManager.addEntity(component, null);
118
119     NicEntity nic = new NicEntity(VSP1, VERSION, COMPONENT1, NIC1);
120     nic.setQuestionnaireData(invalidQuestionnaireData);
121     compositionEntityDataManager.addEntity(nic, null);
122   }
123
124   // TODO: 3/15/2017 fix and enable
125   //@Test(dependsOnMethods = "testAddEntity")
126   public void testValidateEntitiesQuestionnaire() {
127     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager)
128         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, null);
129     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager)
130         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.component, null);
131     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager)
132         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.nic, null);
133
134     errorsById = compositionEntityDataManager.validateEntitiesQuestionnaire();
135     Assert.assertNotNull(errorsById);
136     Assert.assertEquals(errorsById.size(), 2); // both component and nic data don't mach schemas
137     CompositionEntityId nicId =
138         new NicEntity(VSP1, VERSION, COMPONENT1, NIC1).getCompositionEntityId();
139     Assert.assertTrue(errorsById.containsKey(nicId));
140     Assert.assertTrue(errorsById.containsKey(nicId.getParentId()));
141   }
142
143   @Test
144   public void testBuildTrees() {
145     testAddEntity();
146     compositionEntityDataManager.buildTrees();
147   }
148
149   // TODO: 3/15/2017 fix and enable
150   //@Test(dependsOnMethods = "testBuildTrees")
151   public void testAddErrorsToTrees() {
152     compositionEntityDataManager.addErrorsToTrees(errorsById);
153   }
154
155   // TODO: 3/15/2017 fix and enable
156   //@Test(dependsOnMethods = "testAddErrorsToTrees")
157   public void testGetTrees() {
158     Collection<CompositionEntityValidationData> trees = compositionEntityDataManager.getTrees();
159     Assert.assertNotNull(trees);
160     Assert.assertEquals(trees.size(), 1);
161
162     CompositionEntityValidationData vspValidationData = trees.iterator().next();
163     assertValidationData(vspValidationData, VSP1, CompositionEntityType.vsp, false);
164     Assert.assertEquals(vspValidationData.getSubEntitiesValidationData().size(), 1);
165
166     CompositionEntityValidationData componentValidationData =
167         vspValidationData.getSubEntitiesValidationData().iterator().next();
168     assertValidationData(componentValidationData, COMPONENT1, CompositionEntityType.component,
169         true);
170     Assert.assertEquals(componentValidationData.getSubEntitiesValidationData().size(), 1);
171
172     CompositionEntityValidationData nicValidationData =
173         componentValidationData.getSubEntitiesValidationData().iterator().next();
174     assertValidationData(nicValidationData, NIC1, CompositionEntityType.nic, true);
175     Assert.assertNull(nicValidationData.getSubEntitiesValidationData());
176   }
177
178   @Test
179   public void testValidateValidEntity() {
180     NetworkEntity networkEntity = new NetworkEntity(VSP1, VERSION, "network1");
181     Network network = new Network();
182     network.setName("network1 name");
183     network.setDhcp(true);
184     networkEntity.setNetworkCompositionData(network);
185
186     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
187     schemaTemplateInput.setManual(false);
188     schemaTemplateInput.setNetwork(network);
189
190     doReturn(NETWORK_COMPOSITION_SCHEMA).when(compositionEntityDataManager)
191         .generateSchema(SchemaTemplateContext.composition, CompositionEntityType.network,
192             schemaTemplateInput);
193
194     CompositionEntityValidationData validationData = compositionEntityDataManager
195         .validateEntity(networkEntity, SchemaTemplateContext.composition, schemaTemplateInput);
196     assertValidationData(validationData, "network1", CompositionEntityType.network, false);
197   }
198
199   @Test
200   public void testValidateInvalidEntity() {
201     NetworkEntity networkEntity = new NetworkEntity(VSP1, VERSION, "network1");
202     Network network = new Network();
203     network.setName("network1 name changed");
204     network.setDhcp(false);
205     networkEntity.setNetworkCompositionData(network);
206
207     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
208     schemaTemplateInput.setManual(false);
209     Network origNetwork = new Network();
210     origNetwork.setName("network1 name");
211     origNetwork.setDhcp(true);
212     schemaTemplateInput.setNetwork(origNetwork);
213
214     doReturn(NETWORK_COMPOSITION_SCHEMA).when(compositionEntityDataManager)
215         .generateSchema(SchemaTemplateContext.composition, CompositionEntityType.network,
216             schemaTemplateInput);
217
218     CompositionEntityValidationData validationData = compositionEntityDataManager
219         .validateEntity(networkEntity, SchemaTemplateContext.composition, schemaTemplateInput);
220     assertValidationData(validationData, "network1", CompositionEntityType.network, true);
221     Assert.assertEquals(validationData.getErrors().size(), 2);
222   }
223
224   @Test
225   public void testNicAndComponentValidQuestionnaire() {
226     compositionEntityDataManager
227         .addEntity(new VspQuestionnaireEntity(VSP1, VERSION), null);
228
229     ComponentEntity componentEntity = new ComponentEntity(VSP1, VERSION, COMPONENT1);
230     componentEntity.setQuestionnaireData(loadFileToString("quesionnaire/validComponent.json"));
231     compositionEntityDataManager.addEntity(componentEntity, null);
232
233     NicEntity nicEntity = new NicEntity(VSP1, VERSION, COMPONENT1, NIC1);
234     nicEntity.setQuestionnaireData(loadFileToString("quesionnaire/validNic.json"));
235     compositionEntityDataManager.addEntity(nicEntity, null);
236
237     doReturn(SIMPLE_SCHEMA)
238         .when(compositionEntityDataManager)
239         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, null);
240
241     doReturn(loadFileToString("quesionnaire/schema/componentQuestionnaire.json"))
242         .when(compositionEntityDataManager)
243         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.component, null);
244
245     doReturn(loadFileToString("quesionnaire/schema/nicQuestionnaire.json"))
246         .when(compositionEntityDataManager)
247         .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.nic, null);
248
249     Map<CompositionEntityId, Collection<String>> errorsById =
250         compositionEntityDataManager.validateEntitiesQuestionnaire();
251     Assert.assertEquals(errorsById.size(), 1);
252   }
253
254   @Test
255   public void testComponentInvalidQuestionnaire() {
256     //JUnit doesn't have depend on logic available
257     testNicAndComponentValidQuestionnaire();
258     ComponentEntity componentEntity = new ComponentEntity(VSP1, VERSION, COMPONENT1);
259     componentEntity.setQuestionnaireData(loadFileToString("quesionnaire/invalidComponent.json"));
260     compositionEntityDataManager.addEntity(componentEntity, null);
261
262     Map<CompositionEntityId, Collection<String>> errorsById =
263         compositionEntityDataManager.validateEntitiesQuestionnaire();
264     Assert.assertEquals(errorsById.size(), 2);
265
266     CompositionEntityId component = new ArrayList<>(errorsById.keySet()).get(1);
267     List<String> errors = (List<String>) errorsById.get(component);
268     Assert.assertEquals(errors.size(), 1);
269     Assert.assertEquals(errors.get(0),
270         "#/general/recovery/pointObjective: 20.0 is not lower or equal to 15");
271   }
272
273   private static void assertValidationData(CompositionEntityValidationData validationData,
274                                            String id, CompositionEntityType type,
275                                            boolean hasErrors) {
276     Assert.assertNotNull(validationData);
277     Assert.assertEquals(validationData.getEntityId(), id);
278     Assert.assertEquals(validationData.getEntityType(), type);
279     Assert.assertTrue(CollectionUtils.isNotEmpty(validationData.getErrors()) == hasErrors);
280   }
281
282   private static String loadFileToString(String path) {
283     return new String(FileUtils.toByteArray(FileUtils.loadFileToInputStream(path)));
284   }
285
286   @Test(expected = CoreException.class)
287   public void shouldReturnCoreException() {
288     //given
289     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
290
291     //then
292     compositionEntityDataManager.validateEntity(null, SchemaTemplateContext.composition, schemaTemplateInput);
293   }
294
295 }