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 implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.io;
18  
19  import java.io.File;
20  import java.util.Collection;
21  import java.util.Iterator;
22  
23  import org.apache.commons.io.filefilter.FileFilterUtils;
24  import org.apache.commons.io.filefilter.IOFileFilter;
25  import org.apache.commons.io.testtools.FileBasedTestCase;
26  
27  /**
28   * Test cases for FileUtils.listFiles() methods.
29   */
30  public class FileUtilsListFilesTestCase extends FileBasedTestCase {
31  
32      public FileUtilsListFilesTestCase(String name) {
33          super(name);
34      }
35      
36      private File getLocalTestDirectory() {
37          return new File(getTestDirectory(), "list-files");
38      }
39      
40      /**
41       * @see junit.framework.TestCase#setUp()
42       */
43      protected void setUp() throws Exception {
44          File dir = getLocalTestDirectory();
45          if (dir.exists()) {
46              FileUtils.deleteDirectory(dir);
47          }
48          dir.mkdirs();
49          File file = new File(dir, "dummy-build.xml");
50          FileUtils.touch(file);
51          file = new File(dir, "README");
52          FileUtils.touch(file);
53          
54          dir = new File(dir, "subdir1");
55          dir.mkdirs();
56          file = new File(dir, "dummy-build.xml");
57          FileUtils.touch(file);
58          file = new File(dir, "dummy-readme.txt");
59          FileUtils.touch(file);
60          
61          dir = new File(dir, "subsubdir1");
62          dir.mkdirs();
63          file = new File(dir, "dummy-file.txt");
64          FileUtils.touch(file);
65          file = new File(dir, "dummy-index.html");
66          FileUtils.touch(file);
67          
68          dir = dir.getParentFile();
69          dir = new File(dir, "CVS");
70          dir.mkdirs();
71          file = new File(dir, "Entries");
72          FileUtils.touch(file);
73          file = new File(dir, "Repository");
74          FileUtils.touch(file);
75      }
76  
77      /**
78       * @see junit.framework.TestCase#tearDown()
79       */
80      protected void tearDown() throws Exception {
81          File dir = getLocalTestDirectory();
82          FileUtils.deleteDirectory(dir);
83      }
84      
85      private Collection filesToFilenames(Collection files) {
86          Collection filenames = new java.util.ArrayList(files.size());
87          Iterator i = files.iterator();
88          while (i.hasNext()) {
89              filenames.add(((File)i.next()).getName());
90          }
91          return filenames;
92      }
93      
94      public void testListFilesByExtension() throws Exception {
95          String[] extensions = {"xml", "txt"};
96          
97          Collection files = FileUtils.listFiles(getLocalTestDirectory(), extensions, false);
98          assertEquals(1, files.size());
99          Collection filenames = filesToFilenames(files);
100         assertTrue(filenames.contains("dummy-build.xml"));
101         assertFalse(filenames.contains("README"));
102         assertFalse(filenames.contains("dummy-file.txt"));
103         
104         files = FileUtils.listFiles(getLocalTestDirectory(), extensions, true);
105         filenames = filesToFilenames(files);
106         assertEquals(4, filenames.size());
107         assertTrue(filenames.contains("dummy-file.txt"));
108         assertFalse(filenames.contains("dummy-index.html"));
109         
110         files = FileUtils.listFiles(getLocalTestDirectory(), null, false);
111         assertEquals(2, files.size());
112         filenames = filesToFilenames(files);
113         assertTrue(filenames.contains("dummy-build.xml"));
114         assertTrue(filenames.contains("README"));
115         assertFalse(filenames.contains("dummy-file.txt"));
116         
117     }
118 
119     public void testListFiles() throws Exception {
120         Collection files;
121         Collection filenames;
122         IOFileFilter fileFilter;
123         IOFileFilter dirFilter;
124         
125         //First, find non-recursively
126         fileFilter = FileFilterUtils.trueFileFilter();
127         files = FileUtils.listFiles(getLocalTestDirectory(), fileFilter, null);
128         filenames = filesToFilenames(files);
129         assertTrue("'dummy-build.xml' is missing", filenames.contains("dummy-build.xml"));
130         assertFalse("'dummy-index.html' shouldn't be found", filenames.contains("dummy-index.html"));
131         assertFalse("'Entries' shouldn't be found", filenames.contains("Entries"));
132         
133         //Second, find recursively
134         fileFilter = FileFilterUtils.trueFileFilter();
135         dirFilter = FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("CVS"));
136         files = FileUtils.listFiles(getLocalTestDirectory(), fileFilter, dirFilter);
137         filenames = filesToFilenames(files);
138         assertTrue("'dummy-build.xml' is missing", filenames.contains("dummy-build.xml"));
139         assertTrue("'dummy-index.html' is missing", filenames.contains("dummy-index.html"));
140         assertFalse("'Entries' shouldn't be found", filenames.contains("Entries"));
141         
142         //Do the same as above but now with the filter coming from FileFilterUtils
143         fileFilter = FileFilterUtils.trueFileFilter();
144         dirFilter = FileFilterUtils.makeCVSAware(null);
145         files = FileUtils.listFiles(getLocalTestDirectory(), fileFilter, dirFilter);
146         filenames = filesToFilenames(files);
147         assertTrue("'dummy-build.xml' is missing", filenames.contains("dummy-build.xml"));
148         assertTrue("'dummy-index.html' is missing", filenames.contains("dummy-index.html"));
149         assertFalse("'Entries' shouldn't be found", filenames.contains("Entries"));
150 
151         //Again with the CVS filter but now with a non-null parameter
152         fileFilter = FileFilterUtils.trueFileFilter();
153         dirFilter = FileFilterUtils.prefixFileFilter("sub");
154         dirFilter = FileFilterUtils.makeCVSAware(dirFilter);
155         files = FileUtils.listFiles(getLocalTestDirectory(), fileFilter, dirFilter);
156         filenames = filesToFilenames(files);
157         assertTrue("'dummy-build.xml' is missing", filenames.contains("dummy-build.xml"));
158         assertTrue("'dummy-index.html' is missing", filenames.contains("dummy-index.html"));
159         assertFalse("'Entries' shouldn't be found", filenames.contains("Entries"));
160 
161         try {
162             FileUtils.listFiles(getLocalTestDirectory(), null, null);
163             fail("Expected error about null parameter");
164         } catch (Exception e) {
165             //fine
166         }
167     }
168 
169 
170 }