package org.apache.harmony.security.tests.java.security; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestTargetNew; import junit.framework.TestCase; import java.io.IOException; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @TestTargetClass(PrivilegedExceptionAction.class) public class PrivilegedExceptionActionTest extends TestCase { protected void setUp() throws Exception { super.setUp(); } private class MyPrivilegedExceptionAction implements PrivilegedExceptionAction<String> { private boolean called = false; public String run() throws Exception { called = true; return "ok"; } } private class MyPrivilegedExceptionAction2 implements PrivilegedExceptionAction<String> { private boolean called = false; private Exception toThrow = null; public MyPrivilegedExceptionAction2(Exception toThrow) { this.toThrow = toThrow; } public String run() throws Exception { called = true; if (toThrow == null) { return "ok"; } else { throw toThrow; } } } @TestTargetNew( level=TestLevel.COMPLETE, method="run" ) public void testRun() { MyPrivilegedExceptionAction action1 = new MyPrivilegedExceptionAction(); try { String result = AccessController.doPrivileged(action1); assertEquals("unexpected result", "ok", result); assertTrue("method not called", action1.called); } catch (PrivilegedActionException e) { fail("unexpected exception : " + e); } Exception[] exceptions = {new NullPointerException(), new IOException(), null}; for (int i = 0; i < exceptions.length; i++) { Exception exception = exceptions[i]; MyPrivilegedExceptionAction2 action2 = new MyPrivilegedExceptionAction2(exception); try { String result = AccessController.doPrivileged(action2); assertTrue("method not called", action1.called); if (exception == null) { assertEquals("unexpected result", "ok", result); } else { fail("privileged action exception expected"); } } catch (PrivilegedActionException e) { assertTrue("method not called", action2.called); assertSame("expected exception not thrown", exception, e.getCause()); // ok } catch (RuntimeException e) { assertSame("expected exception not thrown", exception, e); } } } }