aboutsummaryrefslogtreecommitdiffstats
path: root/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java')
-rw-r--r--guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java550
1 files changed, 50 insertions, 500 deletions
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
index 99e2ffb..c4d4f8e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -19,21 +19,12 @@ package com.google.common.util.concurrent;
import static java.lang.Thread.currentThread;
import static java.util.concurrent.TimeUnit.SECONDS;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.Service.Listener;
-import com.google.common.util.concurrent.Service.State;
-
+import junit.framework.Assert;
import junit.framework.TestCase;
import java.lang.Thread.UncaughtExceptionHandler;
-import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.concurrent.GuardedBy;
/**
* Unit test for {@link AbstractService}.
@@ -45,59 +36,43 @@ public class AbstractServiceTest extends TestCase {
private Thread executionThread;
private Throwable thrownByExecutionThread;
- public void testNoOpServiceStartStop() throws Exception {
+ public void testNoOpServiceStartStop() {
NoOpService service = new NoOpService();
- RecordingListener listener = RecordingListener.record(service);
-
- assertEquals(State.NEW, service.state());
+ Assert.assertEquals(Service.State.NEW, service.state());
assertFalse(service.isRunning());
assertFalse(service.running);
service.start();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
assertTrue(service.isRunning());
assertTrue(service.running);
service.stop();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
assertFalse(service.isRunning());
assertFalse(service.running);
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.TERMINATED),
- listener.getStateHistory());
}
public void testNoOpServiceStartAndWaitStopAndWait() throws Exception {
NoOpService service = new NoOpService();
service.start().get();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.stop().get();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
}
public void testNoOpServiceStartStopIdempotence() throws Exception {
NoOpService service = new NoOpService();
- RecordingListener listener = RecordingListener.record(service);
+
service.start();
service.start();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.stop();
service.stop();
- assertEquals(State.TERMINATED, service.state());
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.TERMINATED),
- listener.getStateHistory());
+ assertEquals(Service.State.TERMINATED, service.state());
}
public void testNoOpServiceStartStopIdempotenceAfterWait() throws Exception {
@@ -105,11 +80,11 @@ public class AbstractServiceTest extends TestCase {
service.start().get();
service.start();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.stop().get();
service.stop();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
}
public void testNoOpServiceStartStopIdempotenceDoubleWait() throws Exception {
@@ -117,11 +92,11 @@ public class AbstractServiceTest extends TestCase {
service.start().get();
service.start().get();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.stop().get();
service.stop().get();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
}
public void testNoOpServiceStartStopAndWaitUninterruptible()
@@ -131,10 +106,10 @@ public class AbstractServiceTest extends TestCase {
currentThread().interrupt();
try {
service.startAndWait();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.stopAndWait();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
assertTrue(currentThread().isInterrupted());
} finally {
@@ -158,125 +133,49 @@ public class AbstractServiceTest extends TestCase {
}
}
- public void testManualServiceStartStop() throws Exception {
+ public void testManualServiceStartStop() {
ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
service.start();
- assertEquals(State.STARTING, service.state());
+ assertEquals(Service.State.STARTING, service.state());
assertFalse(service.isRunning());
assertTrue(service.doStartCalled);
service.notifyStarted(); // usually this would be invoked by another thread
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
assertTrue(service.isRunning());
service.stop();
- assertEquals(State.STOPPING, service.state());
+ assertEquals(Service.State.STOPPING, service.state());
assertFalse(service.isRunning());
assertTrue(service.doStopCalled);
service.notifyStopped(); // usually this would be invoked by another thread
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
assertFalse(service.isRunning());
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.TERMINATED),
- listener.getStateHistory());
-
}
- public void testManualServiceNotifyStoppedWhileRunning() throws Exception {
+ public void testManualServiceStopWhileStarting() {
ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
service.start();
- service.notifyStarted();
- service.notifyStopped();
- assertEquals(State.TERMINATED, service.state());
- assertFalse(service.isRunning());
- assertFalse(service.doStopCalled);
-
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.TERMINATED),
- listener.getStateHistory());
- }
-
- public void testManualServiceStopWhileStarting() throws Exception {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
-
- service.start();
- assertEquals(State.STARTING, service.state());
+ assertEquals(Service.State.STARTING, service.state());
assertFalse(service.isRunning());
assertTrue(service.doStartCalled);
service.stop();
- assertEquals(State.STOPPING, service.state());
+ assertEquals(Service.State.STOPPING, service.state());
assertFalse(service.isRunning());
assertFalse(service.doStopCalled);
service.notifyStarted();
- assertEquals(State.STOPPING, service.state());
+ assertEquals(Service.State.STOPPING, service.state());
assertFalse(service.isRunning());
assertTrue(service.doStopCalled);
service.notifyStopped();
- assertEquals(State.TERMINATED, service.state());
- assertFalse(service.isRunning());
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.STOPPING,
- State.TERMINATED),
- listener.getStateHistory());
- }
-
- public void testManualServiceStopWhileNew() throws Exception {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
-
- service.stop();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
assertFalse(service.isRunning());
- assertFalse(service.doStartCalled);
- assertFalse(service.doStopCalled);
- assertEquals(ImmutableList.of(State.TERMINATED), listener.getStateHistory());
- }
-
- public void testManualServiceFailWhileStarting() throws Exception {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
- service.start();
- service.notifyFailed(EXCEPTION);
- assertEquals(ImmutableList.of(State.STARTING, State.FAILED), listener.getStateHistory());
- }
-
- public void testManualServiceFailWhileRunning() throws Exception {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
- service.start();
- service.notifyStarted();
- service.notifyFailed(EXCEPTION);
- assertEquals(ImmutableList.of(State.STARTING, State.RUNNING, State.FAILED),
- listener.getStateHistory());
- }
-
- public void testManualServiceFailWhileStopping() throws Exception {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener listener = RecordingListener.record(service);
- service.start();
- service.notifyStarted();
- service.stop();
- service.notifyFailed(EXCEPTION);
- assertEquals(ImmutableList.of(State.STARTING, State.RUNNING, State.STOPPING, State.FAILED),
- listener.getStateHistory());
}
public void testManualServiceUnrequestedStop() {
@@ -285,12 +184,12 @@ public class AbstractServiceTest extends TestCase {
service.start();
service.notifyStarted();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
assertTrue(service.isRunning());
assertFalse(service.doStopCalled);
service.notifyStopped();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
assertFalse(service.isRunning());
assertFalse(service.doStopCalled);
}
@@ -316,23 +215,16 @@ public class AbstractServiceTest extends TestCase {
public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable {
ThreadedService service = new ThreadedService();
- RecordingListener listener = RecordingListener.record(service);
+
service.start().get();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.awaitRunChecks();
- service.stopAndWait();
- assertEquals(State.TERMINATED, service.state());
+ service.stop().get();
+ assertEquals(Service.State.TERMINATED, service.state());
throwIfSet(thrownByExecutionThread);
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.TERMINATED),
- listener.getStateHistory());
}
public void testThreadedServiceStartStopIdempotence() throws Throwable {
@@ -340,13 +232,13 @@ public class AbstractServiceTest extends TestCase {
service.start();
service.start().get();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.awaitRunChecks();
service.stop();
service.stop().get();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
throwIfSet(thrownByExecutionThread);
}
@@ -357,13 +249,13 @@ public class AbstractServiceTest extends TestCase {
service.start().get();
service.start();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.awaitRunChecks();
service.stop().get();
service.stop();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
executionThread.join();
@@ -376,31 +268,17 @@ public class AbstractServiceTest extends TestCase {
service.start().get();
service.start().get();
- assertEquals(State.RUNNING, service.state());
+ assertEquals(Service.State.RUNNING, service.state());
service.awaitRunChecks();
service.stop().get();
service.stop().get();
- assertEquals(State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, service.state());
throwIfSet(thrownByExecutionThread);
}
- public void testManualServiceFailureIdempotence() {
- ManualSwitchedService service = new ManualSwitchedService();
- RecordingListener.record(service);
- service.start();
- service.notifyFailed(new Exception("1"));
- service.notifyFailed(new Exception("2"));
- try {
- service.startAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals("1", e.getCause().getMessage());
- }
- }
-
private class ThreadedService extends AbstractService {
final CountDownLatch hasConfirmedIsRunning = new CountDownLatch(1);
@@ -461,249 +339,53 @@ public class AbstractServiceTest extends TestCase {
public void testStopUnstartedService() throws Exception {
NoOpService service = new NoOpService();
- RecordingListener listener = RecordingListener.record(service);
-
- Future<State> stopResult = service.stop();
- assertEquals(State.TERMINATED, service.state());
- assertEquals(State.TERMINATED, stopResult.get());
+ Future<Service.State> stopResult = service.stop();
+ assertEquals(Service.State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, stopResult.get());
- Future<State> startResult = service.start();
- assertEquals(State.TERMINATED, service.state());
- assertEquals(State.TERMINATED, startResult.get());
- assertEquals(State.TERMINATED, Iterables.getOnlyElement(listener.getStateHistory()));
- }
-
- public void testFailingServiceStartAndWait() throws Exception {
- StartFailingService service = new StartFailingService();
- RecordingListener listener = RecordingListener.record(service);
-
- try {
- service.startAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals(EXCEPTION, e.getCause());
- }
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.FAILED),
- listener.getStateHistory());
- }
-
- public void testFailingServiceStopAndWait_stopFailing() throws Exception {
- StopFailingService service = new StopFailingService();
- RecordingListener listener = RecordingListener.record(service);
-
- service.startAndWait();
- try {
- service.stopAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals(EXCEPTION, e.getCause());
- }
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.FAILED),
- listener.getStateHistory());
- }
-
- public void testFailingServiceStopAndWait_runFailinging() throws Exception {
- RunFailingService service = new RunFailingService();
- RecordingListener listener = RecordingListener.record(service);
-
- service.startAndWait();
- try {
- service.stopAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals(EXCEPTION, e.getCause().getCause());
- }
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.FAILED),
- listener.getStateHistory());
+ Future<Service.State> startResult = service.start();
+ assertEquals(Service.State.TERMINATED, service.state());
+ assertEquals(Service.State.TERMINATED, startResult.get());
}
public void testThrowingServiceStartAndWait() throws Exception {
StartThrowingService service = new StartThrowingService();
- RecordingListener listener = RecordingListener.record(service);
try {
service.startAndWait();
fail();
} catch (UncheckedExecutionException e) {
- assertEquals(service.exception, e.getCause());
+ assertEquals(EXCEPTION, e.getCause());
}
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.FAILED),
- listener.getStateHistory());
}
public void testThrowingServiceStopAndWait_stopThrowing() throws Exception {
StopThrowingService service = new StopThrowingService();
- RecordingListener listener = RecordingListener.record(service);
service.startAndWait();
try {
service.stopAndWait();
fail();
} catch (UncheckedExecutionException e) {
- assertEquals(service.exception, e.getCause());
+ assertEquals(EXCEPTION, e.getCause());
}
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.STOPPING,
- State.FAILED),
- listener.getStateHistory());
}
public void testThrowingServiceStopAndWait_runThrowing() throws Exception {
RunThrowingService service = new RunThrowingService();
- RecordingListener listener = RecordingListener.record(service);
-
- service.startAndWait();
- try {
- service.stopAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals(service.exception, e.getCause().getCause());
- }
- assertEquals(
- ImmutableList.of(
- State.STARTING,
- State.RUNNING,
- State.FAILED),
- listener.getStateHistory());
- }
- public void testFailureCause_throwsIfNotFailed() {
- StopFailingService service = new StopFailingService();
- try {
- service.failureCause();
- fail();
- } catch (IllegalStateException e) {
- // expected
- }
service.startAndWait();
try {
- service.failureCause();
- fail();
- } catch (IllegalStateException e) {
- // expected
- }
- try {
service.stopAndWait();
fail();
} catch (UncheckedExecutionException e) {
- assertEquals(EXCEPTION, service.failureCause());
- assertEquals(EXCEPTION, e.getCause());
- }
- }
-
- public void testAddListenerAfterFailureDoesntCauseDeadlock() throws InterruptedException {
- final StartFailingService service = new StartFailingService();
- service.start();
- assertEquals(State.FAILED, service.state());
- service.addListener(new RecordingListener(service), MoreExecutors.sameThreadExecutor());
- Thread thread = new Thread() {
- @Override public void run() {
- // Internally start() grabs a lock, this could be any such method on AbstractService.
- service.start();
- }
- };
- thread.start();
- thread.join(100);
- assertFalse(thread + " is deadlocked", thread.isAlive());
- }
-
- public void testListenerDoesntDeadlockOnStartAndWaitFromRunning() throws Exception {
- final NoOpThreadedService service = new NoOpThreadedService();
- service.addListener(new Listener() {
- @Override public void starting() { }
- @Override public void running() {
- service.startAndWait();
- }
- @Override public void stopping(State from) { }
- @Override public void terminated(State from) { }
- @Override public void failed(State from, Throwable failure) { }
- }, MoreExecutors.sameThreadExecutor());
- service.start().get(10, TimeUnit.MILLISECONDS);
- service.stop();
- }
-
- public void testListenerDoesntDeadlockOnStopAndWaitFromTerminated() throws Exception {
- final NoOpThreadedService service = new NoOpThreadedService();
- service.addListener(new Listener() {
- @Override public void starting() { }
- @Override public void running() { }
- @Override public void stopping(State from) { }
- @Override public void terminated(State from) {
- service.stopAndWait();
- }
- @Override public void failed(State from, Throwable failure) { }
- }, MoreExecutors.sameThreadExecutor());
- service.startAndWait();
-
- Thread thread = new Thread() {
- @Override public void run() {
- service.stopAndWait();
- }
- };
- thread.start();
- thread.join(100);
- assertFalse(thread + " is deadlocked", thread.isAlive());
- }
-
- private static class NoOpThreadedService extends AbstractExecutionThreadService {
- @Override protected void run() throws Exception {}
- }
-
- private static class StartFailingService extends AbstractService {
- @Override protected void doStart() {
- notifyFailed(EXCEPTION);
- }
-
- @Override protected void doStop() {
- fail();
- }
- }
-
- private static class RunFailingService extends AbstractService {
- @Override protected void doStart() {
- notifyStarted();
- notifyFailed(EXCEPTION);
- }
-
- @Override protected void doStop() {
- fail();
- }
- }
-
- private static class StopFailingService extends AbstractService {
- @Override protected void doStart() {
- notifyStarted();
- }
-
- @Override protected void doStop() {
- notifyFailed(EXCEPTION);
+ assertEquals(EXCEPTION, e.getCause().getCause());
}
}
private static class StartThrowingService extends AbstractService {
-
- final RuntimeException exception = new RuntimeException("deliberate");
-
@Override protected void doStart() {
- throw exception;
+ notifyFailed(EXCEPTION);
}
@Override protected void doStop() {
@@ -712,12 +394,9 @@ public class AbstractServiceTest extends TestCase {
}
private static class RunThrowingService extends AbstractService {
-
- final RuntimeException exception = new RuntimeException("deliberate");
-
@Override protected void doStart() {
notifyStarted();
- throw exception;
+ notifyFailed(EXCEPTION);
}
@Override protected void doStop() {
@@ -726,143 +405,14 @@ public class AbstractServiceTest extends TestCase {
}
private static class StopThrowingService extends AbstractService {
-
- final RuntimeException exception = new RuntimeException("deliberate");
-
@Override protected void doStart() {
notifyStarted();
}
@Override protected void doStop() {
- throw exception;
- }
- }
-
- private static class RecordingListener implements Listener {
- static RecordingListener record(Service service) {
- RecordingListener listener = new RecordingListener(service);
- service.addListener(listener, MoreExecutors.sameThreadExecutor());
- return listener;
- }
-
- final Service service;
-
- RecordingListener(Service service) {
- this.service = service;
- }
-
- @GuardedBy("this")
- final List<State> stateHistory = Lists.newArrayList();
- final CountDownLatch completionLatch = new CountDownLatch(1);
-
- ImmutableList<State> getStateHistory() throws Exception {
- completionLatch.await();
- synchronized (this) {
- return ImmutableList.copyOf(stateHistory);
- }
- }
-
- @Override public synchronized void starting() {
- assertTrue(stateHistory.isEmpty());
- assertNotSame(State.NEW, service.state());
- stateHistory.add(State.STARTING);
- }
-
- @Override public synchronized void running() {
- assertEquals(State.STARTING, Iterables.getOnlyElement(stateHistory));
- stateHistory.add(State.RUNNING);
- assertTrue(service.start().isDone());
- assertEquals(State.RUNNING, service.startAndWait());
- assertNotSame(State.STARTING, service.state());
- }
-
- @Override public synchronized void stopping(State from) {
- assertEquals(from, Iterables.getLast(stateHistory));
- stateHistory.add(State.STOPPING);
- if (from == State.STARTING) {
- assertTrue(service.start().isDone());
- assertEquals(State.STOPPING, service.startAndWait());
- }
- assertNotSame(from, service.state());
- }
-
- @Override public synchronized void terminated(State from) {
- assertEquals(from, Iterables.getLast(stateHistory, State.NEW));
- stateHistory.add(State.TERMINATED);
- assertEquals(State.TERMINATED, service.state());
- assertTrue(service.start().isDone());
- if (from == State.NEW) {
- assertEquals(State.TERMINATED, service.startAndWait());
- }
- assertTrue(service.stop().isDone());
- assertEquals(State.TERMINATED, service.stopAndWait());
- completionLatch.countDown();
- }
-
- @Override public synchronized void failed(State from, Throwable failure) {
- assertEquals(from, Iterables.getLast(stateHistory));
- stateHistory.add(State.FAILED);
- assertEquals(State.FAILED, service.state());
- if (from == State.STARTING) {
- try {
- service.startAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- assertEquals(failure, e.getCause());
- }
- }
- try {
- service.stopAndWait();
- fail();
- } catch (UncheckedExecutionException e) {
- if (from == State.STOPPING) {
- assertEquals(failure, e.getCause());
- } else {
- assertEquals(failure, e.getCause().getCause());
- }
- }
- completionLatch.countDown();
+ notifyFailed(EXCEPTION);
}
}
- public void testNotifyStartedWhenNotStarting() {
- AbstractService service = new DefaultService();
- try {
- service.notifyStarted();
- fail();
- } catch (IllegalStateException expected) {}
- }
-
- public void testNotifyStoppedWhenNotRunning() {
- AbstractService service = new DefaultService();
- try {
- service.notifyStopped();
- fail();
- } catch (IllegalStateException expected) {}
- }
-
- public void testNotifyFailedWhenNotStarted() {
- AbstractService service = new DefaultService();
- try {
- service.notifyFailed(new Exception());
- fail();
- } catch (IllegalStateException expected) {}
- }
-
- public void testNotifyFailedWhenTerminated() {
- NoOpService service = new NoOpService();
- service.startAndWait();
- service.stopAndWait();
- try {
- service.notifyFailed(new Exception());
- fail();
- } catch (IllegalStateException expected) {}
- }
-
- private static class DefaultService extends AbstractService {
- @Override protected void doStart() {}
- @Override protected void doStop() {}
- }
-
private static final Exception EXCEPTION = new Exception();
}