package org.hotswap.agent.watch.nio; import org.hotswap.agent.annotation.FileEvent; import org.hotswap.agent.watch.WatchFileEvent; import org.hotswap.agent.watch.WatchEventListener; import org.hotswap.agent.watch.Watcher; import org.hotswap.agent.watch.WatcherFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import static junit.framework.Assert.assertEquals; import static junit.framework.TestCase.assertTrue; /** * Created by bubnik on 2.11.13. */ public class WatcherNIO2Test { Watcher watcher; Path temp; @Before public void setup() throws IOException { watcher = new WatcherFactory().getWatcher(); temp = Files.createTempDirectory("watcherNIO2Test"); watcher.run(); } @After public void tearDown() { watcher.run(); } @Test public void createFile() throws IOException { final ResultHolder resultHolder = new ResultHolder(); watcher.addEventListener(null, temp.toUri(), new WatchEventListener() { @Override public void onEvent(WatchFileEvent event) { assertEquals("New file event type", FileEvent.CREATE, event.getEventType()); assertTrue("File name", event.getURI().toString().endsWith("test.class")); resultHolder.result = true; } }); File testFile = new File(temp.toFile(), "test.class"); testFile.createNewFile(); assertTrue("Event listener called", waitForResult(resultHolder)); } // ensure it works on file:/ URIs as returned by classloader //@Test public void testTargetClasses() throws Exception { URI uri = new URI("file:/" + temp); final ResultHolder resultHolder = new ResultHolder(); watcher.addEventListener(null, uri, new WatchEventListener() { @Override public void onEvent(WatchFileEvent event) { assertTrue("File name", event.getURI().toString().endsWith("test.class")); resultHolder.result = true; } }); File testFile = new File(uri.toURL().getFile(), "test.class"); testFile.createNewFile(); assertTrue("Event listener not called", waitForResult(resultHolder)); testFile.delete(); } // On Mac OS X, 10.9.4, this would fail for under 10 seconds, succeeded with 10 seconds. I didn't look // into it further. // each 10 ms check if result is true, max 10000 ms private boolean waitForResult(ResultHolder resultHolder) { for (int i = 0; i < 1000; i++) { if (resultHolder.result) return true; // waitForResult for NIO thread try { Thread.sleep(10); } catch (InterruptedException e) { } } return false; } private static class ResultHolder { boolean result = false; } }