Improve testing stability
[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  * 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   String invalidQuestionnaireData = "{\"a\": \"b\"}";
93
94   private Map<CompositionEntityId, Collection<String>> errorsById;
95   @InjectMocks
96   @Spy
97   private CompositionEntityDataManagerImpl compositionEntityDataManager;
98
99   @Before
100   public void setUp() throws Exception {
101     MockitoAnnotations.openMocks(this);
102     compositionEntityDataManager.addEntity(new VspQuestionnaireEntity(VSP1, VERSION), null);
103
104     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager).generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, null);
105     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager).generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.component, null);
106     doReturn(SIMPLE_SCHEMA).when(compositionEntityDataManager).generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.nic, null);
107
108     ComponentEntity component = new ComponentEntity(VSP1, VERSION, COMPONENT1);
109     component.setQuestionnaireData(invalidQuestionnaireData);
110     compositionEntityDataManager.addEntity(component, null);
111
112     NicEntity nic = new NicEntity(VSP1, VERSION, COMPONENT1, NIC1);
113     nic.setQuestionnaireData(invalidQuestionnaireData);
114     compositionEntityDataManager.addEntity(nic, null);
115   }
116
117   @Test(expected = CoreException.class)
118   public void testAddNullEntity_negative() {
119     compositionEntityDataManager.addEntity(null, null);
120   }
121
122   @Test
123   public void testValidateEntitiesQuestionnaire() {
124     errorsById = compositionEntityDataManager.validateEntitiesQuestionnaire();
125     Assert.assertNotNull(errorsById);
126     Assert.assertEquals(3, errorsById.size());
127     CompositionEntityId nicId = new NicEntity(VSP1, VERSION, COMPONENT1, NIC1).getCompositionEntityId();
128     Assert.assertTrue(errorsById.containsKey(nicId));
129     Assert.assertTrue(errorsById.containsKey(nicId.getParentId()));
130   }
131
132   @Test
133   public void testGetTrees() {
134     errorsById = compositionEntityDataManager.validateEntitiesQuestionnaire();
135     compositionEntityDataManager.buildTrees();
136     compositionEntityDataManager.addErrorsToTrees(errorsById);
137     Collection<CompositionEntityValidationData> trees = compositionEntityDataManager.getTrees();
138     Assert.assertNotNull(trees);
139     Assert.assertEquals(1, trees.size());
140
141     CompositionEntityValidationData vspValidationData = trees.iterator().next();
142     Assert.assertEquals(1, vspValidationData.getSubEntitiesValidationData().size());
143
144     CompositionEntityValidationData componentValidationData = vspValidationData.getSubEntitiesValidationData().iterator().next();
145     assertValidationData(componentValidationData, COMPONENT1, CompositionEntityType.component,true);
146     Assert.assertEquals(1, componentValidationData.getSubEntitiesValidationData().size());
147
148     CompositionEntityValidationData nicValidationData = componentValidationData.getSubEntitiesValidationData().iterator().next();
149     assertValidationData(nicValidationData, NIC1, CompositionEntityType.nic, true);
150     Assert.assertNull(nicValidationData.getSubEntitiesValidationData());
151   }
152
153   @Test
154   public void testValidateValidEntity() {
155     NetworkEntity networkEntity = new NetworkEntity(VSP1, VERSION, "network1");
156     Network network = new Network();
157     network.setName("network1 name");
158     network.setDhcp(true);
159     networkEntity.setNetworkCompositionData(network);
160
161     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
162     schemaTemplateInput.setManual(false);
163     schemaTemplateInput.setNetwork(network);
164
165     doReturn(NETWORK_COMPOSITION_SCHEMA).when(compositionEntityDataManager)
166             .generateSchema(SchemaTemplateContext.composition, CompositionEntityType.network,
167                     schemaTemplateInput);
168
169     CompositionEntityValidationData validationData = compositionEntityDataManager
170             .validateEntity(networkEntity, SchemaTemplateContext.composition, schemaTemplateInput);
171     assertValidationData(validationData, "network1", CompositionEntityType.network, false);
172   }
173
174   @Test
175   public void testValidateInvalidEntity() {
176     NetworkEntity networkEntity = new NetworkEntity(VSP1, VERSION, "network1");
177     Network network = new Network();
178     network.setName("network1 name changed");
179     network.setDhcp(false);
180     networkEntity.setNetworkCompositionData(network);
181
182     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
183     schemaTemplateInput.setManual(false);
184     Network origNetwork = new Network();
185     origNetwork.setName("network1 name");
186     origNetwork.setDhcp(true);
187     schemaTemplateInput.setNetwork(origNetwork);
188
189     doReturn(NETWORK_COMPOSITION_SCHEMA).when(compositionEntityDataManager)
190             .generateSchema(SchemaTemplateContext.composition, CompositionEntityType.network,
191                     schemaTemplateInput);
192
193     CompositionEntityValidationData validationData = compositionEntityDataManager
194             .validateEntity(networkEntity, SchemaTemplateContext.composition, schemaTemplateInput);
195     assertValidationData(validationData, "network1", CompositionEntityType.network, true);
196     Assert.assertEquals(validationData.getErrors().size(), 2);
197   }
198
199   @Test
200   public void testNicAndComponentValidQuestionnaire() {
201     compositionEntityDataManager
202             .addEntity(new VspQuestionnaireEntity(VSP1, VERSION), null);
203
204     ComponentEntity componentEntity = new ComponentEntity(VSP1, VERSION, COMPONENT1);
205     componentEntity.setQuestionnaireData(loadFileToString("quesionnaire/validComponent.json"));
206     compositionEntityDataManager.addEntity(componentEntity, null);
207
208     NicEntity nicEntity = new NicEntity(VSP1, VERSION, COMPONENT1, NIC1);
209     nicEntity.setQuestionnaireData(loadFileToString("quesionnaire/validNic.json"));
210     compositionEntityDataManager.addEntity(nicEntity, null);
211
212     doReturn(SIMPLE_SCHEMA)
213             .when(compositionEntityDataManager)
214             .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, null);
215
216     doReturn(loadFileToString("quesionnaire/schema/componentQuestionnaire.json"))
217             .when(compositionEntityDataManager)
218             .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.component, null);
219
220     doReturn(loadFileToString("quesionnaire/schema/nicQuestionnaire.json"))
221             .when(compositionEntityDataManager)
222             .generateSchema(SchemaTemplateContext.questionnaire, CompositionEntityType.nic, null);
223
224     Map<CompositionEntityId, Collection<String>> errorsById =
225             compositionEntityDataManager.validateEntitiesQuestionnaire();
226     Assert.assertEquals(errorsById.size(), 1);
227   }
228
229   @Test
230   public void testComponentInvalidQuestionnaire() {
231     //JUnit doesn't have depend on logic available
232     testNicAndComponentValidQuestionnaire();
233     ComponentEntity componentEntity = new ComponentEntity(VSP1, VERSION, COMPONENT1);
234     componentEntity.setQuestionnaireData(loadFileToString("quesionnaire/invalidComponent.json"));
235     compositionEntityDataManager.addEntity(componentEntity, null);
236
237     Map<CompositionEntityId, Collection<String>> errorsById =
238             compositionEntityDataManager.validateEntitiesQuestionnaire();
239     Assert.assertEquals(errorsById.size(), 2);
240
241     CompositionEntityId component = new ArrayList<>(errorsById.keySet()).get(1);
242     List<String> errors = (List<String>) errorsById.get(component);
243     Assert.assertEquals(errors.size(), 1);
244     Assert.assertEquals(errors.get(0),
245             "#/general/recovery/pointObjective: 20.0 is not lower or equal to 15");
246   }
247
248   private static void assertValidationData(CompositionEntityValidationData validationData,
249                                            String id, CompositionEntityType type,
250                                            boolean hasErrors) {
251     Assert.assertNotNull(validationData);
252     Assert.assertEquals(validationData.getEntityId(), id);
253     Assert.assertEquals(validationData.getEntityType(), type);
254     Assert.assertTrue(CollectionUtils.isNotEmpty(validationData.getErrors()) == hasErrors);
255   }
256
257   private static String loadFileToString(String path) {
258     return new String(FileUtils.toByteArray(FileUtils.loadFileToInputStream(path)));
259   }
260
261   @Test(expected = CoreException.class)
262   public void shouldReturnCoreException() {
263     //given
264     NetworkCompositionSchemaInput schemaTemplateInput = new NetworkCompositionSchemaInput();
265
266     //then
267     compositionEntityDataManager.validateEntity(null, SchemaTemplateContext.composition, schemaTemplateInput);
268   }
269
270 }