Merge "Modelloader: base image update"
[aai/model-loader.git] / src / test / java / org / onap / aai / modelloader / entity / catalog / TestVnfCatalogArtifactHandler.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.entity.catalog;
22
23 import static org.hamcrest.CoreMatchers.containsString;
24 import static org.hamcrest.CoreMatchers.is;
25 import static org.hamcrest.MatcherAssert.assertThat;
26 import static org.junit.jupiter.api.Assertions.assertTrue;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.when;
29
30 import java.io.IOException;
31 import java.io.UnsupportedEncodingException;
32 import java.nio.file.Files;
33 import java.nio.file.Paths;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 import org.junit.jupiter.api.BeforeAll;
38 import org.junit.jupiter.api.Test;
39 import org.mockito.ArgumentCaptor;
40 import org.mockito.Mockito;
41 import org.onap.aai.modelloader.config.AaiProperties;
42 import org.onap.aai.modelloader.entity.Artifact;
43 import org.onap.aai.modelloader.entity.ArtifactType;
44 import org.onap.aai.modelloader.restclient.AaiRestClient;
45 import org.springframework.http.HttpStatus;
46 import org.springframework.http.MediaType;
47 import org.springframework.http.ResponseEntity;
48
49 public class TestVnfCatalogArtifactHandler {
50
51     protected static AaiProperties aaiProperties = new AaiProperties();
52
53     private AaiRestClient mockRestClient = mock(AaiRestClient.class);
54
55     @BeforeAll
56     public static void setup() {
57         aaiProperties.setBaseUrl("http://aai.onap:80");
58         aaiProperties.setModelUrl("/aai/%s/service-design-and-creation/models/model/");
59         aaiProperties.setNamedQueryUrl("/aai/%s/service-design-and-creation/named-queries/named-query/");
60         aaiProperties.setVnfImageUrl("/aai/v*/service-design-and-creation/vnf-images");
61     }
62
63     /**
64      * Update A&AI with 4 images, 2 of which already exist.
65      *
66      * @throws Exception
67      */
68     @Test
69     public void testUpdateVnfImages() throws Exception {
70         // GET operation
71         ResponseEntity mockGetResp = mock(ResponseEntity.class);
72
73         // @formatter:off
74         when(mockGetResp.getStatusCodeValue())
75                 .thenReturn(HttpStatus.OK.value())
76                 .thenReturn(HttpStatus.NOT_FOUND.value())
77                 .thenReturn(HttpStatus.NOT_FOUND.value())
78                 .thenReturn(HttpStatus.OK.value());
79         // @formatter:on
80
81         when(mockRestClient.getResource(Mockito.anyString(), Mockito.anyString(), Mockito.any(MediaType.class), Mockito.any()))
82                 .thenReturn(mockGetResp);
83         mockPutOperations();
84
85         // Example VNF Catalog XML
86         VnfCatalogArtifactHandler handler = new VnfCatalogArtifactHandler(aaiProperties);
87         assertTrue(handler.pushArtifacts(createVnfCatalogArtifact(), "test", new ArrayList<Artifact>(), mockRestClient));
88
89         assertPutOperationsSucceeded();
90     }
91
92     @Test
93     public void testUpdateVnfImagesFromXml() throws Exception {
94         // GET operation
95         ResponseEntity mockGetResp = mock(ResponseEntity.class);
96
97         // @formatter:off
98         when(mockGetResp.getStatusCodeValue())
99                 .thenReturn(HttpStatus.OK.value())
100                 .thenReturn(HttpStatus.NOT_FOUND.value())
101                 .thenReturn(HttpStatus.NOT_FOUND.value())
102                 .thenReturn(HttpStatus.OK.value());
103         // @formatter:on
104
105         when(mockRestClient.getResource(Mockito.anyString(), Mockito.anyString(), Mockito.any(MediaType.class), Mockito.any()))
106                 .thenReturn(mockGetResp);
107         mockPutOperations();
108
109         // Example VNF Catalog XML
110         VnfCatalogArtifactHandler handler = new VnfCatalogArtifactHandler(aaiProperties);
111         assertThat(
112                 handler.pushArtifacts(createVnfCatalogXmlArtifact(), "test", new ArrayList<Artifact>(), mockRestClient),
113                 is(true));
114
115         // Only two of the VNF images should be pushed
116         ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
117         AaiRestClient client = Mockito.verify(mockRestClient, Mockito.times(2));
118         client.putResource(Mockito.anyString(), argument.capture(), Mockito.anyString(), Mockito.any(MediaType.class), Mockito.any());
119         assertThat(argument.getAllValues().size(), is(2));
120         assertThat(argument.getAllValues().get(0), containsString("5.2.5"));
121         assertThat(argument.getAllValues().get(0), containsString("VM00"));
122         assertThat(argument.getAllValues().get(1), containsString("5.2.4"));
123         assertThat(argument.getAllValues().get(1), containsString("VM00"));
124     }
125
126     /**
127      * Example VNF Catalog based on JSON data (returned by Babel)
128      *
129      * @return test Artifacts
130      * @throws IOException
131      * @throws UnsupportedEncodingException
132      */
133     private List<Artifact> createVnfCatalogArtifact() throws IOException, UnsupportedEncodingException {
134         String examplePath = "src/test/resources/imagedataexample.json";
135         byte[] encoded = Files.readAllBytes(Paths.get(examplePath));
136         List<Artifact> artifacts = new ArrayList<Artifact>();
137         artifacts.add(new VnfCatalogArtifact(new String(encoded, "utf-8")));
138         return artifacts;
139     }
140
141     /**
142      * Example VNF Catalog based on VNF_CATALOG XML
143      *
144      * @return test Artifacts
145      * @throws IOException
146      * @throws UnsupportedEncodingException
147      */
148     private List<Artifact> createVnfCatalogXmlArtifact() throws IOException, UnsupportedEncodingException {
149         byte[] encoded = Files.readAllBytes(Paths.get("src/test/resources/xmlFiles/fortigate.xml"));
150         List<Artifact> artifacts = new ArrayList<Artifact>();
151         artifacts.add(new VnfCatalogArtifact(ArtifactType.VNF_CATALOG_XML, new String(encoded, "utf-8")));
152         return artifacts;
153     }
154
155     /**
156      * Always return CREATED (success) for a PUT operation.
157      */
158     private void mockPutOperations() {
159         ResponseEntity mockPutResp = mock(ResponseEntity.class);
160         when(mockPutResp.getStatusCode()).thenReturn(HttpStatus.CREATED);
161         when(mockRestClient.putResource(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(),
162                 Mockito.any(MediaType.class), Mockito.any())).thenReturn(mockPutResp);
163     }
164
165     private void assertPutOperationsSucceeded() {
166         // Only two of the VNF images should be pushed
167         ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
168         AaiRestClient mockedClient = Mockito.verify(mockRestClient, Mockito.times(2));
169         mockedClient.putResource(Mockito.anyString(), argument.capture(), Mockito.anyString(),
170                 Mockito.any(MediaType.class), Mockito.any());
171         assertThat(argument.getAllValues().get(0), containsString("3.16.9"));
172         assertThat(argument.getAllValues().get(0), containsString("VM00"));
173         assertThat(argument.getAllValues().get(1), containsString("3.16.1"));
174         assertThat(argument.getAllValues().get(1), containsString("VM01"));
175     }
176 }