Skip to content

Commit 5dc421d

Browse files
committed
re #836: skipping thread safety checks for http4 and sftp
1 parent cfcc1db commit 5dc421d

File tree

1 file changed

+138
-127
lines changed

1 file changed

+138
-127
lines changed

commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/VfsClassLoaderTests.java

Lines changed: 138 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.commons.vfs2.FileSystemException;
2424
import org.apache.commons.vfs2.FileSystemManager;
2525
import org.apache.commons.vfs2.FileType;
26+
import org.apache.commons.vfs2.operations.FileOperationProvider;
2627
import org.junit.Test;
2728

2829
import java.io.File;
@@ -39,6 +40,7 @@
3940
import java.util.List;
4041
import java.util.Map;
4142
import java.util.Queue;
43+
import java.util.Set;
4244
import java.util.concurrent.ArrayBlockingQueue;
4345
import java.util.concurrent.BlockingQueue;
4446
import java.util.concurrent.BrokenBarrierException;
@@ -117,136 +119,145 @@ protected Capability[] getRequiredCapabilities() {
117119
return new Capability[] { Capability.READ_CONTENT, Capability.URI };
118120
}
119121

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+
}
247249

248250
@Test
249251
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+
250261
// note THREADS must be an even number
251262
final int THREADS = 20;
252263
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(THREADS * 2);

0 commit comments

Comments
 (0)