System.exit() forbidden by JT Harness in agentvm mode

Volker Simonis volker.simonis at gmail.com
Tue Dec 10 14:02:04 PST 2013


Hi Jonathan,

thanks for you comments. But there's still one thing I don't understand:
what's the exact reason that tests in the agentvm mode are  running under a
special security manager while test running in othervm mode aren't
restricted in this way. Is this really necessary?

Regards,
Volker

On Tuesday, December 10, 2013, Jonathan Gibbons wrote:

> Volker,
>
> From the history books, initially there was only "samevm" and "othervm"
> mode and "othervm" mode was the default.
>
> "samevm" mode was problematic in the face of bad tests (especially bad
> tests on Windows) and only the langtools test suite evolved to the point
> where we recommended the use of "samevm" mode.
>
> As a result, "agentvm" mode was added, which is <marketing-slogan>like
> samevm, but better</marketing-slogan>.  It has worked well for most tests,
> but as you have noticed, does not work well if a test tries to exit the
> JVM.  Those tests need some amount of TLC if they are to leverage "agentvm"
> mode.
>
> You can use othervm.dirs in TEST.ROOT, but that was added as a pragmatic,
> stop gap measure, to faciitate running most of the tests in the faster
> "agentvm" mode, while allowing some older parts of the test suite to
> continue running in the slower "othervm" world.
>
> The core-libs team have led an effort to clean up the core-libs tests and
> to provide the test/Makefile as a standard way of running the tests.  It
> seems like it is time to embark on a similar effort for the client tests.
>
> -- Jon
>
> On 12/10/2013 07:37 AM, Volker Simonis wrote:
>
>> Hi,
>>
>> when running the
>> com/sun/java/swing/plaf/windows/8016551/bug8016551.java regression
>> test with the newest version of jtreg (build from source) in agentvm
>> mode I get the following error:
>>
>> ----------System.err:(33/2049)----------
>> java.lang.reflect.InvocationTargetException
>>          at java.awt.EventQueue.invokeAndWait(EventQueue.java:1300)
>>          at java.awt.EventQueue.invokeAndWait(EventQueue.java:1275)
>>          at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.
>> java:1350)
>>          at bug8016551.main(bug8016551.java:46)
>>          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>          at sun.reflect.NativeMethodAccessorImpl.invoke(
>> NativeMethodAccessorImpl.java:62)
>>          at sun.reflect.DelegatingMethodAccessorImpl.invoke(
>> DelegatingMethodAccessorImpl.java:43)
>>          at java.lang.reflect.Method.invoke(Method.java:483)
>>          at com.sun.javatest.regtest.MainAction$SameVMRunnable.run(
>> MainAction.java:754)
>>          at java.lang.Thread.run(Thread.java:744)
>> Caused by: java.lang.SecurityException: System.exit() forbidden by JT
>> Harness
>>          at com.sun.javatest.JavaTestSecurityManager.checkExit(
>> JavaTestSecurityManager.java:117)
>>          at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:395)
>>          at bug8016551$1.run(bug8016551.java:57)
>>          at java.awt.event.InvocationEvent.dispatch(
>> InvocationEvent.java:301)
>>          at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
>>          at java.awt.EventQueue.access$400(EventQueue.java:97)
>>          at java.awt.EventQueue$3.run(EventQueue.java:697)
>>          at java.awt.EventQueue$3.run(EventQueue.java:691)
>>          at java.security.AccessController.doPrivileged(Native Method)
>>          at java.security.ProtectionDomain$1.doIntersectionPrivilege(
>> ProtectionDomain.java:75)
>>          at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
>>          at java.awt.EventDispatchThread.pumpOneEventForFilters(
>> EventDispatchThread.java:201)
>>          at java.awt.EventDispatchThread.pumpEventsForFilter(
>> EventDispatchThread.java:116)
>>          at java.awt.EventDispatchThread.pumpEventsForHierarchy(
>> EventDispatchThread.java:105)
>>          at java.awt.EventDispatchThread.pumpEvents(
>> EventDispatchThread.java:101)
>>          at java.awt.EventDispatchThread.pumpEvents(
>> EventDispatchThread.java:93)
>>          at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
>>
>> If the test is run in othervm mode it succeeds.
>>
>> I looked at this problem a litter loser and found out the following:
>>
>> - there are 99 test which use JFrame.setDefaultCloseOperation(EXIT_
>> ON_CLOSE)
>> - they are in java/awt (15), javax/swing (79), sun/java2d (3),
>> javax/imageio/plugins/gif/GifTransparencyTest.java
>> (setDefaultCloseOperation present but never called) and
>> com/sun/java/swing/plaf/windows/8016551/bug8016551.java
>> - all test in java/awt and sun/java2d are always executed in othervm
>> mode anyway (because of 'othervm.dirs=java/awt ..' in TEST.ROOT)
>>
>> Now I'm not sure if this security-exception is right at this place -
>> i.e. if jtreg/jtharness work as expected here.
>>
>> If yes and if there's no option/workaround to switch this behaviour
>> off, we should either add 'javax/swing' as well to the 'othervm.dirs'
>> list in TEST.ROOT and explicitly flag the remain test to require
>> othervm mode by adding the corresponding '@run main/othervm' tag to
>> the java source file.
>>
>> If adding 'javax/swing' to 'othervm.dirs' is considered to general, we
>> would have to explicitly flag each single test with '@run
>> main/othervm'.
>>
>> What do you think?
>>
>> Volker
>>
>> PS: there are 208 test which call System.exit() directly. I haven't
>> analysed them until now, but the same reasoning applies for them as
>> well.
>>
>
>


More information about the code-tools-dev mailing list