blob: 598d7c45499574c317b499c6abbcc521c5a45eca [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 java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;
import com.gemstone.gemfire.distributed.LocatorLauncher.Builder;
import com.gemstone.gemfire.distributed.LocatorLauncher.Command;
import com.gemstone.gemfire.distributed.internal.DistributionConfig;
import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
import com.gemstone.gemfire.internal.util.IOUtils;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
import joptsimple.OptionException;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* The LocatorLauncherJUnitTest class is a test suite of test cases for testing the contract and functionality of
* launching a GemFire Locator.
*
* @author John Blum
* @author Kirk Lund
* @see com.gemstone.gemfire.distributed.CommonLauncherTestSuite
* @see com.gemstone.gemfire.distributed.LocatorLauncher
* @see com.gemstone.gemfire.distributed.LocatorLauncher.Builder
* @see com.gemstone.gemfire.distributed.LocatorLauncher.Command
* @see org.junit.Assert
* @see org.junit.Test
* @since 7.0
*/
@Category(UnitTest.class)
public class LocatorLauncherJUnitTest extends CommonLauncherTestSuite {
@Test
public void testBuilderParseArguments() throws Exception {
String expectedWorkingDirectory = System.getProperty("user.dir");
Builder builder = new Builder();
builder.parseArguments("start", "memberOne", "--bind-address", InetAddress.getLocalHost().getHostAddress(),
"--dir", expectedWorkingDirectory, "--hostname-for-clients", "Tucows", "--pid", "1234", "--port", "11235",
"--redirect-output", "--force", "--debug");
assertEquals(Command.START, builder.getCommand());
assertEquals(InetAddress.getLocalHost(), builder.getBindAddress());
assertEquals(expectedWorkingDirectory, builder.getWorkingDirectory());
assertEquals("Tucows", builder.getHostnameForClients());
assertEquals(1234, builder.getPid().intValue());
assertEquals(11235, builder.getPort().intValue());
assertTrue(builder.getRedirectOutput());
assertTrue(builder.getForce());
assertTrue(builder.getDebug());
}
@Test
public void testBuilderParseArgumentsWithCommandInArguments() {
String expectedWorkingDirectory = System.getProperty("user.dir");
Builder builder = new Builder();
builder.parseArguments("start", "--dir=" + expectedWorkingDirectory, "--port", "12345", "memberOne");
assertEquals(Command.START, builder.getCommand());
assertFalse(Boolean.TRUE.equals(builder.getDebug()));
assertFalse(Boolean.TRUE.equals(builder.getForce()));
assertFalse(Boolean.TRUE.equals(builder.getHelp()));
assertNull(builder.getBindAddress());
assertNull(builder.getHostnameForClients());
assertEquals("12345", builder.getMemberName());
assertNull(builder.getPid());
assertEquals(expectedWorkingDirectory, builder.getWorkingDirectory());
assertEquals(12345, builder.getPort().intValue());
}
@Test(expected = IllegalArgumentException.class)
public void testBuilderParseArgumentsWithNonNumericPort() {
try {
new Builder().parseArguments("start", "locator1", "--port", "oneTwoThree");
}
catch (IllegalArgumentException expected) {
assertTrue(expected.getCause() instanceof OptionException);
assertTrue(expected.getMessage(), expected.getMessage().contains(
LocalizedStrings.Launcher_Builder_PARSE_COMMAND_LINE_ARGUMENT_ERROR_MESSAGE.toLocalizedString(
"Locator", expected.getCause().getMessage())));
throw expected;
}
}
@Test
public void testForceDefaultsToFalse() {
assertFalse(new Builder().getForce());
}
@Test
public void testForceSetToTrue() {
Builder builder = new Builder();
builder.parseArguments("start", "--force");
assertTrue(Boolean.TRUE.equals(builder.getForce()));
}
@Test
public void testSetAndGetCommand() {
final Builder builder = new Builder();
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
assertSame(builder, builder.setCommand(Command.START));
assertEquals(Command.START, builder.getCommand());
assertSame(builder, builder.setCommand(Command.STATUS));
assertEquals(Command.STATUS, builder.getCommand());
assertSame(builder, builder.setCommand(Command.STOP));
assertEquals(Command.STOP, builder.getCommand());
assertSame(builder, builder.setCommand(null));
assertEquals(Builder.DEFAULT_COMMAND, builder.getCommand());
}
@Test
public void testSetAndGetBindAddress() throws UnknownHostException {
final Builder builder = new Builder();
assertNull(builder.getBindAddress());
assertSame(builder, builder.setBindAddress(null));
assertNull(builder.getBindAddress());
assertSame(builder, builder.setBindAddress(""));
assertNull(builder.getBindAddress());
assertSame(builder, builder.setBindAddress(" "));
assertNull(builder.getBindAddress());
assertSame(builder, builder.setBindAddress(InetAddress.getLocalHost().getCanonicalHostName()));
assertEquals(InetAddress.getLocalHost(), builder.getBindAddress());
}
@Test(expected = IllegalArgumentException.class)
public void testSetBindAddressToUnknownHost() {
try {
new Builder().setBindAddress("badhostname.badcompany.bad");
}
catch (IllegalArgumentException expected) {
final String expectedMessage = LocalizedStrings.Launcher_Builder_UNKNOWN_HOST_ERROR_MESSAGE.toLocalizedString("Locator");
assertEquals(expectedMessage, expected.getMessage());
assertTrue(expected.getCause() instanceof UnknownHostException);
throw expected;
}
}
@Test
public void testSetAndGetHostnameForClients() {
final Builder builder = new Builder();
assertNull(builder.getHostnameForClients());
assertSame(builder, builder.setHostnameForClients("Pegasus"));
assertEquals("Pegasus", builder.getHostnameForClients());
assertSame(builder, builder.setHostnameForClients(null));
assertNull(builder.getHostnameForClients());
}
@Test(expected = IllegalArgumentException.class)
public void testSetHostnameForClientsWithBlankString() {
try {
new Builder().setHostnameForClients(" ");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.LocatorLauncher_Builder_INVALID_HOSTNAME_FOR_CLIENTS_ERROR_MESSAGE
.toLocalizedString(), expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetHostnameForClientsWithEmptyString() {
try {
new Builder().setHostnameForClients("");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.LocatorLauncher_Builder_INVALID_HOSTNAME_FOR_CLIENTS_ERROR_MESSAGE
.toLocalizedString(), expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetMemberName() {
Builder builder = new Builder();
assertNull(builder.getMemberName());
assertSame(builder, builder.setMemberName("locatorOne"));
assertEquals("locatorOne", builder.getMemberName());
assertSame(builder, builder.setMemberName(null));
assertNull(builder.getMemberName());
}
@Test(expected = IllegalArgumentException.class)
public void testSetMemberNameWithBlankString() {
try {
new Builder().setMemberName(" ");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_ERROR_MESSAGE.toLocalizedString("Locator"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetMemberNameWithEmptyString() {
try {
new Builder().setMemberName("");
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_ERROR_MESSAGE.toLocalizedString("Locator"),
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;
}
}
@SuppressWarnings("deprecation")
@Test
public void testSetAndGetPort() {
Builder builder = new Builder();
assertEquals(LocatorLauncher.DEFAULT_LOCATOR_PORT, builder.getPort());
assertSame(builder, builder.setPort(65535));
assertEquals(65535, builder.getPort().intValue());
assertSame(builder, builder.setPort(1024));
assertEquals(1024, builder.getPort().intValue());
assertSame(builder, builder.setPort(80));
assertEquals(80, builder.getPort().intValue());
assertSame(builder, builder.setPort(1));
assertEquals(1, builder.getPort().intValue());
assertSame(builder, builder.setPort(0));
assertEquals(0, builder.getPort().intValue());
assertSame(builder, builder.setPort(null));
assertEquals(LocatorLauncher.DEFAULT_LOCATOR_PORT, builder.getPort());
}
@Test(expected = IllegalArgumentException.class)
public void testSetPortToOverflow() {
try {
new Builder().setPort(65536);
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_INVALID_PORT_ERROR_MESSAGE.toLocalizedString("Locator"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetPortToUnderflow() {
try {
new Builder().setPort(-1);
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_INVALID_PORT_ERROR_MESSAGE.toLocalizedString("Locator"),
expected.getMessage());
throw expected;
}
}
@Test
public void testSetAndGetWorkingDirectory() {
Builder builder = new Builder();
assertEquals(AbstractLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(null));
assertEquals(AbstractLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(""));
assertEquals(AbstractLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(" "));
assertEquals(AbstractLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
assertSame(builder, builder.setWorkingDirectory(System.getProperty("user.dir")));
assertEquals(System.getProperty("user.dir"), 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(null));
assertEquals(AbstractLauncher.DEFAULT_WORKING_DIRECTORY, builder.getWorkingDirectory());
}
@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.getCanonicalPath());
}
catch (IllegalArgumentException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_WORKING_DIRECTORY_NOT_FOUND_ERROR_MESSAGE
.toLocalizedString("Locator"), expected.getMessage());
assertTrue(expected.getCause() instanceof FileNotFoundException);
assertEquals(tmpFile.getCanonicalPath(), expected.getCause().getMessage());
throw expected;
}
}
@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("Locator"), expected.getMessage());
assertTrue(expected.getCause() instanceof FileNotFoundException);
assertEquals("/path/to/non_existing/directory", expected.getCause().getMessage());
throw expected;
}
}
@Test
public void testBuild() {
Builder builder = new Builder();
LocatorLauncher launcher = builder.setCommand(Command.START)
.setDebug(true)
.setHostnameForClients("beanstock.vmware.com")
.setMemberName("Beanstock")
.setPort(8192)
.setWorkingDirectory(AbstractLauncher.DEFAULT_WORKING_DIRECTORY)
.build();
assertNotNull(launcher);
assertEquals(builder.getCommand(), launcher.getCommand());
assertTrue(launcher.isDebugging());
assertEquals(builder.getHostnameForClients(), launcher.getHostnameForClients());
assertEquals(builder.getMemberName(), launcher.getMemberName());
assertEquals(builder.getPort(), launcher.getPort());
assertEquals(builder.getWorkingDirectory(), launcher.getWorkingDirectory());
assertFalse(launcher.isHelping());
assertFalse(launcher.isRunning());
}
@Test
public void testBuildWithMemberNameSetInApiPropertiesOnStart() {
LocatorLauncher launcher = new Builder()
.setCommand(LocatorLauncher.Command.START)
.setMemberName(null)
.set(DistributionConfig.NAME_NAME, "locatorABC")
.build();
assertNotNull(launcher);
assertEquals(LocatorLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
assertEquals("locatorABC", launcher.getProperties().getProperty(DistributionConfig.NAME_NAME));
}
@Test
public void testBuildWithMemberNameSetInGemfirePropertiesOnStart() throws Exception {
System.setProperty("user.dir", this.temporaryFolder.getRoot().getCanonicalPath());
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty(DistributionConfig.NAME_NAME, "locator123");
File gemfirePropertiesFile = writeGemFirePropertiesToFile(gemfireProperties, "gemfire.properties",
String.format("Test gemfire.properties file for %1$s.%2$s.", getClass().getSimpleName(),
"testBuildWithMemberNameSetInGemfirePropertiesOnStart"));
assertNotNull(gemfirePropertiesFile);
assertTrue(gemfirePropertiesFile.isFile());
LocatorLauncher launcher = new Builder().setCommand(Command.START).setMemberName(null).build();
assertNotNull(launcher);
assertEquals(Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
}
@Test
public void testBuildWithMemberNameSetInSystemPropertiesOnStart() {
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + DistributionConfig.NAME_NAME, "locatorXYZ");
LocatorLauncher launcher = new Builder()
.setCommand(LocatorLauncher.Command.START)
.setMemberName(null)
.build();
assertNotNull(launcher);
assertEquals(LocatorLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
}
@Test(expected = IllegalStateException.class)
public void testBuildWithNoMemberNameOnStart() throws Exception {
System.setProperty("user.dir", this.temporaryFolder.getRoot().getCanonicalPath());
try {
new Builder().setCommand(Command.START).build();
}
catch (IllegalStateException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_MEMBER_NAME_VALIDATION_ERROR_MESSAGE.toLocalizedString("Locator"),
expected.getMessage());
throw expected;
}
}
@Test(expected = IllegalStateException.class)
public void testBuildWithMismatchingCurrentAndWorkingDirectoryOnStart() {
try {
new Builder().setCommand(Command.START)
.setMemberName("memberOne")
.setWorkingDirectory(System.getProperty("java.io.tmpdir"))
.build();
}
catch (IllegalStateException expected) {
assertEquals(LocalizedStrings.Launcher_Builder_WORKING_DIRECTORY_OPTION_NOT_VALID_ERROR_MESSAGE
.toLocalizedString("Locator"), expected.getMessage());
throw expected;
}
}
}