1 package org.apache.maven.surefire.junitcore.pc;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.surefire.report.ConsoleStream;
23 import org.apache.maven.surefire.util.internal.DaemonThreadFactory;
24 import org.junit.runner.Description;
25 import org.junit.runners.model.RunnerScheduler;
26
27 import java.util.Collection;
28 import java.util.concurrent.ConcurrentLinkedQueue;
29 import java.util.concurrent.ExecutorService;
30 import java.util.concurrent.LinkedBlockingQueue;
31 import java.util.concurrent.ThreadFactory;
32 import java.util.concurrent.ThreadPoolExecutor;
33 import java.util.concurrent.TimeUnit;
34
35
36
37
38
39
40
41
42
43 final class SingleThreadScheduler
44 {
45 private final ConsoleStream logger;
46
47 private final ExecutorService pool = newPool();
48
49 private final Scheduler master;
50
51 private static ExecutorService newPool()
52 {
53 ThreadFactory tf = DaemonThreadFactory.newDaemonThreadFactory( "maven-surefire-plugin@NotThreadSafe" );
54 return new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), tf );
55 }
56
57 SingleThreadScheduler( ConsoleStream logger )
58 {
59 this.logger = logger;
60 SchedulingStrategy strategy = SchedulingStrategies.createParallelSharedStrategy( logger, pool );
61 master = new Scheduler( logger, null, strategy );
62 }
63
64 RunnerScheduler newRunnerScheduler()
65 {
66 SchedulingStrategy strategy = SchedulingStrategies.createParallelSharedStrategy( logger, pool );
67 return new Scheduler( logger, null, master, strategy );
68 }
69
70
71
72
73 ShutdownResult describeStopped( boolean shutdownNow )
74 {
75 ShutdownResult shutdownResult = master.describeStopped( shutdownNow );
76 return new ShutdownResult( copyExisting( shutdownResult.getTriggeredTests() ),
77 copyExisting( shutdownResult.getIncompleteTests() ) );
78 }
79
80
81
82
83 boolean shutdownThreadPoolsAwaitingKilled()
84 {
85 return master.shutdownThreadPoolsAwaitingKilled();
86 }
87
88 private Collection<Description> copyExisting( Collection<Description> descriptions )
89 {
90 Collection<Description> activeChildren = new ConcurrentLinkedQueue<>( descriptions );
91 ParallelComputerUtil.removeUnusedDescriptions( activeChildren );
92 return activeChildren;
93 }
94 }