blob: 74f52d094a3933fef34002ff9e8463983c21f382 [file] [log] [blame]
/*
* =========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
* ========================================================================
*/
package com.gemstone.gemfire.distributed;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.server.CacheServer;
import com.gemstone.gemfire.distributed.ServerLauncher.Builder;
import com.gemstone.gemfire.distributed.ServerLauncher.Command;
import com.gemstone.gemfire.distributed.internal.DistributionConfig;
import com.gemstone.gemfire.distributed.support.DistributedSystemAdapter;
import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
import com.gemstone.gemfire.internal.lang.SystemUtils;
import com.gemstone.gemfire.internal.util.IOUtils;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
import edu.umd.cs.mtc.MultithreadedTestCase;
import edu.umd.cs.mtc.TestFramework;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.lib.concurrent.Synchroniser;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* The ServerLauncherJUnitTest class is a test suite of unit tests testing the contract, functionality and invariants
* of the ServerLauncher class.
*
* @author John Blum
* @author Kirk Lund
* @see com.gemstone.gemfire.distributed.CommonLauncherTestSuite
* @see com.gemstone.gemfire.distributed.ServerLauncher
* @see com.gemstone.gemfire.distributed.ServerLauncher.Builder
* @see com.gemstone.gemfire.distributed.ServerLauncher.Command
* @see org.junit.Assert
* @see org.junit.Test
* @since 7.0
*/
@SuppressWarnings("deprecation")
@Category(UnitTest.class)
public class ServerLauncherJUnitTest extends CommonLauncherTestSuite {
// private static final String GEMFIRE_PROPERTIES_FILE_NAME = "gemfire.properties";
// private static final String TEMPORARY_FILE_NAME = "beforeServerLauncherJUnitTest_" + GEMFIRE_PROPERTIES_FILE_NAME;
private Mockery mockContext;
// @BeforeClass
// public static void testSuiteSetup() {
// if (SystemUtils.isWindows()) {
// return;
// }
// File file = new File(GEMFIRE_PROPERTIES_FILE_NAME);
// if (file.exists()) {
// File dest = new File(TEMPORARY_FILE_NAME);
// assertTrue(file.renameTo(dest));
// }
// }
//
// @AfterClass
// public static void testSuiteTearDown() {
// if (SystemUtils.isWindows()) {
// return;
// }
// File file = new File(TEMPORARY_FILE_NAME);
// if (file.exists()) {
// File dest = new File(GEMFIRE_PROPERTIES_FILE_NAME);
// assertTrue(file.renameTo(dest));
// }
// }
@Before
public void setup() {
mockContext = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
setThreadingPolicy(new Synchroniser());
}};
}
@After
public void tearDown() {
mockContext.assertIsSatisfied();
mockContext = null;
}
@Test
public void testParseArguments() throws Exception {
Builder builder = new Builder();
builder.parseArguments("start", "serverOne", "--assign-buckets", "--disable-default-server", "--debug", "--force",
"--rebalance", "--redirect-output", "--dir=" + ServerLauncher.DEFAULT_WORKING_DIRECTORY, "--pid=1234",
"--server-bind-address=" + InetAddress.getLocalHost().getHostAddress(), "--server-port=11235");
assertEquals(Command.START, builder.getCommand());
assertEquals("serverOne", builder.getMemberName());
assertTrue(builder.getAssignBuckets());
assertTrue(builder.getDisableDefaultServer());
assertTrue(builder.getDebug());
assertTrue(builder.getForce());
assertFalse(Boolean.TRUE.equals(builder.getHelp()));
assertTrue(builder.getRebalance());
assertTrue(builder.getRedirectOutput());
assertEquals(ServerLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertEquals(1234, builder.getPid().intValue());
assertEquals(InetAddress.getLocalHost(), builder.getServerBindAddress());
assertEquals(11235, builder.getServerPort().intValue());
}
@Test
public void testParseCommand() {
Builder builder = new Builder();
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
builder.parseCommand((String[]) null);
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
builder.parseCommand(); // empty String array
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
builder.parseCommand(Command.START.getName());
assertEquals(Command.START, builder.getCommand());
builder.parseCommand("Status");
assertEquals(Command.STATUS, builder.getCommand());
builder.parseCommand("sToP");
assertEquals(Command.STOP, builder.getCommand());
builder.parseCommand("--opt", "START", "-o", Command.STATUS.getName());
assertEquals(Command.START, builder.getCommand());
builder.setCommand(null);
builder.parseCommand("badCommandName", "--start", "stat");
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
}
@Test
public void testParseMemberName() {
Builder builder = new Builder();
assertNull(builder.getMemberName());
builder.parseMemberName((String[]) null);
assertNull(builder.getMemberName());
builder.parseMemberName(); // empty String array
assertNull(builder.getMemberName());
builder.parseMemberName(Command.START.getName(), "--opt", "-o");
assertNull(builder.getMemberName());
builder.parseMemberName("memberOne");
assertEquals("memberOne", builder.getMemberName());
}
@Test
public void testSetAndGetCommand() {
Builder builder = new Builder();
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
assertSame(builder, builder.setCommand(Command.STATUS));
assertEquals(Command.STATUS, builder.getCommand());
assertSame(builder, builder.setCommand(null));
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
}
@Test
public void testSetAndGetMemberName() {
Builder builder = new Builder();
assertNull(builder.getMemberName());
assertSame(builder, builder.setMemberName("serverOne"));
assertEquals("serverOne", builder.getMemberName());
assertSame(builder, builder.setMemberName(null));
assertNull(builder.getMemberName());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMemberNameToBlankString() {
try {
new Builder().setMemberName(" ");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_ERROR_MESSAGE.toLocalizedString("Server"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetMemberNameToEmptyString() {
try {
new Builder().setMemberName("");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_ERROR_MESSAGE.toLocalizedString("Server"),
expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetPid() {
Builder builder = new Builder();
assertNull(builder.getPid());
assertSame(builder, builder.setPid(0));
assertEquals(0, builder.getPid().intValue());
assertSame(builder, builder.setPid(1));
assertEquals(1, builder.getPid().intValue());
assertSame(builder, builder.setPid(1024));
assertEquals(1024, builder.getPid().intValue());
assertSame(builder, builder.setPid(12345));
assertEquals(12345, builder.getPid().intValue());
assertSame(builder, builder.setPid(null));
assertNull(builder.getPid());
}
@Test(expected = IllegalArgumentException.class)
public void testSetPidToInvalidValue() {
try {
new Builder().setPid(-1);
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_PID_ERROR_MESSAGE.toLocalizedString(), expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetServerBindAddress() throws Exception {
Builder builder = new Builder();
assertNull(builder.getServerBindAddress());
assertSame(builder, builder.setServerBindAddress(null));
assertNull(builder.getServerBindAddress());
assertSame(builder, builder.setServerBindAddress(""));
assertNull(builder.getServerBindAddress());
assertSame(builder, builder.setServerBindAddress(" "));
assertNull(builder.getServerBindAddress());
assertSame(builder, builder.setServerBindAddress(InetAddress.getLocalHost().getCanonicalHostName()));
assertEquals(InetAddress.getLocalHost(), builder.getServerBindAddress());
}
@Test(expected = IllegalArgumentException.class)
public void testSetServerBindAddressToUnknownHost() {
try {
new Builder().setServerBindAddress("badHostName.badCompany.com");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_UNKNOWN_HOST_ERROR_MESSAGE.toLocalizedString("Server"), expected.getMessage());
assertTrue(expected.getCause() instanceof UnknownHostException);
throw expected;
}
}
@Test
public void testSetAndGetServerPort() {
Builder builder = new Builder();
assertEquals(ServerLauncher.DEFAULT_SERVER_PORT, builder.getServerPort());
assertSame(builder, builder.setServerPort(0));
assertEquals(0, builder.getServerPort().intValue());
assertSame(builder, builder.setServerPort(1));
assertEquals(1, builder.getServerPort().intValue());
assertSame(builder, builder.setServerPort(80));
assertEquals(80, builder.getServerPort().intValue());
assertSame(builder, builder.setServerPort(1024));
assertEquals(1024, builder.getServerPort().intValue());
assertSame(builder, builder.setServerPort(65535));
assertEquals(65535, builder.getServerPort().intValue());
assertSame(builder, builder.setServerPort(null));
assertEquals(ServerLauncher.DEFAULT_SERVER_PORT, builder.getServerPort());
}
@Test(expected = IllegalArgumentException.class)
public void testSetServerPortToOverflow() {
try {
new Builder().setServerPort(65536);
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_INVALID_PORT_ERROR_MESSAGE.toLocalizedString("Server"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetServerPortToUnderflow() {
try {
new Builder().setServerPort(-1);
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_INVALID_PORT_ERROR_MESSAGE.toLocalizedString("Server"),
expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetWorkingDirectory() {
Builder builder = new Builder();
assertEquals(ServerLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(System.getProperty("java.io.tmpdir")));
assertEquals(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(new File(System.getProperty("java.io.tmpdir"))),
builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(" "));
assertEquals(ServerLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(""));
assertEquals(ServerLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(null));
assertEquals(ServerLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
}
@Test(expected = IllegalArgumentException.class)
public void testSetWorkingDirectoryToNonExistingDirectory() {
try {
new Builder().setWorkingDirectory("/path/to/non_existing/directory");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_WORKING_DIRECTORY_NOT_FOUND_ERROR_MESSAGE
.toLocalizedString("Server"), expected.getMessage());
assertTrue(expected.getCause() instanceof FileNotFoundException);
assertEquals("/path/to/non_existing/directory", expected.getCause().getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetWorkingDirectoryToFile() throws IOException {
File tmpFile = File.createTempFile("tmp", "file");
assertNotNull(tmpFile);
assertTrue(tmpFile.isFile());
tmpFile.deleteOnExit();
try {
new Builder().setWorkingDirectory(tmpFile.getAbsolutePath());
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_WORKING_DIRECTORY_NOT_FOUND_ERROR_MESSAGE
.toLocalizedString("Server"), expected.getMessage());
assertTrue(expected.getCause() instanceof FileNotFoundException);
assertEquals(tmpFile.getAbsolutePath(), expected.getCause().getMessage());
throw expected;
}
}
@Test
public void testSetAndGetCriticalHeapPercentage() {
Builder builder = new Builder();
assertNull(builder.getCriticalHeapPercentage());
assertSame(builder, builder.setCriticalHeapPercentage(55.5f));
assertEquals(55.5f, builder.getCriticalHeapPercentage().floatValue(), 0.0f);
assertSame(builder, builder.setCriticalHeapPercentage(null));
assertNull(builder.getCriticalHeapPercentage());
}
@Test(expected = IllegalArgumentException.class)
public void testSetCriticalHeapPercentageToOverflow() {
try {
new Builder().setCriticalHeapPercentage(100.01f);
}
catch (IllegalArgumentException expected) {
assertEquals("Critical heap percentage (100.01) must be between 0 and 100!", expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetCriticalHeapPercentageToUnderflow() {
try {
new Builder().setCriticalHeapPercentage(-0.01f);
}
catch (IllegalArgumentException expected) {
assertEquals("Critical heap percentage (-0.01) must be between 0 and 100!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetEvictionHeapPercentage() {
Builder builder = new Builder();
assertNull(builder.getEvictionHeapPercentage());
assertSame(builder, builder.setEvictionHeapPercentage(55.55f));
assertEquals(55.55f, builder.getEvictionHeapPercentage().floatValue(), 0.0f);
assertSame(builder, builder.setEvictionHeapPercentage(null));
assertNull(builder.getEvictionHeapPercentage());
}
@Test(expected = IllegalArgumentException.class)
public void testSetEvictionHeapPercentageToOverflow() {
try {
new Builder().setEvictionHeapPercentage(101.0f);
}
catch (IllegalArgumentException expected) {
assertEquals("Eviction heap percentage (101.0) must be between 0 and 100!", expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetEvictionHeapPercentageToUnderflow() {
try {
new Builder().setEvictionHeapPercentage(-10.0f);
}
catch (IllegalArgumentException expected) {
assertEquals("Eviction heap percentage (-10.0) must be between 0 and 100!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetMaxConnections() {
Builder builder = new Builder();
assertNull(builder.getMaxConnections());
assertSame(builder, builder.setMaxConnections(1000));
assertEquals(1000, builder.getMaxConnections().intValue());
assertSame(builder, builder.setMaxConnections(null));
assertNull(builder.getMaxConnections());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMaxConnectionsWithIllegalValue() {
try {
new Builder().setMaxConnections(-10);
}
catch (IllegalArgumentException expected) {
assertEquals("Max Connections (-10) must be greater than 0!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetMaxMessageCount() {
Builder builder = new Builder();
assertNull(builder.getMaxMessageCount());
assertSame(builder, builder.setMaxMessageCount(50));
assertEquals(50, builder.getMaxMessageCount().intValue());
assertSame(builder, builder.setMaxMessageCount(null));
assertNull(builder.getMaxMessageCount());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMaxMessageCountWithIllegalValue() {
try {
new Builder().setMaxMessageCount(0);
}
catch (IllegalArgumentException expected) {
assertEquals("Max Message Count (0) must be greater than 0!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetMaxThreads() {
Builder builder = new Builder();
assertNull(builder.getMaxThreads());
assertSame(builder, builder.setMaxThreads(16));
assertEquals(16, builder.getMaxThreads().intValue());
assertSame(builder, builder.setMaxThreads(null));
assertNull(builder.getMaxThreads());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMaxThreadsWithIllegalValue() {
try {
new Builder().setMaxThreads(-4);
}
catch (IllegalArgumentException expected) {
assertEquals("Max Threads (-4) must be greater than 0!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetMessageTimeToLive() {
Builder builder = new Builder();
assertNull(builder.getMessageTimeToLive());
assertSame(builder, builder.setMessageTimeToLive(30000));
assertEquals(30000, builder.getMessageTimeToLive().intValue());
assertSame(builder, builder.setMessageTimeToLive(null));
assertNull(builder.getMessageTimeToLive());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMessageTimeToLiveWithIllegalValue() {
try {
new Builder().setMessageTimeToLive(0);
}
catch (IllegalArgumentException expected) {
assertEquals("Message Time To Live (0) must be greater than 0!", expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetSocketBufferSize() {
Builder builder = new Builder();
assertNull(builder.getSocketBufferSize());
assertSame(builder, builder.setSocketBufferSize(32768));
assertEquals(32768, builder.getSocketBufferSize().intValue());
assertSame(builder, builder.setSocketBufferSize(null));
assertNull(builder.getSocketBufferSize());
}
@Test(expected = IllegalArgumentException.class)
public void testSetSocketBufferSizeWithIllegalValue() {
try {
new Builder().setSocketBufferSize(-8192);
}
catch (IllegalArgumentException expected) {
assertEquals("The Server's Socket Buffer Size (-8192) must be greater than 0!", expected.getMessage());
throw expected;
}
}
@Test
public void testBuild() throws Exception {
ServerLauncher launcher = new Builder()
.setCommand(Command.STOP)
.setAssignBuckets(true)
.setForce(true)
.setMemberName("serverOne")
.setRebalance(true)
.setServerBindAddress(InetAddress.getLocalHost().getHostAddress())
.setServerPort(11235)
.setWorkingDirectory(System.getProperty("java.io.tmpdir"))
.setCriticalHeapPercentage(90.0f)
.setEvictionHeapPercentage(75.0f)
.setMaxConnections(100)
.setMaxMessageCount(512)
.setMaxThreads(8)
.setMessageTimeToLive(120000)
.setSocketBufferSize(32768)
.build();
assertNotNull(launcher);
assertTrue(launcher.isAssignBuckets());
assertFalse(launcher.isDebugging());
assertFalse(launcher.isDisableDefaultServer());
assertTrue(launcher.isForcing());
assertFalse(launcher.isHelping());
assertTrue(launcher.isRebalancing());
assertFalse(launcher.isRunning());
assertEquals(Command.STOP, launcher.getCommand());
assertEquals("serverOne", launcher.getMemberName());
assertEquals(InetAddress.getLocalHost(), launcher.getServerBindAddress());
assertEquals(11235, launcher.getServerPort().intValue());
assertEquals(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(new File(System.getProperty("java.io.tmpdir"))),
launcher.getWorkingDirectory());
assertEquals(90.0f, launcher.getCriticalHeapPercentage().floatValue(), 0.0f);
assertEquals(75.0f, launcher.getEvictionHeapPercentage().floatValue(), 0.0f);
assertEquals(100, launcher.getMaxConnections().intValue());
assertEquals(512, launcher.getMaxMessageCount().intValue());
assertEquals(8, launcher.getMaxThreads().intValue());
assertEquals(120000, launcher.getMessageTimeToLive().intValue());
assertEquals(32768, launcher.getSocketBufferSize().intValue());
}
@Test
public void testBuildWithMemberNameSetInApiPropertiesOnStart() {
ServerLauncher launcher = new Builder()
.setCommand(ServerLauncher.Command.START)
.setMemberName(null)
.set(DistributionConfig.NAME_NAME, "serverABC")
.build();
assertNotNull(launcher);
assertEquals(ServerLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
assertEquals("serverABC", launcher.getProperties().getProperty(DistributionConfig.NAME_NAME));
}
@Ignore("GEODE-69: We need to change DistributedSystem to not use static final for gemfirePropertyFile")
@Test
public void testBuildWithMemberNameSetInGemFirePropertiesOnStart() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty(DistributionConfig.NAME_NAME, "server123");
File gemfirePropertiesFile = writeGemFirePropertiesToFile(
gemfireProperties,
"gemfire.properties",
String.format("Test gemfire.properties file for %1$s.%2$s.", getClass().getSimpleName(), this.testName.getMethodName()));
assertNotNull(gemfirePropertiesFile);
assertTrue(gemfirePropertiesFile.isFile());
System.setProperty("gemfirePropertyFile", gemfirePropertiesFile.getAbsolutePath());
System.out.println("gemfirePropertiesFile.getAbsolutePath()=" + gemfirePropertiesFile.getAbsolutePath());
ServerLauncher launcher = new Builder()
.setCommand(ServerLauncher.Command.START)
.setMemberName(null)
.build();
assertNotNull(launcher);
assertEquals(ServerLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
}
@Test
public void testBuildWithMemberNameSetInSystemPropertiesOnStart() {
try {
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + DistributionConfig.NAME_NAME, "serverXYZ");
ServerLauncher launcher = new Builder()
.setCommand(ServerLauncher.Command.START)
.setMemberName(null)
.build();
assertNotNull(launcher);
assertEquals(ServerLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
}
finally {
System.clearProperty(DistributionConfig.GEMFIRE_PREFIX + DistributionConfig.NAME_NAME);
}
}
@Test(expected = IllegalStateException.class)
public void testBuildNoMemberNameOnStart() {
try {
new Builder().setCommand(Command.START).build();
}
catch (IllegalStateException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_VALIDATION_ERROR_MESSAGE.toLocalizedString("Server"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalStateException.class)
public void testBuildWithInvalidWorkingDirectoryOnStart() {
try {
new Builder().setCommand(Command.START)
.setMemberName("serverOne")
.setWorkingDirectory(System.getProperty("java.io.tmpdir"))
.build();
}
catch (IllegalStateException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_WORKING_DIRECTORY_OPTION_NOT_VALID_ERROR_MESSAGE
.toLocalizedString("Server"), expected.getMessage());
throw expected;
}
}
@Test
public void testIsServing() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final CacheServer mockCacheServer = mockContext.mock(CacheServer.class, "CacheServer");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.singletonList(mockCacheServer)));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertTrue(serverLauncher.isServing(mockCache));
}
@Test
public void testIsServingWhenNoCacheServersExist() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertFalse(serverLauncher.isServing(mockCache));
}
@Test
public void testIsWaiting() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getDistributedSystem();
will(returnValue(mockDistributedSystem));
oneOf(mockDistributedSystem).isConnected();
will(returnValue(true));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
serverLauncher.running.set(true);
assertTrue(serverLauncher.isRunning());
assertTrue(serverLauncher.isWaiting(mockCache));
}
@Test
public void testIsWaitingWhenNotConnected() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getDistributedSystem();
will(returnValue(mockDistributedSystem));
oneOf(mockDistributedSystem).isConnected();
will(returnValue(false));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
serverLauncher.running.set(true);
assertTrue(serverLauncher.isRunning());
assertFalse(serverLauncher.isWaiting(mockCache));
}
@Test
public void testIsWaitingWhenNotRunning() {
ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
serverLauncher.running.set(false);
assertFalse(serverLauncher.isRunning());
assertFalse(serverLauncher.isWaiting(null));
}
@Test
public void testWaitOnServer() throws Throwable {
TestFramework.runOnce(new ServerWaitMultiThreadedTestCase());
}
@Test
public void testIsDefaultServerEnabled() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
}});
ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertFalse(serverLauncher.isDisableDefaultServer());
assertTrue(serverLauncher.isDefaultServerEnabled(mockCache));
}
@Test
public void testIsDefaultServerEnabledWhenCacheServersExist() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final CacheServer mockCacheServer = mockContext.mock(CacheServer.class, "CacheServer");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.singletonList(mockCacheServer)));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").setDisableDefaultServer(false).build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertFalse(serverLauncher.isDisableDefaultServer());
assertFalse(serverLauncher.isDefaultServerEnabled(mockCache));
}
@Test
public void testIsDefaultServerEnabledWhenNoCacheServersExistAndDefaultServerDisabled() {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").setDisableDefaultServer(true).build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertTrue(serverLauncher.isDisableDefaultServer());
assertFalse(serverLauncher.isDefaultServerEnabled(mockCache));
}
@Test
public void testStartCacheServer() throws IOException {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final CacheServer mockCacheServer = mockContext.mock(CacheServer.class, "CacheServer");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
oneOf(mockCache).addCacheServer();
will(returnValue(mockCacheServer));
oneOf(mockCacheServer).setBindAddress(with(aNull(String.class)));
oneOf(mockCacheServer).setPort(with(equal(11235)));
oneOf(mockCacheServer).start();
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne")
.setServerBindAddress(null)
.setServerPort(11235)
.setDisableDefaultServer(false)
.build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertFalse(serverLauncher.isDisableDefaultServer());
serverLauncher.startCacheServer(mockCache);
}
@Test
public void testStartCacheServerWhenDefaultServerDisabled() throws IOException {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").setDisableDefaultServer(true).build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertTrue(serverLauncher.isDisableDefaultServer());
serverLauncher.startCacheServer(mockCache);
}
@Test
public void testStartCacheServerWithExistingCacheServer() throws IOException {
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final CacheServer mockCacheServer = mockContext.mock(CacheServer.class, "CacheServer");
mockContext.checking(new Expectations() {{
oneOf(mockCache).getCacheServers();
will(returnValue(Collections.singletonList(mockCacheServer)));
}});
final ServerLauncher serverLauncher = new Builder().setMemberName("serverOne").setDisableDefaultServer(false).build();
assertNotNull(serverLauncher);
assertEquals("serverOne", serverLauncher.getMemberName());
assertFalse(serverLauncher.isDisableDefaultServer());
serverLauncher.startCacheServer(mockCache);
}
public static void main(final String... args) {
System.err.printf("Thread (%1$s) is daemon (%2$s)%n", Thread.currentThread().getName(),
Thread.currentThread().isDaemon());
new Builder(args).setCommand(Command.START).build().run();
}
private final class ServerWaitMultiThreadedTestCase extends MultithreadedTestCase {
private final AtomicBoolean connectionStateHolder = new AtomicBoolean(true);
private ServerLauncher serverLauncher;
@Override
public void initialize() {
super.initialize();
final Cache mockCache = mockContext.mock(Cache.class, "Cache");
final DistributedSystem mockDistributedSystem = new DistributedSystemAdapter() {
@Override public boolean isConnected() {
return connectionStateHolder.get();
}
};
mockContext.checking(new Expectations() {{
allowing(mockCache).getDistributedSystem();
will(returnValue(mockDistributedSystem));
allowing(mockCache).getCacheServers();
will(returnValue(Collections.emptyList()));
oneOf(mockCache).close();
}});
this.serverLauncher = new Builder().setMemberName("dataMember").setDisableDefaultServer(true)
.setCache(mockCache).build();
assertNotNull(this.serverLauncher);
assertEquals("dataMember", this.serverLauncher.getMemberName());
assertTrue(this.serverLauncher.isDisableDefaultServer());
assertTrue(connectionStateHolder.get());
}
public void thread1() {
assertTick(0);
Thread.currentThread().setName("GemFire Data Member 'main' Thread");
this.serverLauncher.running.set(true);
assertTrue(this.serverLauncher.isRunning());
assertFalse(this.serverLauncher.isServing(this.serverLauncher.getCache()));
assertTrue(this.serverLauncher.isWaiting(this.serverLauncher.getCache()));
this.serverLauncher.waitOnServer();
assertTick(1); // NOTE the tick does not advance when the other Thread terminates
}
public void thread2() {
waitForTick(1);
Thread.currentThread().setName("GemFire 'shutdown' Thread");
assertTrue(this.serverLauncher.isRunning());
this.connectionStateHolder.set(false);
}
@Override
public void finish() {
super.finish();
assertFalse(this.serverLauncher.isRunning());
}
}
}