1 package com.atlassian.vcache.internal.test;
2
3 import com.atlassian.utt.concurrency.Barrier;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 import java.util.concurrent.Callable;
8 import java.util.concurrent.CompletableFuture;
9 import java.util.concurrent.ExecutionException;
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.Executors;
12 import java.util.concurrent.Future;
13
14 public class TestUtils {
15 private static final Logger log = LoggerFactory.getLogger(AbstractStableReadExternalCacheIT.class);
16
17 private static final ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool();
18
19 public static <T> CompletableFuture<T> runAndWaitForStart(final Callable<T> r) {
20 final Barrier barrier = new Barrier();
21 log.info("{}: About to submit()", Thread.currentThread().getName());
22 final Future<T> result = EXECUTOR_SERVICE.submit(() -> {
23 log.info("{}: About to signal()", Thread.currentThread().getName());
24 barrier.signal();
25 log.info("{}: resume after signal", Thread.currentThread().getName());
26 return r.call();
27 });
28
29 log.info("{}: About to await()", Thread.currentThread().getName());
30 barrier.await();
31 log.info("{}: resume after await()", Thread.currentThread().getName());
32
33 return CompletableFuture.supplyAsync(() -> {
34 try {
35 return result.get();
36 } catch (InterruptedException | ExecutionException e) {
37 throw new RuntimeException(e);
38 }
39 });
40 }
41 }