diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2008-12-21 18:13:08 -0800 |
---|---|---|
committer | Andrew <andrewarnott@gmail.com> | 2008-12-21 18:13:08 -0800 |
commit | 794143c7bf52f24a11a7c0e1be7efca431715e25 (patch) | |
tree | 7796e4cc433b22fe420ce47389e07eaa5e296256 | |
parent | 08ab45d4b14b9360cfe2ad9b667cf7c0acf86c98 (diff) | |
download | DotNetOpenAuth-794143c7bf52f24a11a7c0e1be7efca431715e25.zip DotNetOpenAuth-794143c7bf52f24a11a7c0e1be7efca431715e25.tar.gz DotNetOpenAuth-794143c7bf52f24a11a7c0e1be7efca431715e25.tar.bz2 |
Added a mock extension and test in order to focus the test on the extension binding element.
7 files changed, 202 insertions, 65 deletions
diff --git a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj index 8a4b8af..997f7ef 100644 --- a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj +++ b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj @@ -80,6 +80,7 @@ <Compile Include="Mocks\InMemoryTokenManager.cs" />
<Compile Include="Mocks\MockHttpRequest.cs" />
<Compile Include="Mocks\MockIdentifier.cs" />
+ <Compile Include="Mocks\MockOpenIdExtension.cs" />
<Compile Include="Mocks\MockTransformationBindingElement.cs" />
<Compile Include="Mocks\MockReplayProtectionBindingElement.cs" />
<Compile Include="Mocks\TestBaseMessage.cs" />
@@ -104,6 +105,7 @@ <Compile Include="OpenId\AssociationsTests.cs" />
<Compile Include="OpenId\AssociationTests.cs" />
<Compile Include="OpenId\AuthenticationTests.cs" />
+ <Compile Include="OpenId\ChannelElements\ExtensionsBindingElementTests.cs" />
<Compile Include="OpenId\ChannelElements\KeyValueFormEncodingTests.cs" />
<Compile Include="Messaging\Bindings\StandardReplayProtectionBindingElementTests.cs" />
<None Include="OpenId\Extensions\ClaimsResponseTests.cs" />
diff --git a/src/DotNetOpenAuth.Test/Mocks/MockOpenIdExtension.cs b/src/DotNetOpenAuth.Test/Mocks/MockOpenIdExtension.cs new file mode 100644 index 0000000..915fbc3 --- /dev/null +++ b/src/DotNetOpenAuth.Test/Mocks/MockOpenIdExtension.cs @@ -0,0 +1,91 @@ +//-----------------------------------------------------------------------
+// <copyright file="MockOpenIdExtension.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.Test.Mocks {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using DotNetOpenAuth.Messaging;
+ using DotNetOpenAuth.OpenId.Messages;
+ using DotNetOpenAuth.OpenId.Extensions;
+
+ internal class MockOpenIdExtension : IOpenIdMessageExtension {
+ private IDictionary<string, string> extraData = new Dictionary<string, string>();
+ private const string MockTypeUri = "http://mockextension";
+
+ internal static readonly OpenIdExtensionFactory.CreateDelegate Factory = (typeUri, data, baseMessage) => {
+ if (typeUri == MockTypeUri) {
+ return new MockOpenIdExtension();
+ }
+
+ return null;
+ };
+
+ internal MockOpenIdExtension() {
+ }
+
+ internal MockOpenIdExtension(string partValue, string extraValue) {
+ this.Part = partValue;
+ this.Data = extraValue;
+ }
+
+ #region IOpenIdMessageExtension Members
+
+ public string TypeUri {
+ get { return MockTypeUri; }
+ }
+
+ public IEnumerable<string> AdditionalSupportedTypeUris {
+ get { return Enumerable.Empty<string>(); }
+ }
+
+ #endregion
+
+ #region IMessage Members
+
+ public Version Version {
+ get { return new Version(1, 0); }
+ }
+
+ public IDictionary<string, string> ExtraData {
+ get { return this.extraData; }
+ }
+
+ public void EnsureValidMessage() {
+ }
+
+ #endregion
+
+ public override bool Equals(object obj) {
+ MockOpenIdExtension other = obj as MockOpenIdExtension;
+ if (other == null) {
+ return false;
+ }
+
+ return this.Part.EqualsNullSafe(other.Part) &&
+ this.Data.EqualsNullSafe(other.Data);
+ }
+
+ public override int GetHashCode() {
+ return 1; // mock doesn't need a good hash code algorithm
+ }
+
+ [MessagePart]
+ internal string Part { get; set; }
+
+ internal string Data {
+ get {
+ string data;
+ this.extraData.TryGetValue("data", out data);
+ return data;
+ }
+
+ set {
+ this.extraData["data"] = value;
+ }
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth.Test/OpenId/ChannelElements/ExtensionsBindingElementTests.cs b/src/DotNetOpenAuth.Test/OpenId/ChannelElements/ExtensionsBindingElementTests.cs new file mode 100644 index 0000000..539b07d --- /dev/null +++ b/src/DotNetOpenAuth.Test/OpenId/ChannelElements/ExtensionsBindingElementTests.cs @@ -0,0 +1,36 @@ +//-----------------------------------------------------------------------
+// <copyright file="ExtensionsBindingElementTests.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.Test.OpenId.ChannelElements {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+ using DotNetOpenAuth.OpenId.Messages;
+ using DotNetOpenAuth.Test.Mocks;
+ using DotNetOpenAuth.Test.OpenId.Extensions;
+ using DotNetOpenAuth.OpenId;
+ using DotNetOpenAuth.OpenId.Extensions;
+
+ [TestClass]
+ public class ExtensionsBindingElementTests : OpenIdTestBase {
+ [TestInitialize]
+ public override void SetUp() {
+ base.SetUp();
+ }
+
+ [TestMethod]
+ public void ExtensionTransportTest() {
+ IOpenIdMessageExtension request = new MockOpenIdExtension("requestPart", "requestData");
+ IOpenIdMessageExtension response = new MockOpenIdExtension("responsePart", "responseData");
+ ExtensionTestUtilities.Roundtrip(
+ Protocol.Default,
+ new IOpenIdMessageExtension[] { request },
+ new IOpenIdMessageExtension[] { response });
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth.Test/OpenId/Extensions/ExtensionTestBase.cs b/src/DotNetOpenAuth.Test/OpenId/Extensions/ExtensionTestBase.cs index 95026d4..b47ff55 100644 --- a/src/DotNetOpenAuth.Test/OpenId/Extensions/ExtensionTestBase.cs +++ b/src/DotNetOpenAuth.Test/OpenId/Extensions/ExtensionTestBase.cs @@ -14,28 +14,24 @@ namespace DotNetOpenAuth.Test.OpenId.Extensions { using DotNetOpenAuth.OpenId.Messages;
using DotNetOpenAuth.Test.Messaging;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+ using DotNetOpenAuth.OpenId.ChannelElements;
+ using DotNetOpenAuth.OpenId.Extensions;
- public class ExtensionTestBase : OpenIdTestBase {
- protected const ProtocolVersion Version = ProtocolVersion.V20;
-
- [TestInitialize]
- public override void SetUp() {
- base.SetUp();
- }
-
- internal void Roundtrip(
+ public static class ExtensionTestUtilities {
+ internal static void Roundtrip(
Protocol protocol,
IEnumerable<IOpenIdMessageExtension> requests,
IEnumerable<IOpenIdMessageExtension> responses) {
Association association = HmacShaAssociation.Create(protocol, protocol.Args.SignatureAlgorithm.Best, AssociationRelyingPartyType.Smart);
var coordinator = new OpenIdCoordinator(
rp => {
- var requestBase = new CheckIdRequest(protocol.Version, ProviderUri, true);
- rp.AssociationStore.StoreAssociation(ProviderUri, association);
+ RegisterExtension(rp.Channel, Mocks.MockOpenIdExtension.Factory);
+ var requestBase = new CheckIdRequest(protocol.Version, OpenIdTestBase.ProviderUri, true);
+ rp.AssociationStore.StoreAssociation(OpenIdTestBase.ProviderUri, association);
requestBase.AssociationHandle = association.Handle;
requestBase.ClaimedIdentifier = "http://claimedid";
requestBase.LocalIdentifier = "http://localid";
- requestBase.ReturnTo = RPUri;
+ requestBase.ReturnTo = OpenIdTestBase.RPUri;
foreach (IOpenIdMessageExtension extension in requests) {
requestBase.Extensions.Add(extension);
@@ -48,6 +44,7 @@ namespace DotNetOpenAuth.Test.OpenId.Extensions { CollectionAssert<IOpenIdMessageExtension>.AreEquivalentByEquality(responses.ToArray(), receivedResponses.ToArray());
},
op => {
+ RegisterExtension(op.Channel, Mocks.MockOpenIdExtension.Factory);
op.AssociationStore.StoreAssociation(AssociationRelyingPartyType.Smart, association);
var request = op.Channel.ReadFromRequest<CheckIdRequest>();
var response = new PositiveAssertionResponse(request);
@@ -62,5 +59,12 @@ namespace DotNetOpenAuth.Test.OpenId.Extensions { });
coordinator.Run();
}
+
+ internal static void RegisterExtension(Channel channel, OpenIdExtensionFactory.CreateDelegate extensionFactory) {
+ ErrorUtilities.VerifyArgumentNotNull(channel, "channel");
+
+ OpenIdExtensionFactory factory = (OpenIdExtensionFactory)channel.BindingElements.OfType<ExtensionsBindingElement>().Single().ExtensionFactory;
+ factory.RegisterExtension(extensionFactory);
+ }
}
}
diff --git a/src/DotNetOpenAuth.Test/OpenId/Extensions/SimpleRegistrationTests.cs b/src/DotNetOpenAuth.Test/OpenId/Extensions/SimpleRegistrationTests.cs index c41ccb8..055bb80 100644 --- a/src/DotNetOpenAuth.Test/OpenId/Extensions/SimpleRegistrationTests.cs +++ b/src/DotNetOpenAuth.Test/OpenId/Extensions/SimpleRegistrationTests.cs @@ -15,13 +15,13 @@ namespace DotNetOpenAuth.Test.OpenId.Extensions { using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
- public class SimpleRegistrationTests : ExtensionTestBase {
+ public class SimpleRegistrationTests : OpenIdTestBase {
[TestMethod]
public void Simple() {
ClaimsRequest request = new ClaimsRequest() { Nickname = DemandLevel.Request };
ClaimsResponse response = new ClaimsResponse(Constants.sreg_ns);
response.Nickname = "Andrew";
- Roundtrip(Protocol.Default, new[] { request }, new[] { response });
+ ExtensionTestUtilities.Roundtrip(Protocol.Default, new[] { request }, new[] { response });
}
////[TestMethod]
diff --git a/src/DotNetOpenAuth.Test/OpenId/OpenIdTestBase.cs b/src/DotNetOpenAuth.Test/OpenId/OpenIdTestBase.cs index 2a1b7bd..4708a2c 100644 --- a/src/DotNetOpenAuth.Test/OpenId/OpenIdTestBase.cs +++ b/src/DotNetOpenAuth.Test/OpenId/OpenIdTestBase.cs @@ -1,39 +1,39 @@ -//----------------------------------------------------------------------- -// <copyright file="OpenIdTestBase.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -namespace DotNetOpenAuth.Test.OpenId { - using System; - using DotNetOpenAuth.Configuration; - using DotNetOpenAuth.Messaging; - using DotNetOpenAuth.OpenId.Provider; - using DotNetOpenAuth.OpenId.RelyingParty; - using DotNetOpenAuth.Test.Mocks; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - public class OpenIdTestBase : TestBase { - internal IDirectSslWebRequestHandler RequestHandler; - - internal MockHttpRequest MockResponder; - - protected static readonly Uri ProviderUri = new Uri("http://provider"); - protected static readonly Uri RPUri = new Uri("http://rp"); - - protected RelyingPartySecuritySettings RelyingPartySecuritySettings { get; private set; } - - protected ProviderSecuritySettings ProviderSecuritySettings { get; private set; } - - [TestInitialize] - public override void SetUp() { - base.SetUp(); - - this.RelyingPartySecuritySettings = RelyingPartySection.Configuration.SecuritySettings.CreateSecuritySettings(); - this.ProviderSecuritySettings = ProviderSection.Configuration.SecuritySettings.CreateSecuritySettings(); - - this.MockResponder = MockHttpRequest.CreateUntrustedMockHttpHandler(); - this.RequestHandler = this.MockResponder.MockWebRequestHandler; - } - } -} +//-----------------------------------------------------------------------
+// <copyright file="OpenIdTestBase.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.Test.OpenId {
+ using System;
+ using DotNetOpenAuth.Configuration;
+ using DotNetOpenAuth.Messaging;
+ using DotNetOpenAuth.OpenId.Provider;
+ using DotNetOpenAuth.OpenId.RelyingParty;
+ using DotNetOpenAuth.Test.Mocks;
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ public class OpenIdTestBase : TestBase {
+ internal IDirectSslWebRequestHandler RequestHandler;
+
+ internal MockHttpRequest MockResponder;
+
+ protected internal static readonly Uri ProviderUri = new Uri("http://provider");
+ protected internal static readonly Uri RPUri = new Uri("http://rp");
+
+ protected RelyingPartySecuritySettings RelyingPartySecuritySettings { get; private set; }
+
+ protected ProviderSecuritySettings ProviderSecuritySettings { get; private set; }
+
+ [TestInitialize]
+ public override void SetUp() {
+ base.SetUp();
+
+ this.RelyingPartySecuritySettings = RelyingPartySection.Configuration.SecuritySettings.CreateSecuritySettings();
+ this.ProviderSecuritySettings = ProviderSection.Configuration.SecuritySettings.CreateSecuritySettings();
+
+ this.MockResponder = MockHttpRequest.CreateUntrustedMockHttpHandler();
+ this.RequestHandler = this.MockResponder.MockWebRequestHandler;
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth/OpenId/ChannelElements/ExtensionsBindingElement.cs b/src/DotNetOpenAuth/OpenId/ChannelElements/ExtensionsBindingElement.cs index 0ee03cf..943cafe 100644 --- a/src/DotNetOpenAuth/OpenId/ChannelElements/ExtensionsBindingElement.cs +++ b/src/DotNetOpenAuth/OpenId/ChannelElements/ExtensionsBindingElement.cs @@ -20,17 +20,12 @@ namespace DotNetOpenAuth.OpenId.ChannelElements { /// </summary>
internal class ExtensionsBindingElement : IChannelBindingElement {
/// <summary>
- /// The extension factory.
- /// </summary>
- private readonly IOpenIdExtensionFactory extensionFactory;
-
- /// <summary>
/// Initializes a new instance of the <see cref="ExtensionsBindingElement"/> class.
/// </summary>
/// <param name="extensionFactory">The extension factory.</param>
internal ExtensionsBindingElement(IOpenIdExtensionFactory extensionFactory) {
ErrorUtilities.VerifyArgumentNotNull(extensionFactory, "extensionFactory");
- this.extensionFactory = extensionFactory;
+ this.ExtensionFactory = extensionFactory;
}
#region IChannelBindingElement Members
@@ -45,6 +40,11 @@ namespace DotNetOpenAuth.OpenId.ChannelElements { public Channel Channel { get; set; }
/// <summary>
+ /// The extension factory.
+ /// </summary>
+ public IOpenIdExtensionFactory ExtensionFactory { get; private set; }
+
+ /// <summary>
/// Gets the protection offered (if any) by this binding element.
/// </summary>
/// <value><see cref="MessageProtections.None"/></value>
@@ -127,13 +127,17 @@ namespace DotNetOpenAuth.OpenId.ChannelElements { var extensionData = extensionManager.GetExtensionArguments(typeUri);
// Initialize this particular extension.
- IOpenIdMessageExtension extension = this.extensionFactory.Create(typeUri, extensionData, extendableMessage);
- MessageDictionary extensionDictionary = new MessageDictionary(extension);
- foreach (var pair in extensionData) {
- extensionDictionary[pair.Key] = pair.Value;
- }
+ IOpenIdMessageExtension extension = this.ExtensionFactory.Create(typeUri, extensionData, extendableMessage);
+ if (extension != null) {
+ MessageDictionary extensionDictionary = new MessageDictionary(extension);
+ foreach (var pair in extensionData) {
+ extensionDictionary[pair.Key] = pair.Value;
+ }
- extendableMessage.Extensions.Add(extension);
+ extendableMessage.Extensions.Add(extension);
+ } else {
+ Logger.WarnFormat("Extension with type URI '{0}' ignored because it is not a recognized extension.", typeUri);
+ }
}
return true;
|