Skip to content

Commit

Permalink
Fix binary formatter serialization for .NET Framework
Browse files Browse the repository at this point in the history
  • Loading branch information
nohwnd authored and github-actions committed Feb 18, 2025
1 parent 6cc463c commit 32c95a2
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/TestFramework/TestFramework/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ namespace Microsoft.VisualStudio.TestTools.UnitTesting;
internal static class Constants
{
internal const string PublicTypeObsoleteMessage = "We will remove or hide this type starting with v4. If you are using this type, reach out to our team on https://github.com/microsoft/testfx.";

internal const string LegacyFormatterImplementationMessage = "This API supports obsolete formatter-based serialization. It should not be called or extended by application code.";
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if NETFRAMEWORK || NETSTANDARD2_0
using System.ComponentModel;
using System.Runtime.Serialization;
#endif

namespace Microsoft.VisualStudio.TestTools.UnitTesting;

/// <summary>
Expand Down Expand Up @@ -35,4 +40,18 @@ public AssertFailedException()
: base()
{
}

#if NETFRAMEWORK || NETSTANDARD2_0
/// <summary>
/// Initializes a new instance of the <see cref="AssertFailedException"/> class.
/// </summary>
/// <param name="info">Serialization info.</param>
/// <param name="context">Streaming context.</param>
[Obsolete(Constants.LegacyFormatterImplementationMessage)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected AssertFailedException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if NETFRAMEWORK || NETSTANDARD2_0
using System.ComponentModel;
using System.Runtime.Serialization;
#endif

namespace Microsoft.VisualStudio.TestTools.UnitTesting;

/// <summary>
Expand Down Expand Up @@ -35,4 +40,18 @@ public AssertInconclusiveException()
: base()
{
}

#if NETFRAMEWORK || NETSTANDARD2_0
/// <summary>
/// Initializes a new instance of the <see cref="AssertInconclusiveException"/> class.
/// </summary>
/// <param name="info">Serialization info.</param>
/// <param name="context">Streaming context.</param>
[Obsolete(Constants.LegacyFormatterImplementationMessage)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected AssertInconclusiveException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if NETFRAMEWORK || NETSTANDARD2_0
using System.ComponentModel;
using System.Runtime.Serialization;
#endif

namespace Microsoft.VisualStudio.TestTools.UnitTesting;

/// <summary>
Expand Down Expand Up @@ -46,4 +51,18 @@ public InternalTestFailureException()
: base()
{
}

#if NETFRAMEWORK || NETSTANDARD2_0
/// <summary>
/// Initializes a new instance of the <see cref="InternalTestFailureException"/> class.
/// </summary>
/// <param name="info">Serialization info.</param>
/// <param name="context">Streaming context.</param>
[Obsolete(Constants.LegacyFormatterImplementationMessage)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected InternalTestFailureException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if NETFRAMEWORK || NETSTANDARD2_0
using System.ComponentModel;
using System.Runtime.Serialization;
#endif

namespace Microsoft.VisualStudio.TestTools.UnitTesting;

/// <summary>
Expand Down Expand Up @@ -34,4 +39,18 @@ protected UnitTestAssertException(string msg)
: base(msg)
{
}

#if NETFRAMEWORK || NETSTANDARD2_0
/// <summary>
/// Initializes a new instance of the <see cref="UnitTestAssertException"/> class.
/// </summary>
/// <param name="info">Serialization info.</param>
/// <param name="context">Streaming context.</param>
[Obsolete(Constants.LegacyFormatterImplementationMessage)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected UnitTestAssertException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#nullable enable
Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException.AssertInconclusiveException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException.AssertFailedException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.InternalTestFailureException.InternalTestFailureException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.UnitTestAssertException.UnitTestAssertException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#nullable enable
Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException.AssertInconclusiveException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException.AssertFailedException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.InternalTestFailureException.InternalTestFailureException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.UnitTestAssertException.UnitTestAssertException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
6 changes: 6 additions & 0 deletions src/TestFramework/TestFramework/TestFramework.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@

<AdditionalFiles Include="PublicAPI\net\PublicAPI.Shipped.txt" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'netcoreapp3.1'))" />
<AdditionalFiles Include="PublicAPI\net\PublicAPI.Unshipped.txt" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'netcoreapp3.1'))" />

<AdditionalFiles Include="PublicAPI\netframework\PublicAPI.Shipped.txt" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net462'))" />
<AdditionalFiles Include="PublicAPI\netframework\PublicAPI.Unshipped.txt" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net462'))" />

<AdditionalFiles Include="PublicAPI\netstandard2.0\PublicAPI.Shipped.txt" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
<AdditionalFiles Include="PublicAPI\netstandard2.0\PublicAPI.Unshipped.txt" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ namespace Microsoft.VisualStudio.TestPlatform.TestFramework.UnitTests.Attributes
public class BinaryFormatterExceptionSerializationTests : TestContainer
{
public void AssertFailedExceptionCanBeSerializedAndDeserialized()
=> VerifySerialization(() => Assert.AreEqual(0, 1));
=> VerifySerialization(Assert.Fail);

public void AssertInconclusiveExceptionCanBeSerializedAndDeserialized()
=> VerifySerialization(Assert.Inconclusive);

public void InternalTestFailureExceptionCanBeSerializedAndDeserialized()
=> VerifySerialization(() => throw new InternalTestFailureException("Some internal error."));

private void VerifySerialization(Action actionThatThrows)
{
Expand All @@ -23,10 +29,14 @@ private void VerifySerialization(Action actionThatThrows)
}
catch (Exception ex)
{
// Ensure the thrown exception can be serialized and deserialized by binary formatter to keep compatibility with it,
// even though it is obsoleted and removed in .NET.
var mem = new MemoryStream();
new BinaryFormatter().Serialize(mem, ex);
mem.Position = 0;
new BinaryFormatter().Deserialize(mem);

return;
}

throw new InvalidOperationException($"The provided '{nameof(actionThatThrows)}' did not throw any exception.");
Expand Down

0 comments on commit 32c95a2

Please sign in to comment.