View Javadoc

1   package com.atlassian.sal.core.executor;
2   
3   import com.atlassian.sal.api.executor.ThreadLocalContextManager;
4   import junit.framework.TestCase;
5   
6   import java.util.concurrent.CountDownLatch;
7   import java.util.concurrent.Executor;
8   import java.util.concurrent.Executors;
9   import java.util.concurrent.TimeUnit;
10  
11  import static com.google.common.base.Preconditions.checkNotNull;
12  
13  public final class TestThreadLocalDelegateExecutor extends TestCase
14  {
15      public void testRun() throws InterruptedException
16      {
17          final ThreadLocalContextManager<Object> manager = new StubThreadLocalContextManager();
18          Runnable delegate = new Runnable()
19          {
20              public void run()
21              {
22                  assertNotNull(manager.getThreadLocalContext());
23              }
24          };
25  
26          manager.setThreadLocalContext(new Object());
27          final Executor executor = new ThreadLocalDelegateExecutor<Object>(manager, Executors.newSingleThreadExecutor());
28  
29          final CountDownLatch latch = new CountDownLatch(1);
30  
31          executor.execute(new CountingDownRunnable(latch, delegate));
32  
33          latch.await(2, TimeUnit.SECONDS);
34          assertNotNull(manager.getThreadLocalContext());
35      }
36  
37      private static final class CountingDownRunnable implements Runnable
38      {
39          private final CountDownLatch latch;
40          private final Runnable delegate;
41  
42          private CountingDownRunnable(CountDownLatch latch, Runnable delegate)
43          {
44              this.latch = checkNotNull(latch);
45              this.delegate = checkNotNull(delegate);
46          }
47  
48          @Override
49          public void run()
50          {
51              try
52              {
53                  delegate.run();
54              }
55              finally
56              {
57                  latch.countDown();
58              }
59          }
60      }
61  }