2  * ========================LICENSE_START=================================
 
   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
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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===================================
 
  21 package org.onap.ccsdk.oran.a1policymanagementservice.tasks;
 
  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;
 
  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;
 
  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.Lock.LockType;
 
  49 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policies;
 
  50 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
 
  51 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyType;
 
  52 import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyTypes;
 
  53 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric;
 
  54 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric.RicState;
 
  55 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Rics;
 
  56 import reactor.core.publisher.Mono;
 
  58 @ExtendWith(MockitoExtension.class)
 
  59 class RicSupervisionTest {
 
  60     private static final String POLICY_TYPE_1_NAME = "type1";
 
  61     private static final PolicyType POLICY_TYPE_1 = PolicyType.builder() //
 
  62             .id(POLICY_TYPE_1_NAME) //
 
  66     private static final Ric RIC_1 = new Ric(ImmutableRicConfig.builder() //
 
  68             .baseUrl("baseUrl1") //
 
  69             .managedElementIds(new Vector<String>(Arrays.asList("kista_1", "kista_2"))) //
 
  70             .controllerName("controllerName") //
 
  73     private static final String POLICY_1_ID = "policyId1";
 
  74     private static final Policy POLICY_1 = Policy.builder() //
 
  77             .ownerServiceId("service") //
 
  79             .type(POLICY_TYPE_1) //
 
  80             .lastModified(Instant.now()) //
 
  81             .isTransient(false) //
 
  82             .statusNotificationUri("statusNotificationUri") //
 
  85     private static final Policy POLICY_2 = Policy.builder() //
 
  88             .ownerServiceId("service") //
 
  90             .type(POLICY_TYPE_1) //
 
  91             .lastModified(Instant.now()) //
 
  92             .isTransient(false) //
 
  93             .statusNotificationUri("statusNotificationUri") //
 
  97     private A1Client a1ClientMock;
 
 100     private A1ClientFactory a1ClientFactory;
 
 103     private RicSynchronizationTask synchronizationTaskMock;
 
 105     private final ApplicationConfig appConfig = new ApplicationConfig();
 
 107     private PolicyTypes types;
 
 108     private Policies policies;
 
 109     private Rics rics = new Rics();
 
 113         types = new PolicyTypes(appConfig);
 
 114         policies = new Policies(appConfig);
 
 117         RIC_1.setState(RicState.UNAVAILABLE);
 
 118         RIC_1.clearSupportedPolicyTypes();
 
 122     void verifyNoRicLocks() {
 
 123         for (Ric ric : this.rics.getRics()) {
 
 124             ric.getLock().lockBlocking(LockType.EXCLUSIVE);
 
 125             ric.getLock().unlockBlocking();
 
 126             assertThat(ric.getLock().getLockCounter()).isZero();
 
 131     void whenRicIdleAndNoChangedPoliciesOrPolicyTypes_thenNoSynchronization() {
 
 132         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 133         RIC_1.setState(RicState.AVAILABLE);
 
 134         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
 
 137         types.put(POLICY_TYPE_1);
 
 139         policies.put(POLICY_1);
 
 141         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID)));
 
 142         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME)));
 
 144         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 146         supervisorUnderTest.checkAllRics();
 
 148         verify(supervisorUnderTest).checkAllRics();
 
 149         verifyNoMoreInteractions(supervisorUnderTest);
 
 153     void whenRicUndefined_thenSynchronization() {
 
 154         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 155         RIC_1.setState(RicState.UNAVAILABLE);
 
 158         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 160         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
 
 162         supervisorUnderTest.checkAllRics();
 
 164         verify(supervisorUnderTest).checkAllRics();
 
 165         verify(supervisorUnderTest).createSynchronizationTask();
 
 166         verify(synchronizationTaskMock).run(RIC_1);
 
 167         verifyNoMoreInteractions(supervisorUnderTest);
 
 171     void whenRicSynchronizing_thenNoSynchronization() {
 
 172         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 173         RIC_1.setState(RicState.SYNCHRONIZING);
 
 176         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 178         supervisorUnderTest.checkAllRics();
 
 180         verify(supervisorUnderTest).checkAllRics();
 
 181         verifyNoMoreInteractions(supervisorUnderTest);
 
 185     void whenRicIdleAndErrorGettingPolicyIdentities_thenNoSynchronization() {
 
 186         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 187         RIC_1.setState(RicState.AVAILABLE);
 
 188         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
 
 191         setUpGetPolicyIdentitiesToReturn(new Exception("Failed"));
 
 193         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 194         supervisorUnderTest.checkAllRics();
 
 196         verify(supervisorUnderTest).checkAllRics();
 
 197         verifyNoMoreInteractions(supervisorUnderTest);
 
 198         assertThat(RIC_1.getState()).isEqualTo(RicState.UNAVAILABLE);
 
 202     void whenRicIdleAndNotSameAmountOfPolicies_thenSynchronization() {
 
 203         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 204         RIC_1.setState(RicState.AVAILABLE);
 
 207         policies.put(POLICY_1);
 
 208         policies.put(POLICY_2);
 
 210         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID)));
 
 212         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 214         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
 
 216         supervisorUnderTest.checkAllRics();
 
 218         verify(supervisorUnderTest).checkAllRics();
 
 219         verify(supervisorUnderTest).createSynchronizationTask();
 
 220         verify(synchronizationTaskMock).run(RIC_1);
 
 221         verifyNoMoreInteractions(supervisorUnderTest);
 
 225     void whenRicIdleAndSameAmountOfPoliciesButNotSamePolicies_thenSynchronization() {
 
 226         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 227         RIC_1.setState(RicState.AVAILABLE);
 
 230         policies.put(POLICY_1);
 
 231         policies.put(POLICY_2);
 
 233         setUpGetPolicyIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_1_ID, "Another_policy")));
 
 235         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 237         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
 
 239         supervisorUnderTest.checkAllRics();
 
 241         verify(supervisorUnderTest).checkAllRics();
 
 242         verify(supervisorUnderTest).createSynchronizationTask();
 
 243         verify(synchronizationTaskMock).run(RIC_1);
 
 244         verifyNoMoreInteractions(supervisorUnderTest);
 
 248     void whenRicIdleAndErrorGettingPolicyTypes_thenNoSynchronization() {
 
 249         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 250         RIC_1.setState(RicState.AVAILABLE);
 
 251         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
 
 254         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
 
 255         setUpGetPolicyTypeIdentitiesToReturn(new Exception("Failed"));
 
 257         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 258         supervisorUnderTest.checkAllRics();
 
 260         verify(supervisorUnderTest).checkAllRics();
 
 261         verifyNoMoreInteractions(supervisorUnderTest);
 
 265     void whenRicIdleAndNotSameAmountOfPolicyTypes_thenSynchronization() {
 
 266         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 267         RIC_1.setState(RicState.AVAILABLE);
 
 268         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
 
 271         types.put(POLICY_TYPE_1);
 
 273         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
 
 274         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME, "another_policy_type")));
 
 276         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 278         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
 
 280         supervisorUnderTest.checkAllRics();
 
 282         verify(supervisorUnderTest).checkAllRics();
 
 283         verify(supervisorUnderTest).createSynchronizationTask();
 
 284         verify(synchronizationTaskMock).run(RIC_1);
 
 285         verifyNoMoreInteractions(supervisorUnderTest);
 
 289     void whenRicIdleAndSameAmountOfPolicyTypesButNotSameTypes_thenSynchronization() {
 
 290         doReturn(Mono.just(a1ClientMock)).when(a1ClientFactory).createA1Client(any(Ric.class));
 
 291         PolicyType policyType2 = PolicyType.builder() //
 
 292                 .id("policyType2") //
 
 296         RIC_1.setState(RicState.AVAILABLE);
 
 297         RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
 
 298         RIC_1.addSupportedPolicyType(policyType2);
 
 301         setUpGetPolicyIdentitiesToReturn(Collections.emptyList());
 
 302         setUpGetPolicyTypeIdentitiesToReturn(new ArrayList<>(Arrays.asList(POLICY_TYPE_1_NAME, "another_policy_type")));
 
 304         RicSupervision supervisorUnderTest = spy(createRicSupervision());
 
 306         doReturn(synchronizationTaskMock).when(supervisorUnderTest).createSynchronizationTask();
 
 308         supervisorUnderTest.checkAllRics();
 
 310         verify(supervisorUnderTest).checkAllRics();
 
 311         verify(supervisorUnderTest).createSynchronizationTask();
 
 312         verify(synchronizationTaskMock).run(RIC_1);
 
 313         verifyNoMoreInteractions(supervisorUnderTest);
 
 316     @SuppressWarnings("unchecked")
 
 317     private void setUpGetPolicyIdentitiesToReturn(Object returnValue) {
 
 318         if (returnValue instanceof List<?>) {
 
 319             when(a1ClientMock.getPolicyIdentities()).thenReturn(Mono.just((List<String>) returnValue));
 
 320         } else if (returnValue instanceof Exception) {
 
 321             when(a1ClientMock.getPolicyIdentities()).thenReturn(Mono.error((Exception) returnValue));
 
 325     @SuppressWarnings("unchecked")
 
 326     private void setUpGetPolicyTypeIdentitiesToReturn(Object returnValue) {
 
 327         if (returnValue instanceof List<?>) {
 
 328             when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.just((List<String>) returnValue));
 
 329         } else if (returnValue instanceof Exception) {
 
 330             when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.error((Exception) returnValue));
 
 334     private RicSupervision createRicSupervision() {
 
 335         ApplicationConfig config = new ApplicationConfig();
 
 336         return new RicSupervision(rics, policies, a1ClientFactory, types, null, config);