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.collection.IsEmptyCollection.empty;
26 import static org.junit.Assert.assertThat;
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;
42 import org.hamcrest.collection.IsEmptyCollection;
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.Test;
46 import org.mockito.Mockito;
47 import org.onap.aai.babel.service.data.BabelArtifact;
48 import org.onap.aai.modelloader.config.ModelLoaderConfig;
49 import org.onap.aai.modelloader.entity.Artifact;
50 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
51 import org.onap.aai.modelloader.restclient.BabelServiceClient;
52 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
53 import org.onap.aai.modelloader.service.BabelServiceClientFactory;
54 import org.onap.aai.modelloader.service.HttpsBabelServiceClientFactory;
55 import org.onap.aai.modelloader.util.ArtifactTestUtils;
56 import org.onap.sdc.api.IDistributionClient;
57 import org.onap.sdc.api.notification.IArtifactInfo;
58 import org.onap.sdc.api.notification.INotificationData;
59 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
60 import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
61 import org.onap.sdc.utils.DistributionActionResultEnum;
62 import org.springframework.test.util.ReflectionTestUtils;
65 * Tests {@link ArtifactDownloadManager}.
67 public class TestArtifactDownloadManager {
69 private ArtifactDownloadManager downloadManager;
70 private BabelServiceClient mockBabelClient;
71 private IDistributionClient mockDistributionClient;
72 private NotificationPublisher mockNotificationPublisher;
73 private BabelArtifactConverter mockBabelArtifactConverter;
74 private BabelServiceClientFactory mockClientFactory;
77 public void setup() throws Exception {
78 mockBabelClient = mock(BabelServiceClient.class);
79 mockDistributionClient = mock(IDistributionClient.class);
80 mockNotificationPublisher = mock(NotificationPublisher.class);
81 mockBabelArtifactConverter = mock(BabelArtifactConverter.class);
82 mockClientFactory = mock(HttpsBabelServiceClientFactory.class);
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);
90 ReflectionTestUtils.setField(downloadManager, "notificationPublisher", mockNotificationPublisher);
91 ReflectionTestUtils.setField(downloadManager, "babelArtifactConverter", mockBabelArtifactConverter);
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.verifyZeroInteractions(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.verifyZeroInteractions(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);
150 Mockito.verifyZeroInteractions(mockBabelArtifactConverter);
154 public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
155 INotificationData data = getNotificationDataWithToscaCsarFile();
156 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
157 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
158 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
159 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
160 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenThrow(new BabelServiceClientException(""));
161 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
163 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
165 Mockito.verify(mockDistributionClient).download(artifact);
166 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
167 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
168 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
170 Mockito.verifyZeroInteractions(mockBabelArtifactConverter);
175 public void downloadArtifacts_invalidModelQuerySpec() {
176 INotificationData data = getNotificationDataWithModelQuerySpec();
177 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
179 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
181 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
182 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
183 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
185 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
188 Mockito.verify(mockDistributionClient).download(artifact);
189 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
190 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
192 Mockito.verifyZeroInteractions(mockBabelClient, mockBabelArtifactConverter);
196 public void downloadArtifacts_validToscaCsarFile()
197 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
198 INotificationData data = getNotificationDataWithToscaCsarFile();
199 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
201 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
203 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
204 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
205 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
207 assertThat(catalogFiles.size(), is(0));
209 Mockito.verify(mockDistributionClient).download(artifactInfo);
210 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
211 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
212 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
213 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
216 private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
217 ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException {
218 when(mockDistributionClient.download(artifactInfo))
219 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
220 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
221 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenReturn(createBabelArtifacts());
224 private List<BabelArtifact> createBabelArtifacts() {
225 List<BabelArtifact> artifactList = new ArrayList<>();
226 artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
227 artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
232 public void downloadArtifactsWithValidModelQuerySpec()
233 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
234 INotificationData data = getNotificationDataWithModelQuerySpec();
235 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
236 setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
238 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
239 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
240 assertThat(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.verifyZeroInteractions(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);
276 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
277 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
278 assertThat(downloadManager.downloadArtifacts(data, artifacts, modelFiles, catalogFiles), is(true));
280 Mockito.verify(mockDistributionClient).download(serviceArtifact);
281 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
282 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
283 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
284 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
286 Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
287 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
290 Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
294 public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
295 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
296 INotificationData data = getNotificationDataWithToscaCsarFile();
297 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
299 when(mockDistributionClient.download(artifactInfo))
300 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
301 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
302 when(mockBabelArtifactConverter.convertToModel(anyList()))
303 .thenThrow(BabelArtifactParsingException.class);
304 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
305 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenReturn(createBabelArtifacts());
307 List<Artifact> modelArtifacts = new ArrayList<>();
308 List<Artifact> catalogFiles = new ArrayList<>();
309 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
311 assertThat(modelArtifacts, is(empty()));
312 assertThat(catalogFiles, is(empty()));
314 Mockito.verify(mockDistributionClient).download(artifactInfo);
315 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
316 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
317 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
321 public void downloadArtifactsWithInvalidType()
322 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
323 INotificationData data = getNotificationDataWithInvalidType();
324 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
326 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
327 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
328 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
330 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
332 Mockito.verify(mockDistributionClient).download(artifact);
333 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
334 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
335 Mockito.verifyZeroInteractions(mockBabelClient, mockBabelArtifactConverter);
338 private IDistributionClientDownloadResult createDistributionClientDownloadResult(
339 DistributionActionResultEnum status, String message, byte[] payload) {
340 DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
341 downloadResult.setArtifactPayload(payload);
342 return downloadResult;