|
23 | 23 | import org.apache.commons.vfs2.FileSystemException; |
24 | 24 | import org.apache.commons.vfs2.FileSystemManager; |
25 | 25 | import org.apache.commons.vfs2.FileType; |
| 26 | +import org.apache.commons.vfs2.operations.FileOperationProvider; |
26 | 27 | import org.junit.Test; |
27 | 28 |
|
28 | 29 | import java.io.File; |
|
39 | 40 | import java.util.List; |
40 | 41 | import java.util.Map; |
41 | 42 | import java.util.Queue; |
| 43 | +import java.util.Set; |
42 | 44 | import java.util.concurrent.ArrayBlockingQueue; |
43 | 45 | import java.util.concurrent.BlockingQueue; |
44 | 46 | import java.util.concurrent.BrokenBarrierException; |
@@ -117,136 +119,145 @@ protected Capability[] getRequiredCapabilities() { |
117 | 119 | return new Capability[] { Capability.READ_CONTENT, Capability.URI }; |
118 | 120 | } |
119 | 121 |
|
120 | | -// /** |
121 | | -// * Tests retrieving resources (from JAR searchpath). |
122 | | -// * <p> |
123 | | -// * This is run for all providers, but only when a local provider is present and jar extension is registered it will |
124 | | -// * actually carry out all tests. |
125 | | -// * </p> |
126 | | -// */ |
127 | | -// @Test |
128 | | -// public void testGetResourcesJARs() throws Exception { |
129 | | -// final FileSystemManager manager = getManager(); |
130 | | -// try { |
131 | | -// // hasProvider("file") cannot be used as it triggers default provider URL |
132 | | -// manager.toFileObject(new File(".")); |
133 | | -// } catch (final FileSystemException e) { |
134 | | -// System.out.println("VfsClassLoaderTests no local file provider, skipping."); |
135 | | -// return; |
136 | | -// } |
137 | | -// |
138 | | -// // build search path without using #getBaseFolder() |
139 | | -// // because NestedJarTestCase redefines it |
140 | | -// final File baseDir = getTestDirectoryFile(); |
141 | | -// final FileObject nestedJar = manager.resolveFile(baseDir, "nested.jar"); |
142 | | -// final FileObject testJar = manager.resolveFile(baseDir, "test.jar"); |
143 | | -// |
144 | | -// // test setup needs to know about .jar extension - i.e. NestedJarTestCase |
145 | | -// if (!manager.canCreateFileSystem(nestedJar)) { |
146 | | -// System.out.println("VfsClassLoaderTests no layered .jar provider, skipping."); |
147 | | -// return; |
148 | | -// } |
149 | | -// |
150 | | -// // verify test setup |
151 | | -// assertSame("nested.jar is required for testing", nestedJar.getType(), FileType.FILE); |
152 | | -// assertSame("test.jar is required for testing", testJar.getType(), FileType.FILE); |
153 | | -// |
154 | | -// // System class loader (null) might be unpredictable in regards |
155 | | -// // to returning resources for META-INF/MANIFEST.MF (see VFS-500) |
156 | | -// // so we use our own which is guaranteed to not return any hit |
157 | | -// final ClassLoader mockClassloader = new MockClassloader(); |
158 | | -// final FileObject[] search = { nestedJar, testJar }; |
159 | | -// final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader); |
160 | | -// |
161 | | -// final Enumeration<URL> urls = loader.getResources("META-INF/MANIFEST.MF"); |
162 | | -// final URL url1 = urls.nextElement(); |
163 | | -// final URL url2 = urls.nextElement(); |
164 | | -// |
165 | | -// assertTrue("First resource must refer to nested.jar but was " + url1, |
166 | | -// url1.toString().endsWith("nested.jar!/META-INF/MANIFEST.MF")); |
167 | | -// assertTrue("Second resource must refer to test.jar but was " + url2, |
168 | | -// url2.toString().endsWith("test.jar!/META-INF/MANIFEST.MF")); |
169 | | -// } |
170 | | -// |
171 | | -// /** |
172 | | -// * Tests retrieving resources (from local directory with .jar extension). |
173 | | -// * <p> |
174 | | -// * This test is repeated with various provider configurations but works on local files, only. |
175 | | -// * </p> |
176 | | -// */ |
177 | | -// @Test |
178 | | -// public void testGetResourcesNoLayerLocal() throws Exception { |
179 | | -// final FileSystemManager manager = getManager(); |
180 | | -// try { |
181 | | -// // hasProvider("file") cannot be used as it triggers default provider URL |
182 | | -// manager.toFileObject(new File(".")); |
183 | | -// } catch (final FileSystemException e) { |
184 | | -// System.out.println("VfsClassLoaderTests no local file provider, skipping."); |
185 | | -// return; |
186 | | -// } |
187 | | -// final File baseDir = getTestDirectoryFile(); |
188 | | -// |
189 | | -// // setup test folder |
190 | | -// final FileObject dir = manager.resolveFile(baseDir, "read-tests/dir1/subdir4.jar"); |
191 | | -// assertSame("subdir4.jar/ is required for testing " + dir, dir.getType(), FileType.FOLDER); |
192 | | -// assertFalse(manager.canCreateFileSystem(dir)); |
193 | | -// |
194 | | -// // prepare classloader |
195 | | -// final FileObject[] search = { dir }; |
196 | | -// final ClassLoader mockClassloader = new MockClassloader(); |
197 | | -// final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader); |
198 | | -// |
199 | | -// // verify resource loading |
200 | | -// final Enumeration<URL> urls = loader.getResources("file1.txt"); |
201 | | -// final URL url1 = urls.nextElement(); |
202 | | -// assertFalse("Only one hit expected", urls.hasMoreElements()); |
203 | | -// assertTrue("not pointing to resource " + url1, url1.toString().endsWith("subdir4.jar/file1.txt")); |
204 | | -// } |
205 | | -// |
206 | | -// /** |
207 | | -// * Tests loading a class. |
208 | | -// */ |
209 | | -// @Test |
210 | | -// public void testLoadClass() throws Exception { |
211 | | -// final VFSClassLoader loader = createClassLoader(); |
212 | | -// |
213 | | -// final Class<?> testClass = loader.loadClass("code.ClassToLoad"); |
214 | | -// final Package pack = testClass.getPackage(); |
215 | | -// assertEquals("code", pack.getName()); |
216 | | -// verifyPackage(pack, false); |
217 | | -// |
218 | | -// final Object testObject = testClass.newInstance(); |
219 | | -// assertEquals("**PRIVATE**", testObject.toString()); |
220 | | -// } |
221 | | -// |
222 | | -// /** |
223 | | -// * Tests loading a resource. |
224 | | -// */ |
225 | | -// @Test |
226 | | -// public void testLoadResource() throws Exception { |
227 | | -// final VFSClassLoader loader = createClassLoader(); |
228 | | -// |
229 | | -// final URL resource = loader.getResource("read-tests/file1.txt"); |
230 | | -// |
231 | | -// assertNotNull(resource); |
232 | | -// final URLConnection urlCon = resource.openConnection(); |
233 | | -// assertSameURLContent(FILE1_CONTENT, urlCon); |
234 | | -// } |
235 | | -// |
236 | | -// /** |
237 | | -// * Tests package sealing. |
238 | | -// */ |
239 | | -// @Test |
240 | | -// public void testSealing() throws Exception { |
241 | | -// final VFSClassLoader loader = createClassLoader(); |
242 | | -// final Class<?> testClass = loader.loadClass("code.sealed.AnotherClass"); |
243 | | -// final Package pack = testClass.getPackage(); |
244 | | -// assertEquals("code.sealed", pack.getName()); |
245 | | -// verifyPackage(pack, true); |
246 | | -// } |
| 122 | + /** |
| 123 | + * Tests retrieving resources (from JAR searchpath). |
| 124 | + * <p> |
| 125 | + * This is run for all providers, but only when a local provider is present and jar extension is registered it will |
| 126 | + * actually carry out all tests. |
| 127 | + * </p> |
| 128 | + */ |
| 129 | + @Test |
| 130 | + public void testGetResourcesJARs() throws Exception { |
| 131 | + final FileSystemManager manager = getManager(); |
| 132 | + try { |
| 133 | + // hasProvider("file") cannot be used as it triggers default provider URL |
| 134 | + manager.toFileObject(new File(".")); |
| 135 | + } catch (final FileSystemException e) { |
| 136 | + System.out.println("VfsClassLoaderTests no local file provider, skipping."); |
| 137 | + return; |
| 138 | + } |
| 139 | + |
| 140 | + // build search path without using #getBaseFolder() |
| 141 | + // because NestedJarTestCase redefines it |
| 142 | + final File baseDir = getTestDirectoryFile(); |
| 143 | + final FileObject nestedJar = manager.resolveFile(baseDir, "nested.jar"); |
| 144 | + final FileObject testJar = manager.resolveFile(baseDir, "test.jar"); |
| 145 | + |
| 146 | + // test setup needs to know about .jar extension - i.e. NestedJarTestCase |
| 147 | + if (!manager.canCreateFileSystem(nestedJar)) { |
| 148 | + System.out.println("VfsClassLoaderTests no layered .jar provider, skipping."); |
| 149 | + return; |
| 150 | + } |
| 151 | + |
| 152 | + // verify test setup |
| 153 | + assertSame("nested.jar is required for testing", nestedJar.getType(), FileType.FILE); |
| 154 | + assertSame("test.jar is required for testing", testJar.getType(), FileType.FILE); |
| 155 | + |
| 156 | + // System class loader (null) might be unpredictable in regards |
| 157 | + // to returning resources for META-INF/MANIFEST.MF (see VFS-500) |
| 158 | + // so we use our own which is guaranteed to not return any hit |
| 159 | + final ClassLoader mockClassloader = new MockClassloader(); |
| 160 | + final FileObject[] search = { nestedJar, testJar }; |
| 161 | + final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader); |
| 162 | + |
| 163 | + final Enumeration<URL> urls = loader.getResources("META-INF/MANIFEST.MF"); |
| 164 | + final URL url1 = urls.nextElement(); |
| 165 | + final URL url2 = urls.nextElement(); |
| 166 | + |
| 167 | + assertTrue("First resource must refer to nested.jar but was " + url1, |
| 168 | + url1.toString().endsWith("nested.jar!/META-INF/MANIFEST.MF")); |
| 169 | + assertTrue("Second resource must refer to test.jar but was " + url2, |
| 170 | + url2.toString().endsWith("test.jar!/META-INF/MANIFEST.MF")); |
| 171 | + } |
| 172 | + |
| 173 | + /** |
| 174 | + * Tests retrieving resources (from local directory with .jar extension). |
| 175 | + * <p> |
| 176 | + * This test is repeated with various provider configurations but works on local files, only. |
| 177 | + * </p> |
| 178 | + */ |
| 179 | + @Test |
| 180 | + public void testGetResourcesNoLayerLocal() throws Exception { |
| 181 | + final FileSystemManager manager = getManager(); |
| 182 | + try { |
| 183 | + // hasProvider("file") cannot be used as it triggers default provider URL |
| 184 | + manager.toFileObject(new File(".")); |
| 185 | + } catch (final FileSystemException e) { |
| 186 | + System.out.println("VfsClassLoaderTests no local file provider, skipping."); |
| 187 | + return; |
| 188 | + } |
| 189 | + final File baseDir = getTestDirectoryFile(); |
| 190 | + |
| 191 | + // setup test folder |
| 192 | + final FileObject dir = manager.resolveFile(baseDir, "read-tests/dir1/subdir4.jar"); |
| 193 | + assertSame("subdir4.jar/ is required for testing " + dir, dir.getType(), FileType.FOLDER); |
| 194 | + assertFalse(manager.canCreateFileSystem(dir)); |
| 195 | + |
| 196 | + // prepare classloader |
| 197 | + final FileObject[] search = { dir }; |
| 198 | + final ClassLoader mockClassloader = new MockClassloader(); |
| 199 | + final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader); |
| 200 | + |
| 201 | + // verify resource loading |
| 202 | + final Enumeration<URL> urls = loader.getResources("file1.txt"); |
| 203 | + final URL url1 = urls.nextElement(); |
| 204 | + assertFalse("Only one hit expected", urls.hasMoreElements()); |
| 205 | + assertTrue("not pointing to resource " + url1, url1.toString().endsWith("subdir4.jar/file1.txt")); |
| 206 | + } |
| 207 | + |
| 208 | + /** |
| 209 | + * Tests loading a class. |
| 210 | + */ |
| 211 | + @Test |
| 212 | + public void testLoadClass() throws Exception { |
| 213 | + final VFSClassLoader loader = createClassLoader(); |
| 214 | + |
| 215 | + final Class<?> testClass = loader.loadClass("code.ClassToLoad"); |
| 216 | + final Package pack = testClass.getPackage(); |
| 217 | + assertEquals("code", pack.getName()); |
| 218 | + verifyPackage(pack, false); |
| 219 | + |
| 220 | + final Object testObject = testClass.newInstance(); |
| 221 | + assertEquals("**PRIVATE**", testObject.toString()); |
| 222 | + } |
| 223 | + |
| 224 | + /** |
| 225 | + * Tests loading a resource. |
| 226 | + */ |
| 227 | + @Test |
| 228 | + public void testLoadResource() throws Exception { |
| 229 | + final VFSClassLoader loader = createClassLoader(); |
| 230 | + |
| 231 | + final URL resource = loader.getResource("read-tests/file1.txt"); |
| 232 | + |
| 233 | + assertNotNull(resource); |
| 234 | + final URLConnection urlCon = resource.openConnection(); |
| 235 | + assertSameURLContent(FILE1_CONTENT, urlCon); |
| 236 | + } |
| 237 | + |
| 238 | + /** |
| 239 | + * Tests package sealing. |
| 240 | + */ |
| 241 | + @Test |
| 242 | + public void testSealing() throws Exception { |
| 243 | + final VFSClassLoader loader = createClassLoader(); |
| 244 | + final Class<?> testClass = loader.loadClass("code.sealed.AnotherClass"); |
| 245 | + final Package pack = testClass.getPackage(); |
| 246 | + assertEquals("code.sealed", pack.getName()); |
| 247 | + verifyPackage(pack, true); |
| 248 | + } |
247 | 249 |
|
248 | 250 | @Test |
249 | 251 | public void testThreadSafety() throws Exception { |
| 252 | + final FileSystemManager manager = getManager(); |
| 253 | + |
| 254 | + // The http4 and sftp mechanisms do not work with this thread safety test |
| 255 | + List<String> schemes = Arrays.asList(manager.getSchemes()); |
| 256 | + if (schemes.contains("http4") || schemes.contains("sftp")) { |
| 257 | + System.out.println("VfsClassLoaderTests skipping thread safety test for schemes :" + schemes); |
| 258 | + return; |
| 259 | + } |
| 260 | + |
250 | 261 | // note THREADS must be an even number |
251 | 262 | final int THREADS = 20; |
252 | 263 | final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(THREADS * 2); |
|
0 commit comments