2ccd3b3c69bbacdb11a3e9b966e02a7a49570d11
[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_IDENTITIES_URL = "/A1-ADAPTER-API:getPolicyIdentities";
50     private static final String PUT_POLICY_URL = "/A1-ADAPTER-API:putPolicy";
51     private static final String DELETE_POLICY_URL = "/A1-ADAPTER-API:deletePolicy";
52     private static final String POLICY_TYPE_1_ID = "type1";
53     private static final String POLICY_1_ID = "policy1";
54     private static final String POLICY_2_ID = "policy2";
55     private static final String POLICY_JSON_VALID = "{\"scope\":{\"ueId\":\"ue1\"}}";
56     private static final String POLICY_JSON_INVALID = "\"scope\":{\"ueId\":\"ue1\"}}";
57
58     SdncOscA1Client clientUnderTest;
59
60     AsyncRestClient asyncRestClientMock;
61
62     @BeforeEach
63     public void init() {
64         asyncRestClientMock = mock(AsyncRestClient.class);
65         clientUnderTest = new SdncOscA1Client(A1ClientHelper.createRic(RIC_1_URL).getConfig(), CONTROLLER_USERNAME,
66             CONTROLLER_PASSWORD, asyncRestClientMock);
67     }
68
69     @Test
70     public void testGetPolicyTypeIdentities() {
71         List<String> policyTypeIds = clientUnderTest.getPolicyTypeIdentities().block();
72         assertEquals(1, policyTypeIds.size(), "should hardcoded to one");
73         assertEquals("", policyTypeIds.get(0), "should hardcoded to empty");
74     }
75
76     @Test
77     public void testGetPolicyIdentities() {
78         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
79             .nearRtRicUrl(RIC_1_URL) //
80             .build();
81         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
82
83         List<String> policyIds = Arrays.asList(POLICY_1_ID, POLICY_2_ID);
84         Mono<String> policyIdsResp = A1ClientHelper.createOutputJsonResponse("policy-id-list", policyIds.toString());
85         whenAsyncPostThenReturn(policyIdsResp);
86
87         Mono<List<String>> returnedMono = clientUnderTest.getPolicyIdentities();
88
89         verify(asyncRestClientMock).postWithAuthHeader(POLICY_IDENTITIES_URL, inputJsonString, CONTROLLER_USERNAME,
90             CONTROLLER_PASSWORD);
91         StepVerifier.create(returnedMono).expectNext(policyIds).expectComplete().verify();
92     }
93
94     @Test
95     public void testGetValidPolicyType() {
96         String policyType = clientUnderTest.getPolicyTypeSchema("").block();
97         assertEquals("{}", policyType, "");
98     }
99
100     @Test
101     public void testPutPolicyValidResponse() {
102         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
103             .nearRtRicUrl(RIC_1_URL) //
104             .policyTypeId(POLICY_TYPE_1_ID) //
105             .policyId(POLICY_1_ID) //
106             .policy(POLICY_JSON_VALID) //
107             .build();
108         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
109
110         Mono<String> policyResp = A1ClientHelper.createOutputJsonResponse("returned-policy", POLICY_JSON_VALID);
111         whenAsyncPostThenReturn(policyResp);
112
113         Mono<String> returnedMono = clientUnderTest
114             .putPolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
115
116         verify(asyncRestClientMock).postWithAuthHeader(PUT_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
117             CONTROLLER_PASSWORD);
118         StepVerifier.create(returnedMono).expectNext(POLICY_JSON_VALID).expectComplete().verify();
119     }
120
121     @Test
122     public void testPutPolicyInvalidResponse() {
123         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
124             .nearRtRicUrl(RIC_1_URL) //
125             .policyTypeId(POLICY_TYPE_1_ID) //
126             .policyId(POLICY_1_ID) //
127             .policy(POLICY_JSON_VALID) //
128             .build();
129         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
130
131         Mono<String> policyResp = A1ClientHelper.createOutputJsonResponse("returned-policy", POLICY_JSON_INVALID);
132         whenAsyncPostThenReturn(policyResp);
133
134         Mono<String> returnedMono = clientUnderTest
135             .putPolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
136
137         verify(asyncRestClientMock).postWithAuthHeader(PUT_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
138             CONTROLLER_PASSWORD);
139         StepVerifier.create(returnedMono).expectErrorMatches(throwable -> throwable instanceof JSONException).verify();
140     }
141
142     @Test
143     public void testDeletePolicy() {
144         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
145             .nearRtRicUrl(RIC_1_URL) //
146             .policyId(POLICY_1_ID) //
147             .build();
148         String inputJsonString = A1ClientHelper.createInputJsonString(inputParams);
149
150         whenAsyncPostThenReturn(Mono.empty());
151
152         Mono<String> returnedMono = clientUnderTest
153             .deletePolicy(A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID));
154
155         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonString, CONTROLLER_USERNAME,
156             CONTROLLER_PASSWORD);
157         StepVerifier.create(returnedMono).expectComplete().verify();
158     }
159
160     @Test
161     public void testDeleteAllPolicies() {
162         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
163             .nearRtRicUrl(RIC_1_URL) //
164             .build();
165         String inputJsonStringGetIds = A1ClientHelper.createInputJsonString(inputParams);
166         inputParams = ImmutableSdncOscAdapterInput.builder() //
167             .nearRtRicUrl(RIC_1_URL) //
168             .policyId(POLICY_1_ID) //
169             .build();
170         String inputJsonStringDeletePolicy1 = A1ClientHelper.createInputJsonString(inputParams);
171         inputParams = ImmutableSdncOscAdapterInput.builder() //
172             .nearRtRicUrl(RIC_1_URL) //
173             .policyId(POLICY_2_ID) //
174             .build();
175         String inputJsonStringDeletePolicy2 = A1ClientHelper.createInputJsonString(inputParams);
176
177         List<String> policyIds = Arrays.asList(POLICY_1_ID, POLICY_2_ID);
178         Mono<String> policyIdsResp = A1ClientHelper.createOutputJsonResponse("policy-id-list", policyIds.toString());
179         whenAsyncPostThenReturn(policyIdsResp).thenReturn(Mono.empty());
180
181         Flux<String> returnedFlux = clientUnderTest.deleteAllPolicies();
182
183         StepVerifier.create(returnedFlux).expectComplete().verify();
184         verify(asyncRestClientMock).postWithAuthHeader(POLICY_IDENTITIES_URL, inputJsonStringGetIds,
185             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
186         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonStringDeletePolicy1,
187             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
188         verify(asyncRestClientMock).postWithAuthHeader(DELETE_POLICY_URL, inputJsonStringDeletePolicy2,
189             CONTROLLER_USERNAME, CONTROLLER_PASSWORD);
190     }
191
192     @Test
193     public void testGetStatus() {
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         String status = "STATUS";
201         Mono<String> policyStatusResp = A1ClientHelper.createOutputJsonResponse("policy-status", status);
202         whenAsyncPostThenReturn(policyStatusResp);
203
204         Policy policy = A1ClientHelper.createPolicy(RIC_1_URL, POLICY_1_ID, POLICY_JSON_VALID, POLICY_TYPE_1_ID);
205
206         String returnedStatus = clientUnderTest.getPolicyStatus(policy).block();
207
208         assertEquals(status, returnedStatus, "unexpexted status");
209
210         final String expectedUrl = "/A1-ADAPTER-API:getPolicyStatus";
211         verify(asyncRestClientMock).postWithAuthHeader(expectedUrl, inputJsonString, CONTROLLER_USERNAME,
212             CONTROLLER_PASSWORD);
213     }
214
215     private OngoingStubbing<Mono<String>> whenAsyncPostThenReturn(Mono<String> response) {
216         return when(asyncRestClientMock.postWithAuthHeader(anyString(), anyString(), anyString(), anyString()))
217             .thenReturn(response);
218     }
219 }