1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2;
18
19 import static org.junit.Assert.assertArrayEquals;
20
21 import java.io.ByteArrayOutputStream;
22 import java.io.InputStream;
23 import java.lang.reflect.InvocationTargetException;
24 import java.lang.reflect.Method;
25 import java.net.URLConnection;
26 import java.nio.charset.StandardCharsets;
27
28 import org.apache.commons.vfs2.impl.DefaultFileSystemManager;
29 import org.apache.commons.vfs2.provider.AbstractFileSystem;
30 import org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider;
31 import org.junit.Assert;
32
33 import junit.framework.Test;
34 import junit.framework.TestCase;
35
36
37
38
39
40
41 public abstract class AbstractProviderTestCase extends AbstractVfsTestCase {
42
43 public static final String FILE1_CONTENT = "This is a test file.";
44
45 public static final String TEST_FILE_CONTENT = "A test file.";
46 protected static Test notConfigured(final Class<?> testClass) {
47 return warning(testClass + " is not configured for tests, skipping");
48 }
49 private static Test warning(final String message) {
50 return new TestCase("warning") {
51 @Override
52 protected void runTest() {
53 System.out.println(message);
54 }
55 };
56 }
57 private FileObject baseFolder;
58 private FileObject readFolder;
59 private FileObject writeFolder;
60
61 private DefaultFileSystemManager manager;
62
63 private ProviderTestConfig providerConfig;
64
65 private Method method;
66
67 private boolean addEmptyDir;
68
69 protected void addEmptyDir(final boolean addEmptyDir) {
70 this.addEmptyDir = addEmptyDir;
71 }
72
73
74
75
76
77
78 protected void assertSameContent(final String expected, final FileObject file) throws Exception {
79
80 assertTrue(file.exists());
81 assertSame(FileType.FILE, file.getType());
82 assertTrue(file.isFile());
83
84
85 final byte[] expectedBin = expected.getBytes(StandardCharsets.UTF_8);
86
87
88 final FileContent content = file.getContent();
89 assertEquals("same content length", expectedBin.length, content.getSize());
90
91
92 final InputStream instr = content.getInputStream();
93 final ByteArrayOutputStream outstr;
94 try {
95 outstr = new ByteArrayOutputStream(expectedBin.length);
96 final byte[] buffer = new byte[256];
97 int nread = 0;
98 while (nread >= 0) {
99 outstr.write(buffer, 0, nread);
100 nread = instr.read(buffer);
101 }
102 } finally {
103 instr.close();
104 }
105
106
107 assertArrayEquals("same binary content", expectedBin, outstr.toByteArray());
108 }
109
110
111
112
113
114
115 protected void assertSameURLContent(final String expected, final URLConnection connection) throws Exception {
116
117 final byte[] expectedBin = expected.getBytes(StandardCharsets.UTF_8);
118
119
120 assertEquals("same content length", expectedBin.length, connection.getContentLength());
121
122
123 final InputStream instr = connection.getInputStream();
124 final ByteArrayOutputStream outstr;
125 try {
126 outstr = new ByteArrayOutputStream();
127 final byte[] buffer = new byte[256];
128 int nread = 0;
129 while (nread >= 0) {
130 outstr.write(buffer, 0, nread);
131 nread = instr.read(buffer);
132 }
133 } finally {
134 instr.close();
135 }
136
137
138 assertArrayEquals("same binary content", expectedBin, outstr.toByteArray());
139 }
140
141
142
143
144
145
146 protected FileInfo buildExpectedStructure() throws FileSystemException {
147
148 final FileInfoInfo.html#FileInfo">FileInfo base = new FileInfo(getReadFolder().getName().getBaseName(), FileType.FOLDER);
149 base.addFile("file1.txt", FILE1_CONTENT);
150
151 base.addFile("file%25.txt", FILE1_CONTENT);
152
153
154
155
156
157
158
159
160
161
162
163 base.addFile("file space.txt", FILE1_CONTENT);
164
165 base.addFile("empty.txt", "");
166 if (addEmptyDir) {
167 base.addFolder("emptydir");
168 }
169
170 final FileInfo dir = base.addFolder("dir1");
171 dir.addFile("file1.txt", TEST_FILE_CONTENT);
172 dir.addFile("file2.txt", TEST_FILE_CONTENT);
173 dir.addFile("file3.txt", TEST_FILE_CONTENT);
174
175 final FileInfo subdir1 = dir.addFolder("subdir1");
176 subdir1.addFile("file1.txt", TEST_FILE_CONTENT);
177 subdir1.addFile("file2.txt", TEST_FILE_CONTENT);
178 subdir1.addFile("file3.txt", TEST_FILE_CONTENT);
179
180 final FileInfo subdir2 = dir.addFolder("subdir2");
181 subdir2.addFile("file1.txt", TEST_FILE_CONTENT);
182 subdir2.addFile("file2.txt", TEST_FILE_CONTENT);
183 subdir2.addFile("file3.txt", TEST_FILE_CONTENT);
184
185 final FileInfo subdir3 = dir.addFolder("subdir3");
186 subdir3.addFile("file1.txt", TEST_FILE_CONTENT);
187 subdir3.addFile("file2.txt", TEST_FILE_CONTENT);
188 subdir3.addFile("file3.txt", TEST_FILE_CONTENT);
189
190 final FileInfo subdir4 = dir.addFolder("subdir4.jar");
191 subdir4.addFile("file1.txt", TEST_FILE_CONTENT);
192 subdir4.addFile("file2.txt", TEST_FILE_CONTENT);
193 subdir4.addFile("file3.txt", TEST_FILE_CONTENT);
194
195 return base;
196 }
197
198
199
200
201
202
203 protected DefaultFileSystemManager createManager() throws Exception {
204 final DefaultFileSystemManager fs = getProviderConfig().getDefaultFileSystemManager();
205 fs.setFilesCache(getProviderConfig().getFilesCache());
206 getProviderConfig().prepare(fs);
207 if (!fs.hasProvider("file")) {
208 fs.addProvider("file", new DefaultLocalFileProvider());
209 }
210 return fs;
211 }
212
213
214
215
216 public FileObject getBaseFolder() {
217 return baseFolder;
218 }
219
220
221
222
223
224 public FileObject getBaseTestFolder(final FileSystemManager fs) throws Exception {
225 return providerConfig.getBaseTestFolder(fs);
226 }
227
228 protected FileSystem getFileSystem() {
229 final FileObject rFolder = getReadFolder();
230 Assert.assertNotNull("This test's read folder should not be null", rFolder);
231 return rFolder.getFileSystem();
232 }
233
234
235
236
237 protected DefaultFileSystemManager getManager() {
238 return manager;
239 }
240
241
242
243
244 public ProviderTestConfig getProviderConfig() {
245 return providerConfig;
246 }
247
248
249
250
251 protected FileObject getReadFolder() {
252 return readFolder;
253 }
254
255
256
257
258
259
260
261 protected Capability[] getRequiredCapabilities() {
262 return null;
263 }
264
265
266
267
268 protected FileObject getWriteFolder() {
269 return writeFolder;
270 }
271
272
273
274
275
276
277
278
279
280
281
282 @Override
283 protected void runTest() throws Throwable {
284
285 final Capability[] caps = getRequiredCapabilities();
286 if (caps != null) {
287 for (final Capability cap2 : caps) {
288 final Capability cap = cap2;
289 final FileSystem fs = getFileSystem();
290 if (!fs.hasCapability(cap)) {
291
292
293
294
295
296 return;
297 }
298 }
299 }
300
301
302 if (method != null) {
303 try {
304 method.invoke(this, (Object[]) null);
305 } catch (final InvocationTargetException e) {
306 throw e.getTargetException();
307 }
308 } else {
309 super.runTest();
310 }
311
312 if (readFolder != null && ((AbstractFileSystem) readFolder.getFileSystem()).isOpen()) {
313 String name = "unknown";
314 if (method != null) {
315 name = method.getName();
316 }
317
318 throw new IllegalStateException(getClass().getName() + ": filesystem has open streams after: " + name);
319 }
320 }
321
322
323
324
325 public void setConfig(final DefaultFileSystemManager manager, final ProviderTestConfig providerConfig,
326 final FileObject baseFolder, final FileObject readFolder, final FileObject writeFolder) {
327 this.manager = manager;
328 this.providerConfig = providerConfig;
329 this.baseFolder = baseFolder;
330 this.readFolder = readFolder;
331 this.writeFolder = writeFolder;
332 assertNotNull("setConfig manager", manager);
333 assertNotNull("setConfig providerConfig", providerConfig);
334 assertNotNull("setConfig baseFolder", baseFolder);
335 assertNotNull("setConfig readFolder", readFolder);
336 assertNotNull("setConfig writeFolder", writeFolder);
337 }
338
339
340
341
342 public void setMethod(final Method method) {
343 this.method = method;
344 }
345
346
347
348
349
350
351 protected void setWriteFolder(final FileObject folder) {
352 writeFolder = folder;
353 }
354
355 @Override
356 public String toString() {
357 return "AbstractProviderTestCase [baseFolder=" + baseFolder + ", readFolder=" + readFolder + ", writeFolder="
358 + writeFolder + ", manager=" + manager + ", providerConfig=" + providerConfig + ", method=" + method
359 + ", addEmptyDir=" + addEmptyDir + "]";
360 }
361 }