Upgrade spring-boot to 2.7.X in model-loader
[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.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.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;
36
37 import java.io.IOException;
38 import java.util.ArrayList;
39 import java.util.List;
40 import java.util.Properties;
41
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.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;
65
66 /**
67  * Tests {@link ArtifactDownloadManager}.
68  */
69 public class TestArtifactDownloadManager {
70
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     @InjectMocks BabelArtifactService babelArtifactService;
78     private VnfCatalogExtractor vnfCatalogExtractor;
79
80     @BeforeEach
81     public void setup() throws Exception {
82         MockitoAnnotations.openMocks(this);
83         vnfCatalogExtractor = new VnfCatalogExtractor();
84         when(mockClientFactory.create(any())).thenReturn(mockBabelClient);
85
86         Properties configProperties = new Properties();
87         configProperties.load(this.getClass().getClassLoader().getResourceAsStream("model-loader.properties"));
88         downloadManager = new ArtifactDownloadManager(mockDistributionClient,
89                 mockNotificationPublisher, vnfCatalogExtractor, babelArtifactService);
90     }
91
92     @AfterEach
93     public void tearDown() {
94         downloadManager = null;
95         mockDistributionClient = null;
96         mockNotificationPublisher = null;
97     }
98
99     /**
100      * Test downloading zero artifacts from SDC.
101      */
102     @Test
103     public void testDownloadWithZeroArtifacts() {
104         List<Artifact> modelFiles = new ArrayList<>();
105         List<Artifact> catalogFiles = new ArrayList<>();
106         assertThat(downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>(), modelFiles,
107                 catalogFiles), is(true));
108         assertThat(modelFiles, is(empty()));
109         assertThat(catalogFiles, is(empty()));
110         Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
111                 mockBabelArtifactConverter);
112     }
113
114     @Test
115     public void testArtifactDownloadFails() {
116         INotificationData data = getNotificationDataWithOneService();
117         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
118         String errorMessage = "error msg";
119         when(mockDistributionClient.download(artifact)).thenReturn(
120                 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
121         doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
122                 errorMessage);
123
124         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
125
126         Mockito.verify(mockDistributionClient).download(artifact);
127         Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
128                 errorMessage);
129
130         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
131     }
132
133     @Test
134     public void testErrorCreatingBabelClient() throws Exception {
135         when(mockClientFactory.create(any())).thenThrow(new BabelServiceClientException(new Exception()));
136
137         INotificationData data = getNotificationDataWithToscaCsarFile();
138         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
139         setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
140         doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
141
142         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
143
144         Mockito.verify(mockDistributionClient).download(artifactInfo);
145         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
146         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
147     }
148
149     @Test
150     public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
151         INotificationData data = getNotificationDataWithToscaCsarFile();
152         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
153         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
154                 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
155         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
156         when(mockBabelClient.postArtifact(any(), any())).thenThrow(new BabelServiceClientException(""));
157         doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
158
159         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, null), is(false));
160
161         Mockito.verify(mockDistributionClient).download(artifact);
162         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
163         Mockito.verify(mockBabelClient).postArtifact(any(), any());
164         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
165
166         Mockito.verifyNoInteractions(mockBabelArtifactConverter);
167
168     }
169
170     @Test
171     public void downloadArtifacts_invalidModelQuerySpec() {
172         INotificationData data = getNotificationDataWithModelQuerySpec();
173         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
174
175         List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
176
177         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
178                 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
179         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
180
181         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, null),
182                 is(false));
183
184         Mockito.verify(mockDistributionClient).download(artifact);
185         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
186         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
187
188         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
189     }
190
191     @Test
192     public void downloadArtifacts_validToscaCsarFile()
193             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
194         INotificationData data = getNotificationDataWithToscaCsarFile();
195         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
196
197         setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
198
199         List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
200         List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
201         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
202                 is(true));
203         assertThat(catalogFiles.size(), is(0));
204
205         Mockito.verify(mockDistributionClient).download(artifactInfo);
206         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
207         Mockito.verify(mockBabelClient).postArtifact(any(), any());
208         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
209         Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
210     }
211
212     private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
213             ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException {
214         when(mockDistributionClient.download(artifactInfo))
215                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
216                         artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
217         when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
218     }
219
220     private List<BabelArtifact> createBabelArtifacts() {
221         List<BabelArtifact> artifactList = new ArrayList<>();
222         artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
223         artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
224         return artifactList;
225     }
226
227     @Test
228     public void downloadArtifactsWithValidModelQuerySpec()
229             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
230         INotificationData data = getNotificationDataWithModelQuerySpec();
231         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
232         setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
233
234         List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
235         List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
236         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelFiles, catalogFiles),
237                 is(true));
238
239         assertThat(modelFiles, is(not(IsEmptyCollection.empty())));
240         assertThat(catalogFiles, is(empty()));
241
242         Mockito.verify(mockDistributionClient).download(artifact);
243         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
244
245         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
246     }
247
248     private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
249             IArtifactInfo artifact) throws IOException {
250         when(mockDistributionClient.download(artifact))
251                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
252                         artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
253         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
254     }
255
256     @Test
257     public void downloadArtifacts_validCsarAndModelFiles()
258             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
259         ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
260         INotificationData data = getNotificationDataWithOneOfEach();
261         List<IArtifactInfo> artifacts = new ArrayList<>();
262
263         IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
264         IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
265
266         artifacts.add(serviceArtifact);
267         artifacts.add(modelSpecArtifact);
268
269         setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
270         setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
271
272         List<org.onap.aai.modelloader.entity.Artifact> modelFiles = new ArrayList<>();
273         List<org.onap.aai.modelloader.entity.Artifact> catalogFiles = new ArrayList<>();
274         assertThat(downloadManager.downloadArtifacts(data, artifacts, modelFiles, catalogFiles), is(true));
275
276         Mockito.verify(mockDistributionClient).download(serviceArtifact);
277         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
278         Mockito.verify(mockBabelClient).postArtifact(any(), any());
279         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
280         Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
281
282         Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
283         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
284                 modelSpecArtifact);
285
286         Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
287     }
288
289     @Test
290     public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
291         ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
292         INotificationData data = getNotificationDataWithToscaCsarFile();
293         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
294
295         when(mockDistributionClient.download(artifactInfo))
296                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
297                         artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
298         when(mockBabelArtifactConverter.convertToModel(anyList()))
299                 .thenThrow(BabelArtifactParsingException.class);
300         doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
301         when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
302
303         List<Artifact> modelArtifacts = new ArrayList<>();
304         List<Artifact> catalogFiles = new ArrayList<>();
305         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), modelArtifacts, catalogFiles),
306                 is(false));
307         assertThat(modelArtifacts, is(empty()));
308         assertThat(catalogFiles, is(empty()));
309
310         Mockito.verify(mockDistributionClient).download(artifactInfo);
311         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
312         Mockito.verify(mockBabelClient).postArtifact(any(), any());
313         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
314     }
315
316     @Test
317     public void downloadArtifactsWithInvalidType()
318             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
319         INotificationData data = getNotificationDataWithInvalidType();
320         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
321
322         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
323                 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
324         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
325
326         assertThat(downloadManager.downloadArtifacts(data, data.getServiceArtifacts(), null, new ArrayList<>()),
327                 is(false));
328         Mockito.verify(mockDistributionClient).download(artifact);
329         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
330         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
331         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
332     }
333
334     private IDistributionClientDownloadResult createDistributionClientDownloadResult(
335             DistributionActionResultEnum status, String message, byte[] payload) {
336         DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
337         downloadResult.setArtifactPayload(payload);
338         return downloadResult;
339     }
340 }