/* * 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 tests.util.TestEnvironment; import java.io.InputStream; import java.io.PrintStream; import java.security.Permission; import java.util.Properties; import java.util.PropertyPermission; /* * 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.System */ @TestTargetClass(java.lang.System.class) public class JavaLangSystemTest extends TestCase { SecurityManager old; @Override protected void setUp() throws Exception { old = System.getSecurityManager(); super.setUp(); } @Override protected void tearDown() throws Exception { TestEnvironment.reset(); System.setSecurityManager(old); super.tearDown(); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that getProperties and setProperties call checkPropertiesAccess on security manager.", method = "getProperties", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that getProperties and setProperties call checkPropertiesAccess on security manager.", method = "setProperties", args = {java.util.Properties.class} ) }) public void test_Properties() { class TestSecurityManager extends SecurityManager { boolean called; void reset(){ called = false; } @Override public void checkPropertiesAccess() { called = true; } @Override public void checkPermission(Permission p) { // nothing to do } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Properties props = System.getProperties(); assertTrue("System.getProperties must call checkPropertiesAccess on security manager", s.called); s.reset(); System.setProperties(props); assertTrue("System.setProperties must call checkPropertiesAccess on security manager", s.called); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that System.getProperty calls checkPropertyAccess on security manager.", method = "getProperty", args = {java.lang.String.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that System.getProperty calls checkPropertyAccess on security manager.", method = "getProperty", args = {java.lang.String.class, java.lang.String.class} ) }) public void test_getProperty() { class TestSecurityManager extends SecurityManager { boolean called; String key; void reset(){ called = false; key = null; } @Override public void checkPropertyAccess(String key) { called = true; this.key = key; } @Override public void checkPermission(Permission p) { // nothing to do } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); System.getProperty("key"); assertTrue("System.getProperty must call checkPropertyAccess on security manager", s.called); assertEquals("Argument of checkPropertyAccess is not correct", "key", s.key); s.reset(); System.getProperty("key", "value"); assertTrue("System.getProperty must call checkPropertyAccess on security manager", s.called); assertEquals("Argument of checkPropertyAccess is not correct", "key", s.key); } @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that System.setProperty method calls checkPermission of security manager.", method = "setProperty", args = {java.lang.String.class, java.lang.String.class} ) public void test_setProperty() { class TestSecurityManager extends SecurityManager { boolean called; Permission p; void reset(){ called = false; p = null; } @Override public void checkPermission(Permission p) { called = true; this.p = p; } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); System.setProperty("key", "value"); assertTrue("System.setProperty must call checkPermission on security manager", s.called); assertEquals("Argument of checkPermission is not correct", new PropertyPermission("key", "write"), s.p); } @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that System.setSecurityManager method checks security permissions.", method = "setSecurityManager", args = {java.lang.SecurityManager.class} ) public void test_setSecurityManager() { class TestSecurityManager extends SecurityManager { boolean called = false; @Override public void checkPermission(Permission permission) { if(permission instanceof RuntimePermission && "setSecurityManager".equals(permission.getName())){ called = true; } } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); System.setSecurityManager(s); assertTrue("System.setSecurityManager must check security permissions", s.called); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that setIn/Out/Err methods call checkPermission method of security manager., needs a fix in class System, see ticket #67", method = "setIn", args = {java.io.InputStream.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that setIn/Out/Err methods call checkPermission " + "method of security manager., needs a fix in class System, " + "see ticket #67", method = "setOut", args = {java.io.PrintStream.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "Verifies that setIn/Out/Err methods call checkPermission " + "method of security manager., needs a fix in class System, " + "see ticket #67", method = "setErr", args = {java.io.PrintStream.class} ) }) public void test_setInOutErr() { class TestSecurityManager extends SecurityManager { boolean called; Permission p; void reset(){ called = false; p = null; } @Override public void checkPermission(Permission p) { called = true; this.p = p; } } InputStream in = System.in; PrintStream out = System.out; PrintStream err = System.err; Permission p = new RuntimePermission("setIO"); TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); System.setIn(in); assertTrue("System.setIn(Inputstream) must call checkPermission on security manager", s.called); assertEquals("Argument of checkPermission is not correct", p, s.p); System.setOut(err); assertTrue("System.setOut(PrintStream) must call checkPermission on security manager", s.called); assertEquals("Argument of checkPermission is not correct", p, s.p); System.setErr(out); assertTrue("System.setErr(PrintStream) must call checkPermission on security manager", s.called); assertEquals("Argument of checkPermission is not correct", p, s.p); } @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) { // nothing to do } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); try { System.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., implementation of Runtime.runFinalizersOnExit needs to be fixed, see ticket 57", 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) { // nothing to do } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); System.runFinalizersOnExit(true); assertTrue("System.runFinalizersOnExit(true) must call checkExit on security manager", s.called); assertEquals("Argument of checkExit is not correct", 0, s.status); s.reset(); System.runFinalizersOnExit(false); assertTrue("System.runFinalizersOnExit(false) must call checkExit on security manager", 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(); } super.checkLink(lib); } @Override public void checkPermission(Permission p) { // nothing to do } } TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); try { System.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 { System.loadLibrary(library); fail("System.loadLibrary must call checkLink on security manager with argument \"" + library + "\""); } catch(CheckLinkCalledException e){ // ok } catch(Throwable t){ fail("System.loadLibrary must call checkLink on security manager with argument \"" + library + "\""); } } }