package dk.kb.yggdrasil;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
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 java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import dk.kb.yggdrasil.bitmag.Bitrepository;
import dk.kb.yggdrasil.config.Models;
import dk.kb.yggdrasil.config.YggdrasilConfig;
import dk.kb.yggdrasil.config.RabbitMqSettings;
import dk.kb.yggdrasil.db.StateDatabase;
import dk.kb.yggdrasil.exceptions.RabbitException;
import dk.kb.yggdrasil.exceptions.YggdrasilException;
import dk.kb.yggdrasil.messaging.MQ;
import dk.kb.yggdrasil.messaging.MqResponse;
import dk.kb.yggdrasil.messaging.RemotePreservationStateUpdater;
@RunWith(JUnit4.class)
public class WorkflowTest extends MqFixtureTestAPI {
private static String RABBITMQ_CONF_FILE = "src/test/resources/config/rabbitmq.yml";
private static File generalConfigFile = new File("src/test/resources/config/yggdrasil.yml");
private static RabbitMqSettings settings;
private static Models models;
private static YggdrasilConfig config;
@BeforeClass
public static void beforeClass() throws YggdrasilException, IOException, RabbitException {
System.setProperty("dk.kb.yggdrasil.runningmode", "test");
config = new YggdrasilConfig(generalConfigFile);
FileUtils.deleteDirectory(config.getDatabaseDir());
File rabbitMQConfig = new File(RABBITMQ_CONF_FILE);
settings = new RabbitMqSettings(rabbitMQConfig);
models = new Models(new File("config/models.yml"));
}
@Test
public void verifyShutdownMessageHandling() throws Exception {
StateDatabase stateDatabase = mock(StateDatabase.class);
Bitrepository bitrepository = mock(Bitrepository.class);
HttpCommunication httpCommunication = mock(HttpCommunication.class);
MQ mq = mock(MQ.class);
RemotePreservationStateUpdater updater = mock(RemotePreservationStateUpdater.class);
when(mq.getSettings()).thenReturn(settings);
Workflow workflow = new Workflow(mq, stateDatabase, bitrepository, config, models, httpCommunication, updater);
MqResponse finalReponse = new MqResponse(MQ.SHUTDOWN_MESSAGE_TYPE, "Please terminate Yggdrasil".getBytes());
when(mq.receiveMessageFromQueue(anyString())).thenReturn(finalReponse);
workflow.run();
verifyNoMoreInteractions(stateDatabase);
verifyNoMoreInteractions(updater);
verifyNoMoreInteractions(bitrepository);
verify(mq, times(2)).getSettings();
verify(mq, atLeastOnce()).receiveMessageFromQueue(anyString());
verifyNoMoreInteractions(mq);
}
@Test
public void verifyOddTypeMessageHandling() throws Exception {
StateDatabase stateDatabase = mock(StateDatabase.class);
Bitrepository bitrepository = mock(Bitrepository.class);
HttpCommunication httpCommunication = mock(HttpCommunication.class);
MQ mq = mock(MQ.class);
RemotePreservationStateUpdater updater = mock(RemotePreservationStateUpdater.class);
when(mq.getSettings()).thenReturn(settings);
Workflow workflow = new Workflow(mq, stateDatabase, bitrepository, config, models, httpCommunication, updater);
MqResponse firstReponse = new MqResponse("ThisIsNotAProperMessageType", "418: I'm a teapot".getBytes());
MqResponse finalReponse = new MqResponse(MQ.SHUTDOWN_MESSAGE_TYPE, "Please terminate Yggdrasil".getBytes());
when(mq.receiveMessageFromQueue(anyString())).thenReturn(firstReponse, finalReponse);
workflow.run();
verifyNoMoreInteractions(stateDatabase);
verifyNoMoreInteractions(updater);
verifyNoMoreInteractions(bitrepository);
verify(mq, times(2)).getSettings();
verify(mq, times(2)).receiveMessageFromQueue(anyString());
verifyNoMoreInteractions(mq);
}
@Test
public void verifyNoTypeMessageHandling() throws Exception {
StateDatabase stateDatabase = mock(StateDatabase.class);
Bitrepository bitrepository = mock(Bitrepository.class);
HttpCommunication httpCommunication = mock(HttpCommunication.class);
MQ mq = mock(MQ.class);
RemotePreservationStateUpdater updater = mock(RemotePreservationStateUpdater.class);
when(mq.getSettings()).thenReturn(settings);
Workflow workflow = new Workflow(mq, stateDatabase, bitrepository, config, models, httpCommunication, updater);
MqResponse firstReponse = new MqResponse(null, "null".getBytes());
MqResponse finalReponse = new MqResponse(MQ.SHUTDOWN_MESSAGE_TYPE, "Please terminate Yggdrasil".getBytes());
when(mq.receiveMessageFromQueue(anyString())).thenReturn(firstReponse, finalReponse);
workflow.run();
verifyNoMoreInteractions(stateDatabase);
verifyNoMoreInteractions(updater);
verifyNoMoreInteractions(bitrepository);
verify(mq, times(2)).getSettings();
verify(mq, atLeastOnce()).receiveMessageFromQueue(anyString());
verifyNoMoreInteractions(mq);
}
}