1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.io.input;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21
22 import java.nio.file.Files;
23 import java.nio.file.Path;
24 import java.util.concurrent.CompletableFuture;
25 import java.util.concurrent.ExecutorService;
26 import java.util.concurrent.Executors;
27 import java.util.concurrent.TimeUnit;
28
29 import org.junit.jupiter.api.AfterEach;
30 import org.junit.jupiter.api.Test;
31 import org.junit.jupiter.api.condition.DisabledOnOs;
32 import org.junit.jupiter.api.condition.OS;
33
34
35
36
37 public class TailerCloseTest {
38
39 private class TailerTestListener extends TailerListenerAdapter {
40
41 @Override
42 public void handle(final Exception ex) {
43 super.handle(ex);
44 result.completeExceptionally(ex);
45 }
46
47 @Override
48 public void handle(final String line) {
49 super.handle(line);
50 result.complete(line);
51 }
52 }
53
54 private static Thread newDaemonThread(final Runnable runnable) {
55 final Thread thread = new Thread(runnable, "commons-io-tailer");
56 thread.setDaemon(true);
57 return thread;
58 }
59
60 private ExecutorService executorService;
61 private Path path;
62 private final CompletableFuture<String> result = new CompletableFuture<>();
63
64 @AfterEach
65 public void tearDown() throws Exception {
66
67 if (executorService != null) {
68 executorService.shutdown();
69 executorService.awaitTermination(60, TimeUnit.SECONDS);
70 }
71 if (path != null && Files.exists(path)) {
72 Files.delete(path);
73 }
74 }
75
76 @DisabledOnOs(value = OS.WINDOWS)
77 @Test
78 public void testCloseTailer() throws Exception {
79 path = Files.createTempFile("TailerTestFile", ".log");
80
81 executorService = Executors.newSingleThreadExecutor(TailerCloseTest::newDaemonThread);
82 try (
83
84 Tailer tailer = Tailer
85 .builder()
86 .setExecutorService(executorService)
87 .setTailerListener(new TailerTestListener())
88 .setFile(path.toFile())
89 .get()) {
90
91 Files.write(path, "aaa\n".getBytes());
92
93 assertEquals("aaa", result.get(60, TimeUnit.SECONDS));
94 }
95
96 Files.delete(path);
97 }
98 }