Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

125 lines
4.4 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System;
using System.Runtime.Serialization;
using System.Web.Security;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace Microsoft.Web.Mvc.Test
{
public class MvcSerializerTest
{
[Fact]
public void DeserializeThrowsIfModeIsOutOfRange()
{
// Arrange
MvcSerializer serializer = new MvcSerializer();
// Act & assert
Assert.ThrowsArgumentOutOfRange(
delegate { serializer.Serialize("blah", (SerializationMode)(-1)); },
"mode",
@"The provided SerializationMode is invalid.");
}
[Fact]
public void DeserializeThrowsIfSerializedValueIsCorrupt()
{
// Arrange
IMachineKey machineKey = new MockMachineKey();
// Act & assert
Exception exception = Assert.Throws<SerializationException>(
delegate { MvcSerializer.Deserialize("This is a corrupted value.", SerializationMode.Signed, machineKey); },
@"Deserialization failed. Verify that the data is being deserialized using the same SerializationMode with which it was serialized. Otherwise see the inner exception.");
Assert.NotNull(exception.InnerException);
}
[Fact]
public void DeserializeThrowsIfSerializedValueIsEmpty()
{
// Arrange
MvcSerializer serializer = new MvcSerializer();
// Act & assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { serializer.Deserialize("", SerializationMode.Signed); }, "serializedValue");
}
[Fact]
public void DeserializeThrowsIfSerializedValueIsNull()
{
// Arrange
MvcSerializer serializer = new MvcSerializer();
// Act & assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { serializer.Deserialize(null, SerializationMode.Signed); }, "serializedValue");
}
[Fact]
public void SerializeAllowsNullValues()
{
// Arrange
IMachineKey machineKey = new MockMachineKey();
// Act
string serializedValue = MvcSerializer.Serialize(null, SerializationMode.EncryptedAndSigned, machineKey);
// Assert
Assert.Equal(@"All-LPgGI1dzEbp3B2FueVR5cGUuA25pbIYJAXozaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vCQFpKWh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlAQ==", serializedValue);
}
[Fact]
public void SerializeAndDeserializeRoundTripsValue()
{
// Arrange
IMachineKey machineKey = new MockMachineKey();
// Act
string serializedValue = MvcSerializer.Serialize(42, SerializationMode.EncryptedAndSigned, machineKey);
object deserializedValue = MvcSerializer.Deserialize(serializedValue, SerializationMode.EncryptedAndSigned, machineKey);
// Assert
Assert.Equal(42, deserializedValue);
}
[Fact]
public void SerializeThrowsIfModeIsOutOfRange()
{
// Arrange
MvcSerializer serializer = new MvcSerializer();
// Act & assert
Assert.ThrowsArgumentOutOfRange(
delegate { serializer.Serialize(null, (SerializationMode)(-1)); },
"mode",
@"The provided SerializationMode is invalid.");
}
private sealed class MockMachineKey : IMachineKey
{
public byte[] Decode(string encodedData, MachineKeyProtection protectionOption)
{
string optionString = protectionOption.ToString();
if (encodedData.StartsWith(optionString, StringComparison.Ordinal))
{
encodedData = encodedData.Substring(optionString.Length + 1);
}
else
{
throw new Exception("Corrupted data.");
}
return Convert.FromBase64String(encodedData);
}
public string Encode(byte[] data, MachineKeyProtection protectionOption)
{
return protectionOption.ToString() + "-" + Convert.ToBase64String(data);
}
}
}
}