Path: blob/master/test/jdk/java/lang/ProcessHandle/PermissionTest.java
41149 views
/*1* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.io.FilePermission;24import java.io.IOException;25import java.lang.reflect.ReflectPermission;26import java.security.CodeSource;27import java.security.Permission;28import java.security.PermissionCollection;29import java.security.Permissions;30import java.security.Policy;31import java.security.ProtectionDomain;32import java.security.SecurityPermission;33import java.util.Arrays;34import java.util.PropertyPermission;3536import org.testng.Assert;37import org.testng.annotations.AfterClass;38import org.testng.annotations.Test;3940/*41* @test42* @run testng/othervm -Djava.security.manager=allow PermissionTest43* @summary Test Permissions to access Info44*/4546public class PermissionTest {47/**48* Backing up policy.49*/50protected static Policy policy;5152/**53* Backing up security manager.54*/55private static SecurityManager sm;5657/**58* Current process handle.59*/60private final ProcessHandle currentHndl;6162PermissionTest() {63policy = Policy.getPolicy();64sm = System.getSecurityManager();65currentHndl = ProcessHandle.current();66}6768@Test69public void descendantsWithPermission() {70Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));71currentHndl.descendants();72}7374@Test75public void allProcessesWithPermission() {76Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));77ProcessHandle.allProcesses();78}7980@Test81public void childrenWithPermission() {82Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));83currentHndl.children();84}8586@Test87public void currentWithPermission() {88Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));89ProcessHandle.current();90}9192@Test93public void ofWithPermission() {94Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));95ProcessHandle.of(0);96}9798@Test99public void parentWithPermission() {100Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));101currentHndl.parent();102}103104@Test105public void processToHandleWithPermission() throws IOException {106Policy.setPolicy(new TestPolicy(new RuntimePermission("manageProcess")));107Process p = null;108try {109ProcessBuilder pb = new ProcessBuilder("sleep", "30");110p = pb.start();111ProcessHandle ph = p.toHandle();112Assert.assertNotNull(ph, "ProcessHandle expected from Process");113} finally {114if (p != null) {115p.destroy();116}117}118}119120/**121* Setup a policy that would reject ProcessHandle requests without Permissions ManageProcess.122*/123public void noPermissionsSetup(){124Policy.setPolicy(new TestPolicy());125SecurityManager sm = new SecurityManager();126System.setSecurityManager(sm);127}128129@Test(expectedExceptions = SecurityException.class)130public void noPermissionAllChildren() {131noPermissionsSetup();132currentHndl.descendants();133}134135@Test(expectedExceptions = SecurityException.class)136public void noPermissionAllProcesses() {137noPermissionsSetup();138ProcessHandle.allProcesses();139}140141@Test(expectedExceptions = SecurityException.class)142public void noPermissionChildren() {143noPermissionsSetup();144currentHndl.children();145}146147@Test(expectedExceptions = SecurityException.class)148public void noPermissionCurrent() {149noPermissionsSetup();150ProcessHandle.current();151}152153@Test(expectedExceptions = SecurityException.class)154public void noPermissionOf() {155noPermissionsSetup();156ProcessHandle.of(0);157}158159@Test(expectedExceptions = SecurityException.class)160public void noPermissionParent() {161noPermissionsSetup();162currentHndl.parent();163}164165@Test(expectedExceptions = SecurityException.class)166public void noPermissionProcessToHandle() throws IOException {167noPermissionsSetup();168Process p = null;169try {170ProcessBuilder pb = new ProcessBuilder("sleep", "30");171p = pb.start();172ProcessHandle ph = p.toHandle();173Assert.assertNotNull(ph, "ProcessHandle expected from Process");174} finally {175if (p != null) {176p.destroy();177}178}179}180181@AfterClass182public void tearDownClass() throws Exception {183System.setSecurityManager(sm);184Policy.setPolicy(policy);185}186}187188class TestPolicy extends Policy {189190static final Policy DEFAULT_POLICY = Policy.getPolicy();191192private final PermissionCollection permissions = new Permissions();193194public TestPolicy() {195setBasicPermissions();196}197198/*199* Defines the minimal permissions required by testNG and set security200* manager permission when running these tests.201*/202public void setBasicPermissions() {203permissions.add(new SecurityPermission("getPolicy"));204permissions.add(new SecurityPermission("setPolicy"));205permissions.add(new RuntimePermission("getClassLoader"));206permissions.add(new RuntimePermission("setSecurityManager"));207permissions.add(new RuntimePermission("createSecurityManager"));208permissions.add(new PropertyPermission("user.dir", "read"));209permissions.add(new PropertyPermission("test.src", "read"));210permissions.add(new PropertyPermission("file.separator", "read"));211permissions.add(new PropertyPermission("line.separator", "read"));212permissions.add(new PropertyPermission("fileStringBuffer", "read"));213permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));214permissions.add(new PropertyPermission("testng.show.stack.frames",215"read"));216permissions.add(new PropertyPermission("testng.thread.affinity", "read"));217permissions.add(new PropertyPermission("testng.memory.friendly", "read"));218permissions.add(new PropertyPermission("testng.mode.dryrun", "read"));219permissions.add(new PropertyPermission("testng.report.xml.name", "read"));220permissions.add(new PropertyPermission("testng.timezone", "read"));221permissions.add(new ReflectPermission("suppressAccessChecks"));222permissions.add(new FilePermission("<<ALL FILES>>", "execute"));223}224225public TestPolicy(Permission... ps) {226setBasicPermissions();227Arrays.stream(ps).forEach(p -> permissions.add(p));228}229230@Override231public PermissionCollection getPermissions(ProtectionDomain domain) {232return permissions;233}234235@Override236public PermissionCollection getPermissions(CodeSource codesource) {237return permissions;238}239240@Override241public boolean implies(ProtectionDomain domain, Permission perm) {242return permissions.implies(perm) || DEFAULT_POLICY.implies(domain, perm);243}244}245246247