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