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.jupiter.api.Assertions.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 junit.framework.TestCase;
29
30 import org.apache.commons.io.IOUtils;
31 import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
32 import org.apache.commons.vfs2.impl.DefaultFileSystemManager;
33 import org.apache.commons.vfs2.provider.AbstractFileSystem;
34 import org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider;
35
36
37
38
39
40
41
42
43
44
45 public abstract class AbstractProviderTestCase extends TestCase {
46
47
48 public static final String FILE1_CONTENT = "This is a test file.";
49
50 public static final String TEST_FILE_CONTENT = "A test file.";
51
52 private boolean addEmptyDir;
53 private FileObject baseFolder;
54 private DefaultFileSystemManager manager;
55 private Method method;
56 private ProviderTestConfig providerConfig;
57 private FileObject readFolder;
58 private FileObject writeFolder;
59
60 protected void addEmptyDir(final boolean addEmptyDir) {
61 this.addEmptyDir = addEmptyDir;
62 }
63
64
65
66
67
68
69 protected void assertSameContent(final String expected, final FileObject fileObject) throws Exception {
70
71 assertTrue(fileObject.exists());
72 assertSame(FileType.FILE, fileObject.getType());
73 assertTrue(fileObject.isFile());
74
75 final byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8);
76
77 final FileContent content = fileObject.getContent();
78 assertEquals("same content length", expectedBytes.length, content.getSize());
79
80 try (InputStream in = content.getInputStream()) {
81 assertTrue(IOUtils.contentEquals(UnsynchronizedByteArrayInputStream.builder().setByteArray(expectedBytes).get(), in));
82 }
83 }
84
85
86
87
88
89
90 protected void assertSameURLContent(final String expected, final URLConnection urlConnection) throws Exception {
91
92 final byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8);
93
94 assertEquals("same content length", expectedBytes.length, urlConnection.getContentLength());
95
96 try (InputStream in = urlConnection.getInputStream()) {
97 assertTrue(IOUtils.contentEquals(UnsynchronizedByteArrayInputStream.builder().setByteArray(expectedBytes).get(), in));
98 }
99 }
100
101
102
103
104
105
106 protected FileInfo buildExpectedStructure() throws FileSystemException {
107
108 final FileInfo base = new FileInfo(getReadFolder().getName().getBaseName(), FileType.FOLDER);
109 base.addFile("file1.txt", FILE1_CONTENT);
110
111 base.addFile("file%25.txt", FILE1_CONTENT);
112
113
114
115
116
117
118
119
120
121
122
123 base.addFile("file space.txt", FILE1_CONTENT);
124
125 base.addFile("empty.txt", "");
126 if (addEmptyDir) {
127 base.addFolder("emptydir");
128 }
129
130 final FileInfo dir = base.addFolder("dir1");
131 dir.addFile("file1.txt", TEST_FILE_CONTENT);
132 dir.addFile("file2.txt", TEST_FILE_CONTENT);
133 dir.addFile("file3.txt", TEST_FILE_CONTENT);
134
135 final FileInfo subdir1 = dir.addFolder("subdir1");
136 subdir1.addFile("file1.txt", TEST_FILE_CONTENT);
137 subdir1.addFile("file2.txt", TEST_FILE_CONTENT);
138 subdir1.addFile("file3.txt", TEST_FILE_CONTENT);
139
140 final FileInfo subdir2 = dir.addFolder("subdir2");
141 subdir2.addFile("file1.txt", TEST_FILE_CONTENT);
142 subdir2.addFile("file2.txt", TEST_FILE_CONTENT);
143 subdir2.addFile("file3.txt", TEST_FILE_CONTENT);
144
145 final FileInfo subdir3 = dir.addFolder("subdir3");
146 subdir3.addFile("file1.txt", TEST_FILE_CONTENT);
147 subdir3.addFile("file2.txt", TEST_FILE_CONTENT);
148 subdir3.addFile("file3.txt", TEST_FILE_CONTENT);
149
150 final FileInfo subdir4 = dir.addFolder("subdir4.jar");
151 subdir4.addFile("file1.txt", TEST_FILE_CONTENT);
152 subdir4.addFile("file2.txt", TEST_FILE_CONTENT);
153 subdir4.addFile("file3.txt", TEST_FILE_CONTENT);
154
155 return base;
156 }
157
158
159
160
161
162
163 protected DefaultFileSystemManager createManager() throws Exception {
164 final DefaultFileSystemManager fs = getProviderConfig().getDefaultFileSystemManager();
165 fs.setFilesCache(getProviderConfig().getFilesCache());
166 getProviderConfig().prepare(fs);
167 if (!fs.hasProvider("file")) {
168 fs.addProvider("file", new DefaultLocalFileProvider());
169 }
170 return fs;
171 }
172
173
174
175
176 public FileObject getBaseFolder() {
177 return baseFolder;
178 }
179
180
181
182
183
184 public FileObject getBaseTestFolder(final FileSystemManager fs) throws Exception {
185 return providerConfig.getBaseTestFolder(fs);
186 }
187
188 protected FileSystem getFileSystem() {
189 final FileObject readFolder = getReadFolder();
190 assertNotNull("This test's read folder should not be null", readFolder);
191 return readFolder.getFileSystem();
192 }
193
194
195
196
197 protected DefaultFileSystemManager getManager() {
198 return manager;
199 }
200
201
202
203
204 public ProviderTestConfig getProviderConfig() {
205 return providerConfig;
206 }
207
208
209
210
211 protected FileObject getReadFolder() {
212 return readFolder;
213 }
214
215
216
217
218
219
220
221 protected Capability[] getRequiredCapabilities() {
222 return null;
223 }
224
225
226
227
228 protected FileObject getWriteFolder() {
229 return writeFolder;
230 }
231
232
233
234
235
236
237
238
239
240
241
242 @Override
243 protected void runTest() throws Throwable {
244
245 final Capability[] caps = getRequiredCapabilities();
246 if (caps != null) {
247 for (final Capability cap2 : caps) {
248 final Capability cap = cap2;
249 final FileSystem fs = getFileSystem();
250 if (!fs.hasCapability(cap)) {
251
252
253
254
255
256 return;
257 }
258 }
259 }
260
261
262 if (method != null) {
263 try {
264 method.invoke(this, (Object[]) null);
265 } catch (final InvocationTargetException e) {
266 throw e.getTargetException();
267 }
268 } else {
269 super.runTest();
270 }
271
272 if (readFolder != null && ((AbstractFileSystem) readFolder.getFileSystem()).isOpen()) {
273 String name = "unknown";
274 if (method != null) {
275 name = method.getName();
276 }
277
278 throw new IllegalStateException(getClass().getName() + ": filesystem has open streams after: " + name);
279 }
280 }
281
282
283
284
285 public void setConfig(final DefaultFileSystemManager manager, final ProviderTestConfig providerConfig,
286 final FileObject baseFolder, final FileObject readFolder, final FileObject writeFolder) {
287 this.manager = manager;
288 this.providerConfig = providerConfig;
289 this.baseFolder = baseFolder;
290 this.readFolder = readFolder;
291 this.writeFolder = writeFolder;
292 assertNotNull("setConfig manager", manager);
293 assertNotNull("setConfig providerConfig", providerConfig);
294 assertNotNull("setConfig baseFolder", baseFolder);
295 assertNotNull("setConfig readFolder", readFolder);
296 assertNotNull("setConfig writeFolder", writeFolder);
297 }
298
299
300
301
302 public void setMethod(final Method method) {
303 this.method = method;
304 }
305
306
307
308
309
310
311 protected void setWriteFolder(final FileObject folder) {
312 writeFolder = folder;
313 }
314
315 @Override
316 public String toString() {
317 return "AbstractProviderTestCase [baseFolder=" + baseFolder + ", readFolder=" + readFolder + ", writeFolder="
318 + writeFolder + ", manager=" + manager + ", providerConfig=" + providerConfig + ", method=" + method
319 + ", addEmptyDir=" + addEmptyDir + "]";
320 }
321
322 }