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