KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > avalon > excalibur > monitor > test > DirectoryTestCase


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14  * implied.
15  *
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */

19 package org.apache.avalon.excalibur.monitor.test;
20
21 import java.io.File JavaDoc;
22 import java.io.FileWriter JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.util.Collections JavaDoc;
25 import java.util.HashSet JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.Set JavaDoc;
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 /**
35  * Junit TestCase for the directory resource.
36  *
37  * @author <a HREF="mailto:dev@avalon.apache.org">Avalon Development Team</a>
38  * @version $Id: DirectoryTestCase.java,v 1.6 2004/02/28 11:47:16 cziegeler Exp $
39  */

40 public class DirectoryTestCase
41     extends TestCase
42 {
43     public DirectoryTestCase( String JavaDoc name )
44     {
45         super( name );
46     }
47
48     public void testDirectoryEvents()
49         throws Exception JavaDoc
50     {
51         final File JavaDoc dir = createDir();
52
53         try
54         {
55             final Set JavaDoc added1 = new HashSet JavaDoc();
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 JavaDoc mods2 = new HashSet JavaDoc();
65             mods2.add( "file2.txt" );
66             final Set JavaDoc added2 = new HashSet JavaDoc();
67             added2.add( "file4.txt" );
68             testChanges( added2,
69                          Collections.EMPTY_SET,
70                          mods2,
71                          dir );
72
73             final Set JavaDoc dels = new HashSet JavaDoc();
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 JavaDoc
88     {
89         final File JavaDoc 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 JavaDoc e )
98         {
99             fail( "Received exception when dir deleted: " + e );
100         }
101     }
102
103     private void deleteDir( final File JavaDoc dir )
104     {
105         final File JavaDoc[] 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 JavaDoc createDir()
114     {
115         final File JavaDoc dir = new File JavaDoc( "testDir" );
116         dir.mkdir();
117         dir.setLastModified( System.currentTimeMillis() );
118         return dir;
119     }
120
121     private void testChanges( final Set JavaDoc added,
122                               final Set JavaDoc removed,
123                               final Set JavaDoc modified,
124                               final File JavaDoc dir )
125         throws Exception JavaDoc
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 JavaDoc adds = added.iterator();
135         while( adds.hasNext() )
136         {
137             final String JavaDoc add = (String JavaDoc)adds.next();
138             touchFile( dir, add );
139         }
140
141         final Iterator JavaDoc mods = modified.iterator();
142         while( mods.hasNext() )
143         {
144             final String JavaDoc mod = (String JavaDoc)mods.next();
145             touchFile( dir, mod );
146         }
147
148         final Iterator JavaDoc rems = removed.iterator();
149         while( rems.hasNext() )
150         {
151             final String JavaDoc rem = (String JavaDoc)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 JavaDoc name,
172                                final Set JavaDoc expected,
173                                final Set JavaDoc actual )
174     {
175         assertEquals( name + " results count(" +
176                       expected + " vs (actual) " +
177                       actual,
178                       expected.size(),
179                       actual.size() );
180         final Iterator JavaDoc iterator = actual.iterator();
181         while( iterator.hasNext() )
182         {
183             final File JavaDoc file = (File JavaDoc)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 JavaDoc dir,
193                             final String JavaDoc filename )
194         throws IOException JavaDoc
195     {
196         final File JavaDoc file = new File JavaDoc( dir, filename );
197         file.createNewFile();
198         final FileWriter JavaDoc writer = new FileWriter JavaDoc( file );
199         writer.write( "Meep!" );
200         writer.flush();
201         writer.close();
202         file.setLastModified( System.currentTimeMillis() );
203     }
204
205     private void deleteFile( final File JavaDoc dir,
206                              final String JavaDoc filename )
207     {
208         final File JavaDoc file = new File JavaDoc( dir, filename );
209         if( !file.delete() )
210         {
211             fail( "Failed to delete file " + file );
212         }
213     }
214
215     /**
216      * Some filesystems are not sensitive enough so you need
217      * to delay for a long enough period of time (ie 1 second).
218      */

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 ); // sleep 10 millis at a time
229
}
230         catch( final InterruptedException JavaDoc ie )
231         {
232             // ignore and keep waiting
233
}
234     }
235 }
236
Popular Tags