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
51
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
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 }