Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/linker.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorVitek Karas <vitek.karas@microsoft.com>2021-11-17 22:34:14 +0300
committervitek-karas <10670590+vitek-karas@users.noreply.github.com>2021-11-22 17:16:37 +0300
commit70cd7ede82e8ba9192bbd8e63fd7c46cbeba0c21 (patch)
tree89bd64839d03429c9ba36192eece90641c94c8c9 /test
parentfba858e92cc8ace3527f76e87fd6f7530bae1783 (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')
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ImplementationLibrary.cs11
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary.il31
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/NestedForwarderLibrary_2.il31
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/Dependencies/ReferenceImplementationLibrary.cs11
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithCopyUsed.cs44
-rw-r--r--test/Mono.Linker.Tests.Cases/TypeForwarding/MultiForwardedTypesWithLink.cs44
-rw-r--r--test/Mono.Linker.Tests/TestCasesRunner/ILCompiler.cs6
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;