1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.util.concurrent;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20 import static junit.framework.Assert.assertEquals;
21 import static junit.framework.Assert.assertFalse;
22 import static junit.framework.Assert.assertTrue;
23 import static junit.framework.Assert.fail;
24
25 import java.util.concurrent.CancellationException;
26 import java.util.concurrent.CountDownLatch;
27 import java.util.concurrent.ExecutionException;
28 import java.util.concurrent.ExecutorService;
29 import java.util.concurrent.Executors;
30 import java.util.concurrent.TimeUnit;
31
32 import javax.annotation.Nullable;
33
34
35
36
37
38
39 public class ListenableFutureTester {
40
41 private final ExecutorService exec;
42 private final ListenableFuture<?> future;
43 private final CountDownLatch latch;
44
45 public ListenableFutureTester(ListenableFuture<?> future) {
46 this.exec = Executors.newCachedThreadPool();
47 this.future = checkNotNull(future);
48 this.latch = new CountDownLatch(1);
49 }
50
51 public void setUp() {
52 future.addListener(new Runnable() {
53 @Override public void run() {
54 latch.countDown();
55 }
56 }, exec);
57
58 assertEquals(1, latch.getCount());
59 assertFalse(future.isDone());
60 assertFalse(future.isCancelled());
61 }
62
63 public void tearDown() {
64 exec.shutdown();
65 }
66
67 public void testCompletedFuture(@Nullable Object expectedValue)
68 throws InterruptedException, ExecutionException {
69 assertTrue(future.isDone());
70 assertFalse(future.isCancelled());
71
72 assertTrue(latch.await(5, TimeUnit.SECONDS));
73 assertTrue(future.isDone());
74 assertFalse(future.isCancelled());
75
76 assertEquals(expectedValue, future.get());
77 }
78
79 public void testCancelledFuture()
80 throws InterruptedException, ExecutionException {
81 assertTrue(future.isDone());
82 assertTrue(future.isCancelled());
83
84 assertTrue(latch.await(5, TimeUnit.SECONDS));
85 assertTrue(future.isDone());
86 assertTrue(future.isCancelled());
87
88 try {
89 future.get();
90 fail("Future should throw CancellationException on cancel.");
91 } catch (CancellationException expected) {}
92 }
93
94 public void testFailedFuture(@Nullable String message)
95 throws InterruptedException {
96 assertTrue(future.isDone());
97 assertFalse(future.isCancelled());
98
99 assertTrue(latch.await(5, TimeUnit.SECONDS));
100 assertTrue(future.isDone());
101 assertFalse(future.isCancelled());
102
103 try {
104 future.get();
105 fail("Future should rethrow the exception.");
106 } catch (ExecutionException e) {
107 assertEquals(message, e.getCause().getMessage());
108 }
109 }
110 }