package org.corfudb.infrastructure;
import org.corfudb.protocols.wireprotocol.CorfuMsgType;
import org.corfudb.protocols.wireprotocol.FailureDetectorMsg;
import org.corfudb.runtime.view.Layout;
import org.junit.After;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Checks the various services and messages handled by the
* Management Server.
* <p>
* Created by zlokhandwala on 11/2/16.
*/
public class ManagementServerTest extends AbstractServerTest {
private ManagementServer managementServer;
@Override
public ManagementServer getDefaultServer() {
// Adding layout server for management server runtime to connect to.
router.addServer(new LayoutServer(new ServerContextBuilder().setSingle(true).setServerRouter(getRouter()).build()));
managementServer = new ManagementServer(new ServerContextBuilder().setSingle(false).setServerRouter(getRouter()).build());
return managementServer;
}
@After
public void cleanUp() {
managementServer.shutdown();
}
/**
* Testing the status of the failure detector and shutdown functionality.
*/
@Test
public void checkFailureDetectorStatus() {
assertThat(!managementServer.getFailureDetectorService().isShutdown());
managementServer.shutdown();
assertThat(managementServer.getFailureDetectorService().isShutdown());
}
/**
* Bootstrapping the management server multiple times.
*/
@Test
public void bootstrapManagementServer() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
sendMessage(CorfuMsgType.MANAGEMENT_BOOTSTRAP_REQUEST.payloadMsg(layout));
assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
sendMessage(CorfuMsgType.MANAGEMENT_BOOTSTRAP_REQUEST.payloadMsg(layout));
assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.MANAGEMENT_ALREADY_BOOTSTRAP_ERROR);
}
/**
* Triggering the failure handler with and without bootstrapping the server.
*/
@Test
public void triggerFailureHandler() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
Set<String> set = new HashSet<>();
set.add("key");
sendMessage(CorfuMsgType.MANAGEMENT_FAILURE_DETECTED.payloadMsg(new FailureDetectorMsg(set)));
assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.MANAGEMENT_NOBOOTSTRAP_ERROR);
sendMessage(CorfuMsgType.MANAGEMENT_BOOTSTRAP_REQUEST.payloadMsg(layout));
assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
sendMessage(CorfuMsgType.MANAGEMENT_FAILURE_DETECTED.payloadMsg(new FailureDetectorMsg(set)));
assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
}
}