| 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()); |
| } |
| } |