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.After;
45 import org.junit.Before;
46 import org.junit.Test;
47 import org.mockito.Mockito;
48 import org.onap.aai.babel.service.data.BabelArtifact;
49 import org.onap.aai.modelloader.config.ModelLoaderConfig;
50 import org.onap.aai.modelloader.entity.Artifact;
51 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
52 import org.onap.aai.modelloader.restclient.BabelServiceClient;
53 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
54 import org.onap.aai.modelloader.service.BabelServiceClientFactory;
55 import org.onap.aai.modelloader.service.HttpsBabelServiceClientFactory;
56 import org.onap.aai.modelloader.util.ArtifactTestUtils;
57 import org.onap.sdc.api.IDistributionClient;
58 import org.onap.sdc.api.notification.IArtifactInfo;
59 import org.onap.sdc.api.notification.INotificationData;
60 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
61 import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
62 import org.onap.sdc.utils.DistributionActionResultEnum;
63 import org.springframework.test.util.ReflectionTestUtils;
66 * Tests {@link ArtifactDownloadManager}.
68 public class TestArtifactDownloadManager {
70 private ArtifactDownloadManager downloadManager;
71 private BabelServiceClient mockBabelClient;
72 private IDistributionClient mockDistributionClient;
73 private NotificationPublisher mockNotificationPublisher;
74 private BabelArtifactConverter mockBabelArtifactConverter;
75 private BabelServiceClientFactory mockClientFactory;
78 public void setup() throws Exception {
79 mockBabelClient = mock(BabelServiceClient.class);
80 mockDistributionClient = mock(IDistributionClient.class);
81 mockNotificationPublisher = mock(NotificationPublisher.class);
82 mockBabelArtifactConverter = mock(BabelArtifactConverter.class);
83 mockClientFactory = mock(HttpsBabelServiceClientFactory.class);
84 when(mockClientFactory.create(any())).thenReturn(mockBabelClient);
86 Properties configProperties = new Properties();
87 configProperties.load(this.getClass().getClassLoader().getResourceAsStream("model-loader.properties"));
88 downloadManager = new ArtifactDownloadManager(mockDistributionClient,
89 new ModelLoaderConfig(configProperties, "."), mockClientFactory);
91 ReflectionTestUtils.setField(downloadManager, "notificationPublisher", mockNotificationPublisher);
92 ReflectionTestUtils.setField(downloadManager, "babelArtifactConverter", mockBabelArtifactConverter);
96 public void tearDown() {
97 downloadManager = null;
98 mockDistributionClient = null;
99 mockNotificationPublisher = null;
103 * Test downloading zero artifacts from SDC.
106 public void testDownloadWithZeroArtifacts() {
107 List<Artifact> modelFiles = new ArrayList<>();
108 List<Artifact> catalogFiles = new ArrayList<>();
109 assertThat(downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>(), modelFiles,
110 catalogFiles), is(true));
111 assertThat(modelFiles, is(empty()));
112 assertThat(catalogFiles, is(empty()));
113 Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
114 mockBabelArtifactConverter);
118 public void testArtifactDownloadFails() {
119 INotificationData data = getNotificationDataWithOneService();
120 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
121 String errorMessage = "error msg";
122 when(mockDistributionClient.download(artifact)).thenReturn(
123 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
124 doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
127 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
129 Mockito.verify(mockDistributionClient).download(artifact);
130 Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
133 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
137 public void testErrorCreatingBabelClient() throws Exception {
138 when(mockClientFactory.create(any())).thenThrow(new BabelServiceClientException(new Exception()));
140 INotificationData data = getNotificationDataWithToscaCsarFile();
141 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
142 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
143 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
145 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
147 Mockito.verify(mockDistributionClient).download(artifactInfo);
148 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
149 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
151 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
155 public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
156 INotificationData data = getNotificationDataWithToscaCsarFile();
157 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
158 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
159 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
160 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
161 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenThrow(new BabelServiceClientException(""));
162 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
164 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
166 Mockito.verify(mockDistributionClient).download(artifact);
167 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
168 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
169 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
171 Mockito.verifyNoInteractions(mockBabelArtifactConverter);
176 public void downloadArtifacts_invalidModelQuerySpec() {
177 INotificationData data = getNotificationDataWithModelQuerySpec();
178 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
180 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
182 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
183 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
184 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
186 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
189 Mockito.verify(mockDistributionClient).download(artifact);
190 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
191 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
193 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
197 public void downloadArtifacts_validToscaCsarFile()
198 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
199 INotificationData data = getNotificationDataWithToscaCsarFile();
200 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
202 setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
204 List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
205 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
206 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
208 assertThat(catalogFiles.size(), is(0));
210 Mockito.verify(mockDistributionClient).download(artifactInfo);
211 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
212 Mockito.verify(mockBabelClient).postArtifact(any(), any(), 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(), 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 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelFiles, catalogFiles),
244 assertThat(modelFiles, is(not(IsEmptyCollection.empty())));
245 assertThat(catalogFiles, is(empty()));
247 Mockito.verify(mockDistributionClient).download(artifact);
248 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
250 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
253 private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
254 IArtifactInfo artifact) throws IOException {
255 when(mockDistributionClient.download(artifact))
256 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
257 artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
258 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
262 public void downloadArtifacts_validCsarAndModelFiles()
263 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
264 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
265 INotificationData data = getNotificationDataWithOneOfEach();
266 List<IArtifactInfo> artifacts = new ArrayList<>();
268 IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
269 IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
271 artifacts.add(serviceArtifact);
272 artifacts.add(modelSpecArtifact);
274 setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
275 setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
277 List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
278 List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
279 assertThat(downloadManager.downloadArtifacts(data, artifacts, modelFiles, catalogFiles), is(true));
281 Mockito.verify(mockDistributionClient).download(serviceArtifact);
282 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
283 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
284 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
285 Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
287 Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
288 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
291 Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
295 public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
296 ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
297 INotificationData data = getNotificationDataWithToscaCsarFile();
298 IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
300 when(mockDistributionClient.download(artifactInfo))
301 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
302 artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
303 when(mockBabelArtifactConverter.convertToModel(anyList()))
304 .thenThrow(BabelArtifactParsingException.class);
305 doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
306 when(mockBabelClient.postArtifact(any(), any(), any(), any())).thenReturn(createBabelArtifacts());
308 List<Artifact> modelArtifacts = new ArrayList<>();
309 List<Artifact> catalogFiles = new ArrayList<>();
310 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
312 assertThat(modelArtifacts, is(empty()));
313 assertThat(catalogFiles, is(empty()));
315 Mockito.verify(mockDistributionClient).download(artifactInfo);
316 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
317 Mockito.verify(mockBabelClient).postArtifact(any(), any(), any(), any());
318 Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
322 public void downloadArtifactsWithInvalidType()
323 throws IOException, BabelServiceClientException, BabelArtifactParsingException {
324 INotificationData data = getNotificationDataWithInvalidType();
325 IArtifactInfo artifact = data.getServiceArtifacts().get(0);
327 when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
328 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
329 doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
331 assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
333 Mockito.verify(mockDistributionClient).download(artifact);
334 Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
335 Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
336 Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
339 private IDistributionClientDownloadResult createDistributionClientDownloadResult(
340 DistributionActionResultEnum status, String message, byte[] payload) {
341 DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
342 downloadResult.setArtifactPayload(payload);
343 return downloadResult;