f8b3de9ca0a44f8f113e1b0dc90d3eeb44ffc13c
[aai/model-loader.git] / src / test / java / org / onap / aai / modelloader / notification / TestArtifactDownloadManager.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21 package org.onap.aai.modelloader.notification;
22
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;
37
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;
63
64 /**
65  * Tests {@link ArtifactDownloadManager}.
66  */
67 public class TestArtifactDownloadManager {
68
69     private ArtifactDownloadManager downloadManager;
70     private BabelServiceClient mockBabelClient;
71     private IDistributionClient mockDistributionClient;
72     private NotificationPublisher mockNotificationPublisher;
73     private BabelArtifactConverter mockBabelArtifactConverter;
74     private BabelServiceClientFactory mockClientFactory;
75
76     @Before
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);
84
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);
89
90         ReflectionTestUtils.setField(downloadManager, "notificationPublisher", mockNotificationPublisher);
91         ReflectionTestUtils.setField(downloadManager, "babelArtifactConverter", mockBabelArtifactConverter);
92     }
93
94     @After
95     public void tearDown() {
96         downloadManager = null;
97         mockDistributionClient = null;
98         mockNotificationPublisher = null;
99     }
100
101     /**
102      * Test downloading zero artifacts from SDC.
103      */
104     @Test
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);
114     }
115
116     @Test
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,
124                 errorMessage);
125
126         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
127
128         Mockito.verify(mockDistributionClient).download(artifact);
129         Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
130                 errorMessage);
131
132         Mockito.verifyZeroInteractions(mockBabelClient, mockBabelArtifactConverter);
133     }
134
135     @Test
136     public void testErrorCreatingBabelClient() throws Exception {
137         when(mockClientFactory.create(any())).thenThrow(new BabelServiceClientException(new Exception()));
138
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);
143
144         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
145
146         Mockito.verify(mockDistributionClient).download(artifactInfo);
147         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
148         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
149
150         Mockito.verifyZeroInteractions(mockBabelArtifactConverter);
151     }
152
153     @Test
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);
162
163         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
164
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);
169
170         Mockito.verifyZeroInteractions(mockBabelArtifactConverter);
171
172     }
173
174     @Test
175     public void downloadArtifacts_invalidModelQuerySpec() {
176         INotificationData data = getNotificationDataWithModelQuerySpec();
177         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
178
179         List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
180
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);
184
185         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
186                 is(false));
187
188         Mockito.verify(mockDistributionClient).download(artifact);
189         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
190         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
191
192         Mockito.verifyZeroInteractions(mockBabelClient, mockBabelArtifactConverter);
193     }
194
195     @Test
196     public void downloadArtifacts_validToscaCsarFile()
197             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
198         INotificationData data = getNotificationDataWithToscaCsarFile();
199         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
200
201         setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
202
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),
206                 is(true));
207         assertThat(catalogFiles.size(), is(0));
208
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());
214     }
215
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());
222     }
223
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"));
228         return artifactList;
229     }
230
231     @Test
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);
237
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),
241                 is(true));
242
243         assertThat(modelFiles, is(not(IsEmptyCollection.empty())));
244         assertThat(catalogFiles, is(empty()));
245
246         Mockito.verify(mockDistributionClient).download(artifact);
247         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
248
249         Mockito.verifyZeroInteractions(mockBabelClient, mockBabelArtifactConverter);
250     }
251
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);
258     }
259
260     @Test
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<>();
266
267         IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
268         IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
269
270         artifacts.add(serviceArtifact);
271         artifacts.add(modelSpecArtifact);
272
273         setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
274         setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
275
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));
279
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());
285
286         Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
287         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
288                 modelSpecArtifact);
289
290         Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
291     }
292
293     @Test
294     public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
295         ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
296         INotificationData data = getNotificationDataWithToscaCsarFile();
297         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
298
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());
306
307         List<Artifact> modelArtifacts = new ArrayList<>();
308         List<Artifact> catalogFiles = new ArrayList<>();
309         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
310                 is(false));
311         assertThat(modelArtifacts, is(empty()));
312         assertThat(catalogFiles, is(empty()));
313
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());
318     }
319
320     @Test
321     public void downloadArtifactsWithInvalidType()
322             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
323         INotificationData data = getNotificationDataWithInvalidType();
324         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
325
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);
329
330         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
331                 is(false));
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);
336     }
337
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;
343     }
344 }