Skip to content
This repository has been archived by the owner on Mar 20, 2019. It is now read-only.

Commit

Permalink
More work on mocked HTTP requests.
Browse files Browse the repository at this point in the history
  • Loading branch information
AArnott committed Aug 7, 2008
1 parent 6590338 commit 982eda4
Show file tree
Hide file tree
Showing 10 changed files with 85 additions and 47 deletions.
12 changes: 12 additions & 0 deletions src/DotNetOpenId.Test/Discovery/rp_xrds.xml
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="1">
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
<URI>http://localhost/RelyingParty.aspx</URI>
</Service>
</XRD>
</xrds:XRDS>
9 changes: 9 additions & 0 deletions src/DotNetOpenId.Test/Discovery/rprealmdiscovery.html
@@ -0,0 +1,9 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="X-XRDS-Location" content="http://localhost/Discovery/rp_xrds.xml"/>
</head>
<body>

</body>
</html>
2 changes: 2 additions & 0 deletions src/DotNetOpenId.Test/DotNetOpenId.Test.csproj
Expand Up @@ -98,6 +98,8 @@
</ItemGroup>
<ItemGroup>
<Content Include="dhpriv.txt" />
<Content Include="Discovery\rp_xrds.xml" />
<EmbeddedResource Include="Discovery\rprealmdiscovery.html" />
<EmbeddedResource Include="Discovery\htmldiscovery\html1020.html" />
<EmbeddedResource Include="Discovery\htmldiscovery\html10both.html" />
<EmbeddedResource Include="Discovery\htmldiscovery\html10del.html" />
Expand Down
7 changes: 6 additions & 1 deletion src/DotNetOpenId.Test/Mocks/MockHttpRequest.cs
Expand Up @@ -20,7 +20,7 @@ class MockHttpRequest {
response.ResponseStream.Seek(0, SeekOrigin.Begin);
return response;
} else {
Assert.Fail("Unexpected HTTP request: {0}", uri);
//Assert.Fail("Unexpected HTTP request: {0}", uri);
return new UntrustedWebResponse(uri, uri, new WebHeaderCollection(), HttpStatusCode.NotFound,
"text/html", null, new MemoryStream());
}
Expand Down Expand Up @@ -113,5 +113,10 @@ class MockHttpRequest {
);
RegisterMockXrdsResponse(identityEndpoint);
}
internal static Identifier RegisterMockXrdsResponse(string embeddedResourcePath) {
UriIdentifier id = TestSupport.GetFullUrl(embeddedResourcePath);
RegisterMockResponse(id, "application/xrds+xml", TestSupport.LoadEmbeddedFile(embeddedResourcePath));
return id;
}
}
}
27 changes: 13 additions & 14 deletions src/DotNetOpenId.Test/Provider/IAuthenticationRequestTest.cs
Expand Up @@ -15,22 +15,21 @@ public class IAuthenticationRequestTest {
UntrustedWebRequest.WhitelistHosts.Add("localhost");
}

[Test, ExpectedException(typeof(WebException), UserMessage = "OP should throw WebException when return URL is unverifiable.")]
public void UnverifiableReturnUrl() {
Uri returnTo;
Realm realm;
getUnverifiableRP(out returnTo, out realm);
var consumer = TestSupport.CreateRelyingParty(null);
var request = consumer.CreateRequest(TestSupport.GetMockIdentifier(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20), realm, returnTo);
WebRequest.Create(request.RedirectingResponse.ExtractUrl()).GetResponse(); // the OP should return 500, causing exception here.
[TearDown]
public void TearDown() {
Mocks.MockHttpRequest.Reset();
}

static void getUnverifiableRP(out Uri returnTo, out Realm realm) {
var disableDiscovery = new Dictionary<string, string> {
{"AllowRPDiscovery", "false"},
};
returnTo = TestSupport.GetFullUrl(TestSupport.ConsumerPage, disableDiscovery);
realm = new Realm(returnTo);
[Test]
public void UnverifiableReturnUrl() {
var request = TestSupport.CreateRelyingPartyRequest(true, TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
bool reachedOP = false;
var response = TestSupport.CreateRelyingPartyResponseThroughProvider(request, req => {
Assert.IsFalse(req.IsReturnUrlDiscoverable);
reachedOP = true;
req.IsAuthenticated = false;
});
Assert.IsTrue(reachedOP);
}
}
}
20 changes: 13 additions & 7 deletions src/DotNetOpenId.Test/RelyingParty/IProviderEndpointTests.cs
Expand Up @@ -3,6 +3,7 @@
using DotNetOpenId.Extensions.SimpleRegistration;
using DotNetOpenId.RelyingParty;
using NUnit.Framework;
using DotNetOpenId.Test.Mocks;

namespace DotNetOpenId.Test.RelyingParty {
[TestFixture]
Expand All @@ -18,11 +19,16 @@ public class IProviderEndpointTests {
UntrustedWebRequest.WhitelistHosts.Add("localhost");
}

[TearDown]
public void TearDown() {
Mocks.MockHttpRequest.Reset();
}

[Test]
public void IsExtensionSupportedTest() {
OpenIdRelyingParty rp = new OpenIdRelyingParty(store, null, null);
Identifier id = TestSupport.GetFullUrl("xrdsdiscovery/xrds20.aspx");
IAuthenticationRequest request = rp.CreateRequest(id, realm, returnTo);
OpenIdRelyingParty rp = TestSupport.CreateRelyingParty(null);
Identifier id = MockHttpRequest.RegisterMockXrdsResponse("/Discovery/xrdsdiscovery/xrds20.xml");
IAuthenticationRequest request = rp.CreateRequest(id, TestSupport.Realm, TestSupport.ReturnTo);
IProviderEndpoint provider = request.Provider;
Assert.IsTrue(provider.IsExtensionSupported<ClaimsRequest>());
Assert.IsTrue(provider.IsExtensionSupported(typeof(ClaimsRequest)));
Expand All @@ -31,17 +37,17 @@ public class IProviderEndpointTests {

// Test the AdditionalTypeUris list by pulling from an XRDS page with one of the
// TypeURIs that only shows up in that list.
id = TestSupport.GetFullUrl("xrdsdiscovery/xrds10.aspx");
id = MockHttpRequest.RegisterMockXrdsResponse("/Discovery/xrdsdiscovery/xrds10.xml");
request = rp.CreateRequest(id, realm, returnTo);
Assert.IsTrue(provider.IsExtensionSupported<ClaimsRequest>());
Assert.IsTrue(provider.IsExtensionSupported(typeof(ClaimsRequest)));
}

[Test]
public void UriTest() {
OpenIdRelyingParty rp = new OpenIdRelyingParty(store, null, null);
Identifier id = TestSupport.GetFullUrl("xrdsdiscovery/xrds20.aspx");
IAuthenticationRequest request = rp.CreateRequest(id, realm, returnTo);
OpenIdRelyingParty rp = TestSupport.CreateRelyingParty(null);
Identifier id = MockHttpRequest.RegisterMockXrdsResponse("/Discovery/xrdsdiscovery/xrds20.xml");
IAuthenticationRequest request = rp.CreateRequest(id, TestSupport.Realm, TestSupport.ReturnTo);
IProviderEndpoint provider = request.Provider;
Assert.AreEqual(new Uri("http://a/b"), provider.Uri);
}
Expand Down
36 changes: 17 additions & 19 deletions src/DotNetOpenId.Test/RelyingParty/OpenIdRelyingPartyTest.cs
Expand Up @@ -17,7 +17,6 @@ public class OpenIdRelyingPartyTest {

[SetUp]
public void Setup() {
TestSupport.ResetStores();
if (!UntrustedWebRequest.WhitelistHosts.Contains("localhost"))
UntrustedWebRequest.WhitelistHosts.Add("localhost");
}
Expand Down Expand Up @@ -59,21 +58,24 @@ public class OpenIdRelyingPartyTest {

[Test]
public void CreateRequestStripsFragment() {
var consumer = new OpenIdRelyingParty(new ApplicationMemoryStore(), simpleNonOpenIdRequest, new NameValueCollection());
var consumer = TestSupport.CreateRelyingParty(null);
UriBuilder userSuppliedIdentifier = new UriBuilder((Uri)TestSupport.GetIdentityUrl(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20));
userSuppliedIdentifier.Fragment = "c";
IAuthenticationRequest request = consumer.CreateRequest(userSuppliedIdentifier.Uri, realm, returnTo);
Identifier mockIdentifer = new MockIdentifier(userSuppliedIdentifier.Uri,
TestSupport.GetMockIdentifier(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20).Discover());
Assert.IsTrue(mockIdentifer.ToString().EndsWith("#c"), "Test broken");
IAuthenticationRequest request = consumer.CreateRequest(mockIdentifer, TestSupport.Realm, TestSupport.ReturnTo);
Assert.AreEqual(0, new Uri(request.ClaimedIdentifier).Fragment.Length);
}

[Test]
public void AssociationCreationWithStore() {
var providerStore = new ProviderMemoryStore();

TestSupport.ResetStores(); // get rid of existing associations so a new one is created
OpenIdRelyingParty rp = TestSupport.CreateRelyingParty(null);
var directMessageSniffer = new DirectMessageSniffWrapper(rp.DirectMessageChannel);
rp.DirectMessageChannel = directMessageSniffer;
var idUrl = TestSupport.GetIdentityUrl(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
var idUrl = TestSupport.GetMockIdentifier(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);

DotNetOpenId.RelyingParty.IAuthenticationRequest req;
bool associationMade = false;
Expand All @@ -87,19 +89,20 @@ public class OpenIdRelyingPartyTest {

[Test]
public void NoAssociationRequestWithoutStore() {
var providerStore = new ProviderMemoryStore();
TestSupport.ResetStores(); // get rid of existing associations so a new one is created

OpenIdRelyingParty rp = new OpenIdRelyingParty(null, null, null);
var idUrl = TestSupport.GetIdentityUrl(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
OpenIdRelyingParty rp = TestSupport.CreateRelyingParty(null, null);
var directMessageSniffer = new DirectMessageSniffWrapper(rp.DirectMessageChannel);
rp.DirectMessageChannel = directMessageSniffer;
var idUrl = TestSupport.GetMockIdentifier(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);

DotNetOpenId.RelyingParty.IAuthenticationRequest req;
bool associationMade = false;
TestSupport.Interceptor.SigningMessage = m => {
if (m.EncodedFields.ContainsKey("assoc_handle") && m.EncodedFields.ContainsKey("session_type"))
directMessageSniffer.Receiving += (provider, fields) => {
if (fields.ContainsKey("assoc_handle") && fields.ContainsKey("session_type"))
associationMade = true;
};
req = rp.CreateRequest(idUrl, realm, returnTo);
TestSupport.Interceptor.SigningMessage = null;
Assert.IsFalse(associationMade);
}

Expand Down Expand Up @@ -129,9 +132,7 @@ public class OpenIdRelyingPartyTest {
}

private static void testExplicitPortOnRealmAndReturnTo(Uri returnTo, Realm realm) {
var identityUrl = TestSupport.GetIdentityUrl(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
var consumer = new OpenIdRelyingParty(null, null, null);
var request = consumer.CreateRequest(identityUrl, realm, returnTo);
var request = TestSupport.CreateRelyingPartyRequest(true, TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
Protocol protocol = Protocol.Lookup(request.Provider.Version);
var nvc = HttpUtility.ParseQueryString(request.RedirectingResponse.ExtractUrl().Query);
string realmString = nvc[protocol.openid.Realm];
Expand All @@ -148,10 +149,7 @@ public class OpenIdRelyingPartyTest {

[Test]
public void ReturnToUrlEncodingTest() {
Uri origin = TestSupport.GetFullUrl(TestSupport.ConsumerPage);
var identityUrl = TestSupport.GetIdentityUrl(TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
var consumer = new OpenIdRelyingParty(null, null, null);
var request = consumer.CreateRequest(identityUrl, origin, origin);
var request = TestSupport.CreateRelyingPartyRequest(true, TestSupport.Scenarios.AutoApproval, ProtocolVersion.V20);
Protocol protocol = Protocol.Lookup(request.Provider.Version);
request.AddCallbackArguments("a+b", "c+d");
var requestArgs = HttpUtility.ParseQueryString(request.RedirectingResponse.ExtractUrl().Query);
Expand Down
15 changes: 10 additions & 5 deletions src/DotNetOpenId.Test/TestSupport.cs
Expand Up @@ -24,6 +24,9 @@ public class TestSupport {
public const string DirectedProviderEndpoint = "DirectedProviderEndpoint.aspx";
public const string MobileConsumerPage = "RelyingPartyMobile.aspx";
public const string ConsumerPage = "RelyingParty.aspx";
public static Uri ReturnTo { get { return TestSupport.GetFullUrl(TestSupport.ConsumerPage); } }
public static Realm Realm { get { return new Realm(TestSupport.GetFullUrl(TestSupport.ConsumerPage).AbsoluteUri); } }

public enum Scenarios {
// Authentication test scenarios
AutoApproval,
Expand Down Expand Up @@ -144,17 +147,17 @@ public enum Scenarios {
return rp;
}
internal static DotNetOpenId.RelyingParty.IAuthenticationRequest CreateRelyingPartyRequest(bool stateless, Scenarios scenario, ProtocolVersion version) {
var returnTo = TestSupport.GetFullUrl(TestSupport.ConsumerPage);
var realm = new Realm(TestSupport.GetFullUrl(TestSupport.ConsumerPage).AbsoluteUri);
// Publish RP discovery information
// TODO: code here

var rp = TestSupport.CreateRelyingParty(stateless ? null : RelyingPartyStore, null);
var rpReq = rp.CreateRequest(TestSupport.GetMockIdentifier(scenario, version), realm, returnTo);
var rpReq = rp.CreateRequest(TestSupport.GetMockIdentifier(scenario, version), Realm, ReturnTo);

{
// Sidetrack: verify URLs and other default properties
Assert.AreEqual(AuthenticationRequestMode.Setup, rpReq.Mode);
Assert.AreEqual(realm, rpReq.Realm);
Assert.AreEqual(returnTo, rpReq.ReturnToUrl);
Assert.AreEqual(Realm, rpReq.Realm);
Assert.AreEqual(ReturnTo, rpReq.ReturnToUrl);
}

return rpReq;
Expand Down Expand Up @@ -264,6 +267,8 @@ public enum Scenarios {
}

internal static void SetAuthenticationFromScenario(Scenarios scenario, DotNetOpenId.Provider.IAuthenticationRequest request) {
// TODO: enable this and make all tests pass.
//Assert.IsTrue(request.IsReturnUrlDiscoverable);
switch (scenario) {
case TestSupport.Scenarios.ExtensionFullCooperation:
case TestSupport.Scenarios.ExtensionPartialCooperation:
Expand Down
2 changes: 1 addition & 1 deletion src/DotNetOpenId.TestWeb/Default.aspx
Expand Up @@ -10,7 +10,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<openid:XrdsPublisher runat="server" ID="xrdsPublisher" XrdsUrl="~/rp_xrds.aspx" />
<openid:XrdsPublisher runat="server" ID="xrdsPublisher" XrdsUrl="~/rp_xrds.aspx" XrdsAdvertisement=Both />
</head>
<body>
<form id="form1" runat="server">
Expand Down
2 changes: 2 additions & 0 deletions src/DotNetOpenId/UntrustedWebResponse.cs
Expand Up @@ -33,6 +33,8 @@ internal class UntrustedWebResponse {
ContentEncoding = string.IsNullOrEmpty(response.ContentEncoding) ? DefaultContentEncoding : response.ContentEncoding;
Headers = response.Headers;
FinalUri = response.ResponseUri;

Trace.TraceWarning("Unmocked HTTP response: {0}", this);
}

/// <summary>
Expand Down

0 comments on commit 982eda4

Please sign in to comment.