You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/05/02 18:58:40 UTC
[05/12] incubator-geode git commit: Fixing tests
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/cd02af01/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalIntegrationTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalIntegrationTest.java
new file mode 100755
index 0000000..03672b6
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalIntegrationTest.java
@@ -0,0 +1,1073 @@
+/*
+ * 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 com.gemstone.gemfire.distributed;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.net.BindException;
+import java.net.InetAddress;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.DataPolicy;
+import com.gemstone.gemfire.cache.Scope;
+import com.gemstone.gemfire.distributed.AbstractLauncher.Status;
+import com.gemstone.gemfire.distributed.ServerLauncher.Builder;
+import com.gemstone.gemfire.distributed.ServerLauncher.ServerState;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.internal.AvailablePort;
+import com.gemstone.gemfire.internal.AvailablePortHelper;
+import com.gemstone.gemfire.internal.GemFireVersion;
+import com.gemstone.gemfire.internal.SocketCreator;
+import com.gemstone.gemfire.internal.cache.AbstractCacheServer;
+import com.gemstone.gemfire.internal.cache.xmlcache.CacheCreation;
+import com.gemstone.gemfire.internal.cache.xmlcache.CacheXmlGenerator;
+import com.gemstone.gemfire.internal.cache.xmlcache.RegionAttributesCreation;
+import com.gemstone.gemfire.internal.process.ProcessControllerFactory;
+import com.gemstone.gemfire.internal.process.ProcessType;
+import com.gemstone.gemfire.internal.process.ProcessUtils;
+import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Integration tests for ServerLauncher as a local API in the local JVM.
+ *
+ * @see com.gemstone.gemfire.distributed.AbstractLauncher
+ * @see com.gemstone.gemfire.distributed.ServerLauncher
+ * @see com.gemstone.gemfire.distributed.ServerLauncher.Builder
+ * @see com.gemstone.gemfire.distributed.ServerLauncher.ServerState
+ * @see com.gemstone.gemfire.internal.AvailablePortHelper
+ * @since 8.0
+ */
+@Category(IntegrationTest.class)
+public class ServerLauncherLocalIntegrationTest extends AbstractServerLauncherIntegrationTestCase {
+
+ @Before
+ public final void setUpServerLauncherLocalTest() throws Exception {
+ disconnectFromDS();
+ System.setProperty(ProcessType.TEST_PREFIX_PROPERTY, getUniqueName()+"-");
+ }
+
+ @After
+ public final void tearDownServerLauncherLocalTest() throws Exception {
+ disconnectFromDS();
+ }
+
+ protected Status getExpectedStopStatusForNotRunning() {
+ return Status.NOT_RESPONDING;
+ }
+
+ @Test
+ public void testBuilderSetProperties() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ this.launcher = new Builder()
+ .setDisableDefaultServer(true)
+ .setForce(true)
+ .setMemberName(getUniqueName())
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.DISABLE_AUTO_RECONNECT_NAME, "true")
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0")
+ .build();
+
+ assertNotNull(this.launcher);
+
+ try {
+ assertEquals(Status.ONLINE, this.launcher.start().getStatus());
+ waitForServerToStart(this.launcher);
+
+ final Cache cache = this.launcher.getCache();
+
+ assertNotNull(cache);
+
+ final DistributedSystem distributedSystem = cache.getDistributedSystem();
+
+ assertNotNull(distributedSystem);
+ assertEquals("true", distributedSystem.getProperties().getProperty(DistributionConfig.DISABLE_AUTO_RECONNECT_NAME));
+ assertEquals("config", distributedSystem.getProperties().getProperty(DistributionConfig.LOG_LEVEL_NAME));
+ assertEquals("0", distributedSystem.getProperties().getProperty(DistributionConfig.MCAST_PORT_NAME));
+ assertEquals(getUniqueName(), distributedSystem.getProperties().getProperty(DistributionConfig.NAME_NAME));
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ assertNull(this.launcher.getCache());
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testIsAttachAPIFound() throws Exception {
+ final ProcessControllerFactory factory = new ProcessControllerFactory();
+ assertTrue(factory.isAttachAPIFound());
+ }
+
+ @Test
+ public void testStartCreatesPidFile() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the Server locally
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+ assertNotNull(this.launcher);
+
+ try {
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+ assertEquals(Status.ONLINE, this.launcher.status().getStatus());
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ assertEquals(Status.ONLINE, this.launcher.status().getStatus());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testStartDeletesStaleControlFiles() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // create existing control files
+ this.stopRequestFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStopRequestFileName());
+ this.stopRequestFile.createNewFile();
+ assertTrue(this.stopRequestFile.exists());
+
+ this.statusRequestFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStatusRequestFileName());
+ this.statusRequestFile.createNewFile();
+ assertTrue(this.statusRequestFile.exists());
+
+ this.statusFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStatusFileName());
+ this.statusFile.createNewFile();
+ assertTrue(this.statusFile.exists());
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+ this.launcher.start();
+
+ try {
+ waitForServerToStart(this.launcher);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ // validate stale control files were deleted
+ assertFalse(this.stopRequestFile.exists());
+ assertFalse(this.statusRequestFile.exists());
+ assertFalse(this.statusFile.exists());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testStartOverwritesStalePidFile() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // create existing pid file
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertFalse("Integer.MAX_VALUE shouldn't be the same as local pid " + Integer.MAX_VALUE, Integer.MAX_VALUE == ProcessUtils.identifyPid());
+ writePid(this.pidFile, Integer.MAX_VALUE);
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+ this.launcher.start();
+
+ try {
+ waitForServerToStart(this.launcher);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ // validate the pid file and its contents
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ /**
+ * Confirms fix for #47778.
+ */
+ @Test
+ public void testStartUsingDisableDefaultServerLeavesPortFree() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the server
+ assertTrue(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+
+ // wait for server to start
+ try {
+ // if start succeeds without throwing exception then #47778 is fixed
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ // verify server did not a port
+ assertTrue(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ final ServerState status = this.launcher.status();
+ final String portString = status.getPort();
+ assertEquals("Port should be \"\" instead of " + portString, "", portString);
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // stop the server
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ /**
+ * Confirms fix for #47778.
+ */
+ @Test
+ public void testStartUsingDisableDefaultServerSkipsPortCheck() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
+ this.socket = SocketCreator.getDefaultInstance().createServerSocket(this.serverPort, 50, null, -1);
+ assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+
+ // wait for server to start
+ try {
+ // if start succeeds without throwing exception then #47778 is fixed
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ final ServerState status = this.launcher.status();
+ final String portString = status.getPort();
+ assertEquals("Port should be \"\" instead of " + portString, "", portString);
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // stop the server
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // verify port is still in use
+ this.errorCollector.checkThat(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET), is(equalTo(false)));
+ }
+
+ @Test
+ @Ignore("Need to rewrite this without using dunit.Host")
+ public void testStartUsingForceOverwritesExistingPidFile() throws Throwable {
+ }/*
+ assertTrue(getUniqueName() + " is broken if PID == Integer.MAX_VALUE", ProcessUtils.identifyPid() != Integer.MAX_VALUE);
+
+ // create existing pid file
+ this.pidFile = new File(ProcessType.SERVER.getPidFileName());
+ final int realPid = Host.getHost(0).getVM(3).invoke(() -> ProcessUtils.identifyPid());
+ assertFalse(realPid == ProcessUtils.identifyPid());
+ writePid(this.pidFile, realPid);
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setForce(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertTrue(builder.getForce());
+ this.launcher = builder.build();
+ assertTrue(this.launcher.isForcing());
+ this.launcher.start();
+
+ // collect and throw the FIRST failure
+ Throwable failure = null;
+
+ try {
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ // validate log file was created
+ final String logFileName = getUniqueName()+".log";
+ assertTrue("Log file should exist: " + logFileName, new File(logFileName).exists());
+
+ } catch (Throwable e) {
+ logger.error(e);
+ if (failure == null) {
+ failure = e;
+ }
+ }
+
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ logger.error(e);
+ if (failure == null) {
+ failure = e;
+ }
+ }
+
+ if (failure != null) {
+ throw failure;
+ }
+ } // testStartUsingForceOverwritesExistingPidFile
+ */
+
+ /**
+ * Confirms part of fix for #47664
+ */
+ @Test
+ public void testStartUsingServerPortOverridesCacheXml() throws Throwable {
+ // verifies part of the fix for #47664
+
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // generate two free ports
+ final int[] freeTCPPorts = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+ assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[0], AvailablePort.SOCKET));
+ assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[1], AvailablePort.SOCKET));
+
+ // write out cache.xml with one port
+ final CacheCreation creation = new CacheCreation();
+ final RegionAttributesCreation attrs = new RegionAttributesCreation(creation);
+ attrs.setScope(Scope.DISTRIBUTED_ACK);
+ attrs.setDataPolicy(DataPolicy.REPLICATE);
+ creation.createRegion(getUniqueName(), attrs);
+ creation.addCacheServer().setPort(freeTCPPorts[0]);
+
+ File cacheXmlFile = this.temporaryFolder.newFile(getUniqueName() + ".xml");
+ final PrintWriter pw = new PrintWriter(new FileWriter(cacheXmlFile), true);
+ CacheXmlGenerator.generate(creation, pw);
+ pw.close();
+
+ System.setProperty(DistributionConfig.CACHE_XML_FILE_NAME, cacheXmlFile.getCanonicalPath());
+
+ // start server
+ final Builder builder = new Builder()
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setServerPort(freeTCPPorts[1])
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+ this.launcher.start();
+
+ // wait for server to start up
+ try {
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ // verify server used --server-port instead of default or port in cache.xml
+ assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[0], AvailablePort.SOCKET));
+ assertFalse(AvailablePort.isPortAvailable(freeTCPPorts[1], AvailablePort.SOCKET));
+
+ final ServerState status = this.launcher.status();
+ final String portString = status.getPort();
+ final int port = Integer.valueOf(portString);
+ assertEquals("Port should be " + freeTCPPorts[1] + " instead of " + port, freeTCPPorts[1], port);
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // stop the server
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ assertFalse("PID file still exists!", pidFile.exists());
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ /**
+ * Confirms part of fix for #47664
+ */
+ @Test
+ public void testStartUsingServerPortUsedInsteadOfDefaultCacheXml() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // write out cache.xml with one port
+ final CacheCreation creation = new CacheCreation();
+ final RegionAttributesCreation attrs = new RegionAttributesCreation(creation);
+ attrs.setScope(Scope.DISTRIBUTED_ACK);
+ attrs.setDataPolicy(DataPolicy.REPLICATE);
+ creation.createRegion(getUniqueName(), attrs);
+ creation.addCacheServer();
+
+ File cacheXmlFile = this.temporaryFolder.newFile(getUniqueName() + ".xml");
+ final PrintWriter pw = new PrintWriter(new FileWriter(cacheXmlFile), true);
+ CacheXmlGenerator.generate(creation, pw);
+ pw.close();
+
+ System.setProperty(DistributionConfig.CACHE_XML_FILE_NAME, cacheXmlFile.getCanonicalPath());
+
+ // start server
+ final Builder builder = new Builder()
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setServerPort(this.serverPort)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+ this.launcher.start();
+
+ // wait for server to start up
+ try {
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+ assertEquals(getPid(), pid);
+
+ // verify server used --server-port instead of default
+ assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ final int port = Integer.valueOf( this.launcher.status().getPort());
+ assertEquals("Port should be " + this.serverPort + " instead of " + port, this.serverPort, port);
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // stop the server
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testStartWithDefaultPortInUseFails() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
+ this.socket = SocketCreator.getDefaultInstance().createServerSocket(this.serverPort, 50, null, -1);
+ assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+
+ RuntimeException expected = null;
+ try {
+ this.launcher.start();
+
+ // why did it not fail like it's supposed to?
+ final String property = System.getProperty(AbstractCacheServer.TEST_OVERRIDE_DEFAULT_PORT_PROPERTY);
+ assertNotNull(property);
+ assertEquals(this.serverPort, Integer.valueOf(property).intValue());
+ assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
+
+ fail("Server port is " + this.launcher.getCache().getCacheServers().get(0).getPort());
+ fail("ServerLauncher start should have thrown RuntimeException caused by BindException");
+ } catch (RuntimeException e) {
+ expected = e;
+ assertNotNull(expected.getMessage());
+ // BindException text varies by platform
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertNotNull(expected);
+ final Throwable cause = expected.getCause();
+ assertNotNull(cause);
+ assertTrue(cause instanceof BindException);
+ // BindException string varies by platform
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertFalse("Pid file should not exist: " + this.pidFile, this.pidFile.exists());
+
+ // creation of log file seems to be random -- look into why sometime
+ final String logFileName = getUniqueName()+".log";
+ assertFalse("Log file should not exist: " + logFileName, new File(this.temporaryFolder.getRoot(), logFileName).exists());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // just in case the launcher started...
+ ServerState status = null;
+ try {
+ status = this.launcher.stop();
+ } catch (Throwable t) {
+ // ignore
+ }
+
+ try {
+ waitForFileToDelete(this.pidFile);
+ assertEquals(getExpectedStopStatusForNotRunning(), status.getStatus());
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ @Ignore("Need to rewrite this without using dunit.Host")
+ public void testStartWithExistingPidFileFails() throws Throwable {
+ }/*
+ // create existing pid file
+ final int realPid = Host.getHost(0).getVM(3).invoke(() -> ProcessUtils.identifyPid());
+ assertFalse("Remote pid shouldn't be the same as local pid " + realPid, realPid == ProcessUtils.identifyPid());
+
+ this.pidFile = new File(ProcessType.SERVER.getPidFileName());
+ writePid(this.pidFile, realPid);
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+
+ // collect and throw the FIRST failure
+ Throwable failure = null;
+ RuntimeException expected = null;
+
+ try {
+ this.launcher.start();
+ fail("ServerLauncher start should have thrown RuntimeException caused by FileAlreadyExistsException");
+ } catch (RuntimeException e) {
+ expected = e;
+ assertNotNull(expected.getMessage());
+ assertTrue(expected.getMessage().contains("A PID file already exists and a Server may be running in"));
+ } catch (Throwable e) {
+ logger.error(e);
+ if (failure == null) {
+ failure = e;
+ }
+ }
+
+ // just in case the launcher started...
+ ServerState status = null;
+ try {
+ status = this.launcher.stop();
+ } catch (Throwable t) {
+ // ignore
+ }
+
+ try {
+ assertNotNull(expected);
+ final Throwable cause = expected.getCause();
+ assertNotNull(cause);
+ assertTrue(cause instanceof FileAlreadyExistsException);
+ assertTrue(cause.getMessage().contains("Pid file already exists: "));
+ assertTrue(cause.getMessage().contains("vf.gf.server.pid for process " + realPid));
+ } catch (Throwable e) {
+ logger.error(e);
+ if (failure == null) {
+ failure = e;
+ }
+ }
+
+ try {
+ delete(this.pidFile);
+ final Status theStatus = status.getStatus();
+ assertFalse(theStatus == Status.STARTING);
+ assertFalse(theStatus == Status.ONLINE);
+ } catch (Throwable e) {
+ logger.error(e);
+ if (failure == null) {
+ failure = e;
+ }
+ }
+
+ if (failure != null) {
+ throw failure;
+ }
+ } // testStartWithExistingPidFileFails
+ */
+
+ /**
+ * Confirms fix for #47665.
+ */
+ @Test
+ public void testStartUsingServerPortInUseFails() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
+ final int freeTCPPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
+ this.socket = SocketCreator.getDefaultInstance().createServerSocket(freeTCPPort, 50, null, -1);
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setServerPort(freeTCPPort)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ this.launcher = builder.build();
+
+ RuntimeException expected = null;
+ try {
+ this.launcher.start();
+ fail("ServerLauncher start should have thrown RuntimeException caused by BindException");
+ } catch (RuntimeException e) {
+ expected = e;
+ assertNotNull(expected.getMessage());
+ // BindException string varies by platform
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ assertNotNull(expected);
+ final Throwable cause = expected.getCause();
+ assertNotNull(cause);
+ assertTrue(cause instanceof BindException);
+ // BindException string varies by platform
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertFalse("Pid file should not exist: " + this.pidFile, this.pidFile.exists());
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // just in case the launcher started...
+ ServerState status = null;
+ try {
+ status = this.launcher.stop();
+ } catch (Throwable t) {
+ // ignore
+ }
+
+ try {
+ waitForFileToDelete(this.pidFile);
+ assertEquals(getExpectedStopStatusForNotRunning(), status.getStatus());
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testStatusUsingPid() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+
+ ServerLauncher pidLauncher = null;
+ try {
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertEquals(ProcessUtils.identifyPid(), pid);
+
+ pidLauncher = new Builder().setPid(pid).build();
+ assertNotNull(pidLauncher);
+ assertFalse(pidLauncher.isRunning());
+
+ final ServerState actualStatus = pidLauncher.status();
+ assertNotNull(actualStatus);
+ assertEquals(Status.ONLINE, actualStatus.getStatus());
+ assertEquals(pid, actualStatus.getPid().intValue());
+ assertTrue(actualStatus.getUptime() > 0);
+ // getWorkingDirectory returns user.dir instead of rootFolder because test is starting Server in this process (to move logFile and pidFile into temp dir)
+ assertEquals(ManagementFactory.getRuntimeMXBean().getClassPath(), actualStatus.getClasspath());
+ assertEquals(GemFireVersion.getGemFireVersion(), actualStatus.getGemFireVersion());
+ assertEquals(System.getProperty("java.version"), actualStatus.getJavaVersion());
+ assertEquals(InetAddress.getLocalHost().getCanonicalHostName(), actualStatus.getHost());
+ assertEquals(getUniqueName(), actualStatus.getMemberName());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ if (pidLauncher == null) {
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ } else {
+ try {
+ assertEquals(Status.STOPPED, pidLauncher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+ }
+
+ @Test
+ public void testStatusUsingWorkingDirectory() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+
+ ServerLauncher dirLauncher = null;
+ try {
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertEquals(ProcessUtils.identifyPid(), pid);
+
+ dirLauncher = new Builder().setWorkingDirectory(rootFolder).build();
+ assertNotNull(dirLauncher);
+ assertFalse(dirLauncher.isRunning());
+
+ final ServerState actualStatus = dirLauncher.status();
+ assertNotNull(actualStatus);
+ assertEquals(Status.ONLINE, actualStatus.getStatus());
+ assertEquals(pid, actualStatus.getPid().intValue());
+ assertTrue(actualStatus.getUptime() > 0);
+ // getWorkingDirectory returns user.dir instead of rootFolder because test is starting Server in this process (to move logFile and pidFile into temp dir)
+ assertEquals(ManagementFactory.getRuntimeMXBean().getClassPath(), actualStatus.getClasspath());
+ assertEquals(GemFireVersion.getGemFireVersion(), actualStatus.getGemFireVersion());
+ assertEquals(System.getProperty("java.version"), actualStatus.getJavaVersion());
+ assertEquals(InetAddress.getLocalHost().getCanonicalHostName(), actualStatus.getHost());
+ assertEquals(getUniqueName(), actualStatus.getMemberName());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ if (dirLauncher == null) {
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ } else {
+ try {
+ assertEquals(Status.STOPPED, dirLauncher.stop().getStatus());
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+ }
+
+ @Test
+ public void testStopUsingPid() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+
+ ServerLauncher pidLauncher = null;
+
+ try {
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertEquals(ProcessUtils.identifyPid(), pid);
+
+ pidLauncher = new Builder().setPid(pid).build();
+ assertNotNull(pidLauncher);
+ assertFalse(pidLauncher.isRunning());
+
+ // stop the server
+ final ServerState serverState = pidLauncher.stop();
+ assertNotNull(serverState);
+ assertEquals(Status.STOPPED, serverState.getStatus());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ this.launcher.stop();
+ } catch (Throwable e) {
+ // ignore
+ }
+
+ try {
+ // verify the PID file was deleted
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+
+ @Test
+ public void testStopUsingWorkingDirectory() throws Throwable {
+ String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
+
+ // build and start the server
+ final Builder builder = new Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(getUniqueName())
+ .setRedirectOutput(true)
+ .setWorkingDirectory(rootFolder)
+ .set(DistributionConfig.LOG_LEVEL_NAME, "config")
+ .set(DistributionConfig.MCAST_PORT_NAME, "0");
+
+ assertFalse(builder.getForce());
+ this.launcher = builder.build();
+ assertFalse(this.launcher.isForcing());
+
+ ServerLauncher dirLauncher = null;
+ try {
+ this.launcher.start();
+ waitForServerToStart(this.launcher);
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ final int pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertEquals(ProcessUtils.identifyPid(), pid);
+
+ dirLauncher = new Builder().setWorkingDirectory(rootFolder).build();
+ assertNotNull(dirLauncher);
+ assertFalse(dirLauncher.isRunning());
+
+ // stop the server
+ final ServerState serverState = dirLauncher.stop();
+ assertNotNull(serverState);
+ assertEquals(Status.STOPPED, serverState.getStatus());
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ this.launcher.stop();
+ } catch (Throwable e) {
+ // ignore
+ }
+
+ try {
+ // verify the PID file was deleted
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/cd02af01/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalJUnitTest.java
deleted file mode 100755
index fd7d806..0000000
--- a/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherLocalJUnitTest.java
+++ /dev/null
@@ -1,1073 +0,0 @@
-/*
- * 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 com.gemstone.gemfire.distributed;
-
-import static org.junit.Assert.*;
-import static org.hamcrest.CoreMatchers.*;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.lang.management.ManagementFactory;
-import java.net.BindException;
-import java.net.InetAddress;
-
-import com.gemstone.gemfire.cache.Cache;
-import com.gemstone.gemfire.cache.DataPolicy;
-import com.gemstone.gemfire.cache.Scope;
-import com.gemstone.gemfire.distributed.AbstractLauncher.Status;
-import com.gemstone.gemfire.distributed.ServerLauncher.Builder;
-import com.gemstone.gemfire.distributed.ServerLauncher.ServerState;
-import com.gemstone.gemfire.distributed.internal.DistributionConfig;
-import com.gemstone.gemfire.internal.AvailablePort;
-import com.gemstone.gemfire.internal.AvailablePortHelper;
-import com.gemstone.gemfire.internal.GemFireVersion;
-import com.gemstone.gemfire.internal.SocketCreator;
-import com.gemstone.gemfire.internal.cache.AbstractCacheServer;
-import com.gemstone.gemfire.internal.cache.xmlcache.CacheCreation;
-import com.gemstone.gemfire.internal.cache.xmlcache.CacheXmlGenerator;
-import com.gemstone.gemfire.internal.cache.xmlcache.RegionAttributesCreation;
-import com.gemstone.gemfire.internal.process.ProcessControllerFactory;
-import com.gemstone.gemfire.internal.process.ProcessType;
-import com.gemstone.gemfire.internal.process.ProcessUtils;
-import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-/**
- * Integration tests for ServerLauncher as a local API in the local JVM.
- *
- * @see com.gemstone.gemfire.distributed.AbstractLauncher
- * @see com.gemstone.gemfire.distributed.ServerLauncher
- * @see com.gemstone.gemfire.distributed.ServerLauncher.Builder
- * @see com.gemstone.gemfire.distributed.ServerLauncher.ServerState
- * @see com.gemstone.gemfire.internal.AvailablePortHelper
- * @since 8.0
- */
-@Category(IntegrationTest.class)
-public class ServerLauncherLocalJUnitTest extends AbstractServerLauncherJUnitTestCase {
-
- @Before
- public final void setUpServerLauncherLocalTest() throws Exception {
- disconnectFromDS();
- System.setProperty(ProcessType.TEST_PREFIX_PROPERTY, getUniqueName()+"-");
- }
-
- @After
- public final void tearDownServerLauncherLocalTest() throws Exception {
- disconnectFromDS();
- }
-
- protected Status getExpectedStopStatusForNotRunning() {
- return Status.NOT_RESPONDING;
- }
-
- @Test
- public void testBuilderSetProperties() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- this.launcher = new Builder()
- .setDisableDefaultServer(true)
- .setForce(true)
- .setMemberName(getUniqueName())
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.DISABLE_AUTO_RECONNECT_NAME, "true")
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0")
- .build();
-
- assertNotNull(this.launcher);
-
- try {
- assertEquals(Status.ONLINE, this.launcher.start().getStatus());
- waitForServerToStart(this.launcher);
-
- final Cache cache = this.launcher.getCache();
-
- assertNotNull(cache);
-
- final DistributedSystem distributedSystem = cache.getDistributedSystem();
-
- assertNotNull(distributedSystem);
- assertEquals("true", distributedSystem.getProperties().getProperty(DistributionConfig.DISABLE_AUTO_RECONNECT_NAME));
- assertEquals("config", distributedSystem.getProperties().getProperty(DistributionConfig.LOG_LEVEL_NAME));
- assertEquals("0", distributedSystem.getProperties().getProperty(DistributionConfig.MCAST_PORT_NAME));
- assertEquals(getUniqueName(), distributedSystem.getProperties().getProperty(DistributionConfig.NAME_NAME));
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- assertNull(this.launcher.getCache());
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testIsAttachAPIFound() throws Exception {
- final ProcessControllerFactory factory = new ProcessControllerFactory();
- assertTrue(factory.isAttachAPIFound());
- }
-
- @Test
- public void testStartCreatesPidFile() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the Server locally
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
- assertNotNull(this.launcher);
-
- try {
- this.launcher.start();
- waitForServerToStart(this.launcher);
- assertEquals(Status.ONLINE, this.launcher.status().getStatus());
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- assertEquals(Status.ONLINE, this.launcher.status().getStatus());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testStartDeletesStaleControlFiles() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // create existing control files
- this.stopRequestFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStopRequestFileName());
- this.stopRequestFile.createNewFile();
- assertTrue(this.stopRequestFile.exists());
-
- this.statusRequestFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStatusRequestFileName());
- this.statusRequestFile.createNewFile();
- assertTrue(this.statusRequestFile.exists());
-
- this.statusFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getStatusFileName());
- this.statusFile.createNewFile();
- assertTrue(this.statusFile.exists());
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
- this.launcher.start();
-
- try {
- waitForServerToStart(this.launcher);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- // validate stale control files were deleted
- assertFalse(this.stopRequestFile.exists());
- assertFalse(this.statusRequestFile.exists());
- assertFalse(this.statusFile.exists());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testStartOverwritesStalePidFile() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // create existing pid file
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertFalse("Integer.MAX_VALUE shouldn't be the same as local pid " + Integer.MAX_VALUE, Integer.MAX_VALUE == ProcessUtils.identifyPid());
- writePid(this.pidFile, Integer.MAX_VALUE);
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
- this.launcher.start();
-
- try {
- waitForServerToStart(this.launcher);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- // validate the pid file and its contents
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- /**
- * Confirms fix for #47778.
- */
- @Test
- public void testStartUsingDisableDefaultServerLeavesPortFree() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the server
- assertTrue(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
-
- // wait for server to start
- try {
- // if start succeeds without throwing exception then #47778 is fixed
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- // verify server did not a port
- assertTrue(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- final ServerState status = this.launcher.status();
- final String portString = status.getPort();
- assertEquals("Port should be \"\" instead of " + portString, "", portString);
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // stop the server
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- /**
- * Confirms fix for #47778.
- */
- @Test
- public void testStartUsingDisableDefaultServerSkipsPortCheck() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
- this.socket = SocketCreator.getDefaultInstance().createServerSocket(this.serverPort, 50, null, -1);
- assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
-
- // wait for server to start
- try {
- // if start succeeds without throwing exception then #47778 is fixed
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- final ServerState status = this.launcher.status();
- final String portString = status.getPort();
- assertEquals("Port should be \"\" instead of " + portString, "", portString);
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // stop the server
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // verify port is still in use
- this.errorCollector.checkThat(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET), is(equalTo(false)));
- }
-
- @Test
- @Ignore("Need to rewrite this without using dunit.Host")
- public void testStartUsingForceOverwritesExistingPidFile() throws Throwable {
- }/*
- assertTrue(getUniqueName() + " is broken if PID == Integer.MAX_VALUE", ProcessUtils.identifyPid() != Integer.MAX_VALUE);
-
- // create existing pid file
- this.pidFile = new File(ProcessType.SERVER.getPidFileName());
- final int realPid = Host.getHost(0).getVM(3).invoke(() -> ProcessUtils.identifyPid());
- assertFalse(realPid == ProcessUtils.identifyPid());
- writePid(this.pidFile, realPid);
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setForce(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertTrue(builder.getForce());
- this.launcher = builder.build();
- assertTrue(this.launcher.isForcing());
- this.launcher.start();
-
- // collect and throw the FIRST failure
- Throwable failure = null;
-
- try {
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- // validate log file was created
- final String logFileName = getUniqueName()+".log";
- assertTrue("Log file should exist: " + logFileName, new File(logFileName).exists());
-
- } catch (Throwable e) {
- logger.error(e);
- if (failure == null) {
- failure = e;
- }
- }
-
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- logger.error(e);
- if (failure == null) {
- failure = e;
- }
- }
-
- if (failure != null) {
- throw failure;
- }
- } // testStartUsingForceOverwritesExistingPidFile
- */
-
- /**
- * Confirms part of fix for #47664
- */
- @Test
- public void testStartUsingServerPortOverridesCacheXml() throws Throwable {
- // verifies part of the fix for #47664
-
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // generate two free ports
- final int[] freeTCPPorts = AvailablePortHelper.getRandomAvailableTCPPorts(2);
- assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[0], AvailablePort.SOCKET));
- assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[1], AvailablePort.SOCKET));
-
- // write out cache.xml with one port
- final CacheCreation creation = new CacheCreation();
- final RegionAttributesCreation attrs = new RegionAttributesCreation(creation);
- attrs.setScope(Scope.DISTRIBUTED_ACK);
- attrs.setDataPolicy(DataPolicy.REPLICATE);
- creation.createRegion(getUniqueName(), attrs);
- creation.addCacheServer().setPort(freeTCPPorts[0]);
-
- File cacheXmlFile = this.temporaryFolder.newFile(getUniqueName() + ".xml");
- final PrintWriter pw = new PrintWriter(new FileWriter(cacheXmlFile), true);
- CacheXmlGenerator.generate(creation, pw);
- pw.close();
-
- System.setProperty(DistributionConfig.CACHE_XML_FILE_NAME, cacheXmlFile.getCanonicalPath());
-
- // start server
- final Builder builder = new Builder()
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setServerPort(freeTCPPorts[1])
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
- this.launcher.start();
-
- // wait for server to start up
- try {
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- // verify server used --server-port instead of default or port in cache.xml
- assertTrue(AvailablePort.isPortAvailable(freeTCPPorts[0], AvailablePort.SOCKET));
- assertFalse(AvailablePort.isPortAvailable(freeTCPPorts[1], AvailablePort.SOCKET));
-
- final ServerState status = this.launcher.status();
- final String portString = status.getPort();
- final int port = Integer.valueOf(portString);
- assertEquals("Port should be " + freeTCPPorts[1] + " instead of " + port, freeTCPPorts[1], port);
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // stop the server
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- assertFalse("PID file still exists!", pidFile.exists());
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- /**
- * Confirms part of fix for #47664
- */
- @Test
- public void testStartUsingServerPortUsedInsteadOfDefaultCacheXml() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // write out cache.xml with one port
- final CacheCreation creation = new CacheCreation();
- final RegionAttributesCreation attrs = new RegionAttributesCreation(creation);
- attrs.setScope(Scope.DISTRIBUTED_ACK);
- attrs.setDataPolicy(DataPolicy.REPLICATE);
- creation.createRegion(getUniqueName(), attrs);
- creation.addCacheServer();
-
- File cacheXmlFile = this.temporaryFolder.newFile(getUniqueName() + ".xml");
- final PrintWriter pw = new PrintWriter(new FileWriter(cacheXmlFile), true);
- CacheXmlGenerator.generate(creation, pw);
- pw.close();
-
- System.setProperty(DistributionConfig.CACHE_XML_FILE_NAME, cacheXmlFile.getCanonicalPath());
-
- // start server
- final Builder builder = new Builder()
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setServerPort(this.serverPort)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
- this.launcher.start();
-
- // wait for server to start up
- try {
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertTrue(ProcessUtils.isProcessAlive(pid));
- assertEquals(getPid(), pid);
-
- // verify server used --server-port instead of default
- assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- final int port = Integer.valueOf( this.launcher.status().getPort());
- assertEquals("Port should be " + this.serverPort + " instead of " + port, this.serverPort, port);
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // stop the server
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testStartWithDefaultPortInUseFails() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
- this.socket = SocketCreator.getDefaultInstance().createServerSocket(this.serverPort, 50, null, -1);
- assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- // build and start the server
- final Builder builder = new Builder()
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
-
- RuntimeException expected = null;
- try {
- this.launcher.start();
-
- // why did it not fail like it's supposed to?
- final String property = System.getProperty(AbstractCacheServer.TEST_OVERRIDE_DEFAULT_PORT_PROPERTY);
- assertNotNull(property);
- assertEquals(this.serverPort, Integer.valueOf(property).intValue());
- assertFalse(AvailablePort.isPortAvailable(this.serverPort, AvailablePort.SOCKET));
-
- fail("Server port is " + this.launcher.getCache().getCacheServers().get(0).getPort());
- fail("ServerLauncher start should have thrown RuntimeException caused by BindException");
- } catch (RuntimeException e) {
- expected = e;
- assertNotNull(expected.getMessage());
- // BindException text varies by platform
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertNotNull(expected);
- final Throwable cause = expected.getCause();
- assertNotNull(cause);
- assertTrue(cause instanceof BindException);
- // BindException string varies by platform
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertFalse("Pid file should not exist: " + this.pidFile, this.pidFile.exists());
-
- // creation of log file seems to be random -- look into why sometime
- final String logFileName = getUniqueName()+".log";
- assertFalse("Log file should not exist: " + logFileName, new File(this.temporaryFolder.getRoot(), logFileName).exists());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // just in case the launcher started...
- ServerState status = null;
- try {
- status = this.launcher.stop();
- } catch (Throwable t) {
- // ignore
- }
-
- try {
- waitForFileToDelete(this.pidFile);
- assertEquals(getExpectedStopStatusForNotRunning(), status.getStatus());
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- @Ignore("Need to rewrite this without using dunit.Host")
- public void testStartWithExistingPidFileFails() throws Throwable {
- }/*
- // create existing pid file
- final int realPid = Host.getHost(0).getVM(3).invoke(() -> ProcessUtils.identifyPid());
- assertFalse("Remote pid shouldn't be the same as local pid " + realPid, realPid == ProcessUtils.identifyPid());
-
- this.pidFile = new File(ProcessType.SERVER.getPidFileName());
- writePid(this.pidFile, realPid);
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
-
- // collect and throw the FIRST failure
- Throwable failure = null;
- RuntimeException expected = null;
-
- try {
- this.launcher.start();
- fail("ServerLauncher start should have thrown RuntimeException caused by FileAlreadyExistsException");
- } catch (RuntimeException e) {
- expected = e;
- assertNotNull(expected.getMessage());
- assertTrue(expected.getMessage().contains("A PID file already exists and a Server may be running in"));
- } catch (Throwable e) {
- logger.error(e);
- if (failure == null) {
- failure = e;
- }
- }
-
- // just in case the launcher started...
- ServerState status = null;
- try {
- status = this.launcher.stop();
- } catch (Throwable t) {
- // ignore
- }
-
- try {
- assertNotNull(expected);
- final Throwable cause = expected.getCause();
- assertNotNull(cause);
- assertTrue(cause instanceof FileAlreadyExistsException);
- assertTrue(cause.getMessage().contains("Pid file already exists: "));
- assertTrue(cause.getMessage().contains("vf.gf.server.pid for process " + realPid));
- } catch (Throwable e) {
- logger.error(e);
- if (failure == null) {
- failure = e;
- }
- }
-
- try {
- delete(this.pidFile);
- final Status theStatus = status.getStatus();
- assertFalse(theStatus == Status.STARTING);
- assertFalse(theStatus == Status.ONLINE);
- } catch (Throwable e) {
- logger.error(e);
- if (failure == null) {
- failure = e;
- }
- }
-
- if (failure != null) {
- throw failure;
- }
- } // testStartWithExistingPidFileFails
- */
-
- /**
- * Confirms fix for #47665.
- */
- @Test
- public void testStartUsingServerPortInUseFails() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // generate one free port and then use TEST_OVERRIDE_DEFAULT_PORT_PROPERTY
- final int freeTCPPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
- this.socket = SocketCreator.getDefaultInstance().createServerSocket(freeTCPPort, 50, null, -1);
-
- // build and start the server
- final Builder builder = new Builder()
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setServerPort(freeTCPPort)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- this.launcher = builder.build();
-
- RuntimeException expected = null;
- try {
- this.launcher.start();
- fail("ServerLauncher start should have thrown RuntimeException caused by BindException");
- } catch (RuntimeException e) {
- expected = e;
- assertNotNull(expected.getMessage());
- // BindException string varies by platform
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- assertNotNull(expected);
- final Throwable cause = expected.getCause();
- assertNotNull(cause);
- assertTrue(cause instanceof BindException);
- // BindException string varies by platform
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertFalse("Pid file should not exist: " + this.pidFile, this.pidFile.exists());
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- // just in case the launcher started...
- ServerState status = null;
- try {
- status = this.launcher.stop();
- } catch (Throwable t) {
- // ignore
- }
-
- try {
- waitForFileToDelete(this.pidFile);
- assertEquals(getExpectedStopStatusForNotRunning(), status.getStatus());
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testStatusUsingPid() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
-
- ServerLauncher pidLauncher = null;
- try {
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertEquals(ProcessUtils.identifyPid(), pid);
-
- pidLauncher = new Builder().setPid(pid).build();
- assertNotNull(pidLauncher);
- assertFalse(pidLauncher.isRunning());
-
- final ServerState actualStatus = pidLauncher.status();
- assertNotNull(actualStatus);
- assertEquals(Status.ONLINE, actualStatus.getStatus());
- assertEquals(pid, actualStatus.getPid().intValue());
- assertTrue(actualStatus.getUptime() > 0);
- // getWorkingDirectory returns user.dir instead of rootFolder because test is starting Server in this process (to move logFile and pidFile into temp dir)
- assertEquals(ManagementFactory.getRuntimeMXBean().getClassPath(), actualStatus.getClasspath());
- assertEquals(GemFireVersion.getGemFireVersion(), actualStatus.getGemFireVersion());
- assertEquals(System.getProperty("java.version"), actualStatus.getJavaVersion());
- assertEquals(InetAddress.getLocalHost().getCanonicalHostName(), actualStatus.getHost());
- assertEquals(getUniqueName(), actualStatus.getMemberName());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- if (pidLauncher == null) {
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- } else {
- try {
- assertEquals(Status.STOPPED, pidLauncher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
- }
-
- @Test
- public void testStatusUsingWorkingDirectory() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
-
- ServerLauncher dirLauncher = null;
- try {
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertEquals(ProcessUtils.identifyPid(), pid);
-
- dirLauncher = new Builder().setWorkingDirectory(rootFolder).build();
- assertNotNull(dirLauncher);
- assertFalse(dirLauncher.isRunning());
-
- final ServerState actualStatus = dirLauncher.status();
- assertNotNull(actualStatus);
- assertEquals(Status.ONLINE, actualStatus.getStatus());
- assertEquals(pid, actualStatus.getPid().intValue());
- assertTrue(actualStatus.getUptime() > 0);
- // getWorkingDirectory returns user.dir instead of rootFolder because test is starting Server in this process (to move logFile and pidFile into temp dir)
- assertEquals(ManagementFactory.getRuntimeMXBean().getClassPath(), actualStatus.getClasspath());
- assertEquals(GemFireVersion.getGemFireVersion(), actualStatus.getGemFireVersion());
- assertEquals(System.getProperty("java.version"), actualStatus.getJavaVersion());
- assertEquals(InetAddress.getLocalHost().getCanonicalHostName(), actualStatus.getHost());
- assertEquals(getUniqueName(), actualStatus.getMemberName());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- if (dirLauncher == null) {
- try {
- assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- } else {
- try {
- assertEquals(Status.STOPPED, dirLauncher.stop().getStatus());
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
- }
-
- @Test
- public void testStopUsingPid() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
-
- ServerLauncher pidLauncher = null;
-
- try {
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertEquals(ProcessUtils.identifyPid(), pid);
-
- pidLauncher = new Builder().setPid(pid).build();
- assertNotNull(pidLauncher);
- assertFalse(pidLauncher.isRunning());
-
- // stop the server
- final ServerState serverState = pidLauncher.stop();
- assertNotNull(serverState);
- assertEquals(Status.STOPPED, serverState.getStatus());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- this.launcher.stop();
- } catch (Throwable e) {
- // ignore
- }
-
- try {
- // verify the PID file was deleted
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-
- @Test
- public void testStopUsingWorkingDirectory() throws Throwable {
- String rootFolder = this.temporaryFolder.getRoot().getCanonicalPath();
-
- // build and start the server
- final Builder builder = new Builder()
- .setDisableDefaultServer(true)
- .setMemberName(getUniqueName())
- .setRedirectOutput(true)
- .setWorkingDirectory(rootFolder)
- .set(DistributionConfig.LOG_LEVEL_NAME, "config")
- .set(DistributionConfig.MCAST_PORT_NAME, "0");
-
- assertFalse(builder.getForce());
- this.launcher = builder.build();
- assertFalse(this.launcher.isForcing());
-
- ServerLauncher dirLauncher = null;
- try {
- this.launcher.start();
- waitForServerToStart(this.launcher);
-
- // validate the pid file and its contents
- this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
- assertTrue(this.pidFile.exists());
- final int pid = readPid(this.pidFile);
- assertTrue(pid > 0);
- assertEquals(ProcessUtils.identifyPid(), pid);
-
- dirLauncher = new Builder().setWorkingDirectory(rootFolder).build();
- assertNotNull(dirLauncher);
- assertFalse(dirLauncher.isRunning());
-
- // stop the server
- final ServerState serverState = dirLauncher.stop();
- assertNotNull(serverState);
- assertEquals(Status.STOPPED, serverState.getStatus());
-
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
-
- try {
- this.launcher.stop();
- } catch (Throwable e) {
- // ignore
- }
-
- try {
- // verify the PID file was deleted
- waitForFileToDelete(this.pidFile);
- } catch (Throwable e) {
- this.errorCollector.addError(e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/cd02af01/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherRemoteFileIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherRemoteFileIntegrationTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherRemoteFileIntegrationTest.java
new file mode 100755
index 0000000..3b5884c
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/ServerLauncherRemoteFileIntegrationTest.java
@@ -0,0 +1,222 @@
+/*
+ * 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 com.gemstone.gemfire.distributed;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import com.gemstone.gemfire.distributed.AbstractLauncher.Status;
+import com.gemstone.gemfire.distributed.ServerLauncher.Builder;
+import com.gemstone.gemfire.internal.process.ProcessControllerFactory;
+import com.gemstone.gemfire.internal.process.ProcessStreamReader;
+import com.gemstone.gemfire.internal.process.ProcessType;
+import com.gemstone.gemfire.internal.process.ProcessUtils;
+import com.gemstone.gemfire.lang.AttachAPINotFoundException;
+import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
+
+/**
+ * Subclass of ServerLauncherRemoteDUnitTest which forces the code to not find
+ * the Attach API which is in the JDK tools.jar. As a result ServerLauncher
+ * ends up using the FileProcessController implementation.
+ *
+ * @since 8.0
+ */
+@Category(IntegrationTest.class)
+public class ServerLauncherRemoteFileIntegrationTest extends ServerLauncherRemoteIntegrationTest {
+
+ @Before
+ public void setUpServerLauncherRemoteFileTest() throws Exception {
+ System.setProperty(ProcessControllerFactory.PROPERTY_DISABLE_ATTACH_API, "true");
+ }
+
+ @After
+ public void tearDownServerLauncherRemoteFileTest() throws Exception {
+ }
+
+ @Override
+ @Test
+ /**
+ * Override and assert Attach API is NOT found
+ */
+ public void testIsAttachAPIFound() throws Exception {
+ final ProcessControllerFactory factory = new ProcessControllerFactory();
+ assertFalse(factory.isAttachAPIFound());
+ }
+
+ @Override
+ @Test
+ /**
+ * Override because FileProcessController cannot request status with PID
+ */
+ public void testStatusUsingPid() throws Throwable {
+ final List<String> jvmArguments = getJvmArguments();
+
+ final List<String> command = new ArrayList<String>();
+ command.add(new File(new File(System.getProperty("java.home"), "bin"), "java").getCanonicalPath());
+ for (String jvmArgument : jvmArguments) {
+ command.add(jvmArgument);
+ }
+ command.add("-cp");
+ command.add(System.getProperty("java.class.path"));
+ command.add(ServerLauncher.class.getName());
+ command.add(ServerLauncher.Command.START.getName());
+ command.add(getUniqueName());
+ command.add("--disable-default-server");
+ command.add("--redirect-output");
+
+ this.process = new ProcessBuilder(command).directory(this.temporaryFolder.getRoot()).start();
+ this.processOutReader = new ProcessStreamReader.Builder(this.process).inputStream(this.process.getInputStream()).build().start();
+ this.processErrReader = new ProcessStreamReader.Builder(this.process).inputStream(this.process.getErrorStream()).build().start();
+
+ // wait for server to start
+ int pid = 0;
+ ServerLauncher pidLauncher = null;
+ this.launcher = new ServerLauncher.Builder()
+ .setWorkingDirectory(this.temporaryFolder.getRoot().getCanonicalPath())
+ .build();
+ try {
+ waitForServerToStart();
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+
+ // validate log file was created
+ final String logFileName = getUniqueName()+".log";
+ assertTrue("Log file should exist: " + logFileName, new File(this.temporaryFolder.getRoot(), logFileName).exists());
+
+ // use launcher with pid
+ pidLauncher = new Builder()
+ .setPid(pid)
+ .build();
+
+ assertNotNull(pidLauncher);
+ assertFalse(pidLauncher.isRunning());
+
+ // status with pid only should throw AttachAPINotFoundException
+ try {
+ pidLauncher.status();
+ fail("FileProcessController should have thrown AttachAPINotFoundException");
+ } catch (AttachAPINotFoundException e) {
+ // passed
+ }
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ // stop the server
+ try {
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForPidToStop(pid, true);
+ waitForFileToDelete(this.pidFile);
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ } finally {
+ new File(ProcessType.SERVER.getStatusRequestFileName()).delete(); // TODO: delete
+ }
+ }
+
+ @Override
+ @Test
+ /**
+ * Override because FileProcessController cannot request stop with PID
+ */
+ public void testStopUsingPid() throws Throwable {
+ final List<String> jvmArguments = getJvmArguments();
+
+ final List<String> command = new ArrayList<String>();
+ command.add(new File(new File(System.getProperty("java.home"), "bin"), "java").getCanonicalPath());
+ for (String jvmArgument : jvmArguments) {
+ command.add(jvmArgument);
+ }
+ command.add("-cp");
+ command.add(System.getProperty("java.class.path"));
+ command.add(ServerLauncher.class.getName());
+ command.add(ServerLauncher.Command.START.getName());
+ command.add(getUniqueName());
+ command.add("--disable-default-server");
+ command.add("--redirect-output");
+
+ this.process = new ProcessBuilder(command).directory(this.temporaryFolder.getRoot()).start();
+ this.processOutReader = new ProcessStreamReader.Builder(this.process).inputStream(this.process.getInputStream()).inputListener(createLoggingListener("sysout", getUniqueName() + "#sysout")).build().start();
+ this.processErrReader = new ProcessStreamReader.Builder(this.process).inputStream(this.process.getErrorStream()).inputListener(createLoggingListener("syserr", getUniqueName() + "#syserr")).build().start();
+
+ // wait for server to start
+ int pid = 0;
+ ServerLauncher pidLauncher = null;
+ this.launcher = new ServerLauncher.Builder()
+ .setWorkingDirectory(this.temporaryFolder.getRoot().getCanonicalPath())
+ .build();
+ try {
+ waitForServerToStart();
+
+ // validate the pid file and its contents
+ this.pidFile = new File(this.temporaryFolder.getRoot(), ProcessType.SERVER.getPidFileName());
+ assertTrue(this.pidFile.exists());
+ pid = readPid(this.pidFile);
+ assertTrue(pid > 0);
+ assertTrue(ProcessUtils.isProcessAlive(pid));
+
+ // validate log file was created
+ final String logFileName = getUniqueName()+".log";
+ assertTrue("Log file should exist: " + logFileName, new File(this.temporaryFolder.getRoot(), logFileName).exists());
+
+ // use launcher with pid
+ pidLauncher = new Builder()
+ .setPid(pid)
+ .build();
+
+ assertNotNull(pidLauncher);
+ assertFalse(pidLauncher.isRunning());
+
+ // stop with pid only should throw AttachAPINotFoundException
+ try {
+ pidLauncher.stop();
+ fail("FileProcessController should have thrown AttachAPINotFoundException");
+ } catch (AttachAPINotFoundException e) {
+ // passed
+ }
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ }
+
+ try {
+ // stop the server
+ assertEquals(Status.STOPPED, this.launcher.stop().getStatus());
+ waitForPidToStop(pid);
+ waitForFileToDelete(this.pidFile);
+
+ } catch (Throwable e) {
+ this.errorCollector.addError(e);
+ } finally {
+ new File(ProcessType.SERVER.getStopRequestFileName()).delete(); // TODO: delete
+ }
+ }
+}