ea2d068bfd02715b562ba989a718e0c97d75a45a
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / test / java / org / openecomp / sdc / vendorsoftwareproduct / services / impl / CandidateServiceImplTest.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.services.impl;
22
23 import static org.mockito.Mockito.doReturn;
24 import static org.testng.Assert.assertEquals;
25 import static org.testng.Assert.assertTrue;
26
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.List;
30 import java.util.Optional;
31 import org.apache.commons.collections4.CollectionUtils;
32 import org.mockito.InjectMocks;
33 import org.mockito.Mock;
34 import org.mockito.MockitoAnnotations;
35 import org.openecomp.core.utilities.json.JsonUtil;
36 import org.openecomp.sdc.common.errors.Messages;
37 import org.openecomp.sdc.datatypes.error.ErrorMessage;
38 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
39 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
40 import org.openecomp.sdc.heat.datatypes.structure.HeatStructureTree;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
42 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.ManifestCreator;
43 import org.openecomp.sdc.vendorsoftwareproduct.services.impl.filedatastructuremodule.CandidateServiceImpl;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Module;
46 import org.openecomp.sdc.versioning.dao.types.Version;
47 import org.testng.Assert;
48 import org.testng.annotations.BeforeMethod;
49 import org.testng.annotations.Test;
50
51 /**
52  * @author Avrahamg
53  * @since November 09, 2016
54  */
55 public class CandidateServiceImplTest {
56   @Mock
57   private ManifestCreator manifestCreatorMock;
58   @InjectMocks
59   private CandidateServiceImpl candidateService;
60
61   @BeforeMethod
62   public void setUp() throws Exception {
63     MockitoAnnotations.initMocks(this);
64   }
65
66   @Test
67   public void shouldReturnOptionalPresentIfInputStreamIsNull() {
68     assertTrue(candidateService.validateNonEmptyFileToUpload(null, "zip").isPresent());
69   }
70
71   // end validateNonEmptyFileToUpload tests
72   // start validateNonEmptyFileToUpload tests
73   @Test
74   public void shouldReturnOptionalEmptyIfUploadedFileDataIsNotNull() {
75     assertEquals(candidateService.validateRawZipData("zip", new byte[]{}), Optional.empty());
76   }
77
78   @Test
79   public void shouldReturnOptionalPresentIfUploadedFileDataIsNull() {
80     assertTrue(candidateService.validateRawZipData("zip", null).isPresent());
81   }
82   // end validateNonEmptyFileToUpload tests
83   // start heatStructureTreeToFileDataStructure tests
84
85   @Test
86   public void shouldValidateManifestInZipMatchesFileDataStructureFromDB() {
87     VspDetails vspDetails = new VspDetails("vspTest", null);
88     vspDetails.setName("vspTest");
89     vspDetails.setDescription("Test description");
90     vspDetails.setVersion(new Version(0, 1));
91     //vspDetails.setOnboardingMethod(VSPCommon.OnboardingMethod.HEAT.name());
92     vspDetails.setOnboardingMethod("HEAT");
93
94     FilesDataStructure structure =
95         JsonUtil.json2Object(getExpectedJson(), FilesDataStructure.class);
96
97     Optional<ManifestContent> expectedManifest = getExpectedManifestJson();
98     doReturn(expectedManifest)
99         .when(manifestCreatorMock).createManifest(vspDetails, structure);
100
101     String expectedManifestJson = JsonUtil.object2Json(expectedManifest.get());
102     String actualManifest = candidateService.createManifest(vspDetails, structure);
103     Assert.assertEquals(actualManifest, expectedManifestJson);
104   }
105
106   @Test
107   public void shouldReturnValidationErrorOnMissingfModule() {
108     FilesDataStructure filesDataStructure = new FilesDataStructure();
109     filesDataStructure.setArtifacts(Collections.singletonList("artifact.sh"));
110
111     Optional<List<ErrorMessage>> validateErrors =
112         candidateService.validateFileDataStructure(filesDataStructure);
113     assertValidationErrorIsAsExpected(validateErrors, 1, Messages.NO_MODULES_IN_MANIFEST
114         .getErrorMessage());
115   }
116
117   @Test
118   public void shouldReturnValidationErrorOnVolumeEnvWithoutVolumeYaml() {
119     FilesDataStructure filesDataStructure = new FilesDataStructure();
120     Module module = new Module();
121     module.setName("test");
122     module.setYaml("base_file.yml");
123     module.setVolEnv("vol_env.env");
124     filesDataStructure.setModules(Collections.singletonList(module));
125
126     Optional<List<ErrorMessage>> validateErrors =
127         candidateService.validateFileDataStructure(filesDataStructure);
128     assertValidationErrorIsAsExpected(validateErrors, 1, String.format(Messages
129         .MODULE_IN_MANIFEST_VOL_ENV_NO_VOL.getErrorMessage(), module.getName()));
130   }
131
132   @Test
133   public void shouldReturnValidationErrorOnModuleWithoutYaml() {
134     FilesDataStructure filesDataStructure = new FilesDataStructure();
135     Module module = new Module();
136     module.setName("test");
137     filesDataStructure.setModules(Collections.singletonList(module));
138
139     Optional<List<ErrorMessage>> validateErrors =
140         candidateService.validateFileDataStructure(filesDataStructure);
141     assertValidationErrorIsAsExpected(validateErrors, 1, String.format(Messages
142         .MODULE_IN_MANIFEST_NO_YAML.getErrorMessage(), module.getName()));
143   }
144
145   private void assertValidationErrorIsAsExpected(Optional<List<ErrorMessage>> validateErrors,
146                                                  int errorListSize, String expectedErrorMessage) {
147     if (validateErrors.isPresent()) {
148       List<ErrorMessage> errorMessages = validateErrors.get();
149       Assert.assertEquals(errorMessages.size(), errorListSize);
150       Assert.assertEquals(errorMessages.get(0).getMessage(), expectedErrorMessage);
151     }
152   }
153
154   private String getExpectedJson() {
155     return "{\n" +
156         "  \"modules\": [\n" +
157         "    {\n" +
158         "      \"isBase\": false,\n" +
159         "      \"yaml\": \"file2.yaml\"\n" +
160         "    },\n" +
161         "    {\n" +
162         "      \"isBase\": true,\n" +
163         "      \"yaml\": \"file1.yaml\",\n" +
164         "      \"vol\": \"file1_vol.yaml\",\n" +
165         "      \"volEnv\": \"file1.env\"\n" +
166         "    }\n" +
167         "  ],\n" +
168         "  \"unassigned\": [\n" +
169         "    \"file3.yml\"\n" +
170         "  ],\n" +
171         "  \"artifacts\": [\n" +
172         "    \"file2.sh\"\n" +
173         "  ],\n" +
174         "  \"nested\": []\n" +
175         "}";
176   }
177
178   private Optional<ManifestContent> getExpectedManifestJson() {
179     ManifestContent mock = new ManifestContent();
180     mock.setDescription("Test description");
181     mock.setName("vspTest");
182     mock.setVersion("0.1");
183
184
185     List<FileData> mockFileData = new ArrayList<>();
186     FileData fileData = createFileData("file2.yaml", false, FileData.Type.HEAT, null);
187     mockFileData.add(fileData);
188     fileData = createFileData("file1.yaml", true, FileData.Type.HEAT, null);
189     mockFileData.add(fileData);
190     fileData = createFileData("file1_vol.yaml", null, FileData.Type.HEAT_VOL, fileData);
191     fileData = createFileData("file1.env", null, FileData.Type.HEAT_ENV,
192         mockFileData.get(1).getData().get(0));
193     mockFileData.add(createFileData("file2.sh", null, FileData.Type.OTHER, null));
194     mockFileData.add(createFileData("file3.yml", null, FileData.Type.OTHER, null));
195     mock.setData(mockFileData);
196     return Optional.of(mock);
197   }
198
199   private FileData createFileData(String fileName, Boolean isBase, FileData.Type fileType,
200                                   FileData fileDataToAddTo) {
201     FileData fileData = new FileData();
202     fileData.setFile(fileName);
203     if (isBase != null) {
204       fileData.setBase(isBase);
205     }
206     fileData.setType(fileType);
207     addFileDataToList(fileDataToAddTo, fileData);
208     return fileData;
209   }
210
211   private void addFileDataToList(FileData fileDataToAddTo, FileData fileData) {
212     if (fileDataToAddTo != null) {
213       List<FileData> list = fileDataToAddTo.getData();
214       if (CollectionUtils.isEmpty(list)) {
215         list = new ArrayList<>();
216       }
217       list.add(fileData);
218       fileDataToAddTo.setData(list);
219
220     }
221   }
222
223   private HeatStructureTree createHeatWithEnvAndVolIncludeVolEnv() {
224     HeatStructureTree heat1 = createBasicHeatTree("file1.yaml", true, FileData.Type.HEAT);
225     addEnvToHeat(heat1, "file1.env");
226     HeatStructureTree heat1Vol =
227         createBasicHeatTree("file1_vol.yaml", false, FileData.Type.HEAT_VOL);
228     addEnvToHeat(heat1Vol, "file1_vol.env");
229     heat1.addVolumeFileToVolumeList(heat1Vol);
230     return heat1;
231   }
232
233   private void addEnvToHeat(HeatStructureTree toAddHeat, String envFileName) {
234     HeatStructureTree heat1Env = createBasicHeatTree(envFileName, false, FileData.Type.HEAT_ENV);
235     toAddHeat.setEnv(heat1Env);
236   }
237
238   private HeatStructureTree createBasicHeatTree(String fileName, boolean isBase,
239                                                 FileData.Type type) {
240     HeatStructureTree heat = new HeatStructureTree();
241     heat.setFileName(fileName);
242     heat.setBase(isBase);
243     heat.setType(type);
244     return heat;
245   }
246
247 }