import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
+
import java.time.Duration;
import java.util.Arrays;
import java.util.Collections;
+
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.oransc.policyagent.repository.Service;
import org.oransc.policyagent.repository.Services;
import org.oransc.policyagent.utils.LoggingUtils;
+
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ExtendWith(MockitoExtension.class)
-public class RicSynchronizationTaskTest {
+class RicSynchronizationTaskTest {
private static final String POLICY_TYPE_1_NAME = "type1";
private static final PolicyType POLICY_TYPE_1 = ImmutablePolicyType.builder() //
.name(POLICY_TYPE_1_NAME) //
.name(RIC_1_NAME) //
.baseUrl("baseUrl1") //
.managedElementIds(Collections.emptyList()) //
+ .controllerName("controllerName") //
.build());
- private static final Policy POLICY_1 = ImmutablePolicy.builder() //
- .id("policyId1") //
- .json("") //
- .ownerServiceName("service") //
- .ric(RIC_1) //
- .type(POLICY_TYPE_1) //
- .lastModified("now") //
- .build();
+ private static Policy createPolicy(String policyId, boolean isTransient) {
+ return ImmutablePolicy.builder() //
+ .id(policyId) //
+ .json("") //
+ .ownerServiceName("service") //
+ .ric(RIC_1) //
+ .type(POLICY_TYPE_1) //
+ .lastModified("now") //
+ .isTransient(isTransient) //
+ .build();
+ }
+
+ private static final Policy POLICY_1 = createPolicy("policyId1", false);
private static final String SERVICE_1_NAME = "service1";
private static final String SERVICE_1_CALLBACK_URL = "callbackUrl";
private Services services;
@BeforeEach
- public void init() {
+ void init() {
policyTypes = new PolicyTypes();
policies = new Policies();
services = new Services();
- RIC_1.setState(RicState.UNDEFINED);
+ RIC_1.setState(RicState.UNAVAILABLE);
RIC_1.clearSupportedPolicyTypes();
}
@Test
- public void ricAlreadySynchronizing_thenNoSynchronization() {
+ void ricAlreadySynchronizing_thenNoSynchronization() {
RIC_1.setState(RicState.SYNCHRONIZING);
RIC_1.addSupportedPolicyType(POLICY_TYPE_1);
}
@Test
- public void ricIdlePolicyTypeInRepo_thenSynchronizationWithReuseOfTypeFromRepoAndCorrectServiceNotified() {
- RIC_1.setState(RicState.IDLE);
+ void ricIdlePolicyTypeInRepo_thenSynchronizationWithReuseOfTypeFromRepoAndCorrectServiceNotified() {
+ RIC_1.setState(RicState.AVAILABLE);
policyTypes.put(POLICY_TYPE_1);
synchronizerUnderTest.run(RIC_1);
- verify(a1ClientMock).getPolicyTypeIdentities();
+ verify(a1ClientMock, times(1)).getPolicyTypeIdentities();
verifyNoMoreInteractions(a1ClientMock);
verify(synchronizerUnderTest).run(RIC_1);
assertThat(policyTypes.size()).isEqualTo(1);
assertThat(policies.size()).isEqualTo(0);
- assertThat(RIC_1.getState()).isEqualTo(RicState.IDLE);
+ assertThat(RIC_1.getState()).isEqualTo(RicState.AVAILABLE);
}
@Test
- public void ricIdlePolicyTypeNotInRepo_thenSynchronizationWithTypeFromRic() throws Exception {
- RIC_1.setState(RicState.IDLE);
+ void ricIdlePolicyTypeNotInRepo_thenSynchronizationWithTypeFromRic() throws Exception {
+ RIC_1.setState(RicState.AVAILABLE);
setUpCreationOfA1Client();
simulateRicWithOnePolicyType();
assertThat(policyTypes.size()).isEqualTo(1);
assertThat(policyTypes.getType(POLICY_TYPE_1_NAME).schema()).isEqualTo(typeSchema);
assertThat(policies.size()).isEqualTo(0);
- assertThat(RIC_1.getState()).isEqualTo(RicState.IDLE);
+ assertThat(RIC_1.getState()).isEqualTo(RicState.AVAILABLE);
}
@Test
- public void ricIdleAndHavePolicies_thenSynchronizationWithRecreationOfPolicies() {
- RIC_1.setState(RicState.IDLE);
+ void ricIdleAndHavePolicies_thenSynchronizationWithRecreationOfPolicies() {
+ RIC_1.setState(RicState.AVAILABLE);
+
+ Policy transientPolicy = createPolicy("transientPolicyId", true);
+ policies.put(transientPolicy);
policies.put(POLICY_1);
setUpCreationOfA1Client();
verifyNoMoreInteractions(a1ClientMock);
assertThat(policyTypes.size()).isEqualTo(0);
- assertThat(policies.size()).isEqualTo(1);
- assertThat(RIC_1.getState()).isEqualTo(RicState.IDLE);
+ assertThat(policies.size()).isEqualTo(1); // The transient policy shall be deleted
+ assertThat(RIC_1.getState()).isEqualTo(RicState.AVAILABLE);
}
@Test
- public void ricIdleAndErrorDeletingPoliciesFirstTime_thenSynchronizationWithDeletionOfPolicies() {
- RIC_1.setState(RicState.IDLE);
+ void ricIdleAndErrorDeletingPoliciesFirstTime_thenSynchronizationWithDeletionOfPolicies() {
+ RIC_1.setState(RicState.AVAILABLE);
policies.put(POLICY_1);
assertThat(policyTypes.size()).isEqualTo(0);
assertThat(policies.size()).isEqualTo(0);
- assertThat(RIC_1.getState()).isEqualTo(RicState.IDLE);
+ assertThat(RIC_1.getState()).isEqualTo(RicState.AVAILABLE);
}
@Test
- public void ricIdleAndErrorDeletingPoliciesAllTheTime_thenSynchronizationWithFailedRecovery() {
- RIC_1.setState(RicState.IDLE);
+ void ricIdleAndErrorDeletingPoliciesAllTheTime_thenSynchronizationWithFailedRecovery() {
+ RIC_1.setState(RicState.AVAILABLE);
policies.put(POLICY_1);
synchronizerUnderTest.run(RIC_1);
verifyCorrectLogMessage(0, logAppender,
- "Synchronization failed for ric: " + RIC_1_NAME + ", reason: " + originalErrorMessage);
- verifyCorrectLogMessage(1, logAppender,
- "Synchronization failure recovery failed for ric: " + RIC_1_NAME + ", reason: " + originalErrorMessage);
+ "Synchronization failure for ric: " + RIC_1_NAME + ", reason: " + originalErrorMessage);
verify(a1ClientMock, times(2)).deleteAllPolicies();
verifyNoMoreInteractions(a1ClientMock);
assertThat(policyTypes.size()).isEqualTo(0);
assertThat(policies.size()).isEqualTo(0);
- assertThat(RIC_1.getState()).isEqualTo(RicState.UNDEFINED);
+ assertThat(RIC_1.getState()).isEqualTo(RicState.UNAVAILABLE);
}
@Test
- public void ricIdlePolicyTypeInRepo_thenSynchronizationWithErrorOnServiceNotificationErrorLogged() {
- RIC_1.setState(RicState.IDLE);
+ void ricIdlePolicyTypeInRepo_thenSynchronizationWithErrorOnServiceNotificationErrorLogged() {
+ RIC_1.setState(RicState.AVAILABLE);
policyTypes.put(POLICY_TYPE_1);
synchronizerUnderTest.run(RIC_1);
ILoggingEvent loggingEvent = logAppender.list.get(0);
- assertThat(loggingEvent.getThrowableProxy().getMessage()).isEqualTo(originalErrorMessage);
- verifyCorrectLogMessage(0, logAppender, "Service notification failed for service: " + SERVICE_1_NAME);
+ 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) {
private void verifyCorrectLogMessage(int messageIndex, ListAppender<ILoggingEvent> logAppender,
String expectedMessage) {
ILoggingEvent loggingEvent = logAppender.list.get(messageIndex);
- assertThat(loggingEvent.toString().contains(expectedMessage)).isTrue();
+ assertThat(loggingEvent.getFormattedMessage()).isEqualTo(expectedMessage);
}
}