[java-idp-oidc] 29/44: JOIDC-5 Improved unit testing.
Henri Mikkonen
henri.mikkonen at iki.fi
Thu Oct 22 13:08:41 UTC 2020
This is an automated email from the git hooks/post-receive script.
hjmikkon pushed a commit to branch main
in repository java-idp-oidc.
View the commit online:
http://git.shibboleth.net/view/?p=java-idp-oidc.git;a=commit;h=71e52db3342e27f0e4fa610b3dd83571aba98d77
commit 71e52db3342e27f0e4fa610b3dd83571aba98d77
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Fri Jun 26 16:30:40 2020 +0300
JOIDC-5 Improved unit testing.
https://issues.shibboleth.net/jira/browse/JOIDC-5
---
.../impl/ClientInformationNodeProcessorTest.java | 136 ++++++++++++++++-----
.../impl/EntitiesDescriptor-with-oidcmd.xml | 37 +++++-
2 files changed, 136 insertions(+), 37 deletions(-)
diff --git a/idp-oidc-extension-impl/src/test/java/org/geant/idpextension/oidc/metadata/impl/ClientInformationNodeProcessorTest.java b/idp-oidc-extension-impl/src/test/java/org/geant/idpextension/oidc/metadata/impl/ClientInformationNodeProcessorTest.java
index 98b065a7..12dc5af8 100644
--- a/idp-oidc-extension-impl/src/test/java/org/geant/idpextension/oidc/metadata/impl/ClientInformationNodeProcessorTest.java
+++ b/idp-oidc-extension-impl/src/test/java/org/geant/idpextension/oidc/metadata/impl/ClientInformationNodeProcessorTest.java
@@ -17,9 +17,12 @@
package org.geant.idpextension.oidc.metadata.impl;
import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.geant.idpextension.keyinfo.ext.impl.provider.ClientSecretProvider;
import org.geant.idpextension.keyinfo.ext.impl.provider.InlineJwksProvider;
@@ -39,34 +42,42 @@ import org.opensaml.xmlsec.keyinfo.impl.provider.DSAKeyValueProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.InlineX509DataProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.RSAKeyValueProvider;
import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import com.nimbusds.jose.EncryptionMethod;
+import com.nimbusds.jose.JWEAlgorithm;
+import com.nimbusds.jose.JWSAlgorithm;
+import com.nimbusds.jose.jwk.JWKSet;
+import com.nimbusds.oauth2.sdk.GrantType;
+import com.nimbusds.oauth2.sdk.ParseException;
+import com.nimbusds.oauth2.sdk.ResponseType;
+import com.nimbusds.oauth2.sdk.Scope;
+import com.nimbusds.oauth2.sdk.auth.ClientAuthenticationMethod;
+import com.nimbusds.openid.connect.sdk.SubjectType;
+import com.nimbusds.openid.connect.sdk.claims.ACR;
+import com.nimbusds.openid.connect.sdk.rp.ApplicationType;
import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
+import com.nimbusds.openid.connect.sdk.rp.OIDCClientMetadata;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
import net.shibboleth.utilities.java.support.resolver.ResolverException;
+/**
+ * Unit tests for {@link ClientInformationNodeProcessor}.
+ */
public class ClientInformationNodeProcessorTest extends XMLObjectBaseTestCase {
-
- private String mdFileName;
- private FilesystemMetadataResolver mdProvider;
-
- private PredicateRoleDescriptorResolver roleResolver;
-
- @BeforeMethod
- protected void setUp() throws Exception {
- mdFileName = "/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml";
+ protected RoleDescriptor parseRoleDescriptor(final String mdFileName)
+ throws ResolverException, ComponentInitializationException, URISyntaxException {
+ final URL mdURL = ClientInformationNodeProcessorTest.class.getResource(mdFileName);
+ final File mdFile = new File(mdURL.toURI());
- URL mdURL = ClientInformationNodeProcessorTest.class.getResource(mdFileName);
- File mdFile = new File(mdURL.toURI());
-
- mdProvider = new FilesystemMetadataResolver(mdFile);
+ final FilesystemMetadataResolver mdProvider = new FilesystemMetadataResolver(mdFile);
mdProvider.setParserPool(parserPool);
mdProvider.setId("test");
- NodeProcessingMetadataFilter filter = new NodeProcessingMetadataFilter();
- List<KeyInfoProvider> providers = new ArrayList<>();
+ final NodeProcessingMetadataFilter filter = new NodeProcessingMetadataFilter();
+ final List<KeyInfoProvider> providers = new ArrayList<>();
providers.add(new DSAKeyValueProvider());
providers.add(new RSAKeyValueProvider());
providers.add(new InlineX509DataProvider());
@@ -74,37 +85,100 @@ public class ClientInformationNodeProcessorTest extends XMLObjectBaseTestCase {
providers.add(new JWKSReferenceProvider());
providers.add(new ClientSecretProvider());
- List<MetadataNodeProcessor> processors = new ArrayList<>();
+ final List<MetadataNodeProcessor> processors = new ArrayList<>();
processors.add(new ClientInformationNodeProcessor(providers));
filter.setNodeProcessors(processors);
filter.initialize();
mdProvider.setMetadataFilter(filter);
mdProvider.initialize();
- roleResolver = new PredicateRoleDescriptorResolver(mdProvider);
+ final PredicateRoleDescriptorResolver roleResolver = new PredicateRoleDescriptorResolver(mdProvider);
roleResolver.initialize();
+ return roleResolver.resolveSingle(new CriteriaSet(
+ new EntityIdCriterion("mockSamlClientId"),
+ new EntityRoleCriterion(SPSSODescriptor.DEFAULT_ELEMENT_NAME),
+ new ProtocolCriterion("http://openid.net/specs/openid-connect-core-1_0.html")));
}
- // Success cases
-
- /**
- * Test valid index.
- * @throws ResolverException
- */
@Test
- public void testWithValidIndex() throws ResolverException {
- RoleDescriptor role = roleResolver.resolveSingle(new CriteriaSet(
- new EntityIdCriterion("mockSamlClientId"),
- new EntityRoleCriterion(SPSSODescriptor.DEFAULT_ELEMENT_NAME),
- new ProtocolCriterion("http://openid.net/specs/openid-connect-core-1_0.html")));
+ public void testParsedXMLMetadata() throws ResolverException, ComponentInitializationException,
+ URISyntaxException, ParseException {
+ final RoleDescriptor role =
+ parseRoleDescriptor("/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml");
Assert.assertNotNull(role);
+ Assert.assertTrue(role instanceof SPSSODescriptor);
final SPSSODescriptor sp = (SPSSODescriptor) role;
final List<OIDCClientInformation> clientInformations = sp.getObjectMetadata().get(OIDCClientInformation.class);
Assert.assertNotNull(clientInformations);
Assert.assertEquals(clientInformations.size(), 1);
- Assert.assertEquals(clientInformations.get(0).getID().getValue(), "mockSamlClientId");
- Assert.assertEquals(clientInformations.get(0).getOIDCMetadata().getRedirectionURIs().size(), 2);
+ final OIDCClientInformation clientInformation = clientInformations.get(0);
+ Assert.assertEquals(clientInformation.getID().getValue(), "mockSamlClientId");
+ final OIDCClientMetadata metadata = clientInformation.getOIDCMetadata();
+
+ Assert.assertEquals(metadata.getApplicationType(), ApplicationType.WEB);
+ Assert.assertEquals(metadata.getURI(), new URI("https://example.org/clientUri"));
+
+ final List<ACR> defaultAcrs = metadata.getDefaultACRs();
+ Assert.assertEquals(defaultAcrs.size(), 2);
+ Assert.assertTrue(defaultAcrs.contains(new ACR("password")));
+ Assert.assertTrue(defaultAcrs.contains(new ACR("mfa")));
+
+ final Set<GrantType> grantTypes = metadata.getGrantTypes();
+ Assert.assertEquals(grantTypes.size(), 1);
+ Assert.assertEquals(grantTypes.iterator().next(), GrantType.AUTHORIZATION_CODE);
+
+ Assert.assertEquals(metadata.getIDTokenJWEAlg(), JWEAlgorithm.A256KW);
+ Assert.assertEquals(metadata.getIDTokenJWEEnc(), EncryptionMethod.A256GCM);
+ Assert.assertEquals(metadata.getIDTokenJWSAlg(), JWSAlgorithm.RS512);
+
+ Assert.assertEquals(metadata.getInitiateLoginURI(), new URI("https://example.org/initiateLogin"));
+
+ final Set<URI> postLogoutUris = metadata.getPostLogoutRedirectionURIs();
+ Assert.assertEquals(postLogoutUris.size(), 1);
+ Assert.assertEquals(postLogoutUris.iterator().next(), new URI("https://example.org/postLogout"));
+
+ Assert.assertEquals(metadata.getRequestObjectJWEAlg(), JWEAlgorithm.A128KW);
+ Assert.assertEquals(metadata.getRequestObjectJWEEnc(), EncryptionMethod.A128GCM);
+ Assert.assertEquals(metadata.getRequestObjectJWSAlg(), JWSAlgorithm.RS256);
+
+ final Set<URI> requestUris = metadata.getRequestObjectURIs();
+ Assert.assertEquals(requestUris.size(), 1);
+ Assert.assertEquals(requestUris.iterator().next(), new URI("https://example.org/request"));
+
+ final Set<ResponseType> responseTypes = metadata.getResponseTypes();
+ Assert.assertEquals(responseTypes.size(), 2);
+ Assert.assertTrue(responseTypes.contains(ResponseType.parse("code")));
+ Assert.assertTrue(responseTypes.contains(ResponseType.parse("id_token")));
+
+ final Scope scope = metadata.getScope();
+ Assert.assertEquals(scope.size(), 2);
+ Assert.assertTrue(scope.contains("openid"));
+ Assert.assertTrue(scope.contains("profile"));
+
+ Assert.assertEquals(metadata.getSectorIDURI(), new URI("https://example.org/sectorIdentifier"));
+ Assert.assertEquals(metadata.getSoftwareID().getValue(), "mockSoftwareId");
+ Assert.assertEquals(metadata.getSoftwareVersion().getValue(), "mockSoftwareVersion");
+ Assert.assertEquals(metadata.getTokenEndpointAuthMethod(), ClientAuthenticationMethod.CLIENT_SECRET_BASIC);
+ Assert.assertEquals(metadata.getTokenEndpointAuthJWSAlg(), JWSAlgorithm.RS512);
+
+ Assert.assertEquals(metadata.getUserInfoJWEAlg(), JWEAlgorithm.A192KW);
+ Assert.assertEquals(metadata.getUserInfoJWEEnc(), EncryptionMethod.A192GCM);
+ Assert.assertEquals(metadata.getUserInfoJWSAlg(), JWSAlgorithm.RS384);
+
+ final JWKSet jwkSet = metadata.getJWKSet();
+ Assert.assertEquals(jwkSet.getKeys().size(), 4);
+ Assert.assertNotNull(jwkSet.getKeyByKeyId("mock"));
+ Assert.assertNotNull(jwkSet.getKeyByKeyId("mockRSA"));
+ Assert.assertNotNull(jwkSet.getKeyByKeyId("mockX509RSA"));
+ Assert.assertNotNull(jwkSet.getKeyByKeyId("mockX509EC"));
+
+ final Set<URI> redirectUris = metadata.getRedirectionURIs();
+ Assert.assertEquals(redirectUris.size(), 2);
+ Assert.assertTrue(redirectUris.contains(new URI("https://example.org/cb")));
+ Assert.assertTrue(redirectUris.contains(new URI("https://example.org/cb2")));
+
+ Assert.assertEquals(metadata.getSubjectType(), SubjectType.PAIRWISE);
}
}
diff --git a/idp-oidc-extension-impl/src/test/resources/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml b/idp-oidc-extension-impl/src/test/resources/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml
index ef0a2153..d813391a 100644
--- a/idp-oidc-extension-impl/src/test/resources/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml
+++ b/idp-oidc-extension-impl/src/test/resources/org/geant/idpextension/oidc/metadata/impl/EntitiesDescriptor-with-oidcmd.xml
@@ -6,6 +6,7 @@
<md:SPSSODescriptor xmlns:oidcmd="urn:mace:shibboleth:metadata:oidc:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" protocolSupportEnumeration="http://openid.net/specs/openid-connect-core-1_0.html">
<md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:KeyName>mockX509RSA</ds:KeyName>
<ds:X509Data>
<ds:X509Certificate>
MIIEQDCCAqigAwIBAgIVAIarXvdvyS47KJR7U40FlTufyD8vMA0GCSqGSIb3DQEB
@@ -35,8 +36,8 @@
</ds:KeyInfo>
</md:KeyDescriptor>
<md:KeyDescriptor use="signing">
- <ds:KeyInfo
- xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:KeyName>mockX509EC</ds:KeyName>
<ds:X509Data>
<ds:X509Certificate>
MIIBKDCBzgIJAOYlspXlaqguMAoGCCqGSM49BAMCMBwxCzAJBgNVBAYTAkZJMQ0w
@@ -51,7 +52,7 @@
</md:KeyDescriptor>
<md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
- <ds:KeyName>Foo</ds:KeyName>
+ <ds:KeyName>mockRSA</ds:KeyName>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>
@@ -93,12 +94,32 @@
</md:KeyDescriptor>
<md:Extensions>
<oidcmd:OAuthRPExtensions>
+ <oidcmd:ApplicationType>web</oidcmd:ApplicationType>
+ <oidcmd:ClientUri>https://example.org/clientUri</oidcmd:ClientUri>
+ <oidcmd:DefaultAcrValue>password</oidcmd:DefaultAcrValue>
+ <oidcmd:DefaultAcrValue>mfa</oidcmd:DefaultAcrValue>
<oidcmd:GrantType>authorization_code</oidcmd:GrantType>
+ <oidcmd:IdTokenEncryptionResponseAlg>A256KW</oidcmd:IdTokenEncryptionResponseAlg>
+ <oidcmd:IdTokenEncryptionResponseEnc>A256GCM</oidcmd:IdTokenEncryptionResponseEnc>
+ <oidcmd:IdTokenSignedResponseAlg>RS512</oidcmd:IdTokenSignedResponseAlg>
+ <oidcmd:InitiateLoginUri>https://example.org/initiateLogin</oidcmd:InitiateLoginUri>
+ <oidcmd:PostLogoutRedirectUri>https://example.org/postLogout</oidcmd:PostLogoutRedirectUri>
+ <oidcmd:RequestObjectEncryptionResponseAlg>A128KW</oidcmd:RequestObjectEncryptionResponseAlg>
+ <oidcmd:RequestObjectEncryptionResponseEnc>A128GCM</oidcmd:RequestObjectEncryptionResponseEnc>
+ <oidcmd:RequestObjectSignedResponseAlg>RS256</oidcmd:RequestObjectSignedResponseAlg>
+ <oidcmd:RequestUri>https://example.org/request</oidcmd:RequestUri>
<oidcmd:ResponseType>code</oidcmd:ResponseType>
- <oidcmd:ApplicationType>web</oidcmd:ApplicationType>
- <oidcmd:TokenEndpointAuthMethod>client_secret_basic</oidcmd:TokenEndpointAuthMethod>
+ <oidcmd:ResponseType>id_token</oidcmd:ResponseType>
<oidcmd:Scope>openid</oidcmd:Scope>
<oidcmd:Scope>profile</oidcmd:Scope>
+ <oidcmd:SectorIdentifierUri>https://example.org/sectorIdentifier</oidcmd:SectorIdentifierUri>
+ <oidcmd:SoftwareId>mockSoftwareId</oidcmd:SoftwareId>
+ <oidcmd:SoftwareVersion>mockSoftwareVersion</oidcmd:SoftwareVersion>
+ <oidcmd:TokenEndpointAuthMethod>client_secret_basic</oidcmd:TokenEndpointAuthMethod>
+ <oidcmd:TokenEndpointAuthSigningAlg>RS512</oidcmd:TokenEndpointAuthSigningAlg>
+ <oidcmd:UserInfoEncryptionResponseAlg>A192KW</oidcmd:UserInfoEncryptionResponseAlg>
+ <oidcmd:UserInfoEncryptionResponseEnc>A192GCM</oidcmd:UserInfoEncryptionResponseEnc>
+ <oidcmd:UserInfoSignedResponseAlg>RS384</oidcmd:UserInfoSignedResponseAlg>
</oidcmd:OAuthRPExtensions>
</md:Extensions>
<md:AssertionConsumerService
@@ -109,7 +130,11 @@
Binding="http://csc.fi/ns/profiles/oidc/sso/browser"
Location="https://example.org/cb2"
index="2"/>
- <md:NameIDFormat>public</md:NameIDFormat>
+ <md:AssertionConsumerService
+ Binding="http://example.org/not/supported/profile/id"
+ Location="https://example.org/cb3"
+ index="3"/>
+ <md:NameIDFormat>pairwise</md:NameIDFormat>
</md:SPSSODescriptor>
</md:EntityDescriptor>
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list