1 package com.atlassian.sal.core.executor;
2
3 import com.atlassian.sal.api.executor.ThreadLocalContextManager;
4 import com.atlassian.sal.api.executor.ThreadLocalDelegateExecutorFactory;
5 import org.junit.Before;
6 import org.junit.Test;
7 import org.junit.runner.RunWith;
8 import org.mockito.Mock;
9 import org.mockito.invocation.InvocationOnMock;
10 import org.mockito.junit.MockitoJUnitRunner;
11 import org.mockito.stubbing.Answer;
12
13 import java.util.concurrent.CountDownLatch;
14 import java.util.concurrent.Executor;
15 import java.util.concurrent.Executors;
16 import java.util.concurrent.TimeUnit;
17
18 import static com.google.common.base.Preconditions.checkNotNull;
19 import static org.junit.Assert.assertNotNull;
20 import static org.mockito.ArgumentMatchers.any;
21 import static org.mockito.Mockito.when;
22
23 @RunWith(MockitoJUnitRunner.class)
24 public final class TestThreadLocalDelegateExecutor {
25
26 @Mock
27 private ThreadLocalDelegateExecutorFactory delegateExecutorFactory;
28
29 @Before
30 public void setup() {
31 when(delegateExecutorFactory.createRunnable(any(Runnable.class))).thenAnswer(new Answer<Runnable>() {
32 @Override
33 public Runnable answer(InvocationOnMock invocation) throws Throwable {
34 return invocation.getArgument(0);
35 }
36 });
37 }
38
39 @Test
40 public void testRun() throws InterruptedException {
41 final ThreadLocalContextManager<Object> manager = new StubThreadLocalContextManager();
42 Runnable delegate = new Runnable() {
43 public void run() {
44 assertNotNull(manager.getThreadLocalContext());
45 }
46 };
47
48 manager.setThreadLocalContext(new Object());
49 final Executor executor = new ThreadLocalDelegateExecutor(Executors.newSingleThreadExecutor(), delegateExecutorFactory);
50
51 final CountDownLatch latch = new CountDownLatch(1);
52
53 executor.execute(new CountingDownRunnable(latch, delegate));
54
55 latch.await(2, TimeUnit.SECONDS);
56 assertNotNull(manager.getThreadLocalContext());
57 }
58
59 private static final class CountingDownRunnable implements Runnable {
60 private final CountDownLatch latch;
61 private final Runnable delegate;
62
63 private CountingDownRunnable(CountDownLatch latch, Runnable delegate) {
64 this.latch = checkNotNull(latch);
65 this.delegate = checkNotNull(delegate);
66 }
67
68 @Override
69 public void run() {
70 try {
71 delegate.run();
72 } finally {
73 latch.countDown();
74 }
75 }
76 }
77 }