//-----------------------------------------------------------------------
//
// Copyright (c) Andrew Arnott. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenId.Test.Extensions.ProviderAuthenticationPolicy {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy;
[TestClass]
public class PolicyRequestTests {
[TestMethod]
public void Ctor() {
PolicyRequest req = new PolicyRequest();
Assert.IsNull(req.MaximumAuthenticationAge);
Assert.IsNotNull(req.PreferredPolicies);
Assert.AreEqual(0, req.PreferredPolicies.Count);
}
[TestMethod]
public void MaximumAuthenticationAgeTest() {
PolicyRequest req = new PolicyRequest();
req.MaximumAuthenticationAge = TimeSpan.FromHours(1);
Assert.IsNotNull(req.MaximumAuthenticationAge);
Assert.AreEqual(TimeSpan.FromHours(1), req.MaximumAuthenticationAge);
req.MaximumAuthenticationAge = null;
Assert.IsNull(req.MaximumAuthenticationAge);
}
[TestMethod]
public void AddPolicies() {
PolicyRequest resp = new PolicyRequest();
resp.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
resp.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
Assert.AreEqual(2, resp.PreferredPolicies.Count);
Assert.AreEqual(AuthenticationPolicies.MultiFactor, resp.PreferredPolicies[0]);
Assert.AreEqual(AuthenticationPolicies.PhishingResistant, resp.PreferredPolicies[1]);
}
[TestMethod]
public void AddPolicyMultipleTimes() {
// Although this isn't really the desired behavior (we'd prefer to see an
// exception thrown), since we're using a List internally we can't
// expect anything better (for now). But if this is ever fixed, by all means
// change this test to expect an exception or something else.
PolicyRequest resp = new PolicyRequest();
resp.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
resp.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
Assert.AreEqual(2, resp.PreferredPolicies.Count);
}
[TestMethod]
public void AddAuthLevelTypes() {
PolicyRequest req = new PolicyRequest();
req.PreferredAuthLevelTypes.Add(Constants.AuthenticationLevels.NistTypeUri);
Assert.AreEqual(1, req.PreferredAuthLevelTypes.Count);
Assert.IsTrue(req.PreferredAuthLevelTypes.Contains(Constants.AuthenticationLevels.NistTypeUri));
}
[TestMethod]
public void EqualsTest() {
PolicyRequest req = new PolicyRequest();
PolicyRequest req2 = new PolicyRequest();
Assert.AreEqual(req, req2);
Assert.AreNotEqual(req, null);
Assert.AreNotEqual(null, req);
// Test PreferredPolicies list comparison
req.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
Assert.AreNotEqual(req, req2);
req2.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
Assert.AreNotEqual(req, req2);
req2.PreferredPolicies.Clear();
req2.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
Assert.AreEqual(req, req2);
// Test PreferredPolicies list comparison when that list is not in the same order.
req.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
Assert.AreNotEqual(req, req2);
req2.PreferredPolicies.Insert(0, AuthenticationPolicies.MultiFactor);
Assert.AreEqual(req, req2);
// Test MaximumAuthenticationAge comparison.
req.MaximumAuthenticationAge = TimeSpan.FromHours(1);
Assert.AreNotEqual(req, req2);
req2.MaximumAuthenticationAge = req.MaximumAuthenticationAge;
Assert.AreEqual(req, req2);
// Test PreferredAuthLevelTypes comparison.
req.PreferredAuthLevelTypes.Add("authlevel1");
Assert.AreNotEqual(req, req2);
req2.PreferredAuthLevelTypes.Add("authlevel2");
Assert.AreNotEqual(req, req2);
req.PreferredAuthLevelTypes.Add("authlevel2");
req2.PreferredAuthLevelTypes.Add("authlevel1");
Assert.AreEqual(req, req2);
}
[TestMethod]
public void DeserializeNull() {
PolicyRequest req = new PolicyRequest();
Assert.IsFalse(((IExtensionRequest)req).Deserialize(null, null, Constants.TypeUri));
}
[TestMethod]
public void DeserializeEmpty() {
PolicyRequest req = new PolicyRequest();
Assert.IsFalse(((IExtensionRequest)req).Deserialize(new Dictionary(), null, Constants.TypeUri));
}
[TestMethod]
public void SerializeRoundTrip() {
// This test relies on the PolicyRequest.Equals method. If this and that test
// are failing, work on EqualsTest first.
// Most basic test
PolicyRequest req = new PolicyRequest(), req2 = new PolicyRequest();
var fields = ((IExtensionRequest)req).Serialize(null);
Assert.IsTrue(((IExtensionRequest)req2).Deserialize(fields, null, Constants.TypeUri));
Assert.AreEqual(req, req2);
// Test with all fields set
req2 = new PolicyRequest();
req.PreferredPolicies.Add(AuthenticationPolicies.MultiFactor);
req.PreferredAuthLevelTypes.Add(Constants.AuthenticationLevels.NistTypeUri);
req.MaximumAuthenticationAge = TimeSpan.FromHours(1);
fields = ((IExtensionRequest)req).Serialize(null);
Assert.IsTrue(((IExtensionRequest)req2).Deserialize(fields, null, Constants.TypeUri));
Assert.AreEqual(req, req2);
// Test with an extra policy and auth level
req2 = new PolicyRequest();
req.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
req.PreferredAuthLevelTypes.Add("customAuthLevel");
fields = ((IExtensionRequest)req).Serialize(null);
Assert.IsTrue(((IExtensionRequest)req2).Deserialize(fields, null, Constants.TypeUri));
Assert.AreEqual(req, req2);
// Test with a policy added twice. We should see it intelligently leave one of
// the doubled policies out.
req2 = new PolicyRequest();
req.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
req.PreferredAuthLevelTypes.Add(Constants.AuthenticationLevels.NistTypeUri);
fields = ((IExtensionRequest)req).Serialize(null);
Assert.IsTrue(((IExtensionRequest)req2).Deserialize(fields, null, Constants.TypeUri));
Assert.AreNotEqual(req, req2);
// Now go ahead and add the doubled one so we can do our equality test.
req2.PreferredPolicies.Add(AuthenticationPolicies.PhishingResistant);
req2.PreferredAuthLevelTypes.Add(Constants.AuthenticationLevels.NistTypeUri);
Assert.AreEqual(req, req2);
}
[TestMethod]
public void Serialize() {
PolicyRequest req = new PolicyRequest();
var fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual(1, fields.Count);
Assert.IsTrue(fields.ContainsKey("preferred_auth_policies"));
Assert.IsEmpty(fields["preferred_auth_policies"]);
req.MaximumAuthenticationAge = TimeSpan.FromHours(1);
fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual(2, fields.Count);
Assert.IsTrue(fields.ContainsKey("max_auth_age"));
Assert.AreEqual(TimeSpan.FromHours(1).TotalSeconds.ToString(CultureInfo.InvariantCulture), fields["max_auth_age"]);
req.PreferredPolicies.Add("http://pol1/");
fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual("http://pol1/", fields["preferred_auth_policies"]);
req.PreferredPolicies.Add("http://pol2/");
fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual("http://pol1/ http://pol2/", fields["preferred_auth_policies"]);
req.PreferredAuthLevelTypes.Add("http://authtype1/");
fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual(4, fields.Count);
Assert.IsTrue(fields.ContainsKey("auth_level.ns.alias1"));
Assert.AreEqual("http://authtype1/", fields["auth_level.ns.alias1"]);
Assert.IsTrue(fields.ContainsKey("preferred_auth_level_types"));
Assert.AreEqual("alias1", fields["preferred_auth_level_types"]);
req.PreferredAuthLevelTypes.Add(Constants.AuthenticationLevels.NistTypeUri);
fields = ((IExtensionRequest)req).Serialize(null);
Assert.AreEqual(5, fields.Count);
Assert.IsTrue(fields.ContainsKey("auth_level.ns.alias2"));
Assert.AreEqual("http://authtype1/", fields["auth_level.ns.alias2"]);
Assert.IsTrue(fields.ContainsKey("auth_level.ns.nist"));
Assert.AreEqual(Constants.AuthenticationLevels.NistTypeUri, fields["auth_level.ns.nist"]);
Assert.AreEqual("alias2 nist", fields["preferred_auth_level_types"]);
}
}
}