diff options
Diffstat (limited to 'src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs')
-rw-r--r-- | src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs | 142 |
1 files changed, 107 insertions, 35 deletions
diff --git a/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs b/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs index 825ef58..cfa9cca 100644 --- a/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs +++ b/src/DotNetOpenId.Test/Extensions/ExtensionTestBase.cs @@ -1,56 +1,128 @@ using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using DotNetOpenId.Extensions;
+using DotNetOpenId.Extensions.AttributeExchange;
+using DotNetOpenId.Extensions.ProviderAuthenticationPolicy;
+using DotNetOpenId.Extensions.SimpleRegistration;
using DotNetOpenId.RelyingParty;
using NUnit.Framework;
-using System.Net;
-using DotNetOpenId.Extensions;
-using System.IO;
-using System.Diagnostics;
-using System.Web;
+using OPRequest = DotNetOpenId.Provider.IAuthenticationRequest;
+using SregDemandLevel = DotNetOpenId.Extensions.SimpleRegistration.DemandLevel;
+using PapeConstants = DotNetOpenId.Extensions.ProviderAuthenticationPolicy.Constants;
namespace DotNetOpenId.Test.Extensions {
public class ExtensionTestBase {
- protected IRelyingPartyApplicationStore AppStore;
protected const ProtocolVersion Version = ProtocolVersion.V20;
+ Dictionary<string, AttributeValues> storedAttributes;
[SetUp]
public virtual void Setup() {
- AppStore = new ApplicationMemoryStore();
+ storedAttributes = new Dictionary<string, AttributeValues>();
+ }
+
+ [TearDown]
+ public virtual void TearDown() {
+ Mocks.MockHttpRequest.Reset();
}
- protected T ParameterizedTest<T>(Identifier identityUrl, IExtensionRequest extension)
+ protected T ParameterizedTest<T>(TestSupport.Scenarios scenario, ProtocolVersion version, IExtensionRequest extension)
where T : IExtensionResponse, new() {
- Debug.Assert(identityUrl != null);
- var returnTo = TestSupport.GetFullUrl(TestSupport.ConsumerPage);
- var realm = new Realm(TestSupport.GetFullUrl(TestSupport.ConsumerPage).AbsoluteUri);
- var consumer = new OpenIdRelyingParty(AppStore, null, null);
- var request = consumer.CreateRequest(identityUrl, realm, returnTo);
+ var rpRequest = TestSupport.CreateRelyingPartyRequest(false, scenario, version);
if (extension != null)
- request.AddExtension(extension);
-
- HttpWebRequest providerRequest = (HttpWebRequest)WebRequest.Create(request.RedirectingResponse.ExtractUrl());
- providerRequest.AllowAutoRedirect = false;
- Uri redirectUrl;
- try {
- using (HttpWebResponse providerResponse = (HttpWebResponse)providerRequest.GetResponse()) {
- Assert.AreEqual(HttpStatusCode.Redirect, providerResponse.StatusCode);
- redirectUrl = new Uri(providerResponse.Headers[HttpResponseHeader.Location]);
- }
- } catch (WebException ex) {
- Trace.WriteLine(ex);
- if (ex.Response != null) {
- using (StreamReader sr = new StreamReader(ex.Response.GetResponseStream())) {
- Trace.WriteLine(sr.ReadToEnd());
+ rpRequest.AddExtension(extension);
+
+ var response = TestSupport.CreateRelyingPartyResponseThroughProvider(rpRequest, request => {
+ TestSupport.SetAuthenticationFromScenario(scenario, request);
+ ExtensionsResponder(request);
+ });
+ Assert.AreEqual(AuthenticationStatus.Authenticated, response.Status);
+ return response.GetExtension<T>();
+ }
+
+ const string nicknameTypeUri = WellKnownAttributes.Name.Alias;
+ const string emailTypeUri = WellKnownAttributes.Contact.Email;
+
+ private void ExtensionsResponder(OPRequest request) {
+ var sregRequest = request.GetExtension<ClaimsRequest>();
+ var sregResponse = sregRequest != null ? sregRequest.CreateResponse() : null;
+ var aeFetchRequest = request.GetExtension<FetchRequest>();
+ var aeFetchResponse = new FetchResponse();
+ var aeStoreRequest = request.GetExtension<StoreRequest>();
+ var aeStoreResponse = new StoreResponse();
+ var papeRequest = request.GetExtension<PolicyRequest>();
+ var papeResponse = new PolicyResponse();
+
+ TestSupport.Scenarios scenario = (TestSupport.Scenarios)Enum.Parse(typeof(TestSupport.Scenarios),
+ new Uri(request.LocalIdentifier).AbsolutePath.TrimStart('/'));
+ switch (scenario) {
+ case TestSupport.Scenarios.ExtensionFullCooperation:
+ if (sregRequest != null) {
+ if (sregRequest.FullName != SregDemandLevel.NoRequest)
+ sregResponse.FullName = "Andrew Arnott";
+ if (sregRequest.Email != SregDemandLevel.NoRequest)
+ sregResponse.Email = "andrewarnott@gmail.com";
+ }
+ if (aeFetchRequest != null) {
+ var att = aeFetchRequest.GetAttribute(nicknameTypeUri);
+ if (att != null)
+ aeFetchResponse.AddAttribute(att.Respond("Andrew"));
+ att = aeFetchRequest.GetAttribute(emailTypeUri);
+ if (att != null) {
+ string[] emails = new[] { "a@a.com", "b@b.com" };
+ string[] subset = new string[Math.Min(emails.Length, att.Count)];
+ Array.Copy(emails, subset, subset.Length);
+ aeFetchResponse.AddAttribute(att.Respond(subset));
+ }
+ foreach (var att2 in aeFetchRequest.Attributes) {
+ if (storedAttributes.ContainsKey(att2.TypeUri))
+ aeFetchResponse.AddAttribute(storedAttributes[att2.TypeUri]);
+ }
+ }
+ if (papeRequest != null) {
+ if (papeRequest.MaximumAuthenticationAge.HasValue) {
+ papeResponse.AuthenticationTimeUtc = DateTime.UtcNow - (papeRequest.MaximumAuthenticationAge.Value - TimeSpan.FromSeconds(30));
+ }
+ if (papeRequest.PreferredAuthLevelTypes.Contains(PapeConstants.AuthenticationLevels.NistTypeUri)) {
+ papeResponse.NistAssuranceLevel = NistAssuranceLevel.Level1;
+ }
}
+ break;
+ case TestSupport.Scenarios.ExtensionPartialCooperation:
+ if (sregRequest != null) {
+ if (sregRequest.FullName == SregDemandLevel.Require)
+ sregResponse.FullName = "Andrew Arnott";
+ if (sregRequest.Email == SregDemandLevel.Require)
+ sregResponse.Email = "andrewarnott@gmail.com";
+ }
+ if (aeFetchRequest != null) {
+ var att = aeFetchRequest.GetAttribute(nicknameTypeUri);
+ if (att != null && att.IsRequired)
+ aeFetchResponse.AddAttribute(att.Respond("Andrew"));
+ att = aeFetchRequest.GetAttribute(emailTypeUri);
+ if (att != null && att.IsRequired) {
+ string[] emails = new[] { "a@a.com", "b@b.com" };
+ string[] subset = new string[Math.Min(emails.Length, att.Count)];
+ Array.Copy(emails, subset, subset.Length);
+ aeFetchResponse.AddAttribute(att.Respond(subset));
+ }
+ foreach (var att2 in aeFetchRequest.Attributes) {
+ if (att2.IsRequired && storedAttributes.ContainsKey(att2.TypeUri))
+ aeFetchResponse.AddAttribute(storedAttributes[att2.TypeUri]);
+ }
+ }
+ break;
+ }
+ if (aeStoreRequest != null) {
+ foreach (var att in aeStoreRequest.Attributes) {
+ storedAttributes[att.TypeUri] = att;
}
- throw;
+ aeStoreResponse.Succeeded = true;
}
- consumer = new OpenIdRelyingParty(AppStore, redirectUrl, HttpUtility.ParseQueryString(redirectUrl.Query));
- Assert.AreEqual(AuthenticationStatus.Authenticated, consumer.Response.Status);
- Assert.AreEqual(identityUrl, consumer.Response.ClaimedIdentifier);
- return consumer.Response.GetExtension<T>();
+
+ if (sregRequest != null) request.AddResponseExtension(sregResponse);
+ if (aeFetchRequest != null) request.AddResponseExtension(aeFetchResponse);
+ if (aeStoreRequest != null) request.AddResponseExtension(aeStoreResponse);
+ if (papeRequest != null) request.AddResponseExtension(papeResponse);
}
}
}
|