Implemented policy get-status
[nonrtric.git] / policy-agent / src / test / java / org / oransc / policyagent / clients / SdncOscA1ClientTest.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2020 Nordix Foundation
6  * %%
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ========================LICENSE_END===================================
19  */
20
21 package org.oransc.policyagent.clients;
22
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.mockito.ArgumentMatchers.anyString;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
28
29 import java.util.Arrays;
30 import java.util.List;
31
32 import org.json.JSONException;
33 import org.junit.jupiter.api.BeforeEach;
34 import org.junit.jupiter.api.Test;
35 import org.junit.jupiter.api.extension.ExtendWith;
36 import org.mockito.junit.jupiter.MockitoExtension;
37 import org.mockito.stubbing.OngoingStubbing;
38 import org.oransc.policyagent.repository.Policy;
39
40 import reactor.core.publisher.Flux;
41 import reactor.core.publisher.Mono;
42 import reactor.test.StepVerifier;
43
44 @ExtendWith(MockitoExtension.class)
45 public class SdncOscA1ClientTest {
46     private static final String CONTROLLER_USERNAME = "username";
47     private static final String CONTROLLER_PASSWORD = "password";
48     private static final String RIC_1_URL = "RicUrl";
49     private static final String POLICY_TYPES_IDENTITIES_URL = "/A1-ADAPTER-API:getPolicyTypeIdentities";
50     private static final String POLICY_IDENTITIES_URL = "/A1-ADAPTER-API:getPolicyIdentities";
51     private static final String POLICY_TYPES_URL = "/A1-ADAPTER-API:getPolicyType";
52     private static final String PUT_POLICY_URL = "/A1-ADAPTER-API:putPolicy";
53     private static final String DELETE_POLICY_URL = "/A1-ADAPTER-API:deletePolicy";
54
55     private static final String POLICY_TYPE_1_ID = "type1";
56     private static final String POLICY_TYPE_2_ID = "type2";
57     private static final String POLICY_TYPE_SCHEMA_VALID = "{\"type\":\"type1\"}";
58     private static final String POLICY_TYPE_SCHEMA_INVALID = "\"type\":\"type1\"}";
59     private static final String POLICY_1_ID = "policy1";
60     private static final String POLICY_2_ID = "policy2";
61     private static final String POLICY_JSON_VALID = "{\"scope\":{\"ueId\":\"ue1\"}}";
62     private static final String POLICY_JSON_INVALID = "\"scope\":{\"ueId\":\"ue1\"}}";
63
64     SdncOscA1Client clientUnderTest;
65
66     AsyncRestClient asyncRestClientMock;
67
68     @BeforeEach
69     public void init() {
70         asyncRestClientMock = mock(AsyncRestClient.class);
71         clientUnderTest = new SdncOscA1Client(A1ClientHelper.createRic(RIC_1_URL).getConfig(), CONTROLLER_USERNAME,
72             CONTROLLER_PASSWORD, asyncRestClientMock);
73     }
74
75     @Test
76     public void testGetPolicyTypeIdentities() {
77         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
78             .nearRtRicUrl(RIC_1_URL) //
79             .build();
80         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
81
82         List<String> policyTypeIds = Arrays.asList(POLICY_TYPE_1_ID, POLICY_TYPE_2_ID);
83         Mono<String> policyTypeIdsResp =
84             A1ClientHelper.createOutputJsonResponse("policy-type-id-list", policyTypeIds.toString());
85         whenAsyncPostThenReturn(policyTypeIdsResp);
86
87         Mono<List<String>> returnedMono = clientUnderTest.getPolicyTypeIdentities();
88
89         verify(asyncRestClientMock).postWithAuthHeader(POLICY_TYPES_IDENTITIES_URL, inputJsonString,
90             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
91         StepVerifier.create(returnedMono).expectNext(policyTypeIds).expectComplete().verify();
92     }
93
94     @Test
95     public void testGetPolicyIdentities() {
96         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
97             .nearRtRicUrl(RIC_1_URL) //
98             .build();
99         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
100
101         List<String> policyIds = Arrays.asList(POLICY_1_ID, POLICY_2_ID);
102         Mono<String> policyIdsResp = A1ClientHelper.createOutputJsonResponse("policy-id-list", policyIds.toString());
103         whenAsyncPostThenReturn(policyIdsResp);
104
105         Mono<List<String>> returnedMono = clientUnderTest.getPolicyIdentities();
106
107         verify(asyncRestClientMock).postWithAuthHeader(POLICY_IDENTITIES_URL, inputJsonString, CONTROLLER_USERNAME,
108             CONTROLLER_PASSWORD);
109         StepVerifier.create(returnedMono).expectNext(policyIds).expectComplete().verify();
110     }
111
112     @Test
113     public void testGetValidPolicyType() {
114         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
115             .nearRtRicUrl(RIC_1_URL) //
116             .policyTypeId(POLICY_TYPE_1_ID) //
117             .build();
118         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
119
120         String policyType = "{\"policySchema\": " + POLICY_TYPE_SCHEMA_VALID + ", \"statusSchema\": {} }";
121         Mono<String> policyTypeResp = A1ClientHelper.createOutputJsonResponse("policy-type", policyType);
122         whenAsyncPostThenReturn(policyTypeResp);
123
124         Mono<String> returnedMono = clientUnderTest.getPolicyTypeSchema(POLICY_TYPE_1_ID);
125
126         verify(asyncRestClientMock).postWithAuthHeader(POLICY_TYPES_URL, inputJsonString, CONTROLLER_USERNAME,
127             CONTROLLER_PASSWORD);
128         StepVerifier.create(returnedMono).expectNext(POLICY_TYPE_SCHEMA_VALID).expectComplete().verify();
129     }
130
131     @Test
132     public void testGetInvalidPolicyType() {
133         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
134             .nearRtRicUrl(RIC_1_URL) //
135             .policyTypeId(POLICY_TYPE_1_ID) //
136             .build();
137         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
138
139         String policyType = "{\"policySchema\": " + POLICY_TYPE_SCHEMA_INVALID + ", \"statusSchema\": {} }";
140         Mono<String> policyTypeResp = A1ClientHelper.createOutputJsonResponse("policy-type", policyType);
141         whenAsyncPostThenReturn(policyTypeResp);
142
143         Mono<String> returnedMono = clientUnderTest.getPolicyTypeSchema(POLICY_TYPE_1_ID);
144
145         verify(asyncRestClientMock).postWithAuthHeader(POLICY_TYPES_URL, inputJsonString, CONTROLLER_USERNAME,
146             CONTROLLER_PASSWORD);
147         StepVerifier.create(returnedMono).expectErrorMatches(throwable -> throwable instanceof JSONException).verify();
148     }
149
150     @Test
151     public void testPutPolicyValidResponse() {
152         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
153             .nearRtRicUrl(RIC_1_URL) //
154             .policyTypeId(POLICY_TYPE_1_ID) //
155             .policyId(POLICY_1_ID) //
156             .policy(POLICY_JSON_VALID) //
157             .build();
158         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
159
160         Mono<String> policyResp = A1ClientHelper.createOutputJsonResponse("returned-policy", POLICY_JSON_VALID);
161         whenAsyncPostThenReturn(policyResp);
162
163         Mono<String> returnedMono = clientUnderTest
164             .putPolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
165
166         verify(asyncRestClientMock).postWithAuthHeader(PUT_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
167             CONTROLLER_PASSWORD);
168         StepVerifier.create(returnedMono).expectNext(POLICY_JSON_VALID).expectComplete().verify();
169     }
170
171     @Test
172     public void testPutPolicyInvalidResponse() {
173         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
174             .nearRtRicUrl(RIC_1_URL) //
175             .policyTypeId(POLICY_TYPE_1_ID) //
176             .policyId(POLICY_1_ID) //
177             .policy(POLICY_JSON_VALID) //
178             .build();
179         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
180
181         Mono<String> policyResp = A1ClientHelper.createOutputJsonResponse("returned-policy", POLICY_JSON_INVALID);
182         whenAsyncPostThenReturn(policyResp);
183
184         Mono<String> returnedMono = clientUnderTest
185             .putPolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
186
187         verify(asyncRestClientMock).postWithAuthHeader(PUT_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
188             CONTROLLER_PASSWORD);
189         StepVerifier.create(returnedMono).expectErrorMatches(throwable -> throwable instanceof JSONException).verify();
190     }
191
192     @Test
193     public void testDeletePolicy() {
194         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
195             .nearRtRicUrl(RIC_1_URL) //
196             .policyId(POLICY_1_ID) //
197             .build();
198         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
199
200         whenAsyncPostThenReturn(Mono.empty());
201
202         Mono<String> returnedMono = clientUnderTest
203             .deletePolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
204
205         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
206             CONTROLLER_PASSWORD);
207         StepVerifier.create(returnedMono).expectComplete().verify();
208     }
209
210     @Test
211     public void testDeleteAllPolicies() {
212         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
213             .nearRtRicUrl(RIC_1_URL) //
214             .build();
215         String inputJsonStringGetIds = A1ClientHelper.createInputJsonString(inputParams);
216         inputParams = ImmutableSdncOscAdapterInput.builder() //
217             .nearRtRicUrl(RIC_1_URL) //
218             .policyId(POLICY_1_ID) //
219             .build();
220         String inputJsonStringDeletePolicy1 = A1ClientHelper.createInputJsonString(inputParams);
221         inputParams = ImmutableSdncOscAdapterInput.builder() //
222             .nearRtRicUrl(RIC_1_URL) //
223             .policyId(POLICY_2_ID) //
224             .build();
225         String inputJsonStringDeletePolicy2 = A1ClientHelper.createInputJsonString(inputParams);
226
227         List<String> policyIds = Arrays.asList(POLICY_1_ID, POLICY_2_ID);
228         Mono<String> policyIdsResp = A1ClientHelper.createOutputJsonResponse("policy-id-list", policyIds.toString());
229         whenAsyncPostThenReturn(policyIdsResp).thenReturn(Mono.empty());
230
231         Flux<String> returnedFlux = clientUnderTest.deleteAllPolicies();
232
233         StepVerifier.create(returnedFlux).expectComplete().verify();
234         verify(asyncRestClientMock).postWithAuthHeader(POLICY_IDENTITIES_URL, inputJsonStringGetIds,
235             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
236         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonStringDeletePolicy1,
237             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
238         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonStringDeletePolicy2,
239             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
240     }
241
242     @Test
243     public void testGetStatus() {
244         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
245             .nearRtRicUrl(RIC_1_URL) //
246             .policyId(POLICY_1_ID) //
247             .build();
248         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
249
250         String status = "STATUS";
251         Mono<String> policyStatusResp = A1ClientHelper.createOutputJsonResponse("policy-status", status);
252         whenAsyncPostThenReturn(policyStatusResp);
253
254         Policy policy = A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID);
255
256         String returnedStatus = clientUnderTest.getPolicyStatus(policy).block();
257
258         assertEquals(status, returnedStatus, "unexpexted status");
259
260         final String expectedUrl = "/A1-ADAPTER-API:getPolicyStatus";
261         verify(asyncRestClientMock).postWithAuthHeader(expectedUrl, inputJsonString, CONTROLLER_USERNAME,
262             CONTROLLER_PASSWORD);
263     }
264
265     private OngoingStubbing<Mono<String>> whenAsyncPostThenReturn(Mono<String> response) {
266         return when(asyncRestClientMock.postWithAuthHeader(anyString(), anyString(), anyString(), anyString()))
267             .thenReturn(response);
268     }
269 }