Add validation for asd descriptor and invariant id
[nonrtric/plt/rappmanager.git] / rapp-manager-models / src / test / java / com / oransc / rappmanager / models / csar / RappCsarConfigurationHandlerTest.java
1 /*-
2  * ============LICENSE_START======================================================================
3  * Copyright (C) 2023 Nordix Foundation. All rights reserved.
4  * Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved.
5  * ===============================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  * ============LICENSE_END========================================================================
18  */
19
20 package com.oransc.rappmanager.models.csar;
21
22 import static org.assertj.core.api.Assertions.assertThat;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.junit.jupiter.api.Assertions.assertNotNull;
25 import static org.junit.jupiter.api.Assertions.assertNull;
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.doReturn;
28 import static org.mockito.Mockito.doThrow;
29 import static org.mockito.Mockito.mock;
30
31 import com.fasterxml.jackson.core.JsonProcessingException;
32 import com.fasterxml.jackson.databind.ObjectMapper;
33 import com.google.gson.JsonSyntaxException;
34 import com.oransc.rappmanager.models.rapp.Rapp;
35 import com.oransc.rappmanager.models.rapp.RappResources;
36 import com.oransc.rappmanager.models.rappinstance.RappACMInstance;
37 import com.oransc.rappmanager.models.rappinstance.RappDMEInstance;
38 import com.oransc.rappmanager.models.rappinstance.RappSMEInstance;
39 import java.io.ByteArrayOutputStream;
40 import java.io.File;
41 import java.io.IOException;
42 import java.util.Set;
43 import java.util.UUID;
44 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
45 import org.json.JSONException;
46 import org.json.JSONObject;
47 import org.junit.jupiter.api.Test;
48 import org.junit.jupiter.params.ParameterizedTest;
49 import org.junit.jupiter.params.provider.ValueSource;
50 import org.springframework.boot.test.context.SpringBootTest;
51 import org.springframework.boot.test.mock.mockito.SpyBean;
52 import org.springframework.test.context.ContextConfiguration;
53
54 @SpringBootTest
55 @ContextConfiguration(classes = {ObjectMapper.class, RappCsarConfigurationHandler.class})
56 class RappCsarConfigurationHandlerTest {
57
58     @SpyBean
59     RappCsarConfigurationHandler rappCsarConfigurationHandler;
60
61     String validCsarFileLocation = "src/test/resources/";
62
63     private final String validRappFile = "valid-rapp-package.csar";
64
65     private final String invalidRappNoAsdFile = "invalid-rapp-package-no-asd-yaml.csar";
66
67     private final String invalidRappEmptyAsdFile = "invalid-rapp-package-empty-asd-yaml.csar";
68
69     @Test
70     void testCsarInstantiationPayload() throws JSONException {
71         Rapp rapp = Rapp.builder().name("").packageName(validRappFile).packageLocation(validCsarFileLocation).build();
72         UUID compositionId = UUID.randomUUID();
73         RappACMInstance rappACMInstance = new RappACMInstance();
74         rappACMInstance.setInstance("kserve-instance");
75         JSONObject jsonObject = new JSONObject(
76                 rappCsarConfigurationHandler.getInstantiationPayload(rapp, rappACMInstance, compositionId));
77         assertEquals(jsonObject.get("compositionId"), String.valueOf(compositionId));
78     }
79
80     @Test
81     void testFileListing() {
82         File file = new File(validCsarFileLocation + validRappFile);
83         Set<String> fileListFromCsar = rappCsarConfigurationHandler.getFileListFromCsar(file, "Files/Sme/serviceapis/");
84         assertThat(fileListFromCsar).hasSize(2);
85     }
86
87     @Test
88     void testInvalidFileListing() {
89         File file = new File(validCsarFileLocation);
90         Set<String> fileListFromCsar = rappCsarConfigurationHandler.getFileListFromCsar(file, null);
91         assertThat(fileListFromCsar).isEmpty();
92     }
93
94     @Test
95     void testInvalidFileListingFromCsar() {
96         File file = new File("InvalidFile");
97         ByteArrayOutputStream fileByteArray = rappCsarConfigurationHandler.getFileFromCsar(file, null);
98         assertThat(fileByteArray.size()).isZero();
99     }
100
101     @Test
102     void testInvalidZipStreamGetFromCsar() throws IOException {
103         ZipArchiveInputStream zipArchiveInputStream = mock(ZipArchiveInputStream.class);
104         doThrow(new IOException()).when(zipArchiveInputStream).getNextEntry();
105         ByteArrayOutputStream fileByteArray = rappCsarConfigurationHandler.getFileFromCsar(zipArchiveInputStream, null);
106         assertThat(fileByteArray.size()).isZero();
107     }
108
109     @Test
110     void testListResources() {
111         UUID rappId = UUID.randomUUID();
112         Rapp rapp =
113                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
114                         .build();
115         RappResources rappResources = rappCsarConfigurationHandler.getRappResource(rapp);
116         assertThat(rappResources).isNotNull();
117         assertNotNull(rappResources.getAcm().getCompositionDefinitions());
118         assertThat(rappResources.getAcm().getCompositionInstances()).hasSize(4);
119         assertThat(rappResources.getSme().getProviderFunctions()).hasSize(4);
120         assertThat(rappResources.getSme().getServiceApis()).hasSize(2);
121         assertThat(rappResources.getSme().getInvokers()).hasSize(2);
122         assertThat(rappResources.getDme().getProducerInfoTypes()).hasSize(2);
123         assertThat(rappResources.getDme().getConsumerInfoTypes()).hasSize(2);
124         assertThat(rappResources.getDme().getInfoProducers()).hasSize(2);
125         assertThat(rappResources.getDme().getInfoConsumers()).hasSize(2);
126     }
127
128     @Test
129     void testListInvalidResources() {
130         UUID rappId = UUID.randomUUID();
131         Rapp rapp = Rapp.builder().rappId(rappId).name("").packageName("").packageLocation("").build();
132         RappResources rappResources = rappCsarConfigurationHandler.getRappResource(rapp);
133         assertThat(rappResources).isNotNull();
134         assertNull(rappResources.getAcm());
135         assertNull(rappResources.getSme());
136         assertNull(rappResources.getDme());
137     }
138
139     @Test
140     void testGetAcmCompositionPayload() {
141         UUID rappId = UUID.randomUUID();
142         RappResources rappResources = new RappResources();
143         rappResources.setAcm(RappResources.ACMResources.builder().compositionDefinitions("compositions")
144                                      .compositionInstances(Set.of()).build());
145         Rapp rapp =
146                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
147                         .rappResources(rappResources).build();
148         String acmCompositionPayload = rappCsarConfigurationHandler.getAcmCompositionPayload(rapp);
149         assertNotNull(acmCompositionPayload);
150     }
151
152     @Test
153     void testGetInvalidAcmCompositionPayload() {
154         UUID rappId = UUID.randomUUID();
155         RappResources rappResources = new RappResources();
156         rappResources.setAcm(RappResources.ACMResources.builder().compositionDefinitions("invalidcomposition")
157                                      .compositionInstances(Set.of()).build());
158         Rapp rapp =
159                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
160                         .rappResources(rappResources).build();
161         String acmCompositionPayload = rappCsarConfigurationHandler.getAcmCompositionPayload(rapp);
162         assertEquals("", acmCompositionPayload);
163     }
164
165     @Test
166     void testGetSmeProviderDomainPayload() {
167         UUID rappId = UUID.randomUUID();
168         RappSMEInstance rappSMEInstance = new RappSMEInstance();
169         rappSMEInstance.setProviderFunction("aef-provider-function");
170         Rapp rapp =
171                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
172                         .build();
173         String smeProviderDomainPayload =
174                 rappCsarConfigurationHandler.getSmeProviderDomainPayload(rapp, rappSMEInstance);
175         assertNotNull(smeProviderDomainPayload);
176     }
177
178     @Test
179     void testGetSmeServiceApiPayload() {
180         UUID rappId = UUID.randomUUID();
181         RappSMEInstance rappSMEInstance = new RappSMEInstance();
182         rappSMEInstance.setServiceApis("api-set-1");
183         Rapp rapp =
184                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
185                         .build();
186         String smeProviderDomainPayload = rappCsarConfigurationHandler.getSmeProviderApiPayload(rapp, rappSMEInstance);
187         assertNotNull(smeProviderDomainPayload);
188     }
189
190     @Test
191     void testGetSmeInvokerPayload() {
192         UUID rappId = UUID.randomUUID();
193         RappSMEInstance rappSMEInstance = new RappSMEInstance();
194         rappSMEInstance.setServiceApis("invoker-app1");
195         Rapp rapp =
196                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
197                         .build();
198         String smeProviderDomainPayload = rappCsarConfigurationHandler.getSmeInvokerPayload(rapp, rappSMEInstance);
199         assertNotNull(smeProviderDomainPayload);
200     }
201
202     @Test
203     void testGetDmeProducerInfoTypePayload() {
204         UUID rappId = UUID.randomUUID();
205         RappDMEInstance rappDMEInstance = new RappDMEInstance();
206         rappDMEInstance.setInfoTypesProducer(Set.of("json-file-data-from-filestore"));
207         Rapp rapp =
208                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
209                         .build();
210         String dmeInfoTypePayload = rappCsarConfigurationHandler.getDmeProducerInfoTypePayload(rapp,
211                 rappDMEInstance.getInfoTypesProducer().iterator().next());
212         assertNotNull(dmeInfoTypePayload);
213     }
214
215     @Test
216     void testGetDmeConsumerInfoTypePayload() {
217         UUID rappId = UUID.randomUUID();
218         RappDMEInstance rappDMEInstance = new RappDMEInstance();
219         rappDMEInstance.setInfoTypeConsumer("json-file-data-from-filestore");
220         Rapp rapp =
221                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
222                         .build();
223         String dmeInfoTypePayload =
224                 rappCsarConfigurationHandler.getDmeConsumerInfoTypePayload(rapp, rappDMEInstance.getInfoTypeConsumer());
225         assertNotNull(dmeInfoTypePayload);
226     }
227
228     @Test
229     void testGetDmeInfoProducerPayload() {
230         UUID rappId = UUID.randomUUID();
231         RappDMEInstance rappDMEInstance = new RappDMEInstance();
232         rappDMEInstance.setInfoProducer("json-file-data-producer");
233         Rapp rapp =
234                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
235                         .build();
236         String dmeInfoProducerPayload =
237                 rappCsarConfigurationHandler.getDmeInfoProducerPayload(rapp, rappDMEInstance.getInfoProducer());
238         assertNotNull(dmeInfoProducerPayload);
239     }
240
241     @Test
242     void testGetDmeInfoConsumerPayload() {
243         UUID rappId = UUID.randomUUID();
244         RappDMEInstance rappDMEInstance = new RappDMEInstance();
245         rappDMEInstance.setInfoConsumer("json-file-consumer");
246         Rapp rapp =
247                 Rapp.builder().rappId(rappId).name("").packageName(validRappFile).packageLocation(validCsarFileLocation)
248                         .build();
249         String dmeInfoConsumerPayload =
250                 rappCsarConfigurationHandler.getDmeInfoConsumerPayload(rapp, rappDMEInstance.getInfoConsumer());
251         assertNotNull(dmeInfoConsumerPayload);
252     }
253
254     @Test
255     void testGetAsdMetadata() {
256         Rapp rapp = Rapp.builder().name("").packageName(validRappFile).packageLocation(validCsarFileLocation).build();
257         AsdMetadata asdMetadata = rappCsarConfigurationHandler.getAsdMetadata(rapp);
258         assertEquals("123e4567-e89b-12d3-a456-426614174000", asdMetadata.getDescriptorId());
259         assertEquals("040eff2a-eb1a-4aff-bd46-37ce38092985", asdMetadata.getDescriptorInvariantId());
260         assertEquals(2, asdMetadata.getDeploymentItems().size());
261     }
262
263     @ParameterizedTest
264     @ValueSource(strings = {invalidRappNoAsdFile, invalidRappEmptyAsdFile})
265     void testGetAsdMetadataNoAsd(String packageName) {
266         Rapp rapp = Rapp.builder().name("").packageName(packageName).packageLocation(validCsarFileLocation).build();
267         assertThat(rappCsarConfigurationHandler.getAsdMetadata(rapp)).isNotNull();
268     }
269
270     @Test
271     void testGetAsdMetadataException() throws JsonProcessingException {
272         Rapp rapp = Rapp.builder().name("").packageName(validRappFile).packageLocation(validCsarFileLocation).build();
273         doThrow(new JsonSyntaxException("")).when(rappCsarConfigurationHandler).getAsdContentNode(any());
274         assertNull(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDescriptorId());
275         assertNull(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDescriptorInvariantId());
276         assertThat(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDeploymentItems()).isNull();
277     }
278
279     @Test
280     void testGetAsdMetadataNullAsdContent() throws JsonProcessingException {
281         Rapp rapp = Rapp.builder().name("").packageName(validRappFile).packageLocation(validCsarFileLocation).build();
282         doReturn(null).when(rappCsarConfigurationHandler).getAsdContentNode(any());
283         assertNull(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDescriptorId());
284         assertNull(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDescriptorInvariantId());
285         assertThat(rappCsarConfigurationHandler.getAsdMetadata(rapp).getDeploymentItems()).isNull();
286     }
287
288     @Test
289     void testGetArtifactPayload() {
290         Rapp rapp = Rapp.builder().name("").packageName(validRappFile).packageLocation(validCsarFileLocation).build();
291         assertNotNull(rappCsarConfigurationHandler.getArtifactPayload(rapp,
292                 "Artifacts/Deployment/HELM/ransliceassurance-1.0.0.tgz"));
293
294     }
295 }