ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorCompletionService9Test.java
Revision: 1.6
Committed: Mon Oct 31 15:52:27 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +8 -4 lines
Log Message:
make test robust against runsPerTest > 1

File Contents

# User Rev Content
1 jsr166 1.1 /*
2     * Written by Doug Lea and Martin Buchholz with assistance from
3     * members of JCP JSR-166 Expert Group and released to the public
4     * domain, as explained at
5     * http://creativecommons.org/publicdomain/zero/1.0/
6     */
7    
8     import java.util.ArrayList;
9     import java.util.Collection;
10 jsr166 1.6 import java.util.Comparator;
11 jsr166 1.1 import java.util.List;
12     import java.util.Set;
13     import java.util.HashSet;
14     import java.util.concurrent.Callable;
15     import java.util.concurrent.CompletionService;
16     import java.util.concurrent.ExecutionException;
17 jsr166 1.3 import java.util.concurrent.Executor;
18 jsr166 1.1 import java.util.concurrent.ExecutorCompletionService;
19     import java.util.concurrent.Future;
20    
21     import junit.framework.Test;
22     import junit.framework.TestSuite;
23    
24     public class ExecutorCompletionService9Test extends JSR166TestCase {
25     public static void main(String[] args) {
26     main(suite(), args);
27     }
28     public static Test suite() {
29     return new TestSuite(ExecutorCompletionService9Test.class);
30     }
31    
32     void solveAll(Executor e,
33     Collection<Callable<Integer>> solvers)
34     throws InterruptedException, ExecutionException {
35     CompletionService<Integer> cs
36     = new ExecutorCompletionService<>(e);
37 jsr166 1.4 solvers.forEach(cs::submit);
38 jsr166 1.1 for (int i = solvers.size(); i > 0; i--) {
39     Integer r = cs.take().get();
40     if (r != null)
41     use(r);
42     }
43     }
44    
45     void solveAny(Executor e,
46     Collection<Callable<Integer>> solvers)
47     throws InterruptedException {
48     CompletionService<Integer> cs
49     = new ExecutorCompletionService<>(e);
50     int n = solvers.size();
51     List<Future<Integer>> futures = new ArrayList<>(n);
52     Integer result = null;
53     try {
54     solvers.forEach((solver) -> futures.add(cs.submit(solver)));
55     for (int i = n; i > 0; i--) {
56     try {
57     Integer r = cs.take().get();
58     if (r != null) {
59     result = r;
60     break;
61     }
62     } catch (ExecutionException ignore) {}
63     }
64     } finally {
65     futures.forEach((future) -> future.cancel(true));
66     }
67    
68     if (result != null)
69     use(result);
70     }
71    
72 jsr166 1.6 ArrayList<Integer> results;
73 jsr166 1.1
74     void use(Integer x) {
75 jsr166 1.6 if (results == null) results = new ArrayList<Integer>();
76 jsr166 1.1 results.add(x);
77     }
78    
79     /**
80     * The first "solvers" sample code in the class javadoc works.
81     */
82     public void testSolveAll()
83     throws InterruptedException, ExecutionException {
84 jsr166 1.6 results = null;
85 jsr166 1.1 Set<Callable<Integer>> solvers = Set.of(
86     () -> null,
87     () -> 1,
88     () -> 2,
89     () -> 3,
90     () -> null);
91 jsr166 1.3 solveAll(cachedThreadPool, solvers);
92 jsr166 1.6 results.sort(Comparator.naturalOrder());
93     assertEquals(List.of(1, 2, 3), results);
94 jsr166 1.1 }
95 jsr166 1.2
96 jsr166 1.1 /**
97     * The second "solvers" sample code in the class javadoc works.
98     */
99     public void testSolveAny()
100     throws InterruptedException {
101 jsr166 1.6 results = null;
102 jsr166 1.1 Set<Callable<Integer>> solvers = Set.of(
103     () -> { throw new ArithmeticException(); },
104     () -> null,
105     () -> 1,
106     () -> 2);
107 jsr166 1.3 solveAny(cachedThreadPool, solvers);
108 jsr166 1.1 assertEquals(1, results.size());
109 jsr166 1.6 Integer elt = results.get(0);
110 jsr166 1.1 assertTrue(elt.equals(1) || elt.equals(2));
111     }
112    
113     }