blob: f40051b0d178ff0ac9ef8ccd0ec411beebc943f0 [file] [log] [blame]
/*
* 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.hadoop.service.launcher;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.BreakableService;
import org.apache.hadoop.service.launcher.testservices.FailingStopInStartService;
import org.apache.hadoop.service.launcher.testservices.InitInConstructorLaunchableService;
import org.apache.hadoop.service.launcher.testservices.LaunchableRunningService;
import org.apache.hadoop.service.launcher.testservices.NoArgsAllowedService;
import org.apache.hadoop.service.launcher.testservices.NullBindLaunchableService;
import org.apache.hadoop.service.launcher.testservices.RunningService;
import org.apache.hadoop.service.launcher.testservices.StoppingInStartLaunchableService;
import org.apache.hadoop.service.launcher.testservices.StringConstructorOnlyService;
import static org.apache.hadoop.service.launcher.LauncherArguments.*;
import static org.apache.hadoop.test.GenericTestUtils.*;
import static org.apache.hadoop.service.launcher.testservices.ExceptionInExecuteLaunchableService.*;
import org.junit.Test;
public class TestServiceLauncher extends AbstractServiceLauncherTestBase {
@Test
public void testRunService() throws Throwable {
assertRuns(RunningService.NAME);
}
@Test
public void testNullBindService() throws Throwable {
assertRuns(NullBindLaunchableService.NAME);
}
@Test
public void testServiceLaunchStringConstructor() throws Throwable {
assertRuns(StringConstructorOnlyService.NAME);
}
/**
* Test the behaviour of service stop logic.
*/
@Test
public void testStopInStartup() throws Throwable {
FailingStopInStartService svc = new FailingStopInStartService();
svc.init(new Configuration());
svc.start();
assertStopped(svc);
Throwable cause = svc.getFailureCause();
assertNotNull(cause);
assertTrue(cause instanceof ServiceLaunchException);
assertTrue(svc.waitForServiceToStop(0));
ServiceLaunchException e = (ServiceLaunchException) cause;
assertEquals(FailingStopInStartService.EXIT_CODE, e.getExitCode());
}
@Test
public void testEx() throws Throwable {
assertLaunchOutcome(EXIT_EXCEPTION_THROWN,
OTHER_EXCEPTION_TEXT,
NAME);
}
/**
* This test verifies that exceptions in the
* {@link LaunchableService#execute()} method are relayed if an instance of
* an exit exceptions, and forwarded if not.
*/
@Test
public void testServiceLaunchException() throws Throwable {
assertLaunchOutcome(EXIT_OTHER_FAILURE,
SLE_TEXT,
NAME,
ARG_THROW_SLE);
}
@Test
public void testIOE() throws Throwable {
assertLaunchOutcome(IOE_EXIT_CODE,
EXIT_IN_IOE_TEXT,
NAME,
ARG_THROW_IOE);
}
@Test
public void testThrowable() throws Throwable {
assertLaunchOutcome(EXIT_EXCEPTION_THROWN,
"java.lang.OutOfMemoryError",
NAME,
ARG_THROWABLE);
}
/**
* As the exception is doing some formatting tricks, these
* tests verify that exception arguments are being correctly
* used as initializers.
*/
@Test
public void testBasicExceptionFormatting() throws Throwable {
ServiceLaunchException ex = new ServiceLaunchException(0, "%03x", 32);
assertExceptionContains("020", ex);
}
@Test
public void testNotEnoughArgsExceptionFormatting() throws Throwable {
ServiceLaunchException ex = new ServiceLaunchException(0, "%03x");
assertExceptionContains("%03x", ex);
}
@Test
public void testInnerCause() throws Throwable {
Exception cause = new Exception("cause");
ServiceLaunchException ex =
new ServiceLaunchException(0, "%03x: %s", 32, cause);
assertExceptionContains("020", ex);
assertExceptionContains("cause", ex);
assertSame(cause, ex.getCause());
}
@Test
public void testInnerCauseNotInFormat() throws Throwable {
Exception cause = new Exception("cause");
ServiceLaunchException ex =
new ServiceLaunchException(0, "%03x:", 32, cause);
assertExceptionContains("020", ex);
assertFalse(ex.getMessage().contains("cause"));
assertSame(cause, ex.getCause());
}
@Test
public void testServiceInitInConstructor() throws Throwable {
assertRuns(InitInConstructorLaunchableService.NAME);
}
@Test
public void testRunNoArgsAllowedService() throws Throwable {
assertRuns(NoArgsAllowedService.NAME);
}
@Test
public void testNoArgsOneArg() throws Throwable {
assertLaunchOutcome(EXIT_COMMAND_ARGUMENT_ERROR, "1",
NoArgsAllowedService.NAME, "one");
}
@Test
public void testNoArgsHasConfsStripped() throws Throwable {
assertRuns(
NoArgsAllowedService.NAME,
LauncherArguments.ARG_CONF_PREFIXED,
configFile(newConf()));
}
@Test
public void testRunLaunchableService() throws Throwable {
assertRuns(LaunchableRunningService.NAME);
}
@Test
public void testArgBinding() throws Throwable {
assertLaunchOutcome(EXIT_OTHER_FAILURE,
"",
LaunchableRunningService.NAME,
LaunchableRunningService.ARG_FAILING);
}
@Test
public void testStoppingInStartLaunchableService() throws Throwable {
assertRuns(StoppingInStartLaunchableService.NAME);
}
@Test
public void testShutdownHookNullReference() throws Throwable {
new ServiceShutdownHook(null).run();
}
@Test
public void testShutdownHook() throws Throwable {
BreakableService service = new BreakableService();
setServiceToTeardown(service);
ServiceShutdownHook hook = new ServiceShutdownHook(service);
hook.run();
assertStopped(service);
}
@Test
public void testFailingHookCaught() throws Throwable {
BreakableService service = new BreakableService(false, false, true);
setServiceToTeardown(service);
ServiceShutdownHook hook = new ServiceShutdownHook(service);
hook.run();
assertStopped(service);
}
}