package com.artemzin.qualitymatters.performance;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
public class AsyncJobsObserverImplTest {
private AsyncJobsObserver asyncJobsObserver;
@Before
public void beforeEachTest() {
asyncJobsObserver = new AsyncJobsObserverImpl();
}
@Test
public void numberOfRunningAsyncJobs_shouldBeZeroByDefault() {
assertThat(asyncJobsObserver.numberOfRunningAsyncJobs()).isEqualTo(0);
}
@Test
public void numberOfRunningAsyncJobs_shouldCorrelateWithStartAndFinish() {
AsyncJob asyncJob = asyncJobsObserver.asyncJobStarted("test job");
assertThat(asyncJobsObserver.numberOfRunningAsyncJobs()).isEqualTo(1);
asyncJobsObserver.asyncJobFinished(asyncJob);
assertThat(asyncJobsObserver.numberOfRunningAsyncJobs()).isEqualTo(0);
}
@Test
public void addListener_shouldAddListenerWithoutExceptions() {
AsyncJobsObserver.Listener listener = mock(AsyncJobsObserver.Listener.class);
asyncJobsObserver.addListener(listener);
verifyZeroInteractions(listener);
}
@Test
public void removeListener_shouldThrowExceptionIfListenerWasNotRegistered() {
try {
asyncJobsObserver.removeListener(mock(AsyncJobsObserver.Listener.class));
failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
assertThat(e).hasMessage("Listener was not registered!");
}
}
@Test
public void removeListener_shouldNormallyRemoveKnownListener() {
AsyncJobsObserver.Listener listener = mock(AsyncJobsObserver.Listener.class);
asyncJobsObserver.addListener(listener);
asyncJobsObserver.removeListener(listener); // No exceptions expected.
verifyZeroInteractions(listener);
}
@Test
public void asyncJobStarted_shouldReturnAsyncJob() {
AsyncJob asyncJob1 = asyncJobsObserver.asyncJobStarted("test job1");
AsyncJob asyncJob2 = asyncJobsObserver.asyncJobStarted("test job2");
assertThat(asyncJob1.id()).isNotEqualTo(asyncJob2.id());
assertThat(asyncJob1.name()).isEqualTo("test job1");
assertThat(asyncJob2.name()).isEqualTo("test job2");
}
@Test
public void asyncJobStarted_shouldNotifyListenersAboutChangedNumberOfAsyncJobs() {
AsyncJobsObserver.Listener listener1 = mock(AsyncJobsObserver.Listener.class);
AsyncJobsObserver.Listener listener2 = mock(AsyncJobsObserver.Listener.class);
asyncJobsObserver.addListener(listener1);
asyncJobsObserver.addListener(listener2);
verifyZeroInteractions(listener1, listener2);
asyncJobsObserver.asyncJobStarted("test job");
verify(listener1).onNumberOfRunningAsyncJobsChanged(1);
verify(listener2).onNumberOfRunningAsyncJobsChanged(1);
}
@Test
public void asyncJobFinished_shouldThrowExceptionIfAsyncJobWasNotRegisteredInObserver() {
AsyncJob asyncJob = AsyncJob.create(1, "not created by async jobs observer!");
try {
asyncJobsObserver.asyncJobFinished(asyncJob);
failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
assertThat(e).hasMessage("Async job was not registered in the AsyncJobsObserver! Job: " + asyncJob);
}
}
@Test
public void asyncJobFinished_shouldNormallyRegisterFinishOfKnownAsyncJob() {
AsyncJob asyncJob = asyncJobsObserver.asyncJobStarted("test job");
asyncJobsObserver.asyncJobFinished(asyncJob); // No exceptions expected.
}
@Test
public void asyncJobFinished_shouldNotifyListenersAboutChangedNumberOfAsyncJobs() {
AsyncJob asyncJob = asyncJobsObserver.asyncJobStarted("test job");
AsyncJobsObserver.Listener listener1 = mock(AsyncJobsObserver.Listener.class);
AsyncJobsObserver.Listener listener2 = mock(AsyncJobsObserver.Listener.class);
asyncJobsObserver.addListener(listener1);
asyncJobsObserver.addListener(listener2);
// We don't expect callbacks about previous changes.
verifyZeroInteractions(listener1, listener2);
asyncJobsObserver.asyncJobFinished(asyncJob);
verify(listener1).onNumberOfRunningAsyncJobsChanged(0);
verify(listener2).onNumberOfRunningAsyncJobsChanged(0);
verifyNoMoreInteractions(listener1, listener2);
}
}