View Javadoc
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.vfs2.impl;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertFalse;
21  import static org.junit.jupiter.api.Assertions.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertNull;
23  import static org.junit.jupiter.api.Assertions.assertThrows;
24  import static org.junit.jupiter.api.Assertions.assertTrue;
25  import static org.junit.jupiter.api.Assertions.fail;
26  
27  import java.io.File;
28  import java.nio.file.Path;
29  import java.nio.file.Paths;
30  
31  import org.apache.commons.vfs2.CacheStrategy;
32  import org.apache.commons.vfs2.FileName;
33  import org.apache.commons.vfs2.FileObject;
34  import org.apache.commons.vfs2.FileSystemException;
35  import org.apache.commons.vfs2.FileSystemManager;
36  import org.apache.commons.vfs2.FileType;
37  import org.apache.commons.vfs2.FilesCache;
38  import org.apache.commons.vfs2.VFS;
39  import org.apache.commons.vfs2.cache.NullFilesCache;
40  import org.apache.commons.vfs2.provider.GenericURLFileName;
41  import org.apache.commons.vfs2.provider.bzip2.Bzip2FileObject;
42  import org.apache.commons.vfs2.provider.gzip.GzipFileObject;
43  import org.apache.commons.vfs2.provider.jar.JarFileObject;
44  import org.apache.commons.vfs2.provider.ram.RamFileProvider;
45  import org.apache.commons.vfs2.provider.zip.ZipFileObject;
46  import org.junit.jupiter.api.Disabled;
47  import org.junit.jupiter.api.Test;
48  import org.mockito.Mockito;
49  
50  /**
51   * Tests {@link DefaultFileSystemManager}.
52   */
53  public class DefaultFileSystemManagerTest {
54  
55      @Test
56      public void testAddAndRemoveProvider() throws FileSystemException {
57          try (DefaultFileSystemManager fileSystemManager = new DefaultFileSystemManager()) {
58              fileSystemManager.setFilesCache(new NullFilesCache());
59              fileSystemManager.setCacheStrategy(CacheStrategy.MANUAL);
60  
61              final RamFileProvider provider = Mockito.spy(new RamFileProvider());
62              fileSystemManager.addProvider("ram1", provider);
63              fileSystemManager.addProvider("ram2", provider);
64              assertNotNull(fileSystemManager.resolveFile("ram1:///"));
65              assertNotNull(fileSystemManager.resolveFile("ram2:///"));
66  
67              fileSystemManager.removeProvider("ram1");
68              Mockito.verify(provider, Mockito.never()).close();
69              assertThrows(FileSystemException.class, () -> fileSystemManager.resolveFile("ram1:///"));
70              assertNotNull(fileSystemManager.resolveFile("ram2:///"));
71  
72              fileSystemManager.removeProvider("ram2");
73              Mockito.verify(provider).close();
74              assertThrows(FileSystemException.class, () -> fileSystemManager.resolveFile("ram2:///"));
75          }
76      }
77  
78      /**
79       * Tests {@link DefaultFileSystemManager#close()}.
80       *
81       * @throws FileSystemException
82       */
83      @Test
84      public void testClose() throws FileSystemException {
85          try (FileSystemManager fileSystemManager = new DefaultFileSystemManager()) {
86              VFS.setManager(fileSystemManager);
87              VFS.setManager(null);
88          }
89          assertNotNull(VFS.getManager());
90          final Path path = Paths.get("DoesNotExist.not");
91          assertFalse(VFS.getManager().resolveFile(path.toUri()).exists());
92          assertFalse(VFS.getManager().toFileObject(path.toFile()).exists());
93          assertFalse(VFS.getManager().toFileObject(path).exists());
94      }
95  
96      @Test
97      public void testCreateBz2FileSystem() throws FileSystemException {
98          testCreateFileSystem("src/test/resources/test-data/bla.txt.bz2", Bzip2FileObject.class);
99      }
100 
101     private void testCreateFileSystem(final String fileStr, final Class<?> clazz) throws FileSystemException {
102         final FileSystemManager manager = VFS.getManager();
103         final Path path = Paths.get(fileStr);
104         try (FileObject localFileObject = manager.toFileObject(path);
105                 FileObject fileObject = manager.createFileSystem(localFileObject)) {
106             assertEquals(clazz, fileObject.getClass());
107         }
108         try (FileObject localFileObject = manager.toFileObject(path.toFile());
109                 FileObject fileObject = manager.createFileSystem(localFileObject)) {
110             assertEquals(clazz, fileObject.getClass());
111         }
112         try (FileObject localFileObject = manager.resolveFile(new File(fileStr).getAbsolutePath());
113                 FileObject fileObject = manager.createFileSystem(localFileObject)) {
114             assertEquals(clazz, fileObject.getClass());
115         }
116     }
117 
118     @Test
119     @Disabled
120     public void testCreateGzipFileSystem() throws FileSystemException {
121         testCreateFileSystem("src/test/resources/test-data/好.txt.gz", GzipFileObject.class);
122     }
123 
124     @Test
125     public void testCreateJarFileSystem() throws FileSystemException {
126         testCreateFileSystem("src/test/resources/test-data/nested.jar", JarFileObject.class);
127     }
128 
129     @Test
130     public void testCreateZipFileSystem() throws FileSystemException {
131         testCreateFileSystem("src/test/resources/test-data/nested.zip", ZipFileObject.class);
132     }
133 
134     @Test
135     public void testFileCacheEmptyAfterManagerClose() throws FileSystemException {
136         final FileSystemManager manager = VFS.getManager();
137         assertNotNull(manager);
138         try (FileObject fileObject = manager.resolveFile(Paths.get("src/test/resources/test-data/read-tests/file1.txt").toUri())) {
139             assertTrue(fileObject.exists());
140             final FilesCache filesCache = manager.getFilesCache();
141             final FileName name = fileObject.getName();
142             // Make sure we have file object in the cache.
143             assertNotNull(filesCache.getFile(fileObject.getFileSystem(), name));
144             manager.close();
145             // Cache MUST now be empty.
146             assertNull(filesCache.getFile(fileObject.getFileSystem(), name));
147         } finally {
148             // Makes sure we reset the singleton or other tests will fail.
149             VFS.close();
150         }
151     }
152 
153     @Test
154     public void testFileCacheEmptyAfterVFSClose() throws FileSystemException {
155         final FileSystemManager manager = VFS.getManager();
156         assertNotNull(manager);
157         try (FileObject fileObject = manager.resolveFile(Paths.get("src/test/resources/test-data/read-tests/file1.txt").toUri())) {
158             assertTrue(fileObject.exists());
159             final FilesCache filesCache = manager.getFilesCache();
160             final FileName name = fileObject.getName();
161             // Make sure we have file object in the cache.
162             assertNotNull(filesCache.getFile(fileObject.getFileSystem(), name));
163             VFS.close();
164             // Cache MUST now be empty.
165             assertNull(filesCache.getFile(fileObject.getFileSystem(), name));
166         }
167     }
168 
169     /**
170      * Even if the file name is absolute, the base file must be given. This is an inconsistency in the API, but it is documented as such.
171      *
172      * @see "VFS-519"
173      */
174     @Test
175     public void testResolveFileAbsoluteThrows() {
176         final String absolute = new File("/").getAbsoluteFile().toURI().toString();
177         assertThrows(NullPointerException.class, () -> VFS.getManager().resolveFile((File) null, absolute));
178     }
179 
180     /**
181      * If the base name is {@code null}, the file system manager should fail throwing a FileSystemException.
182      *
183      * @see VFS-189
184      */
185     @Test
186     public void testResolveFileNameNull() {
187         assertThrows(FileSystemException.class, () -> VFS.getManager().resolveName((FileName) null, "../"));
188     }
189 
190     /**
191      * If the path ends with one of '/' or '.' or '..' or anyPath/..' or 'anyPath/.' , the resulting FileName should be of FileType.FOLDER, else of
192      * FileType.FILE.
193      */
194     @Test
195     public void testResolveFileNameType() {
196         try (DefaultFileSystemManager fileSystemManager = new DefaultFileSystemManager()) {
197             // @formatter:off
198             final FileName baseNameFolder = new GenericURLFileName(
199                     "sftp",
200                     "localhost",
201                     22,
202                     22,
203                     "user",
204                     "password",
205                     "basePath",
206                      FileType.FOLDER,
207                     "query=test");
208             // @formatter:on
209 
210             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "").getType());
211             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "/").getType());
212             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, ".").getType());
213             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "..").getType());
214             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "./").getType());
215             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "../").getType());
216             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "./Sub Folder/").getType());
217             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/").getType());
218             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "./Sub Folder/.").getType());
219             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/..").getType());
220             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "./Sub Folder/./").getType());
221             assertEquals(FileType.FOLDER, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/../").getType());
222 
223             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "File.txt").getType());
224             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "/File.txt").getType());
225             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "./File.txt").getType());
226             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "../File.txt").getType());
227             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "./Sub Folder/File.txt").getType());
228             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/File.txt").getType());
229             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "./Sub Folder/./File.txt").getType());
230             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/../File.txt").getType());
231             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/../File.").getType());
232             assertEquals(FileType.FILE, fileSystemManager.resolveName(baseNameFolder, "../Descendant Folder/../File..").getType());
233 
234         } catch (final FileSystemException e) {
235             fail(e);
236         }
237     }
238 
239     @Test
240     public void testResolveFileObjectNullAbsolute() throws FileSystemException {
241         final String absolute = new File("/").getAbsoluteFile().toURI().toString();
242         VFS.getManager().resolveFile((FileObject) null, absolute);
243     }
244 
245     @Test
246     public void testResolveFileObjectRelativeThrows() {
247         assertThrows(FileSystemException.class, () -> VFS.getManager().resolveFile((FileObject) null, "relativePath"));
248     }
249 
250     @Test
251     public void testResolveFileRelativeThrows() {
252         assertThrows(NullPointerException.class, () -> VFS.getManager().resolveFile((File) null, "relativePath"));
253     }
254 
255 }