//----------------------------------------------------------------------- // // Copyright (c) Andrew Arnott. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOAuth.Test.Messaging { using System; using System.Collections.Generic; using DotNetOAuth.Messaging; using Microsoft.VisualStudio.TestTools.UnitTesting; /// /// Tests for the class. /// [TestClass()] public class MessageSerializerTests : TestBase { [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void SerializeNull() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); serializer.Serialize(null); } [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void SerializeNullFields() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); serializer.Serialize(null, new Mocks.TestMessage()); } [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void SerializeNullMessage() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); serializer.Serialize(new Dictionary(), null); } [TestMethod, ExpectedException(typeof(ArgumentException))] public void GetInvalidMessageType() { MessageSerializer.Get(typeof(string)); } [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void GetNullType() { MessageSerializer.Get(null); } [TestMethod] public void GetReturnsSameSerializerTwice() { Assert.AreSame(MessageSerializer.Get(typeof(Mocks.TestMessage)), MessageSerializer.Get(typeof(Mocks.TestMessage))); } [TestMethod, ExpectedException(typeof(ProtocolException))] public void SerializeInvalidMessage() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); Dictionary fields = new Dictionary(StringComparer.Ordinal); Mocks.TestMessage message = new Mocks.TestMessage(); message.EmptyMember = "invalidvalue"; serializer.Serialize(message); } [TestMethod()] public void SerializeTest() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); var message = new Mocks.TestMessage { Age = 15, Name = "Andrew", Location = new Uri("http://localhost"), Timestamp = DateTime.Parse("1/1/1990"), }; IDictionary actual = serializer.Serialize(message); Assert.AreEqual(4, actual.Count); // Test case sensitivity of generated dictionary Assert.IsFalse(actual.ContainsKey("Age")); Assert.IsTrue(actual.ContainsKey("age")); // Test contents of dictionary Assert.AreEqual("15", actual["age"]); Assert.AreEqual("Andrew", actual["Name"]); Assert.AreEqual("http://localhost/", actual["Location"]); Assert.AreEqual("1990-01-01T00:00:00", actual["Timestamp"]); Assert.IsFalse(actual.ContainsKey("EmptyMember")); } [TestMethod] public void SerializeToExistingDictionary() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); var message = new Mocks.TestMessage { Age = 15, Name = "Andrew" }; var fields = new Dictionary(); fields["someExtraField"] = "someValue"; serializer.Serialize(fields, message); Assert.AreEqual(4, fields.Count); Assert.AreEqual("15", fields["age"]); Assert.AreEqual("Andrew", fields["Name"]); Assert.AreEqual("someValue", fields["someExtraField"]); } [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void DeserializeNull() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); serializer.Deserialize(null); } [TestMethod] public void DeserializeSimple() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); Dictionary fields = new Dictionary(StringComparer.Ordinal); fields["Name"] = "Andrew"; fields["age"] = "15"; fields["Timestamp"] = "1990-01-01T00:00:00"; var actual = (Mocks.TestMessage)serializer.Deserialize(fields); Assert.AreEqual(15, actual.Age); Assert.AreEqual("Andrew", actual.Name); Assert.AreEqual(DateTime.Parse("1/1/1990"), actual.Timestamp); Assert.IsNull(actual.EmptyMember); } /// /// This tests deserialization of a message that is comprised of [DataMember]'s /// that are defined in multiple places in the inheritance tree. /// /// /// The element sorting rules are first inheritance order, then alphabetical order. /// This test validates correct behavior on both. /// [TestMethod] public void DeserializeVerifyElementOrdering() { var serializer = MessageSerializer.Get(typeof(Mocks.TestDerivedMessage)); Dictionary fields = new Dictionary(StringComparer.Ordinal); // We deliberately do this OUT of order, // since DataContractSerializer demands elements to be in // 1) inheritance then 2) alphabetical order. // Proper xml element order would be: Name, age, Second..., TheFirst... fields["TheFirstDerivedElement"] = "first"; fields["age"] = "15"; fields["Name"] = "Andrew"; fields["SecondDerivedElement"] = "second"; fields["explicit"] = "explicitValue"; fields["private"] = "privateValue"; var actual = (Mocks.TestDerivedMessage)serializer.Deserialize(fields); Assert.AreEqual(15, actual.Age); Assert.AreEqual("Andrew", actual.Name); Assert.AreEqual("first", actual.TheFirstDerivedElement); Assert.AreEqual("second", actual.SecondDerivedElement); Assert.AreEqual("explicitValue", ((Mocks.IBaseMessageExplicitMembers)actual).ExplicitProperty); Assert.AreEqual("privateValue", actual.PrivatePropertyAccessor); } [TestMethod] public void DeserializeWithExtraFields() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); Dictionary fields = new Dictionary(StringComparer.Ordinal); fields["age"] = "15"; fields["Name"] = "Andrew"; // Add some field that is not recognized by the class. This simulates a querystring with // more parameters than are actually interesting to the protocol message. fields["someExtraField"] = "asdf"; var actual = (Mocks.TestMessage)serializer.Deserialize(fields); Assert.AreEqual(15, actual.Age); Assert.AreEqual("Andrew", actual.Name); Assert.IsNull(actual.EmptyMember); } [TestMethod, ExpectedException(typeof(ProtocolException))] public void DeserializeEmpty() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); var fields = new Dictionary(StringComparer.Ordinal); serializer.Deserialize(fields); } [TestMethod, ExpectedException(typeof(ProtocolException))] public void DeserializeInvalidMessage() { var serializer = MessageSerializer.Get(typeof(Mocks.TestMessage)); Dictionary fields = new Dictionary(StringComparer.Ordinal); // Set an disallowed value. fields["age"] = "-1"; serializer.Deserialize(fields); } } }