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.junit.jupiter.api.Assertions.assertTrue;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.Mockito.doNothing;
30 import static org.mockito.Mockito.when;
31 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithInvalidType;
32 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithModelQuerySpec;
33 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneOfEach;
34 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneService;
35 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithToscaCsarFile;
37 import java.io.IOException;
38 import java.util.ArrayList;
39 import java.util.List;
40 import java.util.Properties;
42 import org.hamcrest.collection.IsEmptyCollection;
43 import org.junit.jupiter.api.AfterEach;
44 import org.junit.jupiter.api.BeforeEach;
45 import org.junit.jupiter.api.Test;
46 import org.mockito.InjectMocks;
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.babel.BabelArtifactService;
52 import org.onap.aai.modelloader.entity.Artifact;
53 import org.onap.aai.modelloader.entity.catalog.VnfCatalogArtifact;
54 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
55 import org.onap.aai.modelloader.entity.model.ModelArtifact;
56 import org.onap.aai.modelloader.extraction.VnfCatalogExtractor;
57 import org.onap.aai.modelloader.restclient.BabelServiceClient;
58 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
59 import org.onap.aai.modelloader.service.BabelServiceClientFactory;
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 @Mock private BabelServiceClientFactory mockClientFactory;
79 @InjectMocks BabelArtifactService babelArtifactService;
80 private VnfCatalogExtractor vnfCatalogExtractor;
83 public void setup() throws Exception {
84 MockitoAnnotations.openMocks(this);
85 vnfCatalogExtractor = new VnfCatalogExtractor();
86 when(mockClientFactory.create(any())).thenReturn(mockBabelClient);
88 Properties configProperties = new Properties();
89 configProperties.load(this.getClass().getClassLoader().getResourceAsStream("model-loader.properties"));
90 downloadManager = new ArtifactDownloadManager(mockDistributionClient,
91 mockNotificationPublisher, vnfCatalogExtractor, babelArtifactService);
95 public void tearDown() {
96 downloadManager = null;
97 mockDistributionClient = null;
98 mockNotificationPublisher = null;
102 * Test downloading zero artifacts from SDC.
105 public void testDownloadWithZeroArtifacts() {
106 List<Artifact> modelFiles = new ArrayList<>();
107 List<Artifact> catalogFiles = new ArrayList<>();
108 assertThat(downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>(), modelFiles,
109 catalogFiles), is(true));
110 assertThat(modelFiles, is(empty()));
111 assertThat(catalogFiles, is(empty()));
112 Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
113 mockBabelArtifactConverter);
117 public void testArtifactDownloadFails() {
118 INotificationData data = getNotificationDataWithOneService();
119 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
120 String errorMessage = "error msg";
121 when(mockDistributionClient.download(artifact)).thenReturn(
122 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
123 doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
126 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
128 Mockito.verify(mockDistributionClient).download(artifact);
129 Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
132 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
136 public void testErrorCreatingBabelClient() throws Exception {
137 when(mockClientFactory.create(any())).thenThrow(new BabelServiceClientException(new Exception()));
139 INotificationData data = getNotificationDataWithToscaCsarFile();
140 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
141 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
142 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
144 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
146 Mockito.verify(mockDistributionClient).download(artifactInfo);
147 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
148 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
152 public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
153 INotificationData data = getNotificationDataWithToscaCsarFile();
154 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
155 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
156 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
157 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
158 when(mockBabelClient.postArtifact(any(), any())).thenThrow(new BabelServiceClientException(""));
159 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
161 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
163 Mockito.verify(mockDistributionClient).download(artifact);
164 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
165 Mockito.verify(mockBabelClient).postArtifact(any(), any());
166 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
168 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
173 public void downloadArtifacts_invalidModelQuerySpec() {
174 INotificationData data = getNotificationDataWithModelQuerySpec();
175 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
177 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
179 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
180 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
181 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
183 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
186 Mockito.verify(mockDistributionClient).download(artifact);
187 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
188 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
190 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
194 public void downloadArtifacts_validToscaCsarFile()
195 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
196 INotificationData data = getNotificationDataWithToscaCsarFile();
197 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
199 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
201 when(mockBabelArtifactConverter.convertToModel(any(BabelArtifact.class))).thenReturn(List.of(new ModelArtifact()));
202 when(mockBabelArtifactConverter.convertToCatalog(any(BabelArtifact.class))).thenReturn(new VnfCatalogArtifact(""));
204 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
205 List<org.onap.aai.modelloader.entity.Artifact> catalogArtifacts = new ArrayList<>();
206 assertTrue(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogArtifacts));
207 assertThat(modelArtifacts.size(), is(1));
208 assertThat(catalogArtifacts.size(), is(1));
210 Mockito.verify(mockDistributionClient).download(artifactInfo);
211 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
212 Mockito.verify(mockBabelClient).postArtifact(any(), any());
213 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
214 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
217 private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
218 ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException {
219 when(mockDistributionClient.download(artifactInfo))
220 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
221 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
222 when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
225 private List<BabelArtifact> createBabelArtifacts() {
226 List<BabelArtifact> artifactList = new ArrayList<>();
227 artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
228 artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
233 public void downloadArtifactsWithValidModelQuerySpec()
234 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
235 INotificationData data = getNotificationDataWithModelQuerySpec();
236 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
237 setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
239 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
240 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
241 assertTrue(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelFiles, catalogFiles));
243 assertThat(modelFiles, is(not(IsEmptyCollection.empty())));
244 assertThat(catalogFiles, is(empty()));
246 Mockito.verify(mockDistributionClient).download(artifact);
247 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
249 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
252 private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
253 IArtifactInfo artifact) throws IOException {
254 when(mockDistributionClient.download(artifact))
255 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
256 artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
257 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
261 public void downloadArtifacts_validCsarAndModelFiles()
262 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
263 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
264 INotificationData data = getNotificationDataWithOneOfEach();
265 List<IArtifactInfo> artifacts = new ArrayList<>();
267 IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
268 IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
270 artifacts.add(serviceArtifact);
271 artifacts.add(modelSpecArtifact);
273 setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
274 setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
275 when(mockBabelArtifactConverter.convertToModel(any(BabelArtifact.class))).thenReturn(List.of(new ModelArtifact()));
276 when(mockBabelArtifactConverter.convertToCatalog(any(BabelArtifact.class))).thenReturn(new VnfCatalogArtifact(""));
279 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
280 List<org.onap.aai.modelloader.entity.Artifact> catalogArtifacts = new ArrayList<>();
281 assertTrue(downloadManager.downloadArtifacts(data, artifacts, modelArtifacts, catalogArtifacts));
282 assertThat(modelArtifacts.size(), is(2));
283 assertThat(catalogArtifacts.size(), is(1));
285 Mockito.verify(mockDistributionClient).download(serviceArtifact);
286 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
287 Mockito.verify(mockBabelClient).postArtifact(any(), any());
288 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
289 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
291 Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
292 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
295 Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
299 public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
300 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
301 INotificationData data = getNotificationDataWithToscaCsarFile();
302 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
304 when(mockDistributionClient.download(artifactInfo))
305 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
306 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
307 when(mockBabelArtifactConverter.convertToModel(any()))
308 .thenThrow(BabelArtifactParsingException.class);
309 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
310 when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
312 List<Artifact> modelArtifacts = new ArrayList<>();
313 List<Artifact> catalogFiles = new ArrayList<>();
314 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
316 assertThat(modelArtifacts, is(empty()));
317 assertThat(catalogFiles, is(empty()));
319 Mockito.verify(mockDistributionClient).download(artifactInfo);
320 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
321 Mockito.verify(mockBabelClient).postArtifact(any(), any());
322 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
326 public void downloadArtifactsWithInvalidType()
327 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
328 INotificationData data = getNotificationDataWithInvalidType();
329 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
331 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
332 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
333 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
335 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
337 Mockito.verify(mockDistributionClient).download(artifact);
338 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
339 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
340 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
343 private IDistributionClientDownloadResult createDistributionClientDownloadResult(
344 DistributionActionResultEnum status, String message, byte[] payload) {
345 DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
346 downloadResult.setArtifactPayload(payload);
347 return downloadResult;