1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.api.java.security;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FilePermission;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.AccessControlContext;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.AccessControlException;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.AccessController;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Permission;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PermissionCollection;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Permissions;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.ProtectionDomain;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecurityPermission;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.PropertyPermission;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.security.auth.Subject;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.security.auth.SubjectDomainCombiner;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(AccessControlContext.class)
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AccessControlContextTest extends junit.framework.TestCase {
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private class TestSecurityManager extends SecurityManager {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private ArrayList<Permission> notAllowed;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestSecurityManager() {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notAllowed = new ArrayList<Permission>(2);
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notAllowed.add(new SecurityPermission("createAccessControlContext"));
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notAllowed.add(new SecurityPermission("getDomainCombiner"));
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void checkPermission(Permission p) {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (Iterator<Permission> i = notAllowed.iterator(); i.hasNext(); ) {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (i.next().equals(p)) {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new SecurityException();
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlContext#AccessControlContext(java.security.ProtectionDomain[])
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "AccessControlContext",
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.ProtectionDomain[].class}
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_Constructor$Ljava_security_ProtectionDomain() {
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.AccessControlContext(java.security.ProtectionDomain [])
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Create a permission which is not normally granted
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm = new PropertyPermission("java.class.path",
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "read");
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col = perm.newPermissionCollection();
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col.add(perm);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd = new ProtectionDomain(null, col);
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc = new AccessControlContext(
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd });
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(perm);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (SecurityException e) {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have permission");
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final boolean[] result = new boolean[] { false };
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Thread th = new Thread(new Runnable() {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public void run() {
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AccessControlContext acc = new AccessControlContext(
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        new ProtectionDomain[] { pd });
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    acc.checkPermission(perm);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result[0] = true;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (SecurityException e) {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        });
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        th.start();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            th.join();
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InterruptedException e) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // ignore
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("Test 1: Thread should have permission", result[0]);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //Null parameter checking
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new AccessControlContext(null);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Test 2: NullPointerException expected.");
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlContext#AccessControlContext(java.security.AccessControlContext,
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.DomainCombiner)
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "AccessControlContext",
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.AccessControlContext.class, java.security.DomainCombiner.class}
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_ConstructorLjava_security_AccessControlContextLjava_security_DomainCombiner() {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext context = AccessController.getContext();
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new AccessControlContext(context, null);
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("should not throw NullPointerException");
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new AccessControlContext(context, new SubjectDomainCombiner(
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new Subject()));
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("should not throw Exception");
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlContext#AccessControlContext(java.security.AccessControlContext,
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.DomainCombiner)
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Checks SecurityException.",
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "AccessControlContext",
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.AccessControlContext.class, java.security.DomainCombiner.class}
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_ConstructorLjava_security_AccessControlContextLjava_security_DomainCombiner2() {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecurityManager oldSm = System.getSecurityManager();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(new TestSecurityManager());
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext context = AccessController.getContext();
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new AccessControlContext(context, null);
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Test 1: SecurityException expected.");
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (SecurityException e) {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(oldSm);
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlException#checkPermission(Permission)
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "checkPermission",
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.Permission.class}
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_checkPermission() {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char s = File.separatorChar;
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        FilePermission perm[] = new FilePermission[7];
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[0] = new FilePermission("test1.file", "write");
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[1] = new FilePermission("test1.file", "read, execute, delete");
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[2] = new FilePermission(s + "tmp" + s + "test" + s + "*",
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "read, write");
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[3] = new FilePermission(s + "tmp" + s + "test" + s
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                + "collection.file", "read");
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[4] = new FilePermission(s + "windows" + "*", "delete");
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[5] = new FilePermission("aFile.file", "read");
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        perm[6] = new FilePermission("hello.file", "write");
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Permissions perms = new Permissions();
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < perm.length; i++) {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            perms.add(perm[i]);
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ProtectionDomain pd = new ProtectionDomain(null, perms);
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc = new AccessControlContext(
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd });
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < perm.length; i++) {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                acc.checkPermission(perm[i]);
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (AccessControlException e) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("Should have permission " + perm[i]);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(new FilePermission("test1.file", "execute"));
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (AccessControlException e) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have permission ");
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(new FilePermission(s + "tmp" + s + "test" + s
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + "hello.file", "read"));
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (AccessControlException e) {
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have permission ");
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(new FilePermission("test2.file", "execute"));
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("SecurityException expected");
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (AccessControlException e) {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(new FilePermission(s + "tmp" + s + "test" + s
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + "hello.file", "delete"));
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("SecurityException expected");
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (AccessControlException e) {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc.checkPermission(null);
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException expected");
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException npe) {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlException#equals()
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "equals",
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.Object.class}
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_equals() {
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm1 = new PropertyPermission("java.class.path",
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "read");
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm2 = new PropertyPermission("java.path", "write");
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col1 = perm1.newPermissionCollection();
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col1.add(perm1);
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd1 = new ProtectionDomain(null, col1);
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc1 = new AccessControlContext(
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd1 });
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc2 = new AccessControlContext(
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd1 });
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col2 = perm2.newPermissionCollection();
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col2.add(perm2);
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col2.add(perm2);
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd2 = new ProtectionDomain(null, col2);
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc3 = new AccessControlContext(
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd2 });
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc1.equals(null));
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc2.equals(null));
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc3.equals(null));
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc1.equals(acc2));
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc2.equals(acc1));
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc1.equals(acc3));
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc2.equals(acc3));
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext context = AccessController.getContext();
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc4 = new AccessControlContext(context, null);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc5 = new AccessControlContext(context,
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new SubjectDomainCombiner(new Subject()));
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc6 = new AccessControlContext(context, null);
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc4.equals(null));
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc5.equals(null));
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc4.equals(acc5));
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(acc5.equals(acc4));
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc4.equals(acc6));
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc6.equals(acc4));
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlException#getDomainCombiner()
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getDomainCombiner",
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getDomainCombiner() {
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext context = AccessController.getContext();
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc1 = new AccessControlContext(context, null);
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc2 = new AccessControlContext(context,
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new SubjectDomainCombiner(new Subject()));
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm1 = new PropertyPermission("java.class.path",
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "read");
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col1 = perm1.newPermissionCollection();
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col1.add(perm1);
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd1 = new ProtectionDomain(null, col1);
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc3 = new AccessControlContext(
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd1 });
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull(acc1.getDomainCombiner());
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(acc2.getDomainCombiner());
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull(acc3.getDomainCombiner());
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecurityManager oldSm = System.getSecurityManager();
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(new TestSecurityManager());
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            acc1.getDomainCombiner();
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("SecurityException expected.");
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (SecurityException e) {
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected.
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(oldSm);
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.AccessControlException#hashCode()
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "hashCode",
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_hashCode() {
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm1 = new PropertyPermission("java.class.path",
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "read");
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Permission perm2 = new PropertyPermission("java.path", "write");
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col1 = perm1.newPermissionCollection();
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col1.add(perm1);
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd1 = new ProtectionDomain(null, col1);
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc1 = new AccessControlContext(
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd1 });
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc2 = new AccessControlContext(
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd1 });
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PermissionCollection col2 = perm2.newPermissionCollection();
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col2.add(perm2);
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        col2.add(perm2);
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final ProtectionDomain pd2 = new ProtectionDomain(null, col2);
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc3 = new AccessControlContext(
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ProtectionDomain[] { pd2 });
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc1.hashCode() == acc1.hashCode());
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc2.hashCode() == acc2.hashCode());
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc3.hashCode() == acc3.hashCode());
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc1.hashCode() == acc2.hashCode());
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc2.hashCode() != acc3.hashCode());
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc3.hashCode() != acc1.hashCode());
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext context = AccessController.getContext();
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc4 = new AccessControlContext(context, null);
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc5 = new AccessControlContext(context,
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new SubjectDomainCombiner(new Subject()));
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AccessControlContext acc6 = new AccessControlContext(context, null);
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc4.hashCode() == acc4.hashCode());
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc5.hashCode() == acc5.hashCode());
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc6.hashCode() == acc6.hashCode());
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc4.hashCode() == acc5.hashCode());
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc5.hashCode() == acc6.hashCode());
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(acc6.hashCode() == acc4.hashCode());
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}