diff --git a/test/build.xml b/test/build.xml
index bb3559148..84cbbdfff 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -28,6 +28,7 @@
+
diff --git a/test/net/sf/briar/plugins/file/UnixRemovableDriveMonitorTest.java b/test/net/sf/briar/plugins/file/UnixRemovableDriveMonitorTest.java
new file mode 100644
index 000000000..b4294b1ad
--- /dev/null
+++ b/test/net/sf/briar/plugins/file/UnixRemovableDriveMonitorTest.java
@@ -0,0 +1,80 @@
+package net.sf.briar.plugins.file;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+import net.sf.briar.TestUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UnixRemovableDriveMonitorTest extends TestCase {
+
+ private final File testDir = TestUtils.getTestDirectory();
+
+ @Before
+ public void setUp() {
+ testDir.mkdirs();
+ }
+
+ @Test
+ public void testNonexistentDir() throws Exception {
+ File doesNotExist = new File(testDir, "doesNotExist");
+ RemovableDriveMonitor monitor = createMonitor(doesNotExist);
+ monitor.start();
+ monitor.stop();
+ }
+
+ @Test
+ public void testOneCallbackPerFile() throws Exception {
+ final CountDownLatch latch = new CountDownLatch(1);
+ final List detected = new ArrayList();
+ // Create a monitor that will wait for two files before stopping
+ new Thread() {
+ @Override
+ public void run() {
+ try {
+ RemovableDriveMonitor monitor = createMonitor(testDir);
+ monitor.start();
+ detected.add(monitor.waitForInsertion());
+ detected.add(monitor.waitForInsertion());
+ monitor.stop();
+ latch.countDown();
+ } catch(IOException e) {
+ fail();
+ }
+ }
+ }.start();
+ // Create two files in the test directory
+ File file1 = new File(testDir, "1");
+ File file2 = new File(testDir, "2");
+ assertTrue(file1.createNewFile());
+ assertTrue(file2.createNewFile());
+ // Wait for the monitor to detect the files
+ latch.await(1, TimeUnit.SECONDS);
+ // Check that both files were detected
+ assertEquals(2, detected.size());
+ assertTrue(detected.contains(file1));
+ assertTrue(detected.contains(file2));
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.deleteTestDirectory(testDir);
+ }
+
+ private RemovableDriveMonitor createMonitor(final File dir) {
+ return new UnixRemovableDriveMonitor() {
+ @Override
+ protected String[] getPathsToWatch() {
+ return new String[] { dir.getPath() };
+ }
+ };
+ }
+}