< prev index next >
test/java/net/URLClassLoader/closetest/CloseTest.java
Print this page
*** 25,44 ****
* @test
* @bug 4167874
* @modules jdk.httpserver
* @library ../../../../com/sun/net/httpserver
* @library /lib/testlibrary
! * @build FileServerHandler jdk.testlibrary.FileUtils
! * @run shell build.sh
* @run main/othervm CloseTest
* @summary URL-downloaded jar files can consume all available file descriptors
*/
!
! import java.io.*;
! import java.net.*;
! import java.lang.reflect.*;
! import com.sun.net.httpserver.*;
public class CloseTest extends Common {
//
// needs two jar files test1.jar and test2.jar with following structure
--- 25,51 ----
* @test
* @bug 4167874
* @modules jdk.httpserver
* @library ../../../../com/sun/net/httpserver
* @library /lib/testlibrary
! * @build FileServerHandler jdk.testlibrary.FileUtils CompilerUtils JarUtils
* @run main/othervm CloseTest
* @summary URL-downloaded jar files can consume all available file descriptors
*/
! import java.io.File;
! import java.io.IOException;
! import java.net.URL;
! import java.net.URLClassLoader;
! import java.lang.reflect.Method;
! import java.net.InetSocketAddress;
! import java.nio.file.Path;
! import java.nio.file.Paths;
! import java.nio.file.StandardOpenOption;
! import java.util.stream.Stream;
! import com.sun.net.httpserver.HttpServer;
! import com.sun.net.httpserver.HttpContext;
! import static java.nio.file.Files.write;
public class CloseTest extends Common {
//
// needs two jar files test1.jar and test2.jar with following structure
*** 47,159 ****
// com/foo/TestClass1
// com/foo/Resource1
// com/foo/Resource2
//
// and a directory hierarchy with the same structure/contents
! public static void main (String args[]) throws Exception {
!
! String workdir = System.getProperty("test.classes");
! if (workdir == null) {
! workdir = args[0];
! }
! if (!workdir.endsWith("/")) {
! workdir = workdir+"/";
! }
!
! startHttpServer (workdir+"serverRoot/");
!
! String testjar = workdir + "test.jar";
! copyFile (workdir+"test1.jar", testjar);
! test (testjar, 1);
// repeat test with different implementation
// of test.jar (whose TestClass.getValue() returns 2
!
! copyFile (workdir+"test2.jar", testjar);
! test (testjar, 2);
// repeat test using a directory of files
! String testdir=workdir+"testdir/";
! rm_minus_rf (new File(testdir));
! copyDir (workdir+"test1/", testdir);
! test (testdir, 1);
!
! testdir=workdir+"testdir/";
! rm_minus_rf (new File(testdir));
! copyDir (workdir+"test2/", testdir);
! test (testdir, 2);
! getHttpServer().stop (3);
}
// create a loader on jarfile (or directory), plus a http loader
// load a class , then look for a resource
// also load a class from http loader
// then close the loader
// check further new classes/resources cannot be loaded
// check jar (or dir) can be deleted
// check existing classes can be loaded
// check boot classes can be loaded
!
! static void test (String name, int expectedValue) throws Exception {
! URL url = new URL ("file", null, name);
URL url2 = getServerURL();
! System.out.println ("Doing tests with URL: " + url + " and " + url2);
URL[] urls = new URL[2];
urls[0] = url;
urls[1] = url2;
! URLClassLoader loader = new URLClassLoader (urls);
! Class testclass = loadClass ("com.foo.TestClass", loader, true);
! Class class2 = loadClass ("Test", loader, true); // from http
! class2.newInstance();
! Object test = testclass.newInstance();
Method method = testclass.getDeclaredMethods()[0]; // int getValue();
! int res = (Integer) method.invoke (test);
if (res != expectedValue) {
! throw new RuntimeException ("wrong value from getValue() ["+res+
! "/"+expectedValue+"]");
}
// should find /resource1
! URL u1 = loader.findResource ("com/foo/Resource1");
if (u1 == null) {
! throw new RuntimeException ("can't find com/foo/Resource1 in test1.jar");
}
! loader.close ();
// should NOT find /resource2 even though it is in jar
! URL u2 = loader.findResource ("com/foo/Resource2");
if (u2 != null) {
! throw new RuntimeException ("com/foo/Resource2 unexpected in test1.jar");
}
// load tests
! loadClass ("com.foo.TestClass1", loader, false);
! loadClass ("com.foo.TestClass", loader, true);
! loadClass ("java.sql.Array", loader, true);
// now check we can delete the path
! rm_minus_rf (new File(name));
! System.out.println (" ... OK");
}
static HttpServer httpServer;
static HttpServer getHttpServer() {
return httpServer;
}
! static URL getServerURL () throws Exception {
int port = httpServer.getAddress().getPort();
! String s = "http://127.0.0.1:"+port+"/";
return new URL(s);
}
! static void startHttpServer (String docroot) throws Exception {
! httpServer = HttpServer.create (new InetSocketAddress(0), 10);
! HttpContext ctx = httpServer.createContext (
"/", new FileServerHandler(docroot)
);
httpServer.start();
}
}
--- 54,193 ----
// com/foo/TestClass1
// com/foo/Resource1
// com/foo/Resource2
//
// and a directory hierarchy with the same structure/contents
+ public static final Path TEST_SRC = Paths.get(System
+ .getProperty("test.src"));
+ public static final Path TEST_WORK_DIR = Paths.get(System
+ .getProperty("user.dir"));
+ public static final Path SERVERSRC = TEST_SRC.resolve("serverRoot");
+ public static final Path TEST1 = TEST_SRC.resolve("test1");
+ public static final Path TEST2 = TEST_SRC.resolve("test2");
+ public static final Path SERVER_ROOT = TEST_WORK_DIR.resolve("serverRoot");
+ public static final Path TEST1_DIR = TEST_WORK_DIR.resolve("test1");
+ public static final Path TEST2_DIR = TEST_WORK_DIR.resolve("test2");
+ public static final Path TEST_DIR = TEST_WORK_DIR.resolve("testdir");
+ public static final Path TEST1_JAR = TEST_WORK_DIR.resolve("test1.jar");
+ public static final Path TEST2_JAR = TEST_WORK_DIR.resolve("test2.jar");
+ public static final Path TEST_JAR = TEST_WORK_DIR.resolve("test.jar");
+
+ public static void main(String args[]) throws Exception {
+ setUpTest();
+ startHttpServer(SERVER_ROOT.toString());
! copyFile(TEST1_JAR.toFile(), TEST_JAR.toFile());
! test(TEST_JAR.toString(), 1);
// repeat test with different implementation
// of test.jar (whose TestClass.getValue() returns 2
! rm_minus_rf(TEST_JAR.toFile());
! copyFile(TEST2_JAR.toFile(), TEST_JAR.toFile());
! test(TEST_JAR.toString(), 2);
// repeat test using a directory of files
! rm_minus_rf(TEST_DIR.toFile());
! copyDir(TEST1_DIR.toFile(), TEST_DIR.toFile());
! test(TEST1_DIR.toAbsolutePath().toString() + "/", 1);
!
! rm_minus_rf(TEST_DIR.toFile());
! copyDir(TEST2_DIR.toFile(), TEST_DIR.toFile());
! test(TEST_DIR.toAbsolutePath().toString() + "/", 2);
! getHttpServer().stop(3);
! }
!
! static void setUpTest() throws IOException {
! CompilerUtils.compile(TEST1, TEST1_DIR);
! CompilerUtils.compile(TEST2, TEST2_DIR);
! writeResourceFiles(TEST1_DIR);
! writeResourceFiles(TEST2_DIR);
! CompilerUtils.compile(SERVERSRC, SERVER_ROOT);
! // create jar
! JarUtils.createJarFile(TEST1_JAR, TEST1_DIR);
! JarUtils.createJarFile(TEST2_JAR, TEST2_DIR);
! }
!
! static void writeResourceFiles(Path path) {
! try {
! Path resource1 = path.resolve("com").resolve("foo").resolve("Resource1");
! write(resource1, "Hello World".getBytes("UTF-8"),
! StandardOpenOption.CREATE);
! Path resource2 = path.resolve("com").resolve("foo").resolve("Resource2");
! write(resource2, "Hello World again".getBytes("UTF-8"),
! StandardOpenOption.CREATE);
! } catch (IOException ex) {
! System.err.println("Write failed " + ex);
! }
}
// create a loader on jarfile (or directory), plus a http loader
// load a class , then look for a resource
// also load a class from http loader
// then close the loader
// check further new classes/resources cannot be loaded
// check jar (or dir) can be deleted
// check existing classes can be loaded
// check boot classes can be loaded
! static void test(String name, int expectedValue) throws Exception {
! URL url = new URL("file", null, name);
! System.out.println(name);
URL url2 = getServerURL();
! System.out.println("Doing tests with URL: " + url + " and " + url2);
URL[] urls = new URL[2];
urls[0] = url;
urls[1] = url2;
! URLClassLoader loader = new URLClassLoader(urls);
! Class testclass = loadClass("com.foo.TestClass", loader, true);
! Class class2 = loadClass("Test", loader, true); // from http
! class2.getConstructor().newInstance();
! Object test = testclass.getConstructor().newInstance();
Method method = testclass.getDeclaredMethods()[0]; // int getValue();
! int res = (Integer) method.invoke(test);
if (res != expectedValue) {
! throw new RuntimeException("wrong value from getValue() [" + res
! + "/" + expectedValue + "]");
}
// should find /resource1
! URL u1 = loader.findResource("com/foo/Resource1");
if (u1 == null) {
! throw new RuntimeException("can't find com/foo/Resource1 in test1.jar");
}
! loader.close();
// should NOT find /resource2 even though it is in jar
! URL u2 = loader.findResource("com/foo/Resource2");
if (u2 != null) {
! throw new RuntimeException("com/foo/Resource2 unexpected in test1.jar");
}
// load tests
! loadClass("com.foo.TestClass1", loader, false);
! loadClass("com.foo.TestClass", loader, true);
! loadClass("java.sql.Array", loader, true);
// now check we can delete the path
! rm_minus_rf(new File(name));
! System.out.println(" ... OK");
}
static HttpServer httpServer;
static HttpServer getHttpServer() {
return httpServer;
}
! static URL getServerURL() throws Exception {
int port = httpServer.getAddress().getPort();
! String s = "http://127.0.0.1:" + port + "/";
return new URL(s);
}
! static void startHttpServer(String docroot) throws Exception {
! httpServer = HttpServer.create(new InetSocketAddress(0), 10);
! HttpContext ctx = httpServer.createContext(
"/", new FileServerHandler(docroot)
);
httpServer.start();
}
}
< prev index next >