1e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro/*
2e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * Copyright (C) 2016 The Android Open Source Project
3e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro *
4e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * Licensed under the Apache License, Version 2.0 (the "License");
5e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * you may not use this file except in compliance with the License.
6e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * You may obtain a copy of the License at
7e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro *
8e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro *      http://www.apache.org/licenses/LICENSE-2.0
9e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro *
10e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * Unless required by applicable law or agreed to in writing, software
11e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * distributed under the License is distributed on an "AS IS" BASIS,
12e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * See the License for the specific language governing permissions and
14e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro * limitations under the License
15e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro */
16e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
17ea0ab2d5cef6351a101dac88a4806722a8bf4e2cColin Crosspackage libcore.java.security;
18e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
19e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giroimport junit.framework.TestCase;
20e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
21ea0ab2d5cef6351a101dac88a4806722a8bf4e2cColin Crossimport java.security.Principal;
22e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giroimport java.util.Collections;
23e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giroimport java.util.HashSet;
24e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
25e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giroimport javax.security.auth.Subject;
26e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
27e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
28e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giropublic class PrincipalTest extends TestCase {
29e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro    /**
30e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro     * Default implementation of {@code implies} returns true iff the principal is one
31e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro     * of the subject's principals, or if the subject is null.
32e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro     */
33e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro    public void test_Principal_implies() throws Exception {
34e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        HashSet<Principal> subjectPrincipals = new HashSet<>();
35e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        subjectPrincipals.add(new PrincipalWithEqualityByName("a"));
36e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        subjectPrincipals.add(new PrincipalWithEqualityByName("b"));
37e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        Subject subject = new Subject(
38e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro                true /* readOnly */,
39e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro                subjectPrincipals,
40e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro                Collections.EMPTY_SET /* pubCredentials */,
41e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro                Collections.EMPTY_SET /* privCredentials */);
42e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        Principal principalA = new PrincipalWithEqualityByName("a");
43e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        assertTrue(principalA.implies(subject));
44e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        Principal principalC = new PrincipalWithEqualityByName("c");
45e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        assertFalse(principalC.implies(subject));
46e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        assertFalse(principalC.implies(null));
47e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro    }
48e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
49e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro    private static class PrincipalWithEqualityByName implements Principal {
50e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
51e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        private final String name;
52e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
53e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        PrincipalWithEqualityByName(String name) {
54e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            this.name = name;
55e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        }
56e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
57e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        @Override
58e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        public String getName() {
59e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            return name;
60e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        }
61e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
62e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        @Override
63e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        public int hashCode() {
64e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            return name.hashCode();
65e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        }
66e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro
67e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        @Override
68e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        public boolean equals(Object other) {
69e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            if (!(other instanceof PrincipalWithEqualityByName)) {
70e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro                return false;
71e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            }
72e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro            return this.name.equals(((PrincipalWithEqualityByName) other).getName());
73e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro        }
74e8dfeb4267597dec922f0e94790643e3dca8a195Sergio Giro    }
75ea0ab2d5cef6351a101dac88a4806722a8bf4e2cColin Cross}
76