diff -r f09a60fb5967 -r 619035df6988 jdk/test/com/sun/tools/attach/PermissionTest.java --- a/jdk/test/com/sun/tools/attach/PermissionTest.java Tue Dec 03 23:09:17 2013 -0800 +++ b/jdk/test/com/sun/tools/attach/PermissionTest.java Tue Dec 03 17:06:23 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,39 +21,119 @@ * questions. */ -/* - * - * - * Unit test for Attach API - this checks that a SecurityException is thrown as - * expected. - */ import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.AttachNotSupportedException; import java.util.Properties; +import java.io.File; +import jdk.testlibrary.OutputAnalyzer; +import jdk.testlibrary.ProcessTools; +import jdk.testlibrary.ProcessThread; +/* + * @test + * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 + * @summary Basic unit tests for the VM attach mechanism. + * @library /lib/testlibrary + * @run build Application Shutdown + * @run main PermissionTest + * + * Unit test for Attach API - + * this checks that a SecurityException is thrown as expected. + */ public class PermissionTest { - public static void main(String args[]) throws Exception { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - throw new RuntimeException("Test configuration error - no security manager set"); - } - String pid = args[0]; - boolean shouldFail = Boolean.parseBoolean(args[1]); - + /* + * The actual test is in the nested class TestMain. + * The responsibility of this class is to: + * 1. Start the Application class in a separate process. + * 2. Find the pid and shutdown port of the running Application. + * 3. Run the tests in TstMain that will attach to the Application. + * 4. Shut down the Application. + */ + public static void main(String args[]) throws Throwable { + final String pidFile ="TestPermission.Application.pid"; + ProcessThread processThread = null; + RunnerUtil.ProcessInfo info = null; try { - VirtualMachine.attach(pid).detach(); - if (shouldFail) { - throw new RuntimeException("SecurityException should be thrown"); + processThread = RunnerUtil.startApplication(pidFile); + info = RunnerUtil.readProcessInfo(pidFile); + runTests(info.pid); + } catch (Throwable t) { + System.out.println("TestPermission got unexpected exception: " + t); + t.printStackTrace(); + throw t; + } finally { + // Make sure the Application process is stopped. + RunnerUtil.stopApplication(info.shutdownPort, processThread); + } + } + + /** + * Runs the actual test the nested class TestMain. + * The test is run in a separate process because we need to add to the classpath. + */ + private static void runTests(int pid) throws Throwable { + final String sep = File.separator; + + // Need to add jdk/lib/tools.jar to classpath. + String classpath = + System.getProperty("test.class.path", "") + File.pathSeparator + + System.getProperty("test.jdk", ".") + sep + "lib" + sep + "tools.jar"; + String testSrc = System.getProperty("test.src", "") + sep; + + // Use a policy that will NOT allow attach. Test will verify exception. + String[] args = { + "-classpath", + classpath, + "-Djava.security.manager", + String.format("-Djava.security.policy=%sjava.policy.deny", testSrc), + "PermissionTest$TestMain", + Integer.toString(pid), + "true" }; + OutputAnalyzer output = ProcessTools.executeTestJvm(args); + output.shouldHaveExitValue(0); + + // Use a policy that will allow attach. + args = new String[] { + "-classpath", + classpath, + "-Djava.security.manager", + String.format("-Djava.security.policy=%sjava.policy.allow", testSrc), + "PermissionTest$TestMain", + Integer.toString(pid), + "false" }; + output = ProcessTools.executeTestJvm(args); + output.shouldHaveExitValue(0); + } + + /** + * This is the actual test code. It will attach to the Application and verify + * that we get a SecurityException when that is expected. + */ + public static class TestMain { + public static void main(String args[]) throws Exception { + SecurityManager sm = System.getSecurityManager(); + if (sm == null) { + throw new RuntimeException("Test configuration error - no security manager set"); } - System.out.println(" - attached to target VM as expected."); - } catch (Exception x) { - // AttachNotSupportedException thrown when no providers can be loaded - if (shouldFail && ((x instanceof AttachNotSupportedException) || - (x instanceof SecurityException))) { - System.out.println(" - exception thrown as expected."); - } else { - throw x; + + String pid = args[0]; + boolean shouldFail = Boolean.parseBoolean(args[1]); + + try { + VirtualMachine.attach(pid).detach(); + if (shouldFail) { + throw new RuntimeException("SecurityException should be thrown"); + } + System.out.println(" - attached to target VM as expected."); + } catch (Exception x) { + // AttachNotSupportedException thrown when no providers can be loaded + if (shouldFail && ((x instanceof AttachNotSupportedException) || + (x instanceof SecurityException))) { + System.out.println(" - exception thrown as expected."); + } else { + throw x; + } } } }