79eb94d81c3de7991a49f31ce096eca8f6cd74bf
[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.MatcherAssert.assertThat;
25 import static org.hamcrest.collection.IsEmptyCollection.empty;
26 import static org.junit.jupiter.api.Assertions.assertThrows;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.Mockito.doNothing;
29 import static org.mockito.Mockito.when;
30 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithInvalidType;
31 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithModelQuerySpec;
32 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneOfEach;
33 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithOneService;
34 import static org.onap.aai.modelloader.fixture.NotificationDataFixtureBuilder.getNotificationDataWithToscaCsarFile;
35
36 import java.io.IOException;
37 import java.util.ArrayList;
38 import java.util.List;
39 import java.util.Properties;
40 import java.util.stream.Collectors;
41
42 import org.junit.jupiter.api.AfterEach;
43 import org.junit.jupiter.api.BeforeEach;
44 import org.junit.jupiter.api.Test;
45 import org.mockito.InjectMocks;
46 import org.mockito.Mock;
47 import org.mockito.Mockito;
48 import org.mockito.MockitoAnnotations;
49 import org.onap.aai.babel.service.data.BabelArtifact;
50 import org.onap.aai.modelloader.babel.BabelArtifactService;
51 import org.onap.aai.modelloader.entity.Artifact;
52 import org.onap.aai.modelloader.entity.catalog.VnfCatalogArtifact;
53 import org.onap.aai.modelloader.entity.model.BabelArtifactParsingException;
54 import org.onap.aai.modelloader.entity.model.ModelArtifact;
55 import org.onap.aai.modelloader.entity.model.NamedQueryArtifact;
56 import org.onap.aai.modelloader.extraction.InvalidArchiveException;
57 import org.onap.aai.modelloader.extraction.VnfCatalogExtractor;
58 import org.onap.aai.modelloader.restclient.BabelServiceClient;
59 import org.onap.aai.modelloader.restclient.BabelServiceClientException;
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;
67
68 /**
69  * Tests {@link ArtifactDownloadManager}.
70  */
71 public class TestArtifactDownloadManager {
72
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     @InjectMocks BabelArtifactService babelArtifactService;
79     private VnfCatalogExtractor vnfCatalogExtractor;
80
81     @BeforeEach
82     public void setup() throws Exception {
83         MockitoAnnotations.openMocks(this);
84         vnfCatalogExtractor = new VnfCatalogExtractor();
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  * @throws Exception 
102      */
103     @Test
104     public void testDownloadWithZeroArtifacts() throws Exception {
105         List<Artifact> artifacts = downloadManager.downloadArtifacts(getNotificationDataWithOneService(), new ArrayList<>());
106         assertThat(artifacts, is(empty()));
107         Mockito.verifyNoInteractions(mockBabelClient, mockDistributionClient, mockNotificationPublisher,
108                 mockBabelArtifactConverter);
109     }
110
111     @Test
112     public void testArtifactDownloadFails() {
113         INotificationData data = getNotificationDataWithOneService();
114         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
115         String errorMessage = "error msg";
116         when(mockDistributionClient.download(artifact)).thenReturn(
117                 createDistributionClientDownloadResult(DistributionActionResultEnum.FAIL, errorMessage, null));
118         doNothing().when(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
119                 errorMessage);
120
121         assertThrows(DownloadFailureException.class,
122                 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
123
124         Mockito.verify(mockDistributionClient).download(artifact);
125         Mockito.verify(mockNotificationPublisher).publishDownloadFailure(mockDistributionClient, data, artifact,
126                 errorMessage);
127
128         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
129     }
130
131     @Test
132     public void downloadArtifacts_invalidToscaCsarFile() throws IOException, BabelServiceClientException {
133         INotificationData data = getNotificationDataWithToscaCsarFile();
134         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
135         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
136                 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Tosca CSAR File".getBytes()));
137         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
138         when(mockBabelClient.postArtifact(any(), any())).thenThrow(new BabelServiceClientException(""));
139         doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
140
141         assertThrows(ProcessToscaArtifactsException.class,
142                 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
143
144         Mockito.verify(mockDistributionClient).download(artifact);
145         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
146         Mockito.verify(mockBabelClient).postArtifact(any(), any());
147         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
148
149         Mockito.verifyNoInteractions(mockBabelArtifactConverter);
150
151     }
152
153     @Test
154     public void downloadArtifacts_invalidModelQuerySpec() {
155         INotificationData data = getNotificationDataWithModelQuerySpec();
156         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
157
158         List<org.onap.aai.modelloader.entity.Artifact> modelArtifacts = new ArrayList<>();
159
160         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
161                 DistributionActionResultEnum.SUCCESS, null, "This is not a valid Model Query Spec".getBytes()));
162         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
163
164         assertThrows(BabelArtifactParsingException.class,
165                 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
166
167         Mockito.verify(mockDistributionClient).download(artifact);
168         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
169         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
170
171         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
172     }
173
174     @Test
175     public void downloadArtifacts_validToscaCsarFile()
176             throws Exception {
177         INotificationData data = getNotificationDataWithToscaCsarFile();
178         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
179
180         setupValidDownloadCsarMocks(data, artifactInfo, new ArtifactTestUtils());
181
182         List<Artifact> artifacts = downloadManager.downloadArtifacts(data, data.getServiceArtifacts());
183         List<Artifact> modelArtifacts = artifacts.stream().filter(ModelArtifact.class::isInstance)
184                 .collect(Collectors.toList());
185         List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
186                 .collect(Collectors.toList());
187         assertThat(modelArtifacts.size(), is(1));
188         assertThat(catalogArtifacts.size(), is(1));
189
190         Mockito.verify(mockDistributionClient).download(artifactInfo);
191         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifactInfo);
192         Mockito.verify(mockBabelClient).postArtifact(any(), any());
193         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
194         Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
195     }
196
197     private void setupValidDownloadCsarMocks(INotificationData data, IArtifactInfo artifactInfo,
198             ArtifactTestUtils artifactTestUtils) throws IOException, BabelServiceClientException, BabelArtifactParsingException {
199         when(mockDistributionClient.download(artifactInfo))
200                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
201                         artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
202         when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
203
204         when(mockBabelArtifactConverter.convertToModel(any(BabelArtifact.class))).thenReturn(List.of(new ModelArtifact()));
205         when(mockBabelArtifactConverter.convertToCatalog(any(BabelArtifact.class))).thenReturn(new VnfCatalogArtifact(""));
206     }
207
208     private List<BabelArtifact> createBabelArtifacts() {
209         List<BabelArtifact> artifactList = new ArrayList<>();
210         artifactList.add(new BabelArtifact("ModelArtifact", BabelArtifact.ArtifactType.MODEL, "Some model payload"));
211         artifactList.add(new BabelArtifact("VNFCArtifact", BabelArtifact.ArtifactType.VNFCATALOG, "Some VNFC payload"));
212         return artifactList;
213     }
214
215     @Test
216     public void downloadArtifactsWithValidModelQuerySpec()
217             throws Exception {
218         INotificationData data = getNotificationDataWithModelQuerySpec();
219         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
220         setupValidModelQuerySpecMocks(new ArtifactTestUtils(), data, artifact);
221
222         List<Artifact> artifacts = downloadManager.downloadArtifacts(data, data.getServiceArtifacts());
223         List<Artifact> namedQueryArtifacts = artifacts.stream().filter(NamedQueryArtifact.class::isInstance)
224                 .collect(Collectors.toList());
225         List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
226                 .collect(Collectors.toList());
227
228         assertThat(namedQueryArtifacts.size(), is(1));
229         assertThat(catalogArtifacts, is(empty()));
230
231         Mockito.verify(mockDistributionClient).download(artifact);
232         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
233
234         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
235     }
236
237     private void setupValidModelQuerySpecMocks(ArtifactTestUtils artifactTestUtils, INotificationData data,
238             IArtifactInfo artifact) throws IOException {
239         when(mockDistributionClient.download(artifact))
240                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
241                         artifactTestUtils.loadResource("models/named-query-wan-connector.xml")));
242         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
243     }
244
245     @Test
246     public void downloadArtifacts_validCsarAndModelFiles()
247             throws Exception {
248         ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
249         INotificationData data = getNotificationDataWithOneOfEach();
250         List<IArtifactInfo> artifactInfos = new ArrayList<>();
251
252         IArtifactInfo serviceArtifact = data.getServiceArtifacts().get(0);
253         IArtifactInfo modelSpecArtifact = data.getResources().get(1).getArtifacts().get(0);
254
255         artifactInfos.add(serviceArtifact);
256         artifactInfos.add(modelSpecArtifact);
257
258         setupValidDownloadCsarMocks(data, serviceArtifact, artifactTestUtils);
259         setupValidModelQuerySpecMocks(artifactTestUtils, data, modelSpecArtifact);
260
261         List<Artifact> artifacts = downloadManager.downloadArtifacts(data, artifactInfos);
262         List<Artifact> modelArtifacts = artifacts.stream().filter(artifact -> !(artifact instanceof VnfCatalogArtifact))
263                 .collect(Collectors.toList());
264         List<Artifact> catalogArtifacts = artifacts.stream().filter(VnfCatalogArtifact.class::isInstance)
265                 .collect(Collectors.toList());
266         assertThat(modelArtifacts.size(), is(2));
267         assertThat(catalogArtifacts.size(), is(1));
268
269         Mockito.verify(mockDistributionClient).download(serviceArtifact);
270         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, serviceArtifact);
271         Mockito.verify(mockBabelClient).postArtifact(any(), any());
272         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
273         Mockito.verify(mockBabelArtifactConverter).convertToCatalog(any());
274
275         Mockito.verify(mockDistributionClient).download(modelSpecArtifact);
276         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data,
277                 modelSpecArtifact);
278
279         Mockito.verifyNoMoreInteractions(mockBabelClient, mockBabelArtifactConverter);
280     }
281
282     @Test
283     public void activateCallback_toscaToModelConverterHasProcessToscaArtifactsException() throws Exception {
284         ArtifactTestUtils artifactTestUtils = new ArtifactTestUtils();
285         INotificationData data = getNotificationDataWithToscaCsarFile();
286         IArtifactInfo artifactInfo = data.getServiceArtifacts().get(0);
287
288         when(mockDistributionClient.download(artifactInfo))
289                 .thenReturn(createDistributionClientDownloadResult(DistributionActionResultEnum.SUCCESS, null,
290                         artifactTestUtils.loadResource("compressedArtifacts/service-VscpaasTest-csar.csar")));
291         when(mockBabelArtifactConverter.convertToModel(any()))
292                 .thenThrow(BabelArtifactParsingException.class);
293         doNothing().when(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
294         when(mockBabelClient.postArtifact(any(), any())).thenReturn(createBabelArtifacts());
295
296         List<Artifact> modelArtifacts = new ArrayList<>();
297         List<Artifact> catalogFiles = new ArrayList<>();
298         assertThrows(ProcessToscaArtifactsException.class,
299                 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
300
301         assertThat(modelArtifacts, is(empty()));
302         assertThat(catalogFiles, is(empty()));
303
304         Mockito.verify(mockDistributionClient).download(artifactInfo);
305         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifactInfo);
306         Mockito.verify(mockBabelClient).postArtifact(any(), any());
307         Mockito.verify(mockBabelArtifactConverter).convertToModel(any());
308     }
309
310     @Test
311     public void downloadArtifactsWithInvalidType()
312             throws IOException, BabelServiceClientException, BabelArtifactParsingException {
313         INotificationData data = getNotificationDataWithInvalidType();
314         IArtifactInfo artifact = data.getServiceArtifacts().get(0);
315
316         when(mockDistributionClient.download(artifact)).thenReturn(createDistributionClientDownloadResult(
317                 DistributionActionResultEnum.SUCCESS, null, "This content does not matter.".getBytes()));
318         doNothing().when(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
319
320         assertThrows(InvalidArchiveException.class,
321                 () -> downloadManager.downloadArtifacts(data, data.getServiceArtifacts()));
322
323         Mockito.verify(mockDistributionClient).download(artifact);
324         Mockito.verify(mockNotificationPublisher).publishDownloadSuccess(mockDistributionClient, data, artifact);
325         Mockito.verify(mockNotificationPublisher).publishDeployFailure(mockDistributionClient, data, artifact);
326         Mockito.verifyNoInteractions(mockBabelClient, mockBabelArtifactConverter);
327     }
328
329     private IDistributionClientDownloadResult createDistributionClientDownloadResult(
330             DistributionActionResultEnum status, String message, byte[] payload) {
331         DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl(status, message);
332         downloadResult.setArtifactPayload(payload);
333         return downloadResult;
334     }
335 }