//----------------------------------------------------------------------- // // Copyright (c) Andrew Arnott. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOpenAuth.Test.OpenId.Extensions { using System.Collections.Generic; using System.Linq; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OpenId; using DotNetOpenAuth.OpenId.ChannelElements; using DotNetOpenAuth.OpenId.Extensions; using DotNetOpenAuth.OpenId.Messages; using DotNetOpenAuth.OpenId.Provider; using DotNetOpenAuth.OpenId.RelyingParty; using DotNetOpenAuth.Test.Messaging; public static class ExtensionTestUtilities { /// /// Simulates an extension request and response. /// /// The protocol to use in the roundtripping. /// The extensions to add to the request message. /// The extensions to add to the response message. /// /// This method relies on the extension objects' Equals methods to verify /// accurate transport. The Equals methods should be verified by separate tests. /// internal static void Roundtrip( Protocol protocol, IEnumerable requests, IEnumerable responses) { ProviderSecuritySettings securitySettings = new ProviderSecuritySettings(); Association association = HmacShaAssociation.Create(protocol, protocol.Args.SignatureAlgorithm.Best, AssociationRelyingPartyType.Smart, securitySettings); var coordinator = new OpenIdCoordinator( rp => { RegisterExtension(rp.Channel, Mocks.MockOpenIdExtension.Factory); var requestBase = new CheckIdRequest(protocol.Version, OpenIdTestBase.ProviderUri, AuthenticationRequestMode.Immediate); TestSupport.StoreAssociation(rp, OpenIdTestBase.ProviderUri, association); requestBase.AssociationHandle = association.Handle; requestBase.ClaimedIdentifier = "http://claimedid"; requestBase.LocalIdentifier = "http://localid"; requestBase.ReturnTo = OpenIdTestBase.RPUri; foreach (IOpenIdMessageExtension extension in requests) { requestBase.Extensions.Add(extension); } rp.Channel.Send(requestBase); var response = rp.Channel.ReadFromRequest(); var receivedResponses = response.Extensions.Cast(); CollectionAssert.AreEquivalentByEquality(responses.ToArray(), receivedResponses.ToArray()); }, op => { RegisterExtension(op.Channel, Mocks.MockOpenIdExtension.Factory); op.AssociationStore.StoreAssociation(AssociationRelyingPartyType.Smart, association); var request = op.Channel.ReadFromRequest(); var response = new PositiveAssertionResponse(request); var receivedRequests = request.Extensions.Cast(); CollectionAssert.AreEquivalentByEquality(requests.ToArray(), receivedRequests.ToArray()); foreach (var extensionResponse in responses) { response.Extensions.Add(extensionResponse); } op.Channel.Send(response); }); coordinator.Run(); } internal static void RegisterExtension(Channel channel, OpenIdExtensionFactory.CreateDelegate extensionFactory) { ErrorUtilities.VerifyArgumentNotNull(channel, "channel"); OpenIdExtensionFactory factory = (OpenIdExtensionFactory)channel.BindingElements.OfType().Single().ExtensionFactory; factory.RegisterExtension(extensionFactory); } } }