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.PolicyInfo;
49 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances;
50 import org.oransc.portal.nonrtric.controlpanel.model.PolicyType;
51 import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes;
52 import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApiImpl;
53 import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApiImpl.RicInfo;
54 import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo;
55 import org.springframework.http.HttpEntity;
56 import org.springframework.http.HttpHeaders;
57 import org.springframework.http.HttpStatus;
58 import org.springframework.http.MediaType;
59 import org.springframework.http.ResponseEntity;
60 import org.springframework.web.client.RestClientException;
61 import org.springframework.web.client.RestTemplate;
63 public class PolicyAgentApiImplTest {
64 private static final String URL_PREFIX = "UrlPrefix";
65 private static final String URL_POLICY_SCHEMAS = "/policy_schemas";
66 private static final String URL_POLICY_INSTANCES = "/policies?type={type}";
67 private static final String URL_POLICY_INSTANCE = "/policy?id={id}";
68 private static final String URL_PUT_POLICY = "/policy?type={type}&id={id}&ric={ric}&service={service}";
69 private static final String URL_DELETE_POLICY = "/policy?id={id}";
70 private static final String URL_RIC_INFO = "/rics?policyType={typeName}";
71 private static final String POLICY_TYPE_1_ID = "type1";
72 private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}";
73 private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}";
74 private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}";
75 private static final String POLICY_1_ID = "policy1";
76 private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}";
77 private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}";
78 private static final String RIC_1_ID = "ric1";
79 private static final String RIC_1_INFO_VALID = "{\"name\":\"ric1\",\"policyTypes\":[\"type1\"]}";
80 private static final String RIC_1_INFO_INVALID = "{\"name\":\"ric1\",\"policyTypes\":\"type1\"]}";
81 private static final String CLIENT_ERROR_MESSAGE = "Exception: Client returned failure";
83 private static com.google.gson.Gson gson = new GsonBuilder() //
87 PolicyAgentApiImpl apiUnderTest;
89 RestTemplate restTemplateMock;
93 restTemplateMock = mock(RestTemplate.class);
94 apiUnderTest = new PolicyAgentApiImpl(URL_PREFIX, restTemplateMock);
98 public void testGetAllPolicyTypesFailure() {
99 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
100 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
101 .thenReturn(getAllPolicyTypesResp);
103 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
105 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
106 assertNull(returnedResp.getBody());
107 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
111 public void testGetAllPolicyTypesSuccessValidJson() {
112 String policyTypes = Arrays.asList(POLICY_TYPE_1_VALID, POLICY_TYPE_2_VALID).toString();
113 String policyTypesJson = parsePolicyTypesJson(policyTypes);
114 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
115 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
116 .thenReturn(getAllPolicyTypesResp);
118 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
120 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
121 assertEquals(returnedResp.getBody(), policyTypesJson);
122 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
126 public void testGetAllPolicyTypesSuccessInvalidJson() {
127 String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString();
128 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
129 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
130 .thenReturn(getAllPolicyTypesResp);
132 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
134 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
135 assertTrue(returnedResp.getBody().contains("Exception"));
136 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
140 public void testGetPolicyInstancesForTypeFailure() {
141 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
142 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
143 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
144 .thenReturn(getPolicyInstancesForTypeResp);
146 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
148 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
149 assertNull(returnedResp.getBody());
150 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
154 public void testGetPolicyInstancesForTypeSuccessValidJson() {
155 String policyInstances = Arrays.asList(POLICY_1_VALID).toString();
156 String policyInstancesJson = parsePolicyInstancesJson(policyInstances);
157 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
158 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
159 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
160 .thenReturn(getPolicyInstancesForTypeResp);
162 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
164 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
165 assertEquals(returnedResp.getBody(), policyInstancesJson);
166 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
170 public void testGetPolicyInstancesForTypeSuccessInvalidJson() {
171 String policyInstances = Arrays.asList(POLICY_1_INVALID).toString();
172 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
173 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
174 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
175 .thenReturn(getPolicyInstancesForTypeResp);
177 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
179 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
180 assertTrue(returnedResp.getBody().contains("Exception"));
181 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
185 public void testGetPolicyInstance() {
186 ResponseEntity<Object> getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK);
187 Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
188 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables)))
189 .thenReturn(getPolicyInstanceResp);
191 ResponseEntity<Object> returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID);
193 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCE, Object.class, uriVariables);
194 assertEquals(POLICY_1_VALID, returnedResp.getBody());
195 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
199 public void testPutPolicyFailure() {
200 HttpEntity<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
201 Map<String, ?> uriVariables = Map.of( //
202 "type", POLICY_TYPE_1_ID, //
203 "id", POLICY_1_ID, //
205 "service", "controlpanel");
206 doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock)
207 .put(eq(URL_PREFIX + URL_PUT_POLICY), eq(jsonHttpEntity), eq(uriVariables));
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("Exception"));
214 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, 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 doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock)
238 .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("Exception"));
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);