2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017-2018 European Software Marketing Ltd.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 package org.onap.aai.modelloader.notification;
23 import static org.hamcrest.CoreMatchers.is;
24 import static org.hamcrest.MatcherAssert.assertThat;
25 import static org.hamcrest.collection.IsEmptyCollection.empty;
26 import static org.junit.jupiter.api.Assertions.assertThrows;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.Mockito.doNothing;
29 import static org.mockito.Mockito.when;
30 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithInvalidType;
31 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithModelQuerySpec;
32 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneOfEach;
33 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneService;
34 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithToscaCsarFile;
36 import java.io.IOException;
37 import java.util.ArrayList;
38 import java.util.List;
39 import java.util.Properties;
40 import java.util.stream.Collectors;
42 import org.junit.jupiter.api.AfterEach;
43 import org.junit.jupiter.api.BeforeEach;
44 import org.junit.jupiter.api.Test;
45 import org.mockito.InjectMocks;
46 import org.mockito.Mock;
47 import org.mockito.Mockito;
48 import org.mockito.MockitoAnnotations;
49 import org.onap.aai.babel.service.data.BabelArtifact;
50 import org.onap.aai.modelloader.babel.BabelArtifactService;
51 import org.onap.aai.modelloader.entity.Artifact;
52 import org.onap.aai.modelloader.entity.catalog.VnfCatalogArtifact;
53 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
54 import org.onap.aai.modelloader.entity.model.ModelArtifact;
55 import org.onap.aai.modelloader.entity.model.NamedQueryArtifact;
56 import org.onap.aai.modelloader.extraction.InvalidArchiveException;
57 import org.onap.aai.modelloader.extraction.VnfCatalogExtractor;
58 import org.onap.aai.modelloader.restclient.BabelServiceClient;
59 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
60 import org.onap.aai.modelloader.util.ArtifactTestUtils;
61 import org.onap.sdc.api.IDistributionClient;
62 import org.onap.sdc.api.notification.IArtifactInfo;
63 import org.onap.sdc.api.notification.INotificationData;
64 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
65 import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
66 import org.onap.sdc.utils.DistributionActionResultEnum;
69 * Tests {@link ArtifactDownloadManager}.
71 public class TestArtifactDownloadManager {
73 private ArtifactDownloadManager downloadManager;
74 @Mock private BabelServiceClient mockBabelClient;
75 @Mock private IDistributionClient mockDistributionClient;
76 @Mock private NotificationPublisher mockNotificationPublisher;
77 @Mock private BabelArtifactConverter mockBabelArtifactConverter;
78 @InjectMocks BabelArtifactService babelArtifactService;
79 private VnfCatalogExtractor vnfCatalogExtractor;
82 public void setup() throws Exception {
83 MockitoAnnotations.openMocks(this);
84 vnfCatalogExtractor = new VnfCatalogExtractor();
86 Properties configProperties = new Properties();
87 configProperties.load(this.getClass().getClassLoader().getResourceAsStream("model-loader.properties"));
88 downloadManager = new ArtifactDownloadManager(mockDistributionClient,
89 mockNotificationPublisher, vnfCatalogExtractor, babelArtifactService);
93 public void tearDown() {
94 downloadManager = null;
95 mockDistributionClient = null;
96 mockNotificationPublisher = null;
100 * Test downloading zero artifacts from SDC.
104 public void testDownloadWithZeroArtifacts() throws Exception {
105 List<Artifact> artifacts = downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>());
106 assertThat(artifacts, is(empty()));
107 Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
108 mockBabelArtifactConverter);
112 public void testArtifactDownloadFails() {
113 INotificationData data = getNotificationDataWithOneService();
114 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
115 String errorMessage = "error msg";
116 when(mockDistributionClient.download(artifact)).thenReturn(
117 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
118 doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
121 assertThrows(DownloadFailureException.class,
122 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
124 Mockito.verify(mockDistributionClient).download(artifact);
125 Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
128 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
132 public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
133 INotificationData data = getNotificationDataWithToscaCsarFile();
134 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
135 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
136 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
137 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
138 when(mockBabelClient.postArtifact(any(), any())).thenThrow(new BabelServiceClientException(""));
139 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
141 assertThrows(ProcessToscaArtifactsException.class,
142 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
144 Mockito.verify(mockDistributionClient).download(artifact);
145 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
146 Mockito.verify(mockBabelClient).postArtifact(any(), any());
147 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
149 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
154 public void downloadArtifacts_invalidModelQuerySpec() {
155 INotificationData data = getNotificationDataWithModelQuerySpec();
156 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
158 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
160 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
161 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
162 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
164 assertThrows(BabelArtifactParsingException.class,
165 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
167 Mockito.verify(mockDistributionClient).download(artifact);
168 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
169 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
171 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
175 public void downloadArtifacts_validToscaCsarFile()
177 INotificationData data = getNotificationDataWithToscaCsarFile();
178 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
180 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
182 List<Artifact> artifacts = downloadManager.downloadArtifacts(data, data.getServiceArtifacts());
183 List<Artifact> modelArtifacts = artifacts.stream().filter(ModelArtifact.class::isInstance)
184 .collect(Collectors.toList());
185 List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
186 .collect(Collectors.toList());
187 assertThat(modelArtifacts.size(), is(1));
188 assertThat(catalogArtifacts.size(), is(1));
190 Mockito.verify(mockDistributionClient).download(artifactInfo);
191 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
192 Mockito.verify(mockBabelClient).postArtifact(any(), any());
193 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
194 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
197 private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
198 ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException, BabelArtifactParsingException {
199 when(mockDistributionClient.download(artifactInfo))
200 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
201 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
202 when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
204 when(mockBabelArtifactConverter.convertToModel(any(BabelArtifact.class))).thenReturn(List.of(new ModelArtifact()));
205 when(mockBabelArtifactConverter.convertToCatalog(any(BabelArtifact.class))).thenReturn(new VnfCatalogArtifact(""));
208 private List<BabelArtifact> createBabelArtifacts() {
209 List<BabelArtifact> artifactList = new ArrayList<>();
210 artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
211 artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
216 public void downloadArtifactsWithValidModelQuerySpec()
218 INotificationData data = getNotificationDataWithModelQuerySpec();
219 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
220 setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
222 List<Artifact> artifacts = downloadManager.downloadArtifacts(data, data.getServiceArtifacts());
223 List<Artifact> namedQueryArtifacts = artifacts.stream().filter(NamedQueryArtifact.class::isInstance)
224 .collect(Collectors.toList());
225 List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
226 .collect(Collectors.toList());
228 assertThat(namedQueryArtifacts.size(), is(1));
229 assertThat(catalogArtifacts, is(empty()));
231 Mockito.verify(mockDistributionClient).download(artifact);
232 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
234 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
237 private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
238 IArtifactInfo artifact) throws IOException {
239 when(mockDistributionClient.download(artifact))
240 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
241 artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
242 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
246 public void downloadArtifacts_validCsarAndModelFiles()
248 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
249 INotificationData data = getNotificationDataWithOneOfEach();
250 List<IArtifactInfo> artifactInfos = new ArrayList<>();
252 IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
253 IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
255 artifactInfos.add(serviceArtifact);
256 artifactInfos.add(modelSpecArtifact);
258 setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
259 setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
261 List<Artifact> artifacts = downloadManager.downloadArtifacts(data, artifactInfos);
262 List<Artifact> modelArtifacts = artifacts.stream().filter(artifact -> !(artifact instanceof VnfCatalogArtifact))
263 .collect(Collectors.toList());
264 List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
265 .collect(Collectors.toList());
266 assertThat(modelArtifacts.size(), is(2));
267 assertThat(catalogArtifacts.size(), is(1));
269 Mockito.verify(mockDistributionClient).download(serviceArtifact);
270 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
271 Mockito.verify(mockBabelClient).postArtifact(any(), any());
272 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
273 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
275 Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
276 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
279 Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
283 public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
284 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
285 INotificationData data = getNotificationDataWithToscaCsarFile();
286 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
288 when(mockDistributionClient.download(artifactInfo))
289 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
290 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
291 when(mockBabelArtifactConverter.convertToModel(any()))
292 .thenThrow(BabelArtifactParsingException.class);
293 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
294 when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
296 List<Artifact> modelArtifacts = new ArrayList<>();
297 List<Artifact> catalogFiles = new ArrayList<>();
298 assertThrows(ProcessToscaArtifactsException.class,
299 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
301 assertThat(modelArtifacts, is(empty()));
302 assertThat(catalogFiles, is(empty()));
304 Mockito.verify(mockDistributionClient).download(artifactInfo);
305 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
306 Mockito.verify(mockBabelClient).postArtifact(any(), any());
307 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
311 public void downloadArtifactsWithInvalidType()
312 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
313 INotificationData data = getNotificationDataWithInvalidType();
314 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
316 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
317 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
318 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
320 assertThrows(InvalidArchiveException.class,
321 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
323 Mockito.verify(mockDistributionClient).download(artifact);
324 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
325 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
326 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
329 private IDistributionClientDownloadResult createDistributionClientDownloadResult(
330 DistributionActionResultEnum status, String message, byte[] payload) {
331 DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
332 downloadResult.setArtifactPayload(payload);
333 return downloadResult;