/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.distributed;
import org.apache.geode.distributed.LocatorLauncher.Builder;
import org.apache.geode.distributed.LocatorLauncher.Command;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.internal.i18n.LocalizedStrings;
import org.apache.geode.test.junit.categories.FlakyTest;
import org.apache.geode.test.junit.categories.UnitTest;
import joptsimple.OptionException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.RestoreSystemProperties;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
import java.net.InetAddress;
import java.net.UnknownHostException;
import static org.junit.Assert.*;
import static org.apache.geode.distributed.ConfigurationProperties.*;
/**
* The LocatorLauncherTest class is a test suite of test cases for testing the contract and
* functionality of launching a GemFire Locator.
*
* @see org.apache.geode.distributed.LocatorLauncher
* @see org.apache.geode.distributed.LocatorLauncher.Builder
* @see org.apache.geode.distributed.LocatorLauncher.Command
* @see org.junit.Assert
* @see org.junit.Test
* @since GemFire 7.0
*/
@Category(UnitTest.class)
public class LocatorLauncherTest {
@Rule
public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
@Rule
public final TestName testName = new TestName();
@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 expectedMessage1 =
LocalizedStrings.Launcher_Builder_UNKNOWN_HOST_ERROR_MESSAGE.toLocalizedString("Locator");
final String expectedMessage2 =
"badhostname.badcompany.bad is not an address for this machine.";
assertTrue(expected.getMessage().equals(expectedMessage1)
|| expected.getMessage().equals(expectedMessage2));
if (expected.getMessage().equals(expectedMessage1)) {
assertTrue(expected.getCause() instanceof UnknownHostException);
}
throw expected;
}
}
@Category(FlakyTest.class) // GEODE-1308
@Test(expected = IllegalArgumentException.class)
public void testSetBindAddressToNonLocalHost() {
try {
new Builder().setBindAddress("yahoo.com");
} catch (IllegalArgumentException expected) {
final String expectedMessage = "yahoo.com is not an address for this machine.";
assertEquals(expectedMessage, expected.getMessage());
throw expected;
}
}
@Test
public void testSetBindAddressToLocalHost() throws Exception {
String host = InetAddress.getLocalHost().getHostName();
new Builder().setBindAddress(host);
}
@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 testBuild() throws Exception {
Builder builder = new Builder();
LocatorLauncher launcher = builder.setCommand(Command.START).setDebug(true)
.setHostnameForClients("beanstock.vmware.com").setMemberName("Beanstock").setPort(8192)
.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(NAME, "locatorABC").build();
assertNotNull(launcher);
assertEquals(LocatorLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
assertEquals("locatorABC", launcher.getProperties().getProperty(NAME));
}
@Test
public void testBuildWithMemberNameSetInSystemPropertiesOnStart() {
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + NAME, "locatorXYZ");
LocatorLauncher launcher =
new Builder().setCommand(LocatorLauncher.Command.START).setMemberName(null).build();
assertNotNull(launcher);
assertEquals(LocatorLauncher.Command.START, launcher.getCommand());
assertNull(launcher.getMemberName());
}
}