165888c01862049c0f7744cf4dfac371ce780fb24dhanjipackage com.google.inject.service;
265888c01862049c0f7744cf4dfac371ce780fb24dhanji
3b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
4b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport junit.framework.TestCase;
5b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
665888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.CountDownLatch;
765888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.ExecutionException;
865888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.ExecutorService;
965888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.Executors;
10b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.comimport java.util.concurrent.Future;
1165888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.TimeUnit;
1265888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.TimeoutException;
1365888c01862049c0f7744cf4dfac371ce780fb24dhanjiimport java.util.concurrent.atomic.AtomicInteger;
1465888c01862049c0f7744cf4dfac371ce780fb24dhanji
1565888c01862049c0f7744cf4dfac371ce780fb24dhanji/**
1665888c01862049c0f7744cf4dfac371ce780fb24dhanji * Tests using Async Service.
1765888c01862049c0f7744cf4dfac371ce780fb24dhanji */
18b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
1965888c01862049c0f7744cf4dfac371ce780fb24dhanjipublic class SingleServiceIntegrationTest extends TestCase {
20b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
21b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com  public final void testAsyncServiceLifecycle() throws Exception {
2265888c01862049c0f7744cf4dfac371ce780fb24dhanji    ExecutorService executor = Executors.newSingleThreadExecutor();
2365888c01862049c0f7744cf4dfac371ce780fb24dhanji
242ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    final CountDownLatch startLatch = new CountDownLatch(1);
252ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    final CountDownLatch stopLatch = new CountDownLatch(1);
2665888c01862049c0f7744cf4dfac371ce780fb24dhanji    AsyncService service = new AsyncService(executor) {
2765888c01862049c0f7744cf4dfac371ce780fb24dhanji      @Override protected void onStart() {
282ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        assertEquals(1, startLatch.getCount());
292ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        assertEquals(1, stopLatch.getCount());
3065888c01862049c0f7744cf4dfac371ce780fb24dhanji
312ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        startLatch.countDown();
3265888c01862049c0f7744cf4dfac371ce780fb24dhanji      }
3365888c01862049c0f7744cf4dfac371ce780fb24dhanji
3465888c01862049c0f7744cf4dfac371ce780fb24dhanji      @Override protected void onStop() {
352ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        assertEquals(0, startLatch.getCount());
362ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        assertEquals(1, stopLatch.getCount());
3765888c01862049c0f7744cf4dfac371ce780fb24dhanji
382ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji        stopLatch.countDown();
3965888c01862049c0f7744cf4dfac371ce780fb24dhanji      }
4065888c01862049c0f7744cf4dfac371ce780fb24dhanji    };
4165888c01862049c0f7744cf4dfac371ce780fb24dhanji
42b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    Future<?> future = service.start();
43b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    // This should not pass!  TODO(sameb): Why?  Looks like it should to me
442ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    assertTrue(startLatch.await(2, TimeUnit.SECONDS));
45b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    // onStart() is called before the state is set to STARTED, so we need
46b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    // to wait until the Future finishes to guarantee it really was started.
47b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    // This still manages to test what we want because the startLatch check
48b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    // is before this.
49b405e0417151915b98c3d2033adb9770336a7bbbguice.mirrorbot@gmail.com    future.get(1, TimeUnit.SECONDS);
5065888c01862049c0f7744cf4dfac371ce780fb24dhanji
5165888c01862049c0f7744cf4dfac371ce780fb24dhanji    service.stop();
522ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    assertTrue(stopLatch.await(2, TimeUnit.SECONDS));
5365888c01862049c0f7744cf4dfac371ce780fb24dhanji
5465888c01862049c0f7744cf4dfac371ce780fb24dhanji    executor.shutdown();
552ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    assertEquals(0, startLatch.getCount());
562ee4f18ea8cd06d0adf45e0c7c771a7806c8195adhanji    assertEquals(0, stopLatch.getCount());
5765888c01862049c0f7744cf4dfac371ce780fb24dhanji  }
5865888c01862049c0f7744cf4dfac371ce780fb24dhanji
5965888c01862049c0f7744cf4dfac371ce780fb24dhanji  public final void testAsyncServiceBlockingLifecycle()
6065888c01862049c0f7744cf4dfac371ce780fb24dhanji      throws InterruptedException, ExecutionException, TimeoutException {
6165888c01862049c0f7744cf4dfac371ce780fb24dhanji    ExecutorService executor = Executors.newSingleThreadExecutor();
6265888c01862049c0f7744cf4dfac371ce780fb24dhanji
6365888c01862049c0f7744cf4dfac371ce780fb24dhanji    final AtomicInteger integer = new AtomicInteger(2);
6465888c01862049c0f7744cf4dfac371ce780fb24dhanji    AsyncService service = new AsyncService(executor) {
6565888c01862049c0f7744cf4dfac371ce780fb24dhanji      @Override protected void onStart() {
6665888c01862049c0f7744cf4dfac371ce780fb24dhanji        assertEquals(2, integer.getAndDecrement());
6765888c01862049c0f7744cf4dfac371ce780fb24dhanji      }
6865888c01862049c0f7744cf4dfac371ce780fb24dhanji
6965888c01862049c0f7744cf4dfac371ce780fb24dhanji      @Override protected void onStop() {
7065888c01862049c0f7744cf4dfac371ce780fb24dhanji        assertEquals(1, integer.getAndDecrement());
7165888c01862049c0f7744cf4dfac371ce780fb24dhanji      }
7265888c01862049c0f7744cf4dfac371ce780fb24dhanji    };
7365888c01862049c0f7744cf4dfac371ce780fb24dhanji
7465888c01862049c0f7744cf4dfac371ce780fb24dhanji    service.start().get(2, TimeUnit.SECONDS);
7565888c01862049c0f7744cf4dfac371ce780fb24dhanji    service.stop().get(2, TimeUnit.SECONDS);
7665888c01862049c0f7744cf4dfac371ce780fb24dhanji
7765888c01862049c0f7744cf4dfac371ce780fb24dhanji    executor.shutdown();
7865888c01862049c0f7744cf4dfac371ce780fb24dhanji    assertEquals(0, integer.get());
7965888c01862049c0f7744cf4dfac371ce780fb24dhanji  }
8065888c01862049c0f7744cf4dfac371ce780fb24dhanji}
81