2 * ========================LICENSE_START=================================
5 * Copyright (C) 2020 Nordix Foundation
6 * Modifications Copyright (C) 2020 Nordix Foundation
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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===================================
21 package org.oransc.portal.nonrtric.controlpanel.policyagentapi;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.junit.jupiter.api.Assertions.assertNull;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26 import static org.mockito.ArgumentMatchers.eq;
27 import static org.mockito.Mockito.doThrow;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
32 import com.google.gson.GsonBuilder;
33 import com.google.gson.JsonArray;
34 import com.google.gson.JsonElement;
35 import com.google.gson.JsonObject;
36 import com.google.gson.JsonParser;
37 import com.google.gson.reflect.TypeToken;
39 import java.lang.reflect.Type;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.Collection;
43 import java.util.List;
46 import org.junit.jupiter.api.BeforeEach;
47 import org.junit.jupiter.api.Test;
48 import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo;
49 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo;
50 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances;
51 import org.oransc.portal.nonrtric.controlpanel.model.PolicyType;
52 import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes;
53 import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApiImpl.RicInfo;
54 import org.springframework.http.HttpEntity;
55 import org.springframework.http.HttpHeaders;
56 import org.springframework.http.HttpStatus;
57 import org.springframework.http.MediaType;
58 import org.springframework.http.ResponseEntity;
59 import org.springframework.web.client.HttpClientErrorException;
60 import org.springframework.web.client.RestTemplate;
62 public class PolicyAgentApiImplTest {
63 private static final String URL_PREFIX = "UrlPrefix";
64 private static final String URL_POLICY_SCHEMAS = "/policy_schemas";
65 private static final String URL_POLICY_INSTANCES = "/policies?type={type}";
66 private static final String URL_POLICY_INSTANCE = "/policy?id={id}";
67 private static final String URL_PUT_POLICY = "/policy?type={type}&id={id}&ric={ric}&service={service}";
68 private static final String URL_DELETE_POLICY = "/policy?id={id}";
69 private static final String URL_RIC_INFO = "/rics?policyType={typeName}";
70 private static final String POLICY_TYPE_1_ID = "type1";
71 private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}";
72 private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}";
73 private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}";
74 private static final String POLICY_1_ID = "policy1";
75 private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}";
76 private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}";
77 private static final String RIC_1_ID = "ric1";
78 private static final String RIC_1_INFO_VALID = "{\"name\":\"ric1\",\"policyTypes\":[\"type1\"]}";
79 private static final String RIC_1_INFO_INVALID = "{\"name\":\"ric1\",\"policyTypes\":\"type1\"]}";
80 private static final String CLIENT_ERROR_MESSAGE = "XXXXXXX";
82 private static com.google.gson.Gson gson = new GsonBuilder() //
86 PolicyAgentApiImpl apiUnderTest;
88 RestTemplate restTemplateMock;
92 restTemplateMock = mock(RestTemplate.class);
93 apiUnderTest = new PolicyAgentApiImpl(URL_PREFIX, restTemplateMock);
97 public void testGetAllPolicyTypesFailure() {
98 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
99 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
100 .thenReturn(getAllPolicyTypesResp);
102 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
104 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
105 assertNull(returnedResp.getBody());
106 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
110 public void testGetAllPolicyTypesSuccessValidJson() {
111 String policyTypes = Arrays.asList(POLICY_TYPE_1_VALID, POLICY_TYPE_2_VALID).toString();
112 String policyTypesJson = parsePolicyTypesJson(policyTypes);
113 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
114 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
115 .thenReturn(getAllPolicyTypesResp);
117 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
119 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
120 assertEquals(returnedResp.getBody(), policyTypesJson);
121 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
125 public void testGetAllPolicyTypesSuccessInvalidJson() {
126 String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString();
127 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
128 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
129 .thenReturn(getAllPolicyTypesResp);
131 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
133 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
134 assertTrue(returnedResp.getBody().contains("Exception"));
135 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
139 public void testGetPolicyInstancesForTypeFailure() {
140 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
141 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
142 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
143 .thenReturn(getPolicyInstancesForTypeResp);
145 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
147 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
148 assertNull(returnedResp.getBody());
149 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
153 public void testGetPolicyInstancesForTypeSuccessValidJson() {
154 String policyInstances = Arrays.asList(POLICY_1_VALID).toString();
155 String policyInstancesJson = parsePolicyInstancesJson(policyInstances);
156 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
157 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
158 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
159 .thenReturn(getPolicyInstancesForTypeResp);
161 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
163 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
164 assertEquals(returnedResp.getBody(), policyInstancesJson);
165 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
169 public void testGetPolicyInstancesForTypeSuccessInvalidJson() {
170 String policyInstances = Arrays.asList(POLICY_1_INVALID).toString();
171 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
172 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
173 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
174 .thenReturn(getPolicyInstancesForTypeResp);
176 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
178 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
179 assertTrue(returnedResp.getBody().contains("Exception"));
180 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
184 public void testGetPolicyInstance() {
185 ResponseEntity<Object> getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK);
186 Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
187 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables)))
188 .thenReturn(getPolicyInstanceResp);
190 ResponseEntity<Object> returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID);
192 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCE, Object.class, uriVariables);
193 assertEquals(POLICY_1_VALID, returnedResp.getBody());
194 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
198 public void testPutPolicyFailure() {
199 HttpEntity<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
200 Map<String, ?> uriVariables = Map.of( //
201 "type", POLICY_TYPE_1_ID, //
202 "id", POLICY_1_ID, //
204 "service", "controlpanel");
205 HttpClientErrorException exception = new HttpClientErrorException(HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
206 doThrow(exception).when(restTemplateMock).put(eq(URL_PREFIX + URL_PUT_POLICY), eq(jsonHttpEntity),
209 ResponseEntity<String> returnedResp =
210 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID);
212 verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables);
213 assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
214 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
218 public void testPutPolicySuccess() {
219 HttpEntity<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
220 Map<String, ?> uriVariables = Map.of( //
221 "type", POLICY_TYPE_1_ID, //
222 "id", POLICY_1_ID, //
224 "service", "controlpanel");
226 ResponseEntity<String> returnedResp =
227 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID);
229 verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables);
230 assertNull(returnedResp.getBody());
231 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
235 public void testDeletePolicyFailure() {
236 Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
237 HttpClientErrorException exception = new HttpClientErrorException(HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
238 doThrow(exception).when(restTemplateMock).delete(eq(URL_PREFIX + URL_DELETE_POLICY), eq(uriVariables));
240 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
242 verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables);
243 assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
244 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
248 public void testDeletePolicySuccess() {
249 Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
251 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
253 verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables);
254 assertNull(returnedResp.getBody());
255 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
259 public void testGetRicsSupportingTypeValidJson() {
260 String rics = Arrays.asList(RIC_1_INFO_VALID).toString();
261 String ricsJson = parseRicsJson(rics);
262 Map<String, ?> uriVariables = Map.of("typeName", POLICY_TYPE_1_ID);
263 when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables)))
266 ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
268 verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables);
269 assertEquals(returnedResp.getBody(), ricsJson);
270 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
274 public void testGetRicsSupportingTypeInvalidJson() {
275 String rics = Arrays.asList(RIC_1_INFO_INVALID).toString();
276 Map<String, ?> uriVariables = Map.of("typeName", POLICY_TYPE_1_ID);
277 when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables)))
280 ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
282 verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables);
283 assertTrue(returnedResp.getBody().contains("Exception"));
284 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
287 private String parsePolicyTypesJson(String inputString) {
288 PolicyTypes policyTypes = new PolicyTypes();
289 JsonArray schemas = JsonParser.parseString(inputString).getAsJsonArray();
290 for (JsonElement schema : schemas) {
291 JsonObject schemaObj = schema.getAsJsonObject();
292 policyTypes.add(new PolicyType(schemaObj.get("title").getAsString(), schemaObj.toString()));
294 return gson.toJson(policyTypes);
297 private String parsePolicyInstancesJson(String inputString) {
298 Type listType = new TypeToken<List<ImmutablePolicyInfo>>() {}.getType();
299 List<PolicyInfo> rspParsed = gson.fromJson(inputString, listType);
300 PolicyInstances policyInstances = new PolicyInstances();
301 for (PolicyInfo policy : rspParsed) {
302 policyInstances.add(policy);
304 return gson.toJson(policyInstances);
307 private String parseRicsJson(String inputString) {
308 Type listType = new TypeToken<List<ImmutableRicInfo>>() {}.getType();
309 List<RicInfo> rspParsed = gson.fromJson(inputString, listType);
310 Collection<String> rics = new ArrayList<>(rspParsed.size());
311 for (RicInfo ric : rspParsed) {
312 rics.add(ric.ricName());
314 return gson.toJson(rics);
317 private HttpEntity<Object> createJsonHttpEntity(Object content) {
318 HttpHeaders headers = new HttpHeaders();
319 headers.setContentType(MediaType.APPLICATION_JSON);
320 return new HttpEntity<>(content, headers);