DomainCombinerTest.java revision 561ee011997c6c2f1befbfaa9d5f0a99771c1d63
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package tests.api.java.security;
19
20import java.security.AccessControlContext;
21import java.security.AccessController;
22import java.security.AllPermission;
23import java.security.BasicPermission;
24import java.security.CodeSource;
25import java.security.DomainCombiner;
26import java.security.Permission;
27import java.security.PermissionCollection;
28import java.security.Permissions;
29import java.security.PrivilegedAction;
30import java.security.ProtectionDomain;
31import java.security.SecurityPermission;
32import java.security.cert.Certificate;
33
34public class DomainCombinerTest extends junit.framework.TestCase {
35
36	/**
37	 * @tests java.security.DomainCombiner#combine(java.security.ProtectionDomain[],
38	 *        java.security.ProtectionDomain[])
39	 */
40	public void test_combine$Ljava_security_ProtectionDomain$Ljava_security_ProtectionDomain() {
41		final boolean[] calledDomainCombiner = new boolean[] { false, false };
42
43		class MyCombiner implements DomainCombiner {
44			int i;
45
46			MyCombiner(int i) {
47				this.i = i;
48			}
49
50			public ProtectionDomain[] combine(
51					ProtectionDomain[] executionDomains,
52					ProtectionDomain[] parentDomains) {
53				calledDomainCombiner[i] = true;
54				PermissionCollection pc = new Permissions();
55				pc.add(new AllPermission());
56				ProtectionDomain pd;
57				// if run with the system classloader then there will be no
58				// execution domains
59				if (executionDomains.length > 0) {
60					pd = new ProtectionDomain(executionDomains[0]
61							.getCodeSource(), pc);
62				} else {
63					pd = new ProtectionDomain(parentDomains[0].getCodeSource(),
64							pc);
65				}
66				return new ProtectionDomain[] { pd };
67			}
68		}
69
70		ProtectionDomain[] domains = new ProtectionDomain[] { new ProtectionDomain(
71				new CodeSource(null, (Certificate[]) null), new Permissions()) };
72
73		AccessControlContext parent = new AccessControlContext(domains);
74		AccessControlContext c0 = new AccessControlContext(parent,
75				new MyCombiner(0));
76		final AccessControlContext c1 = new AccessControlContext(parent,
77				new MyCombiner(1));
78
79                class TestPermission extends BasicPermission {
80                    TestPermission(String s) {
81                        super(s);
82                    }
83                }
84
85        SecurityManager sm = new SecurityManager() {
86            public void checkPermission(Permission p) {
87                if( p instanceof TestPermission ) {
88                    super.checkPermission(p);
89                }
90            }
91        };
92        sm.checkPermission(new SecurityPermission("let it load"));
93
94        System.setSecurityManager(sm);
95		try {
96			AccessController.doPrivileged(new PrivilegedAction() {
97				public Object run() {
98					// AccessController.getContext();
99					AccessController.checkPermission(new TestPermission(
100							"MyTest"));
101
102					AccessController.doPrivileged(new PrivilegedAction() {
103						public Object run() {
104							AccessController
105									.checkPermission(new TestPermission(
106											"MyTest"));
107							return null;
108						}
109					}, c1);
110					return null;
111				}
112			}, c0);
113			assertTrue("Failed to combine domains for security permission",
114					calledDomainCombiner[0]);
115			assertTrue("Failed to combine domains for security permission",
116					calledDomainCombiner[1]);
117		} finally {
118			System.setSecurityManager(null);
119		}
120	}
121}