View Javadoc
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  }