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