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.mock;
28 import static org.mockito.Mockito.when;
30 import com.google.gson.GsonBuilder;
31 import com.google.gson.JsonArray;
32 import com.google.gson.JsonElement;
33 import com.google.gson.JsonParser;
35 import java.nio.charset.StandardCharsets;
36 import java.util.Arrays;
38 import org.junit.jupiter.api.BeforeEach;
39 import org.junit.jupiter.api.Test;
40 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo;
41 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstance;
42 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances;
43 import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient;
44 import org.springframework.http.HttpStatus;
45 import org.springframework.http.ResponseEntity;
46 import org.springframework.web.client.HttpServerErrorException;
47 import reactor.core.publisher.Mono;
49 class PolicyAgentApiImplTest {
50 private static final String URL_POLICY_SCHEMAS = "/a1-policy/v2/policy-types";
51 private static final String POLICY_TYPE_1_ID = "type1";
52 private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}";
53 private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}";
54 private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}";
55 private static final String POLICY_1_ID = "policy1";
56 private static final String POLICY_DATA =
57 "{\"qosObjectives\":{\"priorityLevel\":22.0},\"scope\":{\"qosId\":\"22\",\"ueId\":\"22\"}}";
58 private static final String POLICY_1_VALID =
59 "{\"policy_id\":\"policy1\",\"policytype_id\":\"type1\",\"ric_id\":\"ric1\",\"policy_data\":" + POLICY_DATA
60 + ",\"service_id\":\"controlpanel\"}";
61 private static final String POLICY_1_INVALID = "\"policy_id\":\"policy1\"}";
62 private static final String RIC_1_ID = "ric1";
63 private static final String RIC_1_INFO_VALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":[\"type1\"]}";
64 private static final String RIC_1_INFO_INVALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":\"type1\"]}";
65 private static final String CLIENT_ERROR_MESSAGE = "XXXXXXX";
66 private static final String SERVICE_ID = "controlpanel";
67 private static final String TIMESTAMP = "2021-01-12T09:59:33.392470Z";
68 private static final String STATUS =
69 "{\"last_modified\": \"" + TIMESTAMP + "\",\"status\":{\"enforceStatus\": \"\",\"enforceReason\": \"\"}}";
70 private static com.google.gson.Gson gson = new GsonBuilder() //
74 PolicyAgentApiImpl apiUnderTest;
76 AsyncRestClient restClient;
80 restClient = mock(AsyncRestClient.class);
81 apiUnderTest = new PolicyAgentApiImpl(restClient);
84 private void whenGetReturnOK(String url, HttpStatus status, String body) {
85 ResponseEntity<String> ret = new ResponseEntity<>(body, status);
86 when(restClient.getForEntity(eq(url))).thenReturn(Mono.just(ret));
89 private void whenGetReturnFailure(String url, HttpStatus status, String body) {
90 HttpServerErrorException e = new HttpServerErrorException(status, body);
91 when(restClient.getForEntity(eq(url))).thenReturn(Mono.error(e));
95 void testGetAllPolicyTypesFailure() {
96 whenGetReturnFailure(URL_POLICY_SCHEMAS, HttpStatus.NOT_FOUND, "");
97 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
98 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
102 void testGetAllPolicyTypesSuccessValidJson() {
103 String returnValue = "{\"policytype_ids\": [\"type1\",\"type2\"]}";
104 whenGetReturnOK(URL_POLICY_SCHEMAS, HttpStatus.OK, returnValue);
105 whenGetReturnOK(URL_POLICY_SCHEMAS + "/type1", HttpStatus.OK, "{\"policy_schema\":{}}");
106 whenGetReturnOK(URL_POLICY_SCHEMAS + "/type2", HttpStatus.OK, "{\"policy_schema\":{}}");
108 ResponseEntity<String> resp = apiUnderTest.getAllPolicyTypes();
109 assertTrue(resp.getBody().contains("\"name\":\"type1\""));
110 assertEquals(HttpStatus.OK, resp.getStatusCode());
114 void testGetAllPolicyTypesSuccessInvalidJson() {
115 String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString();
116 whenGetReturnOK(URL_POLICY_SCHEMAS, HttpStatus.OK, policyTypes);
118 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
120 assertTrue(returnedResp.getBody().contains("Exception"));
121 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
124 private String urlPolicyInstances(String type) {
125 return "/a1-policy/v2/policies?policytype_id=" + type;
129 void testGetPolicyInstancesForTypeFailure() {
130 whenGetReturnFailure(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.NOT_FOUND, "");
132 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
134 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
138 void testGetPolicyInstancesForTypeSuccessValidJson() {
139 String policyInstances = "{\"policy_ids\":[\"policy1\"]}";
140 String policyInstancesJson = parsePolicyInstancesJson("[\"policy1\"]");
142 whenGetReturnOK(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.OK, policyInstances);
143 whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID);
144 whenGetReturnOK(urlPolicyStatus(POLICY_1_ID), HttpStatus.OK, STATUS);
146 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
147 assertEquals(returnedResp.getBody(), policyInstancesJson);
148 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
152 void testGetPolicyInstancesForTypeSuccessInvalidJson() {
153 String policyInstances = Arrays.asList(POLICY_1_INVALID).toString();
155 whenGetReturnOK(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.OK, policyInstances);
157 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
159 assertTrue(returnedResp.getBody().contains("Exception"));
160 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
163 private String urlPolicyInstance(String id) {
164 return "/a1-policy/v2/policies/" + id;
167 private String urlPolicyStatus(String id) {
168 return "/a1-policy/v2/policies/" + id + "/status";
172 void testGetPolicyInstance() {
173 whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID);
174 whenGetReturnOK(urlPolicyStatus(POLICY_1_ID), HttpStatus.OK, STATUS);
176 ResponseEntity<Object> returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID);
178 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
179 assertEquals(POLICY_DATA, gson.toJson(returnedResp.getBody()));
182 private String urlPutPolicy() {
183 return "/a1-policy/v2/policies/";
186 private void whenPutReturnOK(String url, String putBody, HttpStatus status, String body) {
187 ResponseEntity<String> ret = new ResponseEntity<>(body, status);
188 when(restClient.putForEntity(eq(url), eq(putBody))).thenReturn(Mono.just(ret));
191 private void whenPutReturnFailure(String url, String putBody, HttpStatus status, String body) {
192 HttpServerErrorException e =
193 new HttpServerErrorException(status, body, body.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
194 when(restClient.putForEntity(eq(url), eq(putBody))).thenReturn(Mono.error(e));
198 void testPutPolicyFailure() {
199 String url = urlPutPolicy();
200 JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject();
201 PolicyInstance i = PolicyInstance.builder() //
202 .policyId(POLICY_1_ID) //
203 .policyTypeId(POLICY_TYPE_1_ID) //
206 .serviceId(SERVICE_ID) //
209 String jsonStr = gson.toJson(i);
210 whenPutReturnFailure(url, jsonStr, HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
212 ResponseEntity<String> returnedResp =
213 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID);
215 assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
216 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
220 void testPutPolicySuccess() {
221 String url = urlPutPolicy();
222 JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject();
223 PolicyInstance i = PolicyInstance.builder() //
224 .policyId(POLICY_1_ID) //
225 .policyTypeId(POLICY_TYPE_1_ID) //
228 .serviceId(SERVICE_ID) //
230 String jsonStr = gson.toJson(i);
231 whenPutReturnOK(url, jsonStr, HttpStatus.OK, POLICY_1_VALID);
233 ResponseEntity<String> returnedResp =
234 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID);
235 assertNull(returnedResp.getBody());
236 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
239 private void whenDeleteReturnOK(String url, HttpStatus status) {
240 ResponseEntity<String> ret = new ResponseEntity<>(status);
241 when(restClient.deleteForEntity(eq(url))).thenReturn(Mono.just(ret));
244 private void whenDeleteReturnFailure(String url, HttpStatus status, String body) {
245 HttpServerErrorException e =
246 new HttpServerErrorException(status, body, body.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
247 when(restClient.deleteForEntity(eq(url))).thenReturn(Mono.error(e));
250 private String deletePolicyUrl(String id) {
251 return "/a1-policy/v2/policies/" + id;
255 void testDeletePolicyFailure() {
256 whenDeleteReturnFailure(deletePolicyUrl(POLICY_1_ID), HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
258 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
260 assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
261 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
265 void testDeletePolicySuccess() {
266 whenDeleteReturnOK(deletePolicyUrl(POLICY_1_ID), HttpStatus.OK);
267 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
269 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
272 private String urlRicInfo(String typeName) {
273 return "/a1-policy/v2/rics?policytype_id=" + typeName;
277 void testGetRicsSupportingTypeValidJson() {
278 String rics = Arrays.asList(RIC_1_INFO_VALID).toString();
279 String returnVal = "{\"rics\":" + rics + "}";
280 this.whenGetReturnOK(urlRicInfo(POLICY_TYPE_1_ID), HttpStatus.OK, returnVal);
282 ResponseEntity<String> resp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
284 assertEquals(HttpStatus.OK, resp.getStatusCode());
285 assertEquals("[\"ric1\"]", resp.getBody());
289 void testGetRicsSupportingTypeInvalidJson() {
290 String rics = Arrays.asList(RIC_1_INFO_INVALID).toString();
292 this.whenGetReturnOK(urlRicInfo(POLICY_TYPE_1_ID), HttpStatus.OK, rics);
294 ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
296 assertTrue(returnedResp.getBody().contains("Exception"));
297 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
300 private String parsePolicyInstancesJson(String inputString) {
301 JsonArray arr = JsonParser.parseString(inputString).getAsJsonArray();
302 PolicyInstances res = new PolicyInstances();
303 JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject();
304 for (JsonElement id : arr) {
305 PolicyInfo i = PolicyInfo.builder() //
306 .policyId(id.getAsString()) //
307 .policyTypeId(POLICY_TYPE_1_ID) //
310 .serviceId(SERVICE_ID) //
311 .lastModified(TIMESTAMP) //
315 return gson.toJson(res);