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 }