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.CoreMatchers.not;
25 import static org.hamcrest.MatcherAssert.assertThat;
26 import static org.hamcrest.collection.IsEmptyCollection.empty;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.ArgumentMatchers.anyList;
29 import static org.mockito.Mockito.doNothing;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.when;
32 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithInvalidType;
33 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithModelQuerySpec;
34 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneOfEach;
35 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneService;
36 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithToscaCsarFile;
38 import java.io.IOException;
39 import java.util.ArrayList;
40 import java.util.List;
41 import java.util.Properties;
43 import org.hamcrest.collection.IsEmptyCollection;
44 import org.junit.jupiter.api.AfterEach;
45 import org.junit.jupiter.api.BeforeEach;
46 import org.junit.jupiter.api.Test;
47 import org.mockito.Mock;
48 import org.mockito.Mockito;
49 import org.mockito.MockitoAnnotations;
50 import org.onap.aai.babel.service.data.BabelArtifact;
51 import org.onap.aai.modelloader.config.ModelLoaderConfig;
52 import org.onap.aai.modelloader.entity.Artifact;
53 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
54 import org.onap.aai.modelloader.extraction.VnfCatalogExtractor;
55 import org.onap.aai.modelloader.restclient.BabelServiceClient;
56 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
57 import org.onap.aai.modelloader.service.BabelServiceClientFactory;
58 import org.onap.aai.modelloader.util.ArtifactTestUtils;
59 import org.onap.sdc.api.IDistributionClient;
60 import org.onap.sdc.api.notification.IArtifactInfo;
61 import org.onap.sdc.api.notification.INotificationData;
62 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
63 import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
64 import org.onap.sdc.utils.DistributionActionResultEnum;
67 * Tests {@link ArtifactDownloadManager}.
69 public class TestArtifactDownloadManager {
71 private ArtifactDownloadManager downloadManager;
72 @Mock private BabelServiceClient mockBabelClient;
73 @Mock private IDistributionClient mockDistributionClient;
74 @Mock private NotificationPublisher mockNotificationPublisher;
75 @Mock private BabelArtifactConverter mockBabelArtifactConverter;
76 @Mock private BabelServiceClientFactory mockClientFactory;
77 private VnfCatalogExtractor vnfCatalogExtractor;
80 public void setup() throws Exception {
81 MockitoAnnotations.openMocks(this);
82 vnfCatalogExtractor = new VnfCatalogExtractor();
83 when(mockClientFactory.create(any())).thenReturn(mockBabelClient);
85 Properties configProperties = new Properties();
86 configProperties.load(this.getClass().getClassLoader().getResourceAsStream("model-loader.properties"));
87 downloadManager = new ArtifactDownloadManager(mockDistributionClient,
88 new ModelLoaderConfig(configProperties, "."), mockClientFactory, mockBabelArtifactConverter, mockNotificationPublisher, vnfCatalogExtractor);
92 public void tearDown() {
93 downloadManager = null;
94 mockDistributionClient = null;
95 mockNotificationPublisher = null;
99 * Test downloading zero artifacts from SDC.
102 public void testDownloadWithZeroArtifacts() {
103 List<Artifact> modelFiles = new ArrayList<>();
104 List<Artifact> catalogFiles = new ArrayList<>();
105 assertThat(downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>(), modelFiles,
106 catalogFiles), is(true));
107 assertThat(modelFiles, is(empty()));
108 assertThat(catalogFiles, is(empty()));
109 Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
110 mockBabelArtifactConverter);
114 public void testArtifactDownloadFails() {
115 INotificationData data = getNotificationDataWithOneService();
116 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
117 String errorMessage = "error msg";
118 when(mockDistributionClient.download(artifact)).thenReturn(
119 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
120 doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
123 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
125 Mockito.verify(mockDistributionClient).download(artifact);
126 Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
129 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
133 public void testErrorCreatingBabelClient() throws Exception {
134 when(mockClientFactory.create(any())).thenThrow(new BabelServiceClientException(new Exception()));
136 INotificationData data = getNotificationDataWithToscaCsarFile();
137 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
138 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
139 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
141 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
143 Mockito.verify(mockDistributionClient).download(artifactInfo);
144 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
145 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
147 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
151 public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
152 INotificationData data = getNotificationDataWithToscaCsarFile();
153 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
154 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
155 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
156 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
157 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenThrow(new BabelServiceClientException(""));
158 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
160 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
162 Mockito.verify(mockDistributionClient).download(artifact);
163 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
164 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
165 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
167 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
172 public void downloadArtifacts_invalidModelQuerySpec() {
173 INotificationData data = getNotificationDataWithModelQuerySpec();
174 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
176 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
178 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
179 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
180 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
182 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
185 Mockito.verify(mockDistributionClient).download(artifact);
186 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
187 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
189 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
193 public void downloadArtifacts_validToscaCsarFile()
194 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
195 INotificationData data = getNotificationDataWithToscaCsarFile();
196 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
198 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
200 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
201 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
202 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
204 assertThat(catalogFiles.size(), is(0));
206 Mockito.verify(mockDistributionClient).download(artifactInfo);
207 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
208 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
209 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
210 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
213 private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
214 ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException {
215 when(mockDistributionClient.download(artifactInfo))
216 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
217 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
218 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenReturn(createBabelArtifacts());
221 private List<BabelArtifact> createBabelArtifacts() {
222 List<BabelArtifact> artifactList = new ArrayList<>();
223 artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
224 artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
229 public void downloadArtifactsWithValidModelQuerySpec()
230 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
231 INotificationData data = getNotificationDataWithModelQuerySpec();
232 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
233 setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
235 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
236 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
237 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelFiles, catalogFiles),
240 assertThat(modelFiles, is(not(IsEmptyCollection.empty())));
241 assertThat(catalogFiles, is(empty()));
243 Mockito.verify(mockDistributionClient).download(artifact);
244 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
246 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
249 private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
250 IArtifactInfo artifact) throws IOException {
251 when(mockDistributionClient.download(artifact))
252 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
253 artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
254 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
258 public void downloadArtifacts_validCsarAndModelFiles()
259 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
260 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
261 INotificationData data = getNotificationDataWithOneOfEach();
262 List<IArtifactInfo> artifacts = new ArrayList<>();
264 IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
265 IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
267 artifacts.add(serviceArtifact);
268 artifacts.add(modelSpecArtifact);
270 setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
271 setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
273 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
274 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
275 assertThat(downloadManager.downloadArtifacts(data, artifacts, modelFiles, catalogFiles), is(true));
277 Mockito.verify(mockDistributionClient).download(serviceArtifact);
278 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
279 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
280 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
281 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
283 Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
284 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
287 Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
291 public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
292 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
293 INotificationData data = getNotificationDataWithToscaCsarFile();
294 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
296 when(mockDistributionClient.download(artifactInfo))
297 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
298 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
299 when(mockBabelArtifactConverter.convertToModel(anyList()))
300 .thenThrow(BabelArtifactParsingException.class);
301 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
302 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenReturn(createBabelArtifacts());
304 List<Artifact> modelArtifacts = new ArrayList<>();
305 List<Artifact> catalogFiles = new ArrayList<>();
306 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
308 assertThat(modelArtifacts, is(empty()));
309 assertThat(catalogFiles, is(empty()));
311 Mockito.verify(mockDistributionClient).download(artifactInfo);
312 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
313 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
314 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
318 public void downloadArtifactsWithInvalidType()
319 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
320 INotificationData data = getNotificationDataWithInvalidType();
321 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
323 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
324 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
325 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
327 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
329 Mockito.verify(mockDistributionClient).download(artifact);
330 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
331 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
332 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
335 private IDistributionClientDownloadResult createDistributionClientDownloadResult(
336 DistributionActionResultEnum status, String message, byte[] payload) {
337 DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
338 downloadResult.setArtifactPayload(payload);
339 return downloadResult;