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 }