blob: c7c92f952e56d11242c5c4d1340d2a987b09c6a7 [file] [log] [blame]
package com.google.inject.service;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.TestCase;
/** Tests using Async Service. */
public class SingleServiceIntegrationTest extends TestCase {
public final void testAsyncServiceLifecycle() throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
final CountDownLatch startLatch = new CountDownLatch(1);
final CountDownLatch stopLatch = new CountDownLatch(1);
AsyncService service =
new AsyncService(executor) {
@Override
protected void onStart() {
assertEquals(1, startLatch.getCount());
assertEquals(1, stopLatch.getCount());
startLatch.countDown();
}
@Override
protected void onStop() {
assertEquals(0, startLatch.getCount());
assertEquals(1, stopLatch.getCount());
stopLatch.countDown();
}
};
Future<?> future = service.start();
// This should not pass! TODO(sameb): Why? Looks like it should to me
assertTrue(startLatch.await(2, TimeUnit.SECONDS));
// onStart() is called before the state is set to STARTED, so we need
// to wait until the Future finishes to guarantee it really was started.
// This still manages to test what we want because the startLatch check
// is before this.
future.get(1, TimeUnit.SECONDS);
service.stop();
assertTrue(stopLatch.await(2, TimeUnit.SECONDS));
executor.shutdown();
assertEquals(0, startLatch.getCount());
assertEquals(0, stopLatch.getCount());
}
public final void testAsyncServiceBlockingLifecycle()
throws InterruptedException, ExecutionException, TimeoutException {
ExecutorService executor = Executors.newSingleThreadExecutor();
final AtomicInteger integer = new AtomicInteger(2);
AsyncService service =
new AsyncService(executor) {
@Override
protected void onStart() {
assertEquals(2, integer.getAndDecrement());
}
@Override
protected void onStop() {
assertEquals(1, integer.getAndDecrement());
}
};
service.start().get(2, TimeUnit.SECONDS);
service.stop().get(2, TimeUnit.SECONDS);
executor.shutdown();
assertEquals(0, integer.get());
}
}