View Javadoc
1   package org.junit.tests.experimental.rules;
2   
3   import static org.hamcrest.CoreMatchers.hasItem;
4   import static org.hamcrest.core.IsNot.not;
5   import static org.junit.Assert.assertFalse;
6   import static org.junit.Assert.assertThat;
7   import static org.junit.Assert.assertTrue;
8   import static org.junit.experimental.results.PrintableResult.testResult;
9   import static org.junit.experimental.results.ResultMatchers.failureCountIs;
10  import static org.junit.experimental.results.ResultMatchers.isSuccessful;
11  
12  import java.io.File;
13  import java.io.IOException;
14  import java.lang.reflect.Method;
15  import java.util.Arrays;
16  
17  import org.junit.After;
18  import org.junit.Rule;
19  import org.junit.Test;
20  import org.junit.rules.TemporaryFolder;
21  
22  public class TempFolderRuleTest {
23      private static File[] createdFiles = new File[20];
24  
25      public static class HasTempFolder {
26          @Rule
27          public TemporaryFolder folder = new TemporaryFolder();
28  
29          @Test
30          public void testUsingTempFolder() throws IOException {
31              createdFiles[0] = folder.newFile("myfile.txt");
32              assertTrue(createdFiles[0].exists());
33          }
34      }
35  
36      @Test
37      public void tempFolderIsDeleted() {
38          assertThat(testResult(HasTempFolder.class), isSuccessful());
39          assertFalse(createdFiles[0].exists());
40      }
41  
42      public static class CreatesSubFolder {
43          @Rule
44          public TemporaryFolder folder = new TemporaryFolder();
45  
46          @Test
47          public void testUsingTempFolderStringReflection() throws Exception {
48              String subfolder = "subfolder";
49              String filename = "a.txt";
50              // force usage of folder.newFolder(String),
51              // check is available and works, to avoid a potential NoSuchMethodError with non-recompiled code.
52              Method method = folder.getClass().getMethod("newFolder", new Class<?>[]{String.class});
53              createdFiles[0] = (File) method.invoke(folder, subfolder);
54              new File(createdFiles[0], filename).createNewFile();
55  
56              File expectedFile = new File(folder.getRoot(), join(subfolder, filename));
57  
58              assertTrue(expectedFile.exists());
59          }
60  
61          @Test
62          public void testUsingTempFolderString() throws IOException {
63              String subfolder = "subfolder";
64              String filename = "a.txt";
65              // this uses newFolder(String), ensure that a single String works
66              createdFiles[0] = folder.newFolder(subfolder);
67              new File(createdFiles[0], filename).createNewFile();
68  
69              File expectedFile = new File(folder.getRoot(), join(subfolder, filename));
70  
71              assertTrue(expectedFile.exists());
72          }
73  
74          @Test
75          public void testUsingTempTreeFolders() throws IOException {
76              String subfolder = "subfolder";
77              String anotherfolder = "anotherfolder";
78              String filename = "a.txt";
79  
80              createdFiles[0] = folder.newFolder(subfolder, anotherfolder);
81              new File(createdFiles[0], filename).createNewFile();
82  
83              File expectedFile = new File(folder.getRoot(), join(subfolder, anotherfolder, filename));
84  
85              assertTrue(expectedFile.exists());
86          }
87  
88          private String join(String... folderNames) {
89              StringBuilder path = new StringBuilder();
90              for (String folderName : folderNames) {
91                  path.append(File.separator).append(folderName);
92              }
93              return path.toString();
94          }
95      }
96  
97      @Test
98      public void subFolderIsDeleted() {
99          assertThat(testResult(CreatesSubFolder.class), isSuccessful());
100         assertFalse(createdFiles[0].exists());
101     }
102 
103     public static class CreatesRandomSubFolders {
104         @Rule
105         public TemporaryFolder folder = new TemporaryFolder();
106 
107         @Test
108         public void testUsingRandomTempFolders() throws IOException {
109             for (int i = 0; i < 20; i++) {
110                 File newFolder = folder.newFolder();
111                 assertThat(Arrays.asList(createdFiles), not(hasItem(newFolder)));
112                 createdFiles[i] = newFolder;
113                 new File(newFolder, "a.txt").createNewFile();
114                 assertTrue(newFolder.exists());
115             }
116         }
117     }
118 
119     @Test
120     public void randomSubFoldersAreDeleted() {
121         assertThat(testResult(CreatesRandomSubFolders.class), isSuccessful());
122         for (File f : createdFiles) {
123             assertFalse(f.exists());
124         }
125     }
126 
127     public static class CreatesRandomFiles {
128         @Rule
129         public TemporaryFolder folder = new TemporaryFolder();
130 
131         @Test
132         public void testUsingRandomTempFiles() throws IOException {
133             for (int i = 0; i < 20; i++) {
134                 File newFile = folder.newFile();
135                 assertThat(Arrays.asList(createdFiles), not(hasItem(newFile)));
136                 createdFiles[i] = newFile;
137                 assertTrue(newFile.exists());
138             }
139         }
140     }
141 
142     @Test
143     public void randomFilesAreDeleted() {
144         assertThat(testResult(CreatesRandomFiles.class), isSuccessful());
145         for (File f : createdFiles) {
146             assertFalse(f.exists());
147         }
148     }
149 
150     @Test
151     public void recursiveDeleteFolderWithOneElement() throws IOException {
152         TemporaryFolder folder = new TemporaryFolder();
153         folder.create();
154         File file = folder.newFile("a");
155         folder.delete();
156         assertFalse(file.exists());
157         assertFalse(folder.getRoot().exists());
158     }
159 
160     @Test
161     public void recursiveDeleteFolderWithOneRandomElement() throws IOException {
162         TemporaryFolder folder = new TemporaryFolder();
163         folder.create();
164         File file = folder.newFile();
165         folder.delete();
166         assertFalse(file.exists());
167         assertFalse(folder.getRoot().exists());
168     }
169 
170     @Test
171     public void recursiveDeleteFolderWithZeroElements() throws IOException {
172         TemporaryFolder folder = new TemporaryFolder();
173         folder.create();
174         folder.delete();
175         assertFalse(folder.getRoot().exists());
176     }
177 
178     public static class NameClashes {
179         @Rule
180         public TemporaryFolder folder = new TemporaryFolder();
181 
182         @Test
183         public void fileWithFileClash() throws IOException {
184             folder.newFile("something.txt");
185             folder.newFile("something.txt");
186         }
187 
188         @Test
189         public void fileWithFolderTest() throws IOException {
190             folder.newFolder("dummy");
191             folder.newFile("dummy");
192         }
193     }
194 
195     @Test
196     public void nameClashesResultInTestFailures() {
197         assertThat(testResult(NameClashes.class), failureCountIs(2));
198     }
199 
200     private static final String GET_ROOT_DUMMY = "dummy-getRoot";
201 
202     private static final String NEW_FILE_DUMMY = "dummy-newFile";
203 
204     private static final String NEW_FOLDER_DUMMY = "dummy-newFolder";
205 
206     public static class IncorrectUsage {
207         public TemporaryFolder folder = new TemporaryFolder();
208 
209         @Test
210         public void testGetRoot() throws IOException {
211             new File(folder.getRoot(), GET_ROOT_DUMMY).createNewFile();
212         }
213 
214         @Test
215         public void testNewFile() throws IOException {
216             folder.newFile(NEW_FILE_DUMMY);
217         }
218 
219         @Test
220         public void testNewFolder() throws IOException {
221             folder.newFolder(NEW_FOLDER_DUMMY);
222         }
223     }
224 
225     @Test
226     public void incorrectUsageWithoutApplyingTheRuleShouldNotPolluteTheCurrentWorkingDirectory() {
227         assertThat(testResult(IncorrectUsage.class), failureCountIs(3));
228         assertFalse("getRoot should have failed early", new File(GET_ROOT_DUMMY).exists());
229         assertFalse("newFile should have failed early", new File(NEW_FILE_DUMMY).exists());
230         assertFalse("newFolder should have failed early", new File(NEW_FOLDER_DUMMY).exists());
231     }
232 
233     @After
234     public void cleanCurrentWorkingDirectory() {
235         new File(GET_ROOT_DUMMY).delete();
236         new File(NEW_FILE_DUMMY).delete();
237         new File(NEW_FOLDER_DUMMY).delete();
238     }
239 }