2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.tosca;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.junit.jupiter.api.Assertions.assertFalse;
25 import static org.junit.jupiter.api.Assertions.assertNotNull;
26 import static org.junit.jupiter.api.Assertions.assertThrows;
27 import static org.junit.jupiter.api.Assertions.assertTrue;
28 import static org.junit.jupiter.api.Assertions.fail;
29 import static org.openecomp.sdc.be.tosca.ComponentCache.MergeStrategy.overwriteIfSameVersions;
30 import static org.openecomp.sdc.be.tosca.ComponentCache.entry;
32 import fj.data.Either;
34 import java.io.IOException;
35 import java.io.InputStream;
36 import java.nio.ByteBuffer;
37 import java.nio.file.Files;
38 import java.nio.file.Path;
39 import java.nio.file.Paths;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.HashMap;
43 import java.util.HashSet;
44 import java.util.List;
46 import java.util.Map.Entry;
47 import java.util.Objects;
48 import java.util.Optional;
50 import java.util.zip.ZipEntry;
51 import java.util.zip.ZipOutputStream;
52 import mockit.Deencapsulation;
53 import org.apache.commons.collections.CollectionUtils;
54 import org.apache.commons.io.IOUtils;
55 import org.apache.commons.io.output.ByteArrayOutputStream;
56 import org.apache.commons.lang3.tuple.ImmutablePair;
57 import org.apache.commons.lang3.tuple.ImmutableTriple;
58 import org.apache.commons.lang3.tuple.Triple;
59 import org.junit.jupiter.api.BeforeAll;
60 import org.junit.jupiter.api.BeforeEach;
61 import org.junit.jupiter.api.Test;
62 import org.mockito.InjectMocks;
63 import org.mockito.Mock;
64 import org.mockito.Mockito;
65 import org.mockito.MockitoAnnotations;
66 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
67 import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
68 import org.openecomp.sdc.be.config.ConfigurationManager;
69 import org.openecomp.sdc.be.dao.api.ActionStatus;
70 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
71 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
72 import org.openecomp.sdc.be.dao.cassandra.SdcSchemaFilesCassandraDao;
73 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
74 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
75 import org.openecomp.sdc.be.impl.ComponentsUtils;
76 import org.openecomp.sdc.be.model.ArtifactDefinition;
77 import org.openecomp.sdc.be.model.Component;
78 import org.openecomp.sdc.be.model.ComponentInstance;
79 import org.openecomp.sdc.be.model.LifecycleStateEnum;
80 import org.openecomp.sdc.be.model.Resource;
81 import org.openecomp.sdc.be.model.Service;
82 import org.openecomp.sdc.be.model.User;
83 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
84 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
85 import org.openecomp.sdc.be.resources.data.DAOArtifactData;
86 import org.openecomp.sdc.be.resources.data.SdcSchemaFilesData;
87 import org.openecomp.sdc.be.tosca.ComponentCache.CacheEntry;
88 import org.openecomp.sdc.be.tosca.CsarUtils.NonMetaArtifactInfo;
89 import org.openecomp.sdc.be.tosca.model.ToscaTemplate;
90 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
91 import org.openecomp.sdc.common.api.ConfigurationSource;
92 import org.openecomp.sdc.common.impl.ExternalConfiguration;
93 import org.openecomp.sdc.common.impl.FSConfigurationSource;
94 import org.openecomp.sdc.common.test.BaseConfDependent;
95 import org.openecomp.sdc.exception.ResponseFormat;
97 class CsarUtilsTest extends BaseConfDependent {
99 private final List<String> nodesFromPackage = Arrays.asList("tosca.nodes.Root", "tosca.nodes.Container.Application");
100 private final byte[] contentData;
102 private CsarUtils testSubject;
104 private CommonCsarGenerator commonCsarGenerator;
106 private ArtifactCassandraDao artifactCassandraDao;
108 private ComponentsUtils componentsUtils;
110 private ToscaExportHandler toscaExportUtils;
112 private SdcSchemaFilesCassandraDao sdcSchemaFilesCassandraDao;
114 private ToscaOperationFacade toscaOperationFacade;
116 private ArtifactsBusinessLogic artifactsBusinessLogic;
118 public CsarUtilsTest() throws IOException {
119 contentData = getFileResource("yamlValidation/resource-serviceTemplate.yml");
123 public static void setupBeforeClass() {
124 componentName = "catalog-be";
125 confPath = "src/test/resources/config";
129 private static void initConfigurationManager() {
130 final String confPath = new File(Objects
132 CsarUtilsTest.class.getClassLoader().getResource("config/catalog-be/configuration.yaml"))
133 .getFile()).getParent();
134 final ConfigurationSource confSource =
135 new FSConfigurationSource(ExternalConfiguration.getChangeListener(), confPath);
136 new ConfigurationManager(confSource);
140 public void setUpMock() {
141 ExternalConfiguration.setAppName("catalog-be");
142 MockitoAnnotations.openMocks(this);
143 initConfigurationManager();
147 void testCreateCsar() throws IOException {
148 Component component = new Resource();
149 Map<String, ArtifactDefinition> artifactDefinitionHashMap = new HashMap<>();
150 ArtifactDefinition artifact = new ArtifactDefinition();
151 artifact.setArtifactName("artifactName");
152 artifact.setEsId("esId");
153 artifactDefinitionHashMap.put("assettoscatemplate", artifact);
155 component.setToscaArtifacts(artifactDefinitionHashMap);
156 component.setArtifacts(artifactDefinitionHashMap);
157 component.setDeploymentArtifacts(artifactDefinitionHashMap);
159 ByteArrayOutputStream out = new ByteArrayOutputStream();
160 ZipOutputStream zip = new ZipOutputStream(out);
162 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class)))
163 .thenReturn(Either.right(CassandraOperationStatus.GENERAL_ERROR));
165 Mockito.when(componentsUtils.convertFromStorageResponse(Mockito.any(StorageOperationStatus.class)))
166 .thenReturn(ActionStatus.GENERAL_ERROR);
168 assertNotNull(commonCsarGenerator.generateCsarZip(component, false, zip,
170 "Definitions/", true, false).right());
174 void testCreateCsarWithGenerateCsarZipResponseIsLeft() throws IOException {
175 Component component = new Resource();
176 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
177 ArtifactDefinition artifact = new ArtifactDefinition();
178 artifact.setArtifactName("artifactName");
179 artifact.setEsId("esId");
180 artifact.setArtifactUUID("artifactUUID");
181 artifact.setArtifactType("YANG");
182 toscaArtifacts.put("assettoscatemplate", artifact);
184 component.setToscaArtifacts(toscaArtifacts);
185 component.setDeploymentArtifacts(toscaArtifacts);
186 component.setArtifacts(toscaArtifacts);
187 DAOArtifactData artifactData = new DAOArtifactData();
188 byte[] data = "value".getBytes();
189 ByteBuffer bufferData = ByteBuffer.wrap(data);
190 artifactData.setData(bufferData);
192 ToscaTemplate toscaTemplate = new ToscaTemplate("version");
193 List<Triple<String, String, Component>> dependencies = new ArrayList<>();
194 toscaTemplate.setDependencies(dependencies);
196 List<SdcSchemaFilesData> filesData = new ArrayList<>();
197 SdcSchemaFilesData filedata = new SdcSchemaFilesData();
198 filedata.setPayloadAsArray(data);
199 filesData.add(filedata);
201 ByteArrayOutputStream out = new ByteArrayOutputStream();
202 ZipOutputStream zip = new ZipOutputStream(out);
204 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
206 Mockito.when(componentsUtils.convertFromStorageResponse(Mockito.any(StorageOperationStatus.class)))
207 .thenReturn(ActionStatus.GENERAL_ERROR);
209 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
210 .thenReturn(Either.left(toscaTemplate));
213 sdcSchemaFilesCassandraDao.getSpecificSchemaFiles(Mockito.any(String.class), Mockito.any(String.class)))
214 .thenReturn(Either.left(filesData));
216 assertNotNull(commonCsarGenerator.generateCsarZip(component, false, zip,
218 "Definitions/", true, false).right());
222 void testPopulateZipWhenGetDependenciesIsRight() {
223 Component component = new Service();
224 boolean getFromCS = false;
226 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
227 ArtifactDefinition artifact = new ArtifactDefinition();
228 artifact.setArtifactName("artifactName");
229 artifact.setEsId("esId");
230 artifact.setArtifactUUID("artifactUUID");
231 artifact.setArtifactType("YANG");
232 toscaArtifacts.put("assettoscatemplate", artifact);
234 component.setToscaArtifacts(toscaArtifacts);
235 component.setDeploymentArtifacts(toscaArtifacts);
236 component.setArtifacts(toscaArtifacts);
237 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
238 DAOArtifactData artifactData = new DAOArtifactData();
239 byte[] data = "value".getBytes();
240 ByteBuffer bufferData = ByteBuffer.wrap(data);
241 artifactData.setData(bufferData);
243 ToscaRepresentation tosca = ToscaRepresentation.make("value".getBytes());
245 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
247 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class))).thenReturn(Either.left(tosca));
249 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
250 .thenReturn(Either.right(ToscaError.GENERAL_ERROR));
252 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
253 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, true, "Definitions/", true, false);
254 } catch (Exception e) {
260 void testPopulateZipWhenExportComponentIsRight() {
261 Component component = new Resource();
262 boolean getFromCS = false;
264 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
265 ArtifactDefinition artifact = new ArtifactDefinition();
266 artifact.setArtifactName("artifactName");
267 artifact.setEsId("esId");
268 artifact.setArtifactUUID("artifactUUID");
269 artifact.setArtifactType("YANG");
270 toscaArtifacts.put("assettoscatemplate", artifact);
272 component.setToscaArtifacts(toscaArtifacts);
273 component.setDeploymentArtifacts(toscaArtifacts);
274 component.setArtifacts(toscaArtifacts);
275 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
276 DAOArtifactData artifactData = new DAOArtifactData();
277 byte[] data = "value".getBytes();
278 ByteBuffer bufferData = ByteBuffer.wrap(data);
279 artifactData.setData(bufferData);
281 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class)))
282 .thenReturn(Either.right(ToscaError.GENERAL_ERROR));
284 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
285 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, true, "Definitions/", true, false);
286 } catch (Exception e) {
292 void testPopulateZipWhenComponentIsServiceAndCollectComponentCsarDefinitionIsRight() {
293 Component component = new Service();
294 boolean getFromCS = false;
296 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
297 ArtifactDefinition artifact = new ArtifactDefinition();
298 artifact.setArtifactName("artifactName");
299 artifact.setEsId("esId");
300 artifact.setArtifactUUID("artifactUUID");
301 artifact.setArtifactType("YANG");
302 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
303 artifact.setDescription("description");
304 artifact.setArtifactLabel("artifactLabel");
305 toscaArtifacts.put("assettoscatemplate", artifact);
307 component.setToscaArtifacts(toscaArtifacts);
308 component.setDeploymentArtifacts(toscaArtifacts);
309 component.setArtifacts(toscaArtifacts);
310 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
311 component.setVersion("1.0");
312 component.setLastUpdaterUserId("userId");
313 component.setUniqueId("uid");
314 DAOArtifactData artifactData = new DAOArtifactData();
315 ByteBuffer bufferData = ByteBuffer.wrap(contentData);
316 artifactData.setData(bufferData);
318 List<SdcSchemaFilesData> filesData = new ArrayList<>();
319 SdcSchemaFilesData filedata = new SdcSchemaFilesData();
320 filedata.setPayloadAsArray(contentData);
321 filesData.add(filedata);
323 ToscaTemplate toscaTemplate = new ToscaTemplate("version");
324 List<Triple<String, String, Component>> dependencies = new ArrayList<>();
325 Triple<String, String, Component> triple = Triple.of("fileName", "cassandraId", component);
326 dependencies.add(triple);
327 toscaTemplate.setDependencies(dependencies);
329 ToscaRepresentation tosca = ToscaRepresentation.make("value".getBytes());
331 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
333 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class))).thenReturn(Either.left(tosca));
335 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
336 .thenReturn(Either.left(toscaTemplate));
339 sdcSchemaFilesCassandraDao.getSpecificSchemaFiles(Mockito.any(String.class), Mockito.any(String.class)))
340 .thenReturn(Either.left(filesData));
342 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class)))
343 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
345 Mockito.when(artifactsBusinessLogic.validateUserExists(Mockito.any(User.class))).thenReturn(new User());
348 Mockito.when(artifactsBusinessLogic.validateAndHandleArtifact(Mockito.any(String.class),
349 Mockito.any(ComponentTypeEnum.class), Mockito.any(ArtifactOperationInfo.class), Mockito.isNull(),
350 Mockito.any(ArtifactDefinition.class), Mockito.any(String.class), Mockito.any(String.class),
351 Mockito.isNull(), Mockito.isNull(), Mockito.any(User.class), Mockito.any(Component.class),
352 Mockito.any(Boolean.class), Mockito.any(Boolean.class), Mockito.any(Boolean.class)))
353 .thenReturn(Either.left(Mockito.any(ArtifactDefinition.class)));
355 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
356 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, true, "/Definitions", true, false);
357 } catch (Exception e) {
363 void testPopulateZipWhenGetEntryDataIsRight() {
364 Component component = new Service();
365 boolean getFromCS = true;
367 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
368 ArtifactDefinition artifact = new ArtifactDefinition();
369 artifact.setArtifactName("artifactName");
370 artifact.setEsId("esId");
371 artifact.setArtifactUUID("artifactUUID");
372 artifact.setArtifactType("YANG");
373 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
374 artifact.setDescription("description");
375 artifact.setArtifactLabel("artifactLabel");
376 toscaArtifacts.put("assettoscatemplate", artifact);
378 component.setToscaArtifacts(toscaArtifacts);
379 component.setDeploymentArtifacts(toscaArtifacts);
380 component.setArtifacts(toscaArtifacts);
381 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
382 component.setVersion("1.0");
383 component.setLastUpdaterUserId("userId");
384 component.setUniqueId("uid");
385 DAOArtifactData artifactData = new DAOArtifactData();
386 byte[] data = "value".getBytes();
387 ByteBuffer bufferData = ByteBuffer.wrap(data);
388 artifactData.setData(bufferData);
390 ToscaTemplate toscaTemplate = new ToscaTemplate("version");
391 List<Triple<String, String, Component>> dependencies = new ArrayList<>();
392 Triple<String, String, Component> triple = Triple.of("fileName", "", component);
393 dependencies.add(triple);
394 toscaTemplate.setDependencies(dependencies);
396 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
398 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class)))
399 .thenReturn(Either.right(ToscaError.GENERAL_ERROR));
401 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
402 .thenReturn(Either.left(toscaTemplate));
404 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
405 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, true, "Definitions/", true, false);
406 } catch (Exception e) {
412 void testPopulateZipWhenGetEntryDataOfInnerComponentIsRight() {
413 Component component = new Service();
414 boolean getFromCS = false;
416 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
417 ArtifactDefinition artifact = new ArtifactDefinition();
418 artifact.setArtifactName("artifactName");
419 artifact.setEsId("esId");
420 artifact.setArtifactUUID("artifactUUID");
421 artifact.setArtifactType("YANG");
422 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
423 artifact.setDescription("description");
424 artifact.setArtifactLabel("artifactLabel");
425 toscaArtifacts.put("assettoscatemplate", artifact);
427 component.setToscaArtifacts(toscaArtifacts);
428 component.setDeploymentArtifacts(toscaArtifacts);
429 component.setArtifacts(toscaArtifacts);
430 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
431 component.setVersion("1.0");
432 component.setLastUpdaterUserId("userId");
433 component.setUniqueId("uid");
434 DAOArtifactData artifactData = new DAOArtifactData();
435 ByteBuffer bufferData = ByteBuffer.wrap(contentData);
436 artifactData.setData(bufferData);
438 ToscaTemplate toscaTemplate = new ToscaTemplate("version");
439 List<Triple<String, String, Component>> dependencies = new ArrayList<>();
440 Triple<String, String, Component> triple = Triple.of("fileName", "", component);
441 dependencies.add(triple);
442 toscaTemplate.setDependencies(dependencies);
444 ToscaRepresentation tosca = ToscaRepresentation.make(contentData);
446 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
448 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class))).thenReturn(Either.left(tosca),
449 Either.left(tosca), Either.right(ToscaError.GENERAL_ERROR));
451 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
452 .thenReturn(Either.left(toscaTemplate));
454 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
455 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, true, "Definitions/", true, false);
456 } catch (Exception e) {
462 void testPopulateZipWhenLatestSchemaFilesFromCassandraIsRight() {
463 Component component = new Service();
464 boolean getFromCS = false;
466 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
467 ArtifactDefinition artifact = new ArtifactDefinition();
468 artifact.setArtifactName("artifactName");
469 artifact.setEsId("esId");
470 artifact.setArtifactUUID("artifactUUID");
471 artifact.setArtifactType("YANG");
472 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
473 artifact.setDescription("description");
474 artifact.setArtifactLabel("artifactLabel");
475 toscaArtifacts.put("assettoscatemplate", artifact);
477 component.setToscaArtifacts(toscaArtifacts);
478 component.setDeploymentArtifacts(toscaArtifacts);
479 component.setArtifacts(toscaArtifacts);
480 component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
481 component.setVersion("1.0");
482 component.setLastUpdaterUserId("userId");
483 component.setUniqueId("uid");
484 DAOArtifactData artifactData = new DAOArtifactData();
485 ByteBuffer bufferData = ByteBuffer.wrap(contentData);
486 artifactData.setData(bufferData);
488 ToscaTemplate toscaTemplate = new ToscaTemplate("version");
489 List<Triple<String, String, Component>> dependencies = new ArrayList<>();
490 Triple<String, String, Component> triple = Triple.of("fileName", "", component);
491 dependencies.add(triple);
492 toscaTemplate.setDependencies(dependencies);
494 ToscaRepresentation tosca = ToscaRepresentation.make(contentData);
496 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class))).thenReturn(Either.left(artifactData));
498 Mockito.when(toscaExportUtils.exportComponent(Mockito.any(Component.class))).thenReturn(Either.left(tosca));
500 Mockito.when(toscaExportUtils.getDependencies(Mockito.any(Component.class)))
501 .thenReturn(Either.left(toscaTemplate));
504 sdcSchemaFilesCassandraDao.getSpecificSchemaFiles(Mockito.any(String.class), Mockito.any(String.class)))
505 .thenReturn(Either.right(CassandraOperationStatus.GENERAL_ERROR));
507 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out);) {
508 Deencapsulation.invoke(commonCsarGenerator, "generateCsarZip", component, getFromCS, zip, true, "toscaMetaFileName", true, "Definitions/",
510 } catch (Exception e) {
516 void testAddInnerComponentsToCache() {
517 ComponentCache componentCache = ComponentCache.overwritable(overwriteIfSameVersions());
518 Component childComponent = new Resource();
519 Component componentRI = new Service();
520 List<ComponentInstance> componentInstances = new ArrayList<>();
521 ComponentInstance instance = new ComponentInstance();
522 instance.setComponentUid("resourceUid");
523 componentInstances.add(instance);
524 childComponent.setComponentInstances(componentInstances);
526 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
527 ArtifactDefinition artifact = new ArtifactDefinition();
528 artifact.setArtifactName("artifactName");
529 artifact.setEsId("esId");
530 artifact.setArtifactUUID("artifactUUID");
531 artifact.setArtifactType("YANG");
532 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
533 artifact.setDescription("description");
534 artifact.setArtifactLabel("artifactLabel");
535 toscaArtifacts.put("assettoscatemplate", artifact);
537 componentRI.setToscaArtifacts(toscaArtifacts);
539 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class)))
540 .thenReturn(Either.left(componentRI));
542 Deencapsulation.invoke(commonCsarGenerator, "addInnerComponentsToCache", componentCache, childComponent);
544 io.vavr.collection.List<CacheEntry> expected = io.vavr.collection.List.of(entry("esId", "artifactName", componentRI));
545 assertEquals(expected, componentCache.all().toList());
549 void testAddInnerComponentsToCacheWhenGetToscaElementIsRight() {
550 Map<String, ImmutableTriple<String, String, Component>> componentCache = new HashMap<>();
551 Component childComponent = new Resource();
553 List<ComponentInstance> componentInstances = new ArrayList<>();
554 ComponentInstance instance = new ComponentInstance();
555 instance.setComponentUid("abc");
556 componentInstances.add(instance);
557 childComponent.setComponentInstances(componentInstances);
559 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
560 ArtifactDefinition artifact = new ArtifactDefinition();
561 artifact.setArtifactName("artifactName");
562 artifact.setEsId("esId");
563 artifact.setArtifactUUID("artifactUUID");
564 artifact.setArtifactType("YANG");
565 artifact.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
566 artifact.setDescription("description");
567 artifact.setArtifactLabel("artifactLabel");
568 toscaArtifacts.put("assettoscatemplate", artifact);
570 Component componentRI = new Service();
572 componentRI.setToscaArtifacts(toscaArtifacts);
574 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class)))
575 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
578 assertTrue(componentCache.isEmpty());
582 void testWriteComponentInterface() throws IOException {
583 String fileName = "name.hello";
584 ToscaRepresentation tosca = ToscaRepresentation.make("value".getBytes());
586 Mockito.when(toscaExportUtils.exportComponentInterface(Mockito.any(Component.class), Mockito.any(Boolean.class)))
587 .thenReturn(Either.left(tosca));
590 try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out)) {
591 List<Triple<String, String, Component>> output = Deencapsulation.invoke(commonCsarGenerator, "writeComponentInterface", new Resource(),
592 zip, fileName, "Definitions/");
593 assertNotNull(output);
598 void testGetEntryData() {
599 String cassandraId = "id";
600 Component childComponent = new Resource();
602 Mockito.when(artifactCassandraDao.getArtifact(Mockito.any(String.class)))
603 .thenReturn(Either.right(CassandraOperationStatus.GENERAL_ERROR));
605 Either<byte[], ActionStatus> output = Deencapsulation.invoke(commonCsarGenerator, "getEntryData", cassandraId, childComponent);
607 assertNotNull(output);
608 assertTrue(output.isRight());
612 void testGetLatestSchemaFilesFromCassandraWhenListOfSchemasIsEmpty() {
613 List<SdcSchemaFilesData> filesData = new ArrayList<>();
616 sdcSchemaFilesCassandraDao.getSpecificSchemaFiles(Mockito.any(String.class), Mockito.any(String.class)))
617 .thenReturn(Either.left(filesData));
619 Either<byte[], ResponseFormat> output = Deencapsulation.invoke(commonCsarGenerator, "getLatestSchemaFilesFromCassandra");
621 assertNotNull(output);
622 assertTrue(output.isRight());
626 void testExtractVfcsArtifactsFromCsar() {
627 String key = "Artifacts/org.openecomp.resource.some/Deployment/to/resource";
628 byte[] data = "value".getBytes();
630 Map<String, byte[]> csar = new HashMap<>();
633 Map<String, List<ArtifactDefinition>> output = CsarUtils.extractVfcsArtifactsFromCsar(csar);
635 assertNotNull(output);
636 assertTrue(output.containsKey("org.openecomp.resource.some"));
637 assertEquals(1, output.get("org.openecomp.resource.some").size());
641 void testAddExtractedVfcArtifactWhenArtifactsContainsExtractedArtifactKey() {
642 ImmutablePair<String, ArtifactDefinition> extractedVfcArtifact = new ImmutablePair<String, ArtifactDefinition>(
643 "key", new ArtifactDefinition());
644 Map<String, List<ArtifactDefinition>> artifacts = new HashMap<>();
645 artifacts.put("key", new ArrayList<>());
647 Deencapsulation.invoke(testSubject, "addExtractedVfcArtifact", extractedVfcArtifact, artifacts);
649 assertEquals(1, artifacts.get("key").size());
653 void testAddExtractedVfcArtifactWhenArtifactsDoesntContainsExtractedArtifactKey() {
654 ImmutablePair<String, ArtifactDefinition> extractedVfcArtifact = new ImmutablePair<String, ArtifactDefinition>(
655 "key", new ArtifactDefinition());
656 Map<String, List<ArtifactDefinition>> artifacts = new HashMap<>();
657 artifacts.put("key1", new ArrayList<>());
659 Deencapsulation.invoke(testSubject, "addExtractedVfcArtifact", extractedVfcArtifact, artifacts);
661 assertEquals(0, artifacts.get("key1").size());
662 assertEquals(1, artifacts.get("key").size());
663 assertEquals(2, artifacts.size());
667 void testExtractVfcArtifact() {
668 String path = "path/to/informational/artificat";
669 Map<String, byte[]> map = new HashMap<>();
670 map.put(path, "value".getBytes());
671 Entry<String, byte[]> entry = map.entrySet().iterator().next();
673 Optional<ImmutablePair<String, ArtifactDefinition>> output =
674 Deencapsulation.invoke(testSubject, "extractVfcArtifact", entry, new HashMap<>());
676 if (output.isPresent()) {
677 assertEquals("to", output.get().left);
679 fail("`output` is empty!");
684 void testDetectArtifactGroupTypeWithExceptionBeingCaught() {
685 Either<ArtifactGroupTypeEnum, Boolean> output = Deencapsulation.invoke(testSubject, "detectArtifactGroupType", "type", Map.class);
687 assertNotNull(output);
688 assertTrue(output.isRight());
689 assertFalse(output.right().value());
693 void testDetectArtifactGroupTypeWWhenCollectedWarningMessagesContainesKey() {
694 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
696 collectedWarningMessages.put("Warning - unrecognized artifact group type {} was received.", new HashSet<>());
697 Either<ArtifactGroupTypeEnum, Boolean> output =
698 Deencapsulation.invoke(testSubject, "detectArtifactGroupType", "type", collectedWarningMessages);
700 assertNotNull(output);
701 assertTrue(output.isRight());
702 assertFalse(output.right().value());
706 void testValidateNonMetaArtifactWithExceptionCaught() {
707 CsarUtils.validateNonMetaArtifact("", new byte[0], new HashMap<>());
711 void testCollectComponentCsarDefinitionWhenComponentIsServiceAndGetToscaElementIsLeft() {
712 Component component = new Service();
713 component.setUniqueId("uniqueId");
714 List<ComponentInstance> resourceInstances = new ArrayList<>();
715 ComponentInstance instance = new ComponentInstance();
716 instance.setComponentUid("resourceUid");
717 instance.setOriginType(OriginTypeEnum.SERVICE);
718 resourceInstances.add(instance);
719 component.setComponentInstances(resourceInstances);
721 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
722 ArtifactDefinition artifact = new ArtifactDefinition();
723 artifact.setArtifactName("artifactName");
724 artifact.setEsId("esId");
725 artifact.setArtifactUUID("artifactUUID");
726 artifact.setArtifactType("YANG");
727 toscaArtifacts.put("assettoscatemplate", artifact);
729 component.setToscaArtifacts(toscaArtifacts);
730 component.setDeploymentArtifacts(toscaArtifacts);
731 component.setArtifacts(toscaArtifacts);
733 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class))).thenReturn(Either.left(component),
734 Either.right(StorageOperationStatus.BAD_REQUEST));
736 Either<Object, ResponseFormat> output = Deencapsulation.invoke(testSubject, "collectComponentCsarDefinition", component);
738 assertNotNull(output);
739 assertTrue(output.isRight());
743 void testCollectComponentTypeArtifactsWhenFetchedComponentHasComponentInstances() {
744 Component component = new Service();
745 Component fetchedComponent = new Resource();
746 component.setUniqueId("uniqueId");
747 List<ComponentInstance> resourceInstances = new ArrayList<>();
748 ComponentInstance instance = new ComponentInstance();
749 instance.setComponentUid("resourceUid");
750 instance.setOriginType(OriginTypeEnum.SERVICE);
751 resourceInstances.add(instance);
752 component.setComponentInstances(resourceInstances);
753 fetchedComponent.setComponentInstances(resourceInstances);
755 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
756 ArtifactDefinition artifact = new ArtifactDefinition();
757 artifact.setArtifactName("artifactName");
758 artifact.setEsId("esId");
759 artifact.setArtifactUUID("artifactUUID");
760 artifact.setArtifactType("YANG");
761 toscaArtifacts.put("assettoscatemplate", artifact);
763 component.setToscaArtifacts(toscaArtifacts);
764 component.setDeploymentArtifacts(toscaArtifacts);
765 component.setArtifacts(toscaArtifacts);
767 fetchedComponent.setToscaArtifacts(toscaArtifacts);
768 fetchedComponent.setDeploymentArtifacts(toscaArtifacts);
769 fetchedComponent.setArtifacts(toscaArtifacts);
771 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class))).thenReturn(Either.left(component),
772 Either.left(fetchedComponent), Either.right(StorageOperationStatus.BAD_REQUEST));
774 Either<Object, ResponseFormat> output = Deencapsulation.invoke(testSubject, "collectComponentCsarDefinition", component);
776 assertNotNull(output);
777 assertTrue(output.isRight());
781 void testCollectComponentTypeArtifactsWhenFetchedComponentDontHaveComponentInstances() {
782 Component component = new Service();
783 Component fetchedComponent = new Resource();
784 component.setUniqueId("uniqueId");
785 List<ComponentInstance> resourceInstances = new ArrayList<>();
786 ComponentInstance instance = new ComponentInstance();
787 instance.setComponentUid("resourceUid");
788 instance.setOriginType(OriginTypeEnum.SERVICE);
790 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
791 ArtifactDefinition artifact = new ArtifactDefinition();
792 artifact.setArtifactName("artifactName");
793 artifact.setEsId("esId");
794 artifact.setArtifactUUID("artifactUUID");
795 artifact.setArtifactType("PLAN");
796 toscaArtifacts.put("assettoscatemplate", artifact);
798 instance.setDeploymentArtifacts(toscaArtifacts);
800 resourceInstances.add(instance);
801 component.setComponentInstances(resourceInstances);
803 component.setToscaArtifacts(toscaArtifacts);
804 component.setDeploymentArtifacts(toscaArtifacts);
805 component.setArtifacts(toscaArtifacts);
807 fetchedComponent.setToscaArtifacts(toscaArtifacts);
808 fetchedComponent.setDeploymentArtifacts(toscaArtifacts);
809 fetchedComponent.setArtifacts(toscaArtifacts);
811 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class))).thenReturn(Either.left(component),
812 Either.left(fetchedComponent));
814 Either<Object, ResponseFormat> output = Deencapsulation.invoke(testSubject, "collectComponentCsarDefinition", component);
816 assertNotNull(output);
817 assertTrue(output.isLeft());
821 void testValidateNonMetaArtifactHappyScenario() {
822 String artifactPath = "Artifacts/Deployment/YANG_XML/myYang.xml";
823 byte[] payloadData = "some payload data".getBytes();
824 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
825 Either<NonMetaArtifactInfo, Boolean> eitherNonMetaArtifact = CsarUtils.validateNonMetaArtifact(artifactPath,
826 payloadData, collectedWarningMessages);
827 assertTrue(eitherNonMetaArtifact.isLeft());
828 assertTrue(collectedWarningMessages.isEmpty());
830 artifactPath = "Artifacts/Informational/OTHER/someArtifact.xml";
831 eitherNonMetaArtifact = CsarUtils.validateNonMetaArtifact(artifactPath, payloadData, collectedWarningMessages);
832 assertTrue(eitherNonMetaArtifact.isLeft());
833 assertTrue(collectedWarningMessages.isEmpty());
837 void testValidateNonMetaArtifactScenarioWithWarnnings() {
838 String artifactPath = "Artifacts/Deployment/Buga/myYang.xml";
839 byte[] payloadData = "some payload data".getBytes();
840 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
841 Either<NonMetaArtifactInfo, Boolean> eitherNonMetaArtifact = CsarUtils.validateNonMetaArtifact(artifactPath,
842 payloadData, collectedWarningMessages);
843 assertTrue(eitherNonMetaArtifact.isLeft());
845 artifactPath = "Artifacts/Informational/Buga2/someArtifact.xml";
846 eitherNonMetaArtifact = CsarUtils.validateNonMetaArtifact(artifactPath, payloadData, collectedWarningMessages);
847 assertTrue(eitherNonMetaArtifact.isLeft());
849 assertEquals(1, collectedWarningMessages.size());
850 assertEquals(2, collectedWarningMessages.values().iterator().next().size());
854 void testValidateNonMetaArtifactUnhappyScenario() {
855 String artifactPath = "Artifacts/Buga/YANG_XML/myYang.xml";
856 byte[] payloadData = "some payload data".getBytes();
857 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
858 Either<NonMetaArtifactInfo, Boolean> eitherNonMetaArtifact = CsarUtils.validateNonMetaArtifact(artifactPath,
859 payloadData, collectedWarningMessages);
860 assertTrue(eitherNonMetaArtifact.isRight());
861 assertFalse(collectedWarningMessages.isEmpty());
865 void testAddSchemaFilesFromCassandraAddingDuplicatedEntry() throws IOException {
866 final String rootPath = System.getProperty("user.dir");
867 final Path path = Paths.get(rootPath + "/src/test/resources/sdc.zip");
868 final byte[] data = Files.readAllBytes(path);
869 try (final ByteArrayOutputStream out = new ByteArrayOutputStream(); final ZipOutputStream zip = new ZipOutputStream(out)) {
870 Deencapsulation.invoke(commonCsarGenerator, "addSchemaFilesFromCassandra", zip, data, nodesFromPackage, "Definitions/");
871 final IOException actualException = assertThrows(IOException.class, () -> zip.putNextEntry(new ZipEntry("Definitions/nodes.yml")));
872 assertEquals("duplicate entry: Definitions/nodes.yml", actualException.getMessage());
877 void testFindNonRootNodesFromPackage() {
878 final Resource resource = new Resource();
879 resource.setDerivedList(nodesFromPackage);
880 final Component component = resource;
881 final List<Triple<String, String, Component>> dependencies = new ArrayList<>();
882 final Triple<String, String, Component> triple = Triple.of("fileName", "cassandraId", component);
883 dependencies.add(triple);
884 final List<String> expectedResult = Arrays.asList("tosca.nodes.Container.Application");
885 final List<String> result = Deencapsulation.invoke(commonCsarGenerator,
886 "findNonRootNodesFromPackage", dependencies);
887 assertTrue(CollectionUtils.isNotEmpty(result));
888 assertEquals(expectedResult, result);
891 private byte[] getFileResource(final String filePath) throws IOException {
892 try (final InputStream inputStream = getFileResourceAsInputStream(filePath)) {
893 return IOUtils.toByteArray(inputStream);
897 private InputStream getFileResourceAsInputStream(final String filePath) {
898 return Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);