package org.onap.ccsdk.oran.a1policymanagementservice.tasks;
-import static ch.qos.logback.classic.Level.WARN;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.read.ListAppender;
-
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import org.mockito.junit.jupiter.MockitoExtension;
import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1Client;
import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1ClientFactory;
-import org.onap.ccsdk.oran.a1policymanagementservice.clients.AsyncRestClient;
+import org.onap.ccsdk.oran.a1policymanagementservice.clients.AsyncRestClientFactory;
+import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfig;
import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ImmutableRicConfig;
-import org.onap.ccsdk.oran.a1policymanagementservice.repository.ImmutablePolicy;
-import org.onap.ccsdk.oran.a1policymanagementservice.repository.ImmutablePolicyType;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policies;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyType;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.PolicyTypes;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric.RicState;
+import org.onap.ccsdk.oran.a1policymanagementservice.repository.Rics;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Service;
import org.onap.ccsdk.oran.a1policymanagementservice.repository.Services;
-import org.onap.ccsdk.oran.a1policymanagementservice.utils.LoggingUtils;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ExtendWith(MockitoExtension.class)
class RicSynchronizationTaskTest {
private static final String POLICY_TYPE_1_NAME = "type1";
- private static final PolicyType POLICY_TYPE_1 = ImmutablePolicyType.builder() //
+ private static final PolicyType POLICY_TYPE_1 = PolicyType.builder() //
.id(POLICY_TYPE_1_NAME) //
.schema("") //
.build();
.build());
private static Policy createPolicy(String policyId, boolean isTransient) {
- return ImmutablePolicy.builder() //
+ return Policy.builder() //
.id(policyId) //
.json("") //
.ownerServiceId("service") //
.type(POLICY_TYPE_1) //
.lastModified(Instant.now()) //
.isTransient(isTransient) //
+ .statusNotificationUri("statusNotificationUri") //
.build();
}
private PolicyTypes policyTypes;
private Policies policies;
private Services services;
+ private Rics rics;
+
+ private final ApplicationConfig appConfig = new ApplicationConfig();
@BeforeEach
void init() {
- policyTypes = new PolicyTypes();
- policies = new Policies();
- services = new Services();
+ policyTypes = new PolicyTypes(appConfig);
+ policies = new Policies(appConfig);
+ services = new Services(appConfig);
+ rics = new Rics();
RIC_1.setState(RicState.UNAVAILABLE);
RIC_1.clearSupportedPolicyTypes();
}
+ private RicSynchronizationTask createTask() {
+ ApplicationConfig config = new ApplicationConfig();
+ AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config.getWebClientConfig());
+ return new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services, restClientFactory,
+ rics);
+ };
+
@Test
void ricAlreadySynchronizing_thenNoSynchronization() {
RIC_1.setState(RicState.SYNCHRONIZING);
policyTypes.put(POLICY_TYPE_1);
policies.put(POLICY_1);
- RicSynchronizationTask synchronizerUnderTest =
- new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services);
+ RicSynchronizationTask synchronizerUnderTest = createTask();
synchronizerUnderTest.run(RIC_1);
@Test
void ricIdlePolicyTypeInRepo_thenSynchronizationWithReuseOfTypeFromRepoAndCorrectServiceNotified() {
+ rics.put(RIC_1);
RIC_1.setState(RicState.AVAILABLE);
policyTypes.put(POLICY_TYPE_1);
setUpCreationOfA1Client();
simulateRicWithOnePolicyType();
- RicSynchronizationTask synchronizerUnderTest =
- spy(new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services));
-
- AsyncRestClient restClientMock = setUpCreationOfAsyncRestClient(synchronizerUnderTest);
- when(restClientMock.put(anyString(), anyString())).thenReturn(Mono.just("Ok"));
+ RicSynchronizationTask synchronizerUnderTest = spy(createTask());
synchronizerUnderTest.run(RIC_1);
verifyNoMoreInteractions(a1ClientMock);
verify(synchronizerUnderTest).run(RIC_1);
- verify(synchronizerUnderTest).createNotificationClient(SERVICE_1_CALLBACK_URL);
- verifyNoMoreInteractions(synchronizerUnderTest);
-
- verify(restClientMock).put("", "Synchronization completed for:" + RIC_1_NAME);
- verifyNoMoreInteractions(restClientMock);
assertThat(policyTypes.size()).isEqualTo(1);
assertThat(policies.size()).isZero();
@Test
void ricIdlePolicyTypeNotInRepo_thenSynchronizationWithTypeFromRic() throws Exception {
RIC_1.setState(RicState.AVAILABLE);
+ rics.put(RIC_1);
setUpCreationOfA1Client();
simulateRicWithOnePolicyType();
String typeSchema = "schema";
when(a1ClientMock.getPolicyTypeSchema(POLICY_TYPE_1_NAME)).thenReturn(Mono.just(typeSchema));
- RicSynchronizationTask synchronizerUnderTest =
- new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services);
+ RicSynchronizationTask synchronizerUnderTest = createTask();
synchronizerUnderTest.run(RIC_1);
verifyNoMoreInteractions(a1ClientMock);
assertThat(policyTypes.size()).isEqualTo(1);
- assertThat(policyTypes.getType(POLICY_TYPE_1_NAME).schema()).isEqualTo(typeSchema);
+ assertThat(policyTypes.getType(POLICY_TYPE_1_NAME).getSchema()).isEqualTo(typeSchema);
assertThat(policies.size()).isZero();
assertThat(RIC_1.getState()).isEqualTo(RicState.AVAILABLE);
}
@Test
void ricIdleAndHavePolicies_thenSynchronizationWithRecreationOfPolicies() {
RIC_1.setState(RicState.AVAILABLE);
+ rics.put(RIC_1);
Policy transientPolicy = createPolicy("transientPolicyId", true);
when(a1ClientMock.deleteAllPolicies()).thenReturn(Flux.just("OK"));
when(a1ClientMock.putPolicy(any(Policy.class))).thenReturn(Mono.just("OK"));
- RicSynchronizationTask synchronizerUnderTest =
- new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services);
+ RicSynchronizationTask synchronizerUnderTest = createTask();
synchronizerUnderTest.run(RIC_1);
@Test
void ricIdleAndErrorDeletingPoliciesFirstTime_thenSynchronizationWithDeletionOfPolicies() {
RIC_1.setState(RicState.AVAILABLE);
+ rics.put(RIC_1);
policies.put(POLICY_1);
.thenReturn(Flux.error(new Exception("Exception"))) //
.thenReturn(Flux.just("OK"));
- RicSynchronizationTask synchronizerUnderTest =
- new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services);
+ RicSynchronizationTask synchronizerUnderTest = createTask();
synchronizerUnderTest.run(RIC_1);
String originalErrorMessage = "Exception";
when(a1ClientMock.deleteAllPolicies()).thenReturn(Flux.error(new Exception(originalErrorMessage)));
- RicSynchronizationTask synchronizerUnderTest =
- new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services);
-
- final ListAppender<ILoggingEvent> logAppender =
- LoggingUtils.getLogListAppender(RicSynchronizationTask.class, WARN);
+ RicSynchronizationTask synchronizerUnderTest = createTask();
synchronizerUnderTest.run(RIC_1);
- verifyCorrectLogMessage(0, logAppender,
- "Synchronization failure for ric: " + RIC_1_NAME + ", reason: " + originalErrorMessage);
-
verify(a1ClientMock, times(2)).deleteAllPolicies();
verifyNoMoreInteractions(a1ClientMock);
assertThat(RIC_1.getState()).isEqualTo(RicState.UNAVAILABLE);
}
- @Test
- void ricIdlePolicyTypeInRepo_thenSynchronizationWithErrorOnServiceNotificationErrorLogged() {
- RIC_1.setState(RicState.AVAILABLE);
-
- policyTypes.put(POLICY_TYPE_1);
-
- services.put(SERVICE_1);
-
- setUpCreationOfA1Client();
- simulateRicWithOnePolicyType();
-
- final ListAppender<ILoggingEvent> logAppender =
- LoggingUtils.getLogListAppender(RicSynchronizationTask.class, WARN);
-
- RicSynchronizationTask synchronizerUnderTest =
- spy(new RicSynchronizationTask(a1ClientFactoryMock, policyTypes, policies, services));
-
- AsyncRestClient restClientMock = setUpCreationOfAsyncRestClient(synchronizerUnderTest);
- String originalErrorMessage = "Exception";
- when(restClientMock.put(anyString(), anyString())).thenReturn(Mono.error(new Exception(originalErrorMessage)));
-
- synchronizerUnderTest.run(RIC_1);
-
- ILoggingEvent loggingEvent = logAppender.list.get(0);
- assertThat(loggingEvent.getLevel()).isEqualTo(WARN);
- verifyCorrectLogMessage(0, logAppender,
- "Service notification failed for service: " + SERVICE_1_NAME + ". Cause: " + originalErrorMessage);
- }
-
private void setUpCreationOfA1Client() {
when(a1ClientFactoryMock.createA1Client(any(Ric.class))).thenReturn(Mono.just(a1ClientMock));
doReturn(Flux.empty()).when(a1ClientMock).deleteAllPolicies();
}
- private AsyncRestClient setUpCreationOfAsyncRestClient(RicSynchronizationTask synchronizerUnderTest) {
- AsyncRestClient restClientMock = mock(AsyncRestClient.class);
- doReturn(restClientMock).when(synchronizerUnderTest).createNotificationClient(anyString());
- return restClientMock;
- }
-
private void simulateRicWithOnePolicyType() {
when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.just(Arrays.asList(POLICY_TYPE_1_NAME)));
}
private void simulateRicWithNoPolicyTypes() {
when(a1ClientMock.getPolicyTypeIdentities()).thenReturn(Mono.just(Collections.emptyList()));
}
-
- private void verifyCorrectLogMessage(int messageIndex, ListAppender<ILoggingEvent> logAppender,
- String expectedMessage) {
- ILoggingEvent loggingEvent = logAppender.list.get(messageIndex);
- assertThat(loggingEvent.getFormattedMessage()).isEqualTo(expectedMessage);
- }
}