package org.sef4j.core.helpers.files;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.sef4j.core.MockEventSender;
import org.sef4j.core.api.ioeventchain.InputEventChain.ListenerHandle;
import org.sef4j.core.helpers.ioeventchain.PeriodicTaskInputEventChain;
import org.sef4j.core.helpers.tasks.PeriodicTask;
public class ChangedFileWatchInputEventChainTest {
protected MockEventSender<FileChangeEvent> mockResult = new MockEventSender<FileChangeEvent>();
protected Path watchDirPath = Paths.get("target", "tests", "watchdir1");
protected Path file1Path = watchDirPath.resolve("file1");
protected PeriodicTaskInputEventChain<FileChangeEvent> sut = new PeriodicTaskInputEventChain<FileChangeEvent>("test",
new ChangedFileWatchPollingEventProvider(watchDirPath),
new PeriodicTask.Builder(50, TimeUnit.MILLISECONDS)
);
@Before
public void setup() throws Exception {
if (!Files.exists(watchDirPath)) {
Files.createDirectories(watchDirPath);
}
Files.write(file1Path, "".getBytes());
}
@Test
public void testRegisterEventListener_underlyingSendEvent_unregisterEventListener() throws Exception {
// Prepare
Assert.assertFalse(sut.isStarted());
ListenerHandle<FileChangeEvent> subscr = sut.registerEventListener(mockResult);
Assert.assertTrue(sut.isStarted());
// Perform
Files.write(file1Path, "Hello".getBytes());
Thread.sleep(50); // wait for polling timer in separate thread!!
// Post-check
List<FileChangeEvent> res;
res = mockResult.clearAndGet();
if (res.isEmpty()) {
Thread.sleep(100);
res = mockResult.clearAndGet();
}
// sut.poll(); // useless!..
Assert.assertTrue(res.size() >= 1);
FileChangeEvent event0 = res.get(0);
Assert.assertEquals(StandardWatchEventKinds.ENTRY_MODIFY, event0.getEventKind());
Assert.assertEquals(file1Path.toString(), event0.getFilePath().toString());
sut.unregisterEventListener(subscr);
}
}