/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package tests.security.permissions; import dalvik.annotation.TestTargets; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetNew; import dalvik.annotation.TestTargetClass; import junit.framework.TestCase; import java.io.IOException; import java.security.Permission; /* * This class tests the security permissions which are documented in * http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html#PermsAndMethods * for class java.lang.Runtime */ @TestTargetClass(java.lang.Runtime.class) public class JavaLangRuntimeTest extends TestCase { SecurityManager old; @Override protected void setUp() throws Exception { old = System.getSecurityManager(); super.setUp(); } @Override protected void tearDown() throws Exception { System.setSecurityManager(old); super.tearDown(); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that Runtime.exec calls checkExec method on security manager", method = "exec", args = {java.lang.String.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that Runtime.exec calls checkExec method on security manager", method = "exec", args = {java.lang.String.class, java.lang.String[].class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that Runtime.exec calls checkExec method on security manager", method = "exec", args = {java.lang.String[].class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that Runtime.exec calls checkExec method on security manager", method = "exec", args = {java.lang.String[].class, java.lang.String[].class} ) }) public void test_exec() throws IOException { class TestSecurityManager extends SecurityManager { boolean called; String cmd; void reset(){ called = false; cmd = null; } @Override public void checkExec(String cmd) { called = true; this.cmd = cmd; } @Override public void checkPermission(Permission p) { } } String cmd = "ls"; String arg = "-al"; TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Runtime.getRuntime().exec(cmd); assertTrue("Runtime.exec must call checkExcec on security manager", s.called); assertEquals("Argument of checkExec is not correct", cmd, s.cmd); s.reset(); Runtime.getRuntime().exec(cmd, null); assertTrue("Runtime.exec must call checkExcec on security manager", s.called); assertEquals("Argument of checkExec is not correct", cmd, s.cmd); s.reset(); Runtime.getRuntime().exec(new String[]{cmd, arg}); assertTrue("Runtime.exec must call checkExcec on security manager", s.called); assertEquals("Argument of checkExec is not correct", cmd, s.cmd); s.reset(); Runtime.getRuntime().exec(new String[]{cmd, arg}, null); assertTrue("Runtime.exec must call checkExcec on security manager", s.called); assertEquals("Argument of checkExec is not correct", cmd, s.cmd); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that addShutdownHook and remove ShutdownHook call checkPermission on security manager., disabled due to implementation bug, see ticket #55", method = "addShutdownHook", args = {java.lang.Thread.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that addShutdownHook and remove ShutdownHook call checkPermission on security manager., disabled due to implementation bug, see ticket #55", method = "removeShutdownHook", args = {java.lang.Thread.class} ) }) public void test_shutdownHook() { class TestSecurityManager extends SecurityManager { boolean called; Permission permission; void reset(){ called = false; permission = null; } @Override public void checkPermission(Permission permission){ if(permission instanceof RuntimePermission){ called = true; this.permission = permission; } } } Thread hook = new Thread(){}; TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Runtime.getRuntime().addShutdownHook(hook); assertTrue("Runtime.addShutdownHook must call checkPermission on security manager with a RuntimePermission", s.called); assertEquals("Name of RuntimePermission passed to checkPermission is not correct", "shutdownHooks", s.permission.getName()); s.reset(); Runtime.getRuntime().removeShutdownHook(hook); assertTrue("Runtime.removeShutdownHook must call checkPermission on security manager with a RuntimePermission", s.called); assertEquals("Name of RuntimePermission passed to checkPermission is not correct", "shutdownHooks", s.permission.getName()); } @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that exit calls checkExit on security manager.", method = "exit", args = {int.class} ) public void test_exit() { class ExitNotAllowedException extends RuntimeException {} class TestSecurityManager extends SecurityManager { boolean called; int status; void reset(){ called = false; status = -1; } @Override public void checkExit(int status){ this.called = true; this.status = status; throw new ExitNotAllowedException(); // prevent that the system is shut down } @Override public void checkPermission(Permission p) { } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); try { Runtime.getRuntime().exit(11); fail("Runtime.exit must call checkExit on security manager with a RuntimePermission"); } catch(ExitNotAllowedException e){ // expected exception } assertTrue("Runtime.exit must call checkExit on security manager with a RuntimePermission", s.called); assertEquals("Argument of checkExit is not correct", 11, s.status); } @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that runFinalizersOnExit calls checkExit on security manager., disabled due to implementation bug, see ticket #55", method = "runFinalizersOnExit", args = {boolean.class} ) public void test_runFinalizersOnExit() { class TestSecurityManager extends SecurityManager { boolean called; int status; void reset(){ called = false; status = -1; } @Override public void checkExit(int status){ this.called = true; this.status = status; } @Override public void checkPermission(Permission p) { } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Runtime.runFinalizersOnExit(true); assertTrue("Runtime.runFinalizersOnExit must call checkExit on security manager with a RuntimePermission", s.called); assertEquals("Argument of checkExit is not correct", 0, s.status); s.reset(); Runtime.runFinalizersOnExit(false); assertTrue("Runtime.runFinalizersOnExit must call checkExit on security manager with a RuntimePermission", s.called); assertEquals("Argument of checkExit is not correct", 0, s.status); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that methods load and loadLibrary call checkLink on security manager.", method = "load", args = {java.lang.String.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that methods load and loadLibrary call checkLink on security manager.", method = "loadLibrary", args = {java.lang.String.class} ) }) public void test_load() { final String library = "library"; class CheckLinkCalledException extends RuntimeException {} class TestSecurityManager extends SecurityManager { @Override public void checkLink(String lib){ if(library.equals(lib)){ throw new CheckLinkCalledException(); } } @Override public void checkPermission(Permission p) { } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); try { Runtime.getRuntime().load(library); fail("System.load must call checkLink on security manager with argument "+library); } catch(CheckLinkCalledException e){ // ok } catch(Throwable t){ fail("System.load must call checkLink on security manager with argument "+library); } try { Runtime.getRuntime().loadLibrary(library); fail("System.load must call checkLink on security manager with argument "+library); } catch(CheckLinkCalledException e){ // ok } catch(Throwable t){ fail("System.load must call checkLink on security manager with argument "+library); } } }