1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.lang3.concurrent;
18
19 import static org.apache.commons.lang3.LangAssertions.assertNullPointerException;
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertNotNull;
23 import static org.junit.jupiter.api.Assertions.assertNotSame;
24 import static org.junit.jupiter.api.Assertions.assertNull;
25 import static org.junit.jupiter.api.Assertions.assertSame;
26 import static org.junit.jupiter.api.Assertions.assertTrue;
27
28 import java.util.concurrent.ThreadFactory;
29
30 import org.apache.commons.lang3.AbstractLangTest;
31 import org.easymock.EasyMock;
32 import org.junit.jupiter.api.BeforeEach;
33 import org.junit.jupiter.api.Test;
34
35
36
37
38 class BasicThreadFactoryTest extends AbstractLangTest {
39
40
41 private static final String PATTERN = "testThread-%d";
42
43
44 private BasicThreadFactory.Builder builder;
45
46
47
48
49
50
51 private void checkDaemonFlag(final boolean flag) {
52 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
53 final Runnable r = EasyMock.createMock(Runnable.class);
54 final Thread t = new Thread();
55 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
56 EasyMock.replay(wrapped, r);
57
58 final BasicThreadFactory factory = builder
59 .wrappedFactory(wrapped)
60 .daemon(flag)
61 .build();
62
63 assertSame(t, factory.newThread(r), "Wrong thread");
64 assertEquals(flag, t.isDaemon(), "Wrong daemon flag");
65 EasyMock.verify(wrapped, r);
66 }
67
68
69
70
71
72
73 private void checkFactoryDefaults(final BasicThreadFactory factory) {
74 assertNull(factory.getNamingPattern(), "Got a naming pattern");
75 assertNull(factory.getUncaughtExceptionHandler(), "Got an exception handler");
76 assertNull(factory.getPriority(), "Got a priority");
77 assertNull(factory.getDaemonFlag(), "Got a daemon flag");
78 assertNotNull(factory.getWrappedFactory(), "No wrapped factory");
79 }
80
81 @BeforeEach
82 public void setUp() {
83 builder = BasicThreadFactory.builder();
84 }
85
86
87
88
89 @Test
90 void testBuildDefaults() {
91 final BasicThreadFactory factory = builder.build();
92 checkFactoryDefaults(factory);
93 }
94
95
96
97
98 @Test
99 void testBuilderDaemon() {
100 builder.daemon();
101 assertTrue(builder.build().getDaemonFlag());
102 }
103
104
105
106
107 @Test
108 void testBuilderDaemonBoolean() {
109 builder.daemon(true);
110 assertTrue(builder.build().getDaemonFlag());
111 builder.daemon(false);
112 assertFalse(builder.build().getDaemonFlag());
113 }
114
115
116
117
118 @Test
119 void testBuilderReset() {
120 final ThreadFactory wrappedFactory = EasyMock.createMock(ThreadFactory.class);
121 final Thread.UncaughtExceptionHandler exHandler = EasyMock
122 .createMock(Thread.UncaughtExceptionHandler.class);
123 EasyMock.replay(wrappedFactory, exHandler);
124
125 builder.namingPattern(PATTERN)
126 .daemon(true)
127 .priority(Thread.MAX_PRIORITY)
128 .uncaughtExceptionHandler(exHandler)
129 .wrappedFactory(wrappedFactory);
130
131 builder.reset();
132 final BasicThreadFactory factory = builder.build();
133 checkFactoryDefaults(factory);
134 assertNotSame(wrappedFactory, factory.getWrappedFactory(), "Wrapped factory not reset");
135 EasyMock.verify(wrappedFactory, exHandler);
136 }
137
138
139
140
141 @Test
142 void testBuilderResetAfterBuild() {
143
144 builder
145 .wrappedFactory(EasyMock.createNiceMock(ThreadFactory.class))
146 .namingPattern(PATTERN)
147 .daemon(true)
148 .build();
149
150 checkFactoryDefaults(builder.build());
151 }
152
153
154
155
156 @Test
157 void testBuildNamingPatternNull() {
158 assertNullPointerException(() -> builder.namingPattern(null));
159 }
160
161
162
163
164 @Test
165 void testBuildUncaughtExceptionHandlerNull() {
166 assertNullPointerException(() -> builder.uncaughtExceptionHandler(null));
167 }
168
169
170
171
172 @Test
173 void testBuildWrappedFactoryNull() {
174 assertNullPointerException(() -> builder.wrappedFactory(null));
175 }
176
177
178
179
180 @Test
181 void testNewThreadDaemonFalse() {
182 checkDaemonFlag(false);
183 }
184
185
186
187
188 @Test
189 void testNewThreadDaemonTrue() {
190 checkDaemonFlag(true);
191 }
192
193
194
195
196 @Test
197 void testNewThreadExHandler() {
198 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
199 final Runnable r = EasyMock.createMock(Runnable.class);
200 final Thread.UncaughtExceptionHandler handler = EasyMock
201 .createMock(Thread.UncaughtExceptionHandler.class);
202 final Thread t = new Thread();
203 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
204 EasyMock.replay(wrapped, r, handler);
205 final BasicThreadFactory factory = builder.wrappedFactory(wrapped)
206 .uncaughtExceptionHandler(handler).build();
207 assertSame(t, factory.newThread(r), "Wrong thread");
208 assertEquals(handler, t.getUncaughtExceptionHandler(), "Wrong exception handler");
209 EasyMock.verify(wrapped, r, handler);
210 }
211
212
213
214
215 @Test
216 void testNewThreadNamingPattern() {
217 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
218 final Runnable r = EasyMock.createMock(Runnable.class);
219 final int count = 12;
220 for (int i = 0; i < count; i++) {
221 EasyMock.expect(wrapped.newThread(r)).andReturn(new Thread());
222 }
223 EasyMock.replay(wrapped, r);
224 final BasicThreadFactory factory = builder.wrappedFactory(wrapped)
225 .namingPattern(PATTERN).build();
226 for (int i = 0; i < count; i++) {
227 final Thread t = factory.newThread(r);
228 assertEquals(String.format(PATTERN, Long.valueOf(i + 1)), t.getName(), "Wrong thread name");
229 assertEquals(i + 1, factory.getThreadCount(), "Wrong thread count");
230 }
231 EasyMock.verify(wrapped, r);
232 }
233
234
235
236
237
238 @Test
239 void testNewThreadNoDaemonFlag() {
240 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
241 final Runnable r1 = EasyMock.createMock(Runnable.class);
242 final Runnable r2 = EasyMock.createMock(Runnable.class);
243 final Thread t1 = new Thread();
244 final Thread t2 = new Thread();
245 t1.setDaemon(true);
246 EasyMock.expect(wrapped.newThread(r1)).andReturn(t1);
247 EasyMock.expect(wrapped.newThread(r2)).andReturn(t2);
248 EasyMock.replay(wrapped, r1, r2);
249 final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
250 assertSame(t1, factory.newThread(r1), "Wrong thread 1");
251 assertTrue(t1.isDaemon(), "No daemon thread");
252 assertSame(t2, factory.newThread(r2), "Wrong thread 2");
253 assertFalse(t2.isDaemon(), "A daemon thread");
254 EasyMock.verify(wrapped, r1, r2);
255 }
256
257
258
259
260
261 @Test
262 void testNewThreadNoExHandler() {
263 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
264 final Runnable r = EasyMock.createMock(Runnable.class);
265 final Thread.UncaughtExceptionHandler handler = EasyMock
266 .createMock(Thread.UncaughtExceptionHandler.class);
267 final Thread t = new Thread();
268 t.setUncaughtExceptionHandler(handler);
269 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
270 EasyMock.replay(wrapped, r, handler);
271 final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
272 assertSame(t, factory.newThread(r), "Wrong thread");
273 assertEquals(handler, t.getUncaughtExceptionHandler(), "Wrong exception handler");
274 EasyMock.verify(wrapped, r, handler);
275 }
276
277
278
279
280
281 @Test
282 void testNewThreadNoNamingPattern() {
283 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
284 final Runnable r = EasyMock.createMock(Runnable.class);
285 final String name = "unchangedThreadName";
286 final Thread t = new Thread(name);
287 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
288 EasyMock.replay(wrapped, r);
289 final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
290 assertSame(t, factory.newThread(r), "Wrong thread");
291 assertEquals(name, t.getName(), "Name was changed");
292 EasyMock.verify(wrapped, r);
293 }
294
295
296
297
298
299 @Test
300 void testNewThreadNoPriority() {
301 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
302 final Runnable r = EasyMock.createMock(Runnable.class);
303 final int orgPriority = Thread.NORM_PRIORITY + 1;
304 final Thread t = new Thread();
305 t.setPriority(orgPriority);
306 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
307 EasyMock.replay(wrapped, r);
308 final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
309 assertSame(t, factory.newThread(r), "Wrong thread");
310 assertEquals(orgPriority, t.getPriority(), "Wrong priority");
311 EasyMock.verify(wrapped, r);
312 }
313
314
315
316
317 @Test
318 void testNewThreadPriority() {
319 final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
320 final Runnable r = EasyMock.createMock(Runnable.class);
321 final Thread t = new Thread();
322 EasyMock.expect(wrapped.newThread(r)).andReturn(t);
323 EasyMock.replay(wrapped, r);
324 final int priority = Thread.NORM_PRIORITY + 1;
325 final BasicThreadFactory factory = builder.wrappedFactory(wrapped).priority(
326 priority).build();
327 assertSame(t, factory.newThread(r), "Wrong thread");
328 assertEquals(priority, t.getPriority(), "Wrong priority");
329 EasyMock.verify(wrapped, r);
330 }
331 }