2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2020 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.so.adapters.vnfmadapter.rest;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertThat;
27 import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
28 import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
29 import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
30 import java.security.GeneralSecurityException;
32 import java.net.URISyntaxException;
33 import java.util.ArrayList;
34 import java.util.List;
35 import java.util.Objects;
36 import java.util.UUID;
37 import com.google.gson.Gson;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.onap.so.adapters.vnfmadapter.Constants;
42 import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
43 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
44 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
45 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
46 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
47 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
48 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
49 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter;
50 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.NotificationTypesEnum;
51 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
52 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
53 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
54 import org.onap.so.utils.CryptoUtils;
55 import org.springframework.beans.factory.annotation.Autowired;
56 import org.springframework.beans.factory.annotation.Qualifier;
57 import org.springframework.boot.test.context.SpringBootTest;
58 import org.springframework.cache.Cache;
59 import org.springframework.cache.CacheManager;
60 import org.springframework.http.HttpHeaders;
61 import org.springframework.http.HttpStatus;
62 import org.springframework.http.MediaType;
63 import org.springframework.http.ResponseEntity;
64 import org.springframework.test.context.ActiveProfiles;
65 import org.springframework.test.context.junit4.SpringRunner;
66 import org.springframework.test.web.client.MockRestServiceServer;
67 import org.springframework.web.client.RestTemplate;
68 import org.springframework.http.HttpMethod;
69 import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
70 import static org.hamcrest.Matchers.is;
71 import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
72 import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
75 * @author Ronan Kenny (ronan.kenny@est.tech)
76 * @author Gareth Roper (gareth.roper@est.tech)
79 @RunWith(SpringRunner.class)
80 @SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
81 @ActiveProfiles("test")
82 @SuppressWarnings("unchecked")
83 public class Sol003PackageManagementSubscriptionControllerTest {
85 private static String subscriptionId;
86 private final Gson gson = new Gson();
89 @Qualifier(CONFIGURABLE_REST_TEMPLATE)
90 private RestTemplate testRestTemplate;
92 private MockRestServiceServer mockRestServer;
95 private CacheManager cacheServiceProvider;
96 private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
99 private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
102 public void setUp() {
103 mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
104 final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
109 public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
110 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
111 final ResponseEntity<InlineResponse2002> response =
112 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
113 .postSubscriptionRequest(pkgmSubscriptionRequest);
115 final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
117 SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
118 VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
119 vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
120 + "/subscriptions/" + response.getBody().getId());
121 subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
123 assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
124 assertEquals(subscriptionsLinks, response.getBody().getLinks());
125 assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
126 assert (response.getHeaders().equals(headers));
127 assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
128 assertNotNull(response.getBody().getCallbackUri());
132 public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
133 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
135 final ResponseEntity<InlineResponse2002> response =
136 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
137 .postSubscriptionRequest(pkgmSubscriptionRequest);
138 subscriptionId = Objects.requireNonNull(response.getBody()).getId();
140 // Create duplicate entry
141 final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
143 final ResponseEntity<InlineResponse2002> response2002 =
144 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
145 .postSubscriptionRequest(pkgmSubscriptionRequest2);
147 assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
151 public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
152 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
154 final ResponseEntity<InlineResponse2002> response =
155 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
156 .postSubscriptionRequest(pkgmSubscriptionRequest);
157 subscriptionId = Objects.requireNonNull(response.getBody()).getId();
159 final ResponseEntity<InlineResponse2002> response2002 =
160 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
161 .getSubscription(subscriptionId);
163 final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
166 assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
167 assert (response.getHeaders().equals(headers));
168 assertEquals(HttpStatus.OK, response2002.getStatusCode());
169 assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
170 // Ensure CallBackUri is set to new URI
171 assertNotEquals(pkgmSubscriptionRequest.getCallbackUri(), response.getBody().getCallbackUri());
175 public void testFailGetSubscriptionWithInvalidSubscriptionId() {
176 final ResponseEntity<InlineResponse2002> response =
177 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
178 .getSubscription("invalidSubscriptionId");
179 assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
183 public void testSuccessGetSubscriptions() throws GeneralSecurityException {
184 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
185 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
187 mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
188 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
190 sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
191 ResponseEntity<List<InlineResponse2002>> response =
192 sol003PackageManagementSubscriptionController.getSubscriptions();
194 List<InlineResponse2002> subscriptionsList = response.getBody();
196 assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
197 pkgmSubscriptionRequest.getFilter());
198 assert (subscriptionsList != null);
199 assertNotEquals('0', subscriptionsList.size());
200 assertEquals(HttpStatus.OK, response.getStatusCode());
204 public void testSuccessDeleteSubscriptionWithSubscriptionId() throws GeneralSecurityException {
205 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
206 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
207 final String subscriptionId = pkgmSubscription.getId();
209 mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
210 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
211 mockRestServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
212 .andRespond(withStatus(HttpStatus.NO_CONTENT));
214 final ResponseEntity<InlineResponse2002> responsePost =
215 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
216 .postSubscriptionRequest(pkgmSubscriptionRequest);
219 final ResponseEntity responseDelete =
220 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
222 // Attempt to retrieve the subscription after delete
223 final ResponseEntity<InlineResponse2002> responseGetSubscription =
224 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
225 .getSubscription(subscriptionId);
227 assertEquals(HttpStatus.NOT_FOUND, responseGetSubscription.getStatusCode());
228 assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
232 public void testFailDeleteSubscriptionWithInvalidSubscriptionId() throws URISyntaxException, InterruptedException {
233 final ResponseEntity<Void> responseDelete = (ResponseEntity<Void>) sol003PackageManagementSubscriptionController
234 .deleteSubscription("invalidSubscriptionId");
235 assertEquals(HttpStatus.NOT_FOUND, responseDelete.getStatusCode());
238 private PkgmSubscriptionRequest buildPkgmSubscriptionRequest() {
239 final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
240 final SubscriptionsFilter sub = buildSubscriptionsFilter();
241 final SubscriptionsAuthentication auth = new SubscriptionsAuthentication();
242 pkgmSubscriptionRequest.setFilter(sub);
243 pkgmSubscriptionRequest.setCallbackUri(msbEndpoint.toString());
244 pkgmSubscriptionRequest.setAuthentication(auth);
245 return pkgmSubscriptionRequest;
248 private SubscriptionsFilter buildSubscriptionsFilter() {
249 final SubscriptionsFilter sub = new SubscriptionsFilter();
250 final List<String> vnfdIdList = new ArrayList();
251 final List<String> vnfPkgIdList = new ArrayList();
252 final List<NotificationTypesEnum> notificationTypes = new ArrayList<>();
253 final SubscriptionsFilterVnfProductsFromProviders subscriptionsFilterVnfProductsFromProviders =
254 new SubscriptionsFilterVnfProductsFromProviders();
255 final List<SubscriptionsFilterVnfProductsFromProviders> vnfProductsFromProviders = new ArrayList<>();
257 vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
258 sub.setVnfdId(vnfdIdList);
259 sub.setNotificationTypes(notificationTypes);
260 sub.setVnfPkgId(vnfPkgIdList);
261 sub.setVnfProductsFromProviders(vnfProductsFromProviders);
265 private PkgmSubscription buildPkgmSubscription() {
266 PkgmSubscription pkgmSubscription = new PkgmSubscription();
267 PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
268 LinkSelf linkSelf = new LinkSelf();
269 String id = UUID.randomUUID().toString();
270 pkgmSubscription.setId(id);
271 pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
272 pkgmSubscription.setFilter(pkgmNotificationsFilter);
273 pkgmSubscription.setLinks(linkSelf);
274 return pkgmSubscription;
277 private PkgmSubscriptionRequest postSubscriptionForTest() {
278 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
279 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
281 mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
282 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
283 return pkgmSubscriptionRequest;
286 private HttpHeaders buildHttpHeaders(String uri) throws URISyntaxException {
287 final HttpHeaders headers = new HttpHeaders();
288 URI myUri = new URI(uri);
289 headers.setLocation(myUri);