blob: 9e09c91c7af40d821ce79ed5cfb49fb3dbc34626 [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.slider.server.services.utility
import groovy.util.logging.Slf4j
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.service.Service
import org.apache.slider.core.main.ServiceLauncherBaseTest
import org.junit.Test
@Slf4j
class TestCompoundService extends ServiceLauncherBaseTest {
@Test
public void testSingleCompound() throws Throwable {
CompoundService parent = startService([new MockService()])
parent.stop();
}
@Test
public void testSingleCompoundTerminating() throws Throwable {
CompoundService parent = startService([new MockService("1",false,100)])
assert waitForParentToStop(parent);
}
public boolean waitForParentToStop(CompoundService parent) {
boolean stop = parent.waitForServiceToStop(1000)
if (!stop) {
log.error("Service failed to stop $parent")
logState(parent)
}
return stop
}
@Test
public void testSingleCompoundFailing() throws Throwable {
CompoundService parent = startService([new MockService("1",true,100)])
assert parent.waitForServiceToStop(1000);
assert parent.getFailureCause() != null;
}
@Test
public void testCompound() throws Throwable {
MockService one = new MockService("one", false, 100)
MockService two = new MockService("two", false, 100)
CompoundService parent = startService([one, two])
assert waitForParentToStop(parent);
assert one.isInState(Service.STATE.STOPPED)
assert two.isInState(Service.STATE.STOPPED)
}
@Test
public void testCompoundOneLongLived() throws Throwable {
MockService one = new MockService("one", false, 500)
MockService two = new MockService("two", false, 100)
CompoundService parent = startService([one, two])
assert waitForParentToStop(parent);
assert one.isInState(Service.STATE.STOPPED)
assert two.isInState(Service.STATE.STOPPED)
}
@Test
public void testNotificationInCompound() throws Throwable {
boolean notified = false;
EventCallback ecb = new EventCallback() {
@Override
void eventCallbackEvent() {
log.info("EventCallback")
notified = true;
}
}
MockService one = new MockService("one", false, 100)
EventNotifyingService ens = new EventNotifyingService(ecb, 100);
MockService two = new MockService("two", false, 100)
CompoundService parent = startService([one, ens, two])
assert waitForParentToStop(parent);
assert one.isInState(Service.STATE.STOPPED)
assert ens.isInState(Service.STATE.STOPPED)
assert two.isInState(Service.STATE.STOPPED)
assert notified
}
@Test
public void testFailingCompound() throws Throwable {
MockService one = new MockService("one", true, 100)
MockService two = new MockService("two", false, 100)
CompoundService parent = startService([one, two])
assert waitForParentToStop(parent);
assert one.isInState(Service.STATE.STOPPED)
assert one.failureCause != null
assert two.isInState(Service.STATE.STOPPED)
}
@Test
public void testCompoundInCompound() throws Throwable {
MockService one = new MockService("one", false, 100)
MockService two = new MockService("two", false, 100)
CompoundService parent = buildService([one, two])
CompoundService outer = startService([parent])
assert outer.waitForServiceToStop(1000);
assert one.isInState(Service.STATE.STOPPED)
assert two.isInState(Service.STATE.STOPPED)
}
public CompoundService startService(List<Service> services) {
CompoundService parent = buildService(services)
//expect service to start and stay started
parent.start();
return parent
}
public CompoundService buildService(List<Service> services) {
CompoundService parent = new CompoundService("test")
services.each { parent.addService(it) }
parent.init(new Configuration())
return parent
}
void logState(Parent p) {
logService(p)
for (Service s : p.services) {
logService(s)
}
}
public void logService(Service s) {
log.info(s.toString())
if (s.getFailureCause()) {
log.info("Failed in state ${s.getFailureState()} with $s.failureCause")
}
}
}