package com.bc.util.watch;
import com.bc.util.io.UnitTestDir;
import com.bc.util.io.UnitTestFile;
import junit.framework.TestCase;
import java.io.File;
public class DirectoryWatchTest extends TestCase {
public void testDirectoriesCanBeAdded() {
UnitTestDir dir = new UnitTestDir("somewhere/over/the/rainbow");
assertEquals(0, watch.getNumDirectories());
watch.add(dir);
assertEquals(1, watch.getNumDirectories());
watch.add(null);
assertEquals(1, watch.getNumDirectories());
}
public void testSameDirectoryCannotBeAddedTwice() {
UnitTestDir dir = new UnitTestDir("C:\\Test\\Directory");
assertEquals(0, watch.getNumDirectories());
watch.add(dir);
assertEquals(1, watch.getNumDirectories());
watch.add(dir);
assertEquals(1, watch.getNumDirectories());
}
public void testAddingOtherThanDirectoryFails() {
UnitTestDir dir = new UnitTestDir("C:\\Test\\Directory");
dir.setIsDirectory(false);
try {
watch.add(dir);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
}
public void testRemoveDirectory() {
UnitTestDir dir = new UnitTestDir("/usr/local/popocal");
assertEquals(0, watch.getNumDirectories());
watch.add(dir);
assertEquals(1, watch.getNumDirectories());
watch.remove(dir);
assertEquals(0, watch.getNumDirectories());
}
public void testRemoveDirectoryAlsoRemovesAllFilesContained() {
UnitTestDir dir = new UnitTestDir("F:/drive_c");
UnitTestFile file_1 = createFileInDir(dir, "testi.txt");
UnitTestFile file_2 = createFileInDir(dir, "testomat.txt");
dir.addFile(file_1);
dir.addFile(file_2);
watch.add(dir);
triggerWatchTilFilesAreStable();
File[] content = watch.getDirectoriesContent();
assertEquals(2, content.length);
watch.remove(dir);
content = watch.getDirectoriesContent();
assertEquals(0, content.length);
}
public void testRemoveIllegalDirectories() {
UnitTestDir dir_1 = new UnitTestDir("/usr/muser");
UnitTestDir dir_2 = new UnitTestDir("F:\\ile");
assertEquals(0, watch.getNumDirectories());
watch.add(dir_1);
assertEquals(1, watch.getNumDirectories());
watch.remove(null);
assertEquals(1, watch.getNumDirectories());
watch.remove(dir_2);
assertEquals(1, watch.getNumDirectories());
}
public void testThatFilesAreWatched() {
File list[];
list = watch.getWatchedFiles();
assertEquals(0, list.length);
watch.checkDirectories();
UnitTestDir dir = new UnitTestDir("here");
UnitTestFile file_1 = new UnitTestFile("testi.txt");
UnitTestFile file_2 = new UnitTestFile("nocheiner.txt");
dir.addFile(file_1);
watch.add(dir);
watch.checkDirectories();
list = watch.getWatchedFiles();
assertEquals(1, list.length);
dir.addFile(file_2);
watch.checkDirectories();
list = watch.getWatchedFiles();
assertEquals(2, list.length);
assertEquals(file_1.getPath(), list[0].getPath());
assertEquals(file_2.getPath(), list[1].getPath());
}
public void testListenersCanBeAddedAndRemoved() {
UnitTestDirListener listener_1 = new UnitTestDirListener();
UnitTestDirListener listener_2 = new UnitTestDirListener();
assertEquals(0, watch.getNumListeners());
watch.addListener(listener_1);
assertEquals(1, watch.getNumListeners());
watch.addListener(listener_2);
assertEquals(2, watch.getNumListeners());
watch.removeListener(listener_2);
assertEquals(1, watch.getNumListeners());
watch.removeListener(listener_1);
assertEquals(0, watch.getNumListeners());
}
public void testNullCannotBeUsedAsListener() {
UnitTestDirListener listener = new UnitTestDirListener();
assertEquals(0, watch.getNumListeners());
watch.addListener(null);
assertEquals(0, watch.getNumListeners());
watch.addListener(listener);
assertEquals(1, watch.getNumListeners());
watch.removeListener(null);
assertEquals(1, watch.getNumListeners());
}
public void testSameListenerCannotAttachOrRemoveTwice() {
UnitTestDirListener listener_1 = new UnitTestDirListener();
UnitTestDirListener listener_2 = new UnitTestDirListener();
watch.addListener(listener_1);
watch.addListener(listener_2);
assertEquals(2, watch.getNumListeners());
watch.addListener(listener_2);
assertEquals(2, watch.getNumListeners());
watch.removeListener(listener_2);
assertEquals(1, watch.getNumListeners());
watch.removeListener(listener_2);
assertEquals(1, watch.getNumListeners());
}
public void testWatchedFileThatDoNotChangeAnymoreNotifyListeners() {
UnitTestDir dir = new UnitTestDir("here");
UnitTestFile file_1 = new UnitTestFile("testi.txt");
File list[];
UnitTestDirListener listener = new UnitTestDirListener();
dir.addFile(file_1);
watch.add(dir);
watch.addListener(listener);
watch.checkDirectories();
list = watch.getWatchedFiles();
assertEquals(1, list.length);
watch.checkDirectories();
watch.checkDirectories();
assertEquals(1, listener.getNumAddedFiles());
}
/**
* @noinspection MagicNumber
*/
public void testNewFilesWithChangingLengthDoNotTriggerNotifies() {
UnitTestDir dir = new UnitTestDir("here");
UnitTestFile file = new UnitTestFile("testi.txt");
File list[];
UnitTestDirListener listener = new UnitTestDirListener();
dir.addFile(file);
watch.add(dir);
watch.addListener(listener);
watch.checkDirectories();
list = watch.getWatchedFiles();
assertEquals(1, list.length);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
file.setLength(file.length() + 108);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
file.setLength(file.length() + 108);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
// notify when file is stable after third iteration after the last change
watch.checkDirectories();
assertEquals(1, listener.getNumAddedFiles());
}
/**
* @noinspection MagicNumber
*/
public void testNewFilesWithChangingMofdificationDateDoNotTriggerNotifies() {
UnitTestDir dir = new UnitTestDir("here");
UnitTestFile file = new UnitTestFile("testi.txt");
File list[];
UnitTestDirListener listener = new UnitTestDirListener();
dir.addFile(file);
watch.add(dir);
watch.addListener(listener);
watch.checkDirectories();
list = watch.getWatchedFiles();
assertEquals(1, list.length);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
file.setLastModified(file.lastModified() + 12);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
file.setLastModified(file.lastModified() + 34);
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
watch.checkDirectories();
assertEquals(0, listener.getNumAddedFiles());
// notify when file is stable after third iteration after the last change
watch.checkDirectories();
assertEquals(1, listener.getNumAddedFiles());
}
public void testStableFilesAreWatchedInDirectoriesContent() {
UnitTestDir dir_1 = new UnitTestDir("here");
UnitTestFile file_1 = new UnitTestFile("testi.txt");
UnitTestDir dir_2 = new UnitTestDir("there");
UnitTestFile file_2 = new UnitTestFile("testi.tom");
dir_1.addFile(file_1);
dir_2.addFile(file_2);
watch.add(dir_1);
watch.add(dir_2);
triggerWatchTilFilesAreStable();
File content[] = watch.getDirectoriesContent();
assertNotNull(content);
assertEquals(2, content.length);
assertEquals(file_1.getPath(), content[0].getPath());
assertEquals(file_2.getPath(), content[1].getPath());
}
public void testListenersAreNotifiedOnlyOnceOnAddedFiles() {
UnitTestDirListener listener = new UnitTestDirListener();
UnitTestDir dir = new UnitTestDir("C:(nasenmann");
UnitTestFile file = new UnitTestFile("whatafile.txt");
dir.addFile(file);
watch.addListener(listener);
watch.add(dir);
triggerWatchTilFilesAreStable();
watch.checkDirectories();
watch.checkDirectories();
assertEquals(1, listener.getNumAddedFiles());
}
public void testListenersAreNotifiedOnRemovedFiles() {
UnitTestDirListener listener = new UnitTestDirListener();
UnitTestDir dir_1 = new UnitTestDir("here");
UnitTestFile file_1 = new UnitTestFile("testi.txt");
UnitTestDir dir_2 = new UnitTestDir("there");
UnitTestFile file_2 = new UnitTestFile("testi.tom");
dir_1.addFile(file_1);
dir_2.addFile(file_2);
watch.add(dir_1);
watch.add(dir_2);
watch.addListener(listener);
triggerWatchTilFilesAreStable();
file_2.setExists(false);
watch.checkDirectories();
assertEquals(1, listener.getNumRemovedFiles());
watch.checkDirectories();
assertEquals(0, listener.getNumRemovedFiles());
}
/**
* @noinspection MagicNumber
*/
public void testTimerIsWorking() {
UnitTestDirListener listener = new UnitTestDirListener();
UnitTestDir dir = new UnitTestDir("here/it/is");
UnitTestFile file_1 = new UnitTestFile("testomat.txt");
UnitTestFile file_2 = new UnitTestFile("junitstuff.txt");
dir.addFile(file_1);
watch.add(dir);
watch.addListener(listener);
watch.start(50);
dir.addFile(file_2);
try {
Thread.sleep(200);
} catch (InterruptedException ignore) {
}
assertEquals(2, listener.getNumAddedFiles());
watch.stop();
}
/**
* @noinspection MagicNumber
*/
public void testWatchDoesNotFailWhenStoppedTwice() {
watch.start(50);
watch.stop();
watch.stop();
}
///////////////////////////////////////////////////////////////////////////
/////// END OF PUBLIC
///////////////////////////////////////////////////////////////////////////
private DirectoryWatch watch;
protected void setUp() {
watch = new DirectoryWatch();
}
private void triggerWatchTilFilesAreStable() {
watch.checkDirectories();
watch.checkDirectories();
watch.checkDirectories();
}
private UnitTestFile createFileInDir(UnitTestDir dir, String fileName) {
final UnitTestFile file = new UnitTestFile(dir, fileName);
dir.addFile(file);
return file;
}
}