package org.apereo.cas.adaptors.x509.authentication.principal; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.springframework.core.io.ClassPathResource; import java.io.FileInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collection; /** * Unit test for {@link X509SubjectPrincipalResolver}. * * @author Marvin S. Addison * @since 4.0.0 */ @RunWith(Parameterized.class) public class X509SubjectPrincipalResolverTests { private X509Certificate certificate; private final X509SubjectPrincipalResolver resolver; private final String expected; /** * Creates a new test instance with the given parameters. * * @param certPath path to the cert * @param descriptor the descriptor * @param expectedResult the expected result */ public X509SubjectPrincipalResolverTests( final String certPath, final String descriptor, final String expectedResult) { this.resolver = new X509SubjectPrincipalResolver(descriptor); try { this.certificate = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate( new FileInputStream(certPath)); } catch (final Exception e) { Assert.fail(String.format("Error parsing certificate %s: %s", certPath, e.getMessage())); } this.expected = expectedResult; } /** * Gets the unit test parameters. * * @return Test parameter data. */ @Parameters public static Collection<Object[]> getTestParameters() throws Exception { final Collection<Object[]> params = new ArrayList<>(); // Test case #1 // Use CN for principal ID params.add(new Object[] { new ClassPathResource("x509-ctop-resolver-hizzy.crt").getFile().getCanonicalPath(), "$CN", "Hizzogarthington I.S. Pleakinsense" }); // Test case #2 // Use email address for principal ID params.add(new Object[] { new ClassPathResource("x509-ctop-resolver-hizzy.crt").getFile().getCanonicalPath(), "$EMAILADDRESS", "hizzy@vt.edu" }); // Test case #2 // Use combination of ou and cn for principal ID params.add(new Object[] { new ClassPathResource("x509-ctop-resolver-hizzy.crt").getFile().getCanonicalPath(), "$OU $CN", "Middleware Hizzogarthington I.S. Pleakinsense" }); // Test case #3 // Use combination of serial number and cn for principal ID params.add(new Object[] { new ClassPathResource("x509-ctop-resolver-gazzo.crt").getFile().getCanonicalPath(), "$CN:$SERIALNUMBER", "Gazzaloddi P. Wishwashington:271828183" }); // Test case #4 // Build principal ID from multivalued attributes params.add(new Object[] { new ClassPathResource("x509-ctop-resolver-jacky.crt").getFile().getCanonicalPath(), "$UID@$DC.$DC", "jacky@vt.edu" }); return params; } @Test public void verifyResolvePrincipalInternal() { Assert.assertEquals(this.expected, this.resolver.resolvePrincipalInternal(this.certificate)); } }