1 19 package org.apache.avalon.excalibur.monitor.test; 20 21 import java.io.File ; 22 import java.io.FileWriter ; 23 import java.io.IOException ; 24 import java.util.Collections ; 25 import java.util.HashSet ; 26 import java.util.Iterator ; 27 import java.util.Set ; 28 29 import junit.framework.TestCase; 30 31 import org.apache.avalon.excalibur.monitor.DirectoryResource; 32 import org.apache.avalon.framework.logger.ConsoleLogger; 33 34 40 public class DirectoryTestCase 41 extends TestCase 42 { 43 public DirectoryTestCase( String name ) 44 { 45 super( name ); 46 } 47 48 public void testDirectoryEvents() 49 throws Exception 50 { 51 final File dir = createDir(); 52 53 try 54 { 55 final Set added1 = new HashSet (); 56 added1.add( "file1.txt" ); 57 added1.add( "file2.txt" ); 58 added1.add( "file3.txt" ); 59 testChanges( added1, 60 Collections.EMPTY_SET, 61 Collections.EMPTY_SET, 62 dir ); 63 64 final Set mods2 = new HashSet (); 65 mods2.add( "file2.txt" ); 66 final Set added2 = new HashSet (); 67 added2.add( "file4.txt" ); 68 testChanges( added2, 69 Collections.EMPTY_SET, 70 mods2, 71 dir ); 72 73 final Set dels = new HashSet (); 74 dels.add( "file2.txt" ); 75 testChanges( Collections.EMPTY_SET, 76 dels, 77 Collections.EMPTY_SET, 78 dir ); 79 } 80 finally 81 { 82 deleteDir( dir ); 83 } 84 } 85 86 public void testDirectoryDelete() 87 throws Exception 88 { 89 final File dir = createDir(); 90 final DirectoryResource resource = 91 new DirectoryResource( dir.getCanonicalPath() ); 92 deleteDir( dir ); 93 try 94 { 95 resource.testModifiedAfter( System.currentTimeMillis() ); 96 } 97 catch( final Exception e ) 98 { 99 fail( "Received exception when dir deleted: " + e ); 100 } 101 } 102 103 private void deleteDir( final File dir ) 104 { 105 final File [] files = dir.listFiles(); 106 for( int i = 0; i < files.length; i++ ) 107 { 108 files[ i ].delete(); 109 } 110 dir.delete(); 111 } 112 113 private File createDir() 114 { 115 final File dir = new File ( "testDir" ); 116 dir.mkdir(); 117 dir.setLastModified( System.currentTimeMillis() ); 118 return dir; 119 } 120 121 private void testChanges( final Set added, 122 final Set removed, 123 final Set modified, 124 final File dir ) 125 throws Exception 126 { 127 final DirectoryResource resource = 128 new DirectoryResource( dir.getCanonicalPath() ); 129 130 final DirectoryTCListener listener = new DirectoryTCListener(); 131 listener.enableLogging( new ConsoleLogger() ); 132 resource.addPropertyChangeListener( listener ); 133 134 final Iterator adds = added.iterator(); 135 while( adds.hasNext() ) 136 { 137 final String add = (String )adds.next(); 138 touchFile( dir, add ); 139 } 140 141 final Iterator mods = modified.iterator(); 142 while( mods.hasNext() ) 143 { 144 final String mod = (String )mods.next(); 145 touchFile( dir, mod ); 146 } 147 148 final Iterator rems = removed.iterator(); 149 while( rems.hasNext() ) 150 { 151 final String rem = (String )rems.next(); 152 deleteFile( dir, rem ); 153 } 154 155 longDelay(); 156 157 resource.testModifiedAfter( System.currentTimeMillis() ); 158 final int changeCount = listener.getChangeCount(); 159 resource.testModifiedAfter( System.currentTimeMillis() + 1 ); 160 testExpected( "Add", added, listener.getAdded() ); 161 testExpected( "Remove", removed, listener.getRemoved() ); 162 testExpected( "Modify", modified, listener.getModified() ); 163 164 assertEquals( "Changes detected. (Should be " + changeCount + 165 " as no changes occured between two tests)", 166 changeCount, 167 listener.getChangeCount() ); 168 listener.reset(); 169 } 170 171 private void testExpected( final String name, 172 final Set expected, 173 final Set actual ) 174 { 175 assertEquals( name + " results count(" + 176 expected + " vs (actual) " + 177 actual, 178 expected.size(), 179 actual.size() ); 180 final Iterator iterator = actual.iterator(); 181 while( iterator.hasNext() ) 182 { 183 final File file = (File )iterator.next(); 184 if( !expected.contains( file.getName() ) ) 185 { 186 fail( "Missing " + file.getName() + 187 " from expected set " + expected ); 188 } 189 } 190 } 191 192 private void touchFile( final File dir, 193 final String filename ) 194 throws IOException 195 { 196 final File file = new File ( dir, filename ); 197 file.createNewFile(); 198 final FileWriter writer = new FileWriter ( file ); 199 writer.write( "Meep!" ); 200 writer.flush(); 201 writer.close(); 202 file.setLastModified( System.currentTimeMillis() ); 203 } 204 205 private void deleteFile( final File dir, 206 final String filename ) 207 { 208 final File file = new File ( dir, filename ); 209 if( !file.delete() ) 210 { 211 fail( "Failed to delete file " + file ); 212 } 213 } 214 215 219 private void longDelay() 220 { 221 delay( 1000 ); 222 } 223 224 private void delay( final int time ) 225 { 226 try 227 { 228 Thread.sleep( time ); } 230 catch( final InterruptedException ie ) 231 { 232 } 234 } 235 } 236 | Popular Tags |