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      public void testRun() throws InterruptedException {
15          final ThreadLocalContextManager<Object> manager = new StubThreadLocalContextManager();
16          Runnable delegate = new Runnable() {
17              public void run() {
18                  assertNotNull(manager.getThreadLocalContext());
19              }
20          };
21  
22          manager.setThreadLocalContext(new Object());
23          final Executor executor = new ThreadLocalDelegateExecutor<Object>(manager, Executors.newSingleThreadExecutor());
24  
25          final CountDownLatch latch = new CountDownLatch(1);
26  
27          executor.execute(new CountingDownRunnable(latch, delegate));
28  
29          latch.await(2, TimeUnit.SECONDS);
30          assertNotNull(manager.getThreadLocalContext());
31      }
32  
33      private static final class CountingDownRunnable implements Runnable {
34          private final CountDownLatch latch;
35          private final Runnable delegate;
36  
37          private CountingDownRunnable(CountDownLatch latch, Runnable delegate) {
38              this.latch = checkNotNull(latch);
39              this.delegate = checkNotNull(delegate);
40          }
41  
42          @Override
43          public void run() {
44              try {
45                  delegate.run();
46              } finally {
47                  latch.countDown();
48              }
49          }
50      }
51  }