diff options
author | Vitek Karas <vitek.karas@microsoft.com> | 2021-11-17 22:34:14 +0300 |
---|---|---|
committer | vitek-karas <10670590+vitek-karas@users.noreply.github.com> | 2021-11-22 17:16:37 +0300 |
commit | 70cd7ede82e8ba9192bbd8e63fd7c46cbeba0c21 (patch) | |
tree | 89bd64839d03429c9ba36192eece90641c94c8c9 /test | |
parent | fba858e92cc8ace3527f76e87fd6f7530bae1783 (diff) |
Adds a test for multiple nested forwarders in a row with copy/link (#2372)
The problematic scenario is if there's a "copy" assembly with a forwarder to a "link" assembly with a forwarder. The forwarder is for a nested class.
Test for https://github.com/dotnet/linker/issues/2359.
Also improved the test infra to print out errors from ilasm if they happen.
Diffstat (limited to 'test')
7 files changed, 177 insertions, 1 deletions
diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ImplementationLibrary.cs b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ImplementationLibrary.cs index 211e2d14f..6ba555970 100644 --- a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ImplementationLibrary.cs +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ImplementationLibrary.cs @@ -25,6 +25,10 @@ namespace Mono.Linker.Tests.Cases.TypeForwarding.Dependencies public static int PropertyOnNestedType { get; set; } } + public class ForwardedNestedType + { + } + public static int someField = 42; public string GetSomeValue () @@ -33,6 +37,13 @@ namespace Mono.Linker.Tests.Cases.TypeForwarding.Dependencies } } + public class AnotherImplementationClass + { + public class ForwardedNestedType + { + } + } + [AttributeUsage (AttributeTargets.All)] public class ImplementationLibraryAttribute : Attribute { diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary.il b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary.il new file mode 100644 index 000000000..edb8ded47 --- /dev/null +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary.il @@ -0,0 +1,31 @@ +.assembly extern mscorlib +{ +} + +.assembly extern Implementation +{ +} + +.assembly NestedForwarderLibrary +{ +} + +.class extern forwarder Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary +{ + .assembly extern 'Implementation' +} +.class extern ForwardedNestedType +{ + .class extern 'Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary' +} + +.class extern forwarder Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.AnotherImplementationClass +{ + .assembly extern 'Implementation' +} +.class extern ForwardedNestedType +{ + .class extern 'Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary' +} + +.module 'NestedForwarderLibrary.dll' diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary_2.il b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary_2.il new file mode 100644 index 000000000..2b0faefc6 --- /dev/null +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary_2.il @@ -0,0 +1,31 @@ +.assembly extern mscorlib +{ +} + +.assembly extern NestedForwarderLibrary +{ +} + +.assembly NestedForwarderLibrary_2 +{ +} + +.class extern forwarder Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary +{ + .assembly extern 'NestedForwarderLibrary' +} +.class extern ForwardedNestedType +{ + .class extern 'Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary' +} + +.class extern forwarder Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.AnotherImplementationClass +{ + .assembly extern 'NestedForwarderLibrary' +} +.class extern ForwardedNestedType +{ + .class extern 'Mono.Linker.Tests.Cases.TypeForwarding.Dependencies.ImplementationLibrary' +} + +.module 'NestedForwarderLibrary_2.dll' diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ReferenceImplementationLibrary.cs b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ReferenceImplementationLibrary.cs index 4ec420372..ac08d817a 100644 --- a/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ReferenceImplementationLibrary.cs +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ReferenceImplementationLibrary.cs @@ -27,6 +27,10 @@ namespace Mono.Linker.Tests.Cases.TypeForwarding.Dependencies public static int PropertyOnNestedType { get; set; } } + public class ForwardedNestedType + { + } + public static int someField = 0; public string GetSomeValue () @@ -35,6 +39,13 @@ namespace Mono.Linker.Tests.Cases.TypeForwarding.Dependencies } } + public class AnotherImplementationClass + { + public class ForwardedNestedType + { + } + } + [AttributeUsage (AttributeTargets.All)] public class ImplementationLibraryAttribute : Attribute { diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithCopyUsed.cs b/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithCopyUsed.cs new file mode 100644 index 000000000..e2e5c39bf --- /dev/null +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithCopyUsed.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Mono.Linker.Tests.Cases.Expectations.Assertions; +using Mono.Linker.Tests.Cases.Expectations.Metadata; +using Mono.Linker.Tests.Cases.TypeForwarding.Dependencies; + +namespace Mono.Linker.Tests.Cases.TypeForwarding +{ + [SkipUnresolved (true)] + + [SetupCompileBefore ("NestedForwarderLibrary_2.dll", new[] { "Dependencies/ReferenceImplementationLibrary.cs" }, defines: new[] { "INCLUDE_REFERENCE_IMPL" })] + + // After compiling the test case we then replace the reference impl with implementation + type forwarder + [SetupCompileAfter ("Implementation.dll", new[] { "Dependencies/ImplementationLibrary.cs" })] + [SetupCompileAfter ("NestedForwarderLibrary.dll", new[] { "Dependencies/NestedForwarderLibrary.il" }, references: new[] { "Implementation.dll" })] + [SetupCompileAfter ("NestedForwarderLibrary_2.dll", new[] { "Dependencies/NestedForwarderLibrary_2.il" }, references: new[] { "NestedForwarderLibrary.dll" })] + + [SetupLinkerAction ("copy", "test")] + [SetupLinkerAction ("copy", "NestedForwarderLibrary_2")] + [SetupLinkerAction ("copyused", "NestedForwarderLibrary")] + [SetupLinkerAction ("copyused", "Implementation")] + + // https://github.com/dotnet/linker/issues/2359 + // One of the type forwarders in NestedForwarderLibrary will not be kept. + // Which one depends on order. + //[KeptTypeInAssembly ("NestedForwarderLibrary.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary_2.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary_2.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + [KeptTypeInAssembly ("Implementation.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + [KeptTypeInAssembly ("Implementation.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + + [KeptMember (".ctor()")] + class MultiForwardedTypesWithCopyUsed + { + static void Main () + { + Console.WriteLine (typeof (ImplementationLibrary.ForwardedNestedType).FullName); + Console.WriteLine (typeof (AnotherImplementationClass.ForwardedNestedType).FullName); + } + } +} diff --git a/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithLink.cs b/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithLink.cs new file mode 100644 index 000000000..2d61e1e6b --- /dev/null +++ b/test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithLink.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Mono.Linker.Tests.Cases.Expectations.Assertions; +using Mono.Linker.Tests.Cases.Expectations.Metadata; +using Mono.Linker.Tests.Cases.TypeForwarding.Dependencies; + +namespace Mono.Linker.Tests.Cases.TypeForwarding +{ + [SkipUnresolved (true)] + + [SetupCompileBefore ("NestedForwarderLibrary_2.dll", new[] { "Dependencies/ReferenceImplementationLibrary.cs" }, defines: new[] { "INCLUDE_REFERENCE_IMPL" })] + + // After compiling the test case we then replace the reference impl with implementation + type forwarder + [SetupCompileAfter ("Implementation.dll", new[] { "Dependencies/ImplementationLibrary.cs" })] + [SetupCompileAfter ("NestedForwarderLibrary.dll", new[] { "Dependencies/NestedForwarderLibrary.il" }, references: new[] { "Implementation.dll" })] + [SetupCompileAfter ("NestedForwarderLibrary_2.dll", new[] { "Dependencies/NestedForwarderLibrary_2.il" }, references: new[] { "NestedForwarderLibrary.dll" })] + + [SetupLinkerAction ("copy", "test")] + [SetupLinkerAction ("copy", "NestedForwarderLibrary_2")] + [SetupLinkerAction ("link", "NestedForwarderLibrary")] + [SetupLinkerAction ("link", "Implementation")] + + // https://github.com/dotnet/linker/issues/2359 + // One of the type forwarders in NestedForwarderLibrary will not be kept. + // Which one depends on order. + //[KeptTypeInAssembly ("NestedForwarderLibrary.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary_2.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + //[KeptTypeInAssembly ("NestedForwarderLibrary_2.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + [KeptTypeInAssembly ("Implementation.dll", typeof (ImplementationLibrary.ForwardedNestedType))] + [KeptTypeInAssembly ("Implementation.dll", typeof (AnotherImplementationClass.ForwardedNestedType))] + + [KeptMember (".ctor()")] + class MultiForwardedTypesWithLink + { + static void Main () + { + Console.WriteLine (typeof (ImplementationLibrary.ForwardedNestedType).FullName); + Console.WriteLine (typeof (AnotherImplementationClass.ForwardedNestedType).FullName); + } + } +} diff --git a/test/Mono.Linker.Tests/TestCasesRunner/ILCompiler.cs b/test/Mono.Linker.Tests/TestCasesRunner/ILCompiler.cs index 52e876694..f2aba174d 100644 --- a/test/Mono.Linker.Tests/TestCasesRunner/ILCompiler.cs +++ b/test/Mono.Linker.Tests/TestCasesRunner/ILCompiler.cs @@ -15,16 +15,20 @@ namespace Mono.Linker.Tests.TestCasesRunner public NPath Compile (CompilerOptions options) { var capturedOutput = new List<string> (); + var capturedError = new List<string> (); var process = new Process (); SetupProcess (process, options); process.StartInfo.RedirectStandardOutput = true; + process.StartInfo.RedirectStandardError = true; process.OutputDataReceived += (sender, args) => capturedOutput.Add (args.Data); + process.ErrorDataReceived += (sender, args) => capturedError.Add (args.Data); process.Start (); process.BeginOutputReadLine (); + process.BeginErrorReadLine (); process.WaitForExit (); if (process.ExitCode != 0) { - Assert.Fail ($"Failed to compile IL assembly : {options.OutputPath}\n{capturedOutput.Aggregate ((buff, s) => buff + Environment.NewLine + s)}"); + Assert.Fail ($"Failed to compile IL assembly : {options.OutputPath}\n{capturedOutput.Aggregate ((buff, s) => buff + Environment.NewLine + s)}{capturedError.Aggregate ((buff, s) => buff + Environment.NewLine + s)}"); } return options.OutputPath; |