| 38 | import org.junit.runners.JUnit4; |
| 39 | |
| 40 | @RunWith(JUnit4.class) |
| 41 | public class DoubleCheckTest { |
| 42 | @Test |
| 43 | public void provider_nullPointerException() { |
| 44 | try { |
| 45 | DoubleCheck.provider(null); |
| 46 | fail(); |
| 47 | } catch (NullPointerException expected) { |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | @Test |
| 52 | public void lazy_nullPointerException() { |
| 53 | try { |
| 54 | DoubleCheck.lazy(null); |
| 55 | fail(); |
| 56 | } catch (NullPointerException expected) { |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | private static final Provider<Object> DOUBLE_CHECK_OBJECT_PROVIDER = |
| 61 | DoubleCheck.provider(Object::new); |
| 62 | |
| 63 | @Test |
| 64 | public void doubleWrapping_provider() { |
| 65 | assertThat(DoubleCheck.provider(DOUBLE_CHECK_OBJECT_PROVIDER)) |
| 66 | .isSameAs(DOUBLE_CHECK_OBJECT_PROVIDER); |
| 67 | } |
| 68 | |
| 69 | @Test |
| 70 | public void doubleWrapping_lazy() { |
| 71 | assertThat(DoubleCheck.lazy(DOUBLE_CHECK_OBJECT_PROVIDER)) |
| 72 | .isSameAs(DOUBLE_CHECK_OBJECT_PROVIDER); |
| 73 | } |
| 74 | |
| 75 | @Test |
| 76 | public void get() throws Exception { |
| 77 | int numThreads = 10; |
| 78 | ExecutorService executor = Executors.newFixedThreadPool(numThreads); |
| 79 | |
| 80 | final CountDownLatch latch = new CountDownLatch(numThreads); |
| 81 | LatchedProvider provider = new LatchedProvider(latch); |
| 82 | final Lazy<Object> lazy = DoubleCheck.lazy(provider); |
| 83 | |
| 84 | List<Callable<Object>> tasks = Lists.newArrayListWithCapacity(numThreads); |
| 85 | for (int i = 0; i < numThreads; i++) { |
| 86 | tasks.add( |
| 87 | () -> { |
| 88 | latch.countDown(); |
| 89 | return lazy.get(); |
| 90 | }); |
| 91 | } |
| 92 | |
| 93 | List<Future<Object>> futures = executor.invokeAll(tasks); |
| 94 | |
| 95 | assertThat(provider.provisions.get()).isEqualTo(1); |
| 96 | Set<Object> results = Sets.newIdentityHashSet(); |
| 97 | for (Future<Object> future : futures) { |