4e72bbf65893f48e72c4dc216034bb9bbba3f693
[ccsdk/oran.git] /
1 /*-
2  * ========================LICENSE_START=================================
3  * ONAP : ccsdk oran
4  * ======================================================================
5  * Copyright (C) 2020 Nordix Foundation. All rights reserved.
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.onap.ccsdk.oran.a1policymanagementservice.tasks;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.Mockito.doReturn;
26 import static org.mockito.Mockito.spy;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.verifyNoMoreInteractions;
29 import static org.mockito.Mockito.when;
30
31 import java.time.Instant;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.Collections;
35 import java.util.List;
36 import java.util.Vector;
37
38 import org.junit.jupiter.api.AfterEach;
39 import org.junit.jupiter.api.BeforeEach;
40 import org.junit.jupiter.api.Test;
41 import org.junit.jupiter.api.extension.ExtendWith;
42 import org.mockito.Mock;
43 import org.mockito.junit.jupiter.MockitoExtension;
44 import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1Client;
45 import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1ClientFactory;
46 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfig;
47 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ImmutableRicConfig;
48 import org.onap.ccsdk.oran.a1policymanagementservice.repository.ImmutablePolicy;
49 import org.onap.ccsdk.oran.a1policymanagementservice.repository.ImmutablePolicyType;
50 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Lock.LockType;
51 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policies;
52 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
53 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyType;
54 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyTypes;
55 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric;
56 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric.RicState;
57 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Rics;
58 import reactor.core.publisher.Mono;
59
60 @ExtendWith(MockitoExtension.class)
61 class RicSupervisionTest {
62     private static final String POLICY_TYPE_1_NAME = "type1";
63     private static final PolicyType POLICY_TYPE_1 = ImmutablePolicyType.builder() //
64             .id(POLICY_TYPE_1_NAME) //
65             .schema("") //
66             .build();
67
68     private static final Ric RIC_1 = new Ric(ImmutableRicConfig.builder() //
69             .ricId("ric_1") //
70             .baseUrl("baseUrl1") //
71             .managedElementIds(new Vector<String>(Arrays.asList("kista_1", "kista_2"))) //
72             .controllerName("controllerName") //
73             .build());
74
75     private static final String POLICY_1_ID = "policyId1";
76     private static final Policy POLICY_1 = ImmutablePolicy.builder() //
77             .id(POLICY_1_ID) //
78             .json("") //
79             .ownerServiceId("service") //
80             .ric(RIC_1) //
81             .type(POLICY_TYPE_1) //
82             .lastModified(Instant.now()) //
83             .isTransient(false) //
84             .statusNotificationUri("statusNotificationUri") //
85             .build();
86
87     private static final Policy POLICY_2 = ImmutablePolicy.builder() //
88             .id("policyId2") //
89             .json("") //
90             .ownerServiceId("service") //
91             .ric(RIC_1) //
92             .type(POLICY_TYPE_1) //
93             .lastModified(Instant.now()) //
94             .isTransient(false) //
95             .statusNotificationUri("statusNotificationUri") //
96             .build();
97
98     @Mock
99     private A1Client a1ClientMock;
100
101     @Mock
102     private A1ClientFactory a1ClientFactory;
103
104     @Mock
105     private RicSynchronizationTask synchronizationTaskMock;
106
107     private final PolicyTypes types = new PolicyTypes();
108     private Policies policies = new Policies();
109     private Rics rics = new Rics();
110
111     @BeforeEach
112     void init() {
113         types.clear();
114         policies.clear();
115         rics.clear();
116         RIC_1.setState(RicState.UNAVAILABLE);
117         RIC_1.clearSupportedPolicyTypes();
118     }
119
120     @AfterEach
121     void verifyNoRicLocks() {
122         for (Ric ric : this.rics.getRics()) {
123             ric.getLock().lockBlocking(LockType.EXCLUSIVE);
124             ric.getLock().unlockBlocking();
125             assertThat(ric.getLock().getLockCounter()).isZero();
126         }
127     }
128
129     @Test
130     void whenRicIdleAndNoChangedPoliciesOrPolicyTypes_thenNoSynchronization() {
131         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
132         RIC_1.setState(RicState.AVAILABLE);
133         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
134         rics.put(RIC_1);
135
136         types.put(POLICY_TYPE_1);
137
138         policies.put(POLICY_1);
139
140         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID)));
141         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME)));
142
143         RicSupervision supervisorUnderTest = spy(createRicSupervision());
144
145         supervisorUnderTest.checkAllRics();
146
147         verify(supervisorUnderTest).checkAllRics();
148         verifyNoMoreInteractions(supervisorUnderTest);
149     }
150
151     @Test
152     void whenRicUndefined_thenSynchronization() {
153         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
154         RIC_1.setState(RicState.UNAVAILABLE);
155         rics.put(RIC_1);
156
157         RicSupervision supervisorUnderTest = spy(createRicSupervision());
158
159         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
160
161         supervisorUnderTest.checkAllRics();
162
163         verify(supervisorUnderTest).checkAllRics();
164         verify(supervisorUnderTest).createSynchronizationTask();
165         verify(synchronizationTaskMock).run(RIC_1);
166         verifyNoMoreInteractions(supervisorUnderTest);
167     }
168
169     @Test
170     void whenRicSynchronizing_thenNoSynchronization() {
171         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
172         RIC_1.setState(RicState.SYNCHRONIZING);
173         rics.put(RIC_1);
174
175         RicSupervision supervisorUnderTest = spy(createRicSupervision());
176
177         supervisorUnderTest.checkAllRics();
178
179         verify(supervisorUnderTest).checkAllRics();
180         verifyNoMoreInteractions(supervisorUnderTest);
181     }
182
183     @Test
184     void whenRicIdleAndErrorGettingPolicyIdentities_thenNoSynchronization() {
185         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
186         RIC_1.setState(RicState.AVAILABLE);
187         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
188         rics.put(RIC_1);
189
190         setUpGetPolicyIdentitiesToReturn(new Exception("Failed"));
191
192         RicSupervision supervisorUnderTest = spy(createRicSupervision());
193         supervisorUnderTest.checkAllRics();
194
195         verify(supervisorUnderTest).checkAllRics();
196         verifyNoMoreInteractions(supervisorUnderTest);
197         assertThat(RIC_1.getState()).isEqualTo(RicState.UNAVAILABLE);
198     }
199
200     @Test
201     void whenRicIdleAndNotSameAmountOfPolicies_thenSynchronization() {
202         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
203         RIC_1.setState(RicState.AVAILABLE);
204         rics.put(RIC_1);
205
206         policies.put(POLICY_1);
207         policies.put(POLICY_2);
208
209         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID)));
210
211         RicSupervision supervisorUnderTest = spy(createRicSupervision());
212
213         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
214
215         supervisorUnderTest.checkAllRics();
216
217         verify(supervisorUnderTest).checkAllRics();
218         verify(supervisorUnderTest).createSynchronizationTask();
219         verify(synchronizationTaskMock).run(RIC_1);
220         verifyNoMoreInteractions(supervisorUnderTest);
221     }
222
223     @Test
224     void whenRicIdleAndSameAmountOfPoliciesButNotSamePolicies_thenSynchronization() {
225         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
226         RIC_1.setState(RicState.AVAILABLE);
227         rics.put(RIC_1);
228
229         policies.put(POLICY_1);
230         policies.put(POLICY_2);
231
232         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID, "Another_policy")));
233
234         RicSupervision supervisorUnderTest = spy(createRicSupervision());
235
236         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
237
238         supervisorUnderTest.checkAllRics();
239
240         verify(supervisorUnderTest).checkAllRics();
241         verify(supervisorUnderTest).createSynchronizationTask();
242         verify(synchronizationTaskMock).run(RIC_1);
243         verifyNoMoreInteractions(supervisorUnderTest);
244     }
245
246     @Test
247     void whenRicIdleAndErrorGettingPolicyTypes_thenNoSynchronization() {
248         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
249         RIC_1.setState(RicState.AVAILABLE);
250         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
251         rics.put(RIC_1);
252
253         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
254         setUpGetPolicyTypeIdentitiesToReturn(new Exception("Failed"));
255
256         RicSupervision supervisorUnderTest = spy(createRicSupervision());
257         supervisorUnderTest.checkAllRics();
258
259         verify(supervisorUnderTest).checkAllRics();
260         verifyNoMoreInteractions(supervisorUnderTest);
261     }
262
263     @Test
264     void whenRicIdleAndNotSameAmountOfPolicyTypes_thenSynchronization() {
265         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
266         RIC_1.setState(RicState.AVAILABLE);
267         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
268         rics.put(RIC_1);
269
270         types.put(POLICY_TYPE_1);
271
272         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
273         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME, "another_policy_type")));
274
275         RicSupervision supervisorUnderTest = spy(createRicSupervision());
276
277         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
278
279         supervisorUnderTest.checkAllRics();
280
281         verify(supervisorUnderTest).checkAllRics();
282         verify(supervisorUnderTest).createSynchronizationTask();
283         verify(synchronizationTaskMock).run(RIC_1);
284         verifyNoMoreInteractions(supervisorUnderTest);
285     }
286
287     @Test
288     void whenRicIdleAndSameAmountOfPolicyTypesButNotSameTypes_thenSynchronization() {
289         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
290         PolicyType policyType2 = ImmutablePolicyType.builder() //
291                 .id("policyType2") //
292                 .schema("") //
293                 .build();
294
295         RIC_1.setState(RicState.AVAILABLE);
296         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
297         RIC_1.addSupportedPolicyType(policyType2);
298         rics.put(RIC_1);
299
300         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
301         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME, "another_policy_type")));
302
303         RicSupervision supervisorUnderTest = spy(createRicSupervision());
304
305         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
306
307         supervisorUnderTest.checkAllRics();
308
309         verify(supervisorUnderTest).checkAllRics();
310         verify(supervisorUnderTest).createSynchronizationTask();
311         verify(synchronizationTaskMock).run(RIC_1);
312         verifyNoMoreInteractions(supervisorUnderTest);
313     }
314
315     @SuppressWarnings("unchecked")
316     private void setUpGetPolicyIdentitiesToReturn(Object returnValue) {
317         if (returnValue instanceof List<?>) {
318             when(a1ClientMock.getPolicyIdentities()).thenReturn(Mono.just((List<String>) returnValue));
319         } else if (returnValue instanceof Exception) {
320             when(a1ClientMock.getPolicyIdentities()).thenReturn(Mono.error((Exception) returnValue));
321         }
322     }
323
324     @SuppressWarnings("unchecked")
325     private void setUpGetPolicyTypeIdentitiesToReturn(Object returnValue) {
326         if (returnValue instanceof List<?>) {
327             when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.just((List<String>) returnValue));
328         } else if (returnValue instanceof Exception) {
329             when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.error((Exception) returnValue));
330         }
331     }
332
333     private RicSupervision createRicSupervision() {
334         ApplicationConfig config = new ApplicationConfig();
335         return new RicSupervision(rics, policies, a1ClientFactory, types, null, config);
336     }
337 }