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