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
diff options
context:
space:
mode:
authorTlakaelel Axayakatl Ceja <tlakaelel.ceja@microsoft.com>2021-04-01 06:38:10 +0300
committerGitHub <noreply@github.com>2021-04-01 06:38:10 +0300
commitf4147aa53a425420f725c9cb5dbd36552df99372 (patch)
treecdc2529bd7824a210ae95c150c6d888e8b7a1036 /test/ILLink.RoslynAnalyzer.Tests
parentdd7d70118b7146125781c830bbff47a8cb953f39 (diff)
Merge SingleFileAnalyzer into RequiresAssemblyFilesAnalyzer and add capability to suppress IL3000/IL3001 with RequiresAssemblyFilesAnalyzer (#1921)
Merge SingleFileAnalyzer into RequiresAssemblyFilesAnalyzer Suppress warnings on dangerous patterns if RequiresAssemblyFilesAttribute is used on the parent call Fix case in which we have a dangerous method inside a property Add tests
Diffstat (limited to 'test/ILLink.RoslynAnalyzer.Tests')
-rw-r--r--test/ILLink.RoslynAnalyzer.Tests/AvoidAssemblyLocationInSingleFileTests.cs144
-rw-r--r--test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs192
2 files changed, 185 insertions, 151 deletions
diff --git a/test/ILLink.RoslynAnalyzer.Tests/AvoidAssemblyLocationInSingleFileTests.cs b/test/ILLink.RoslynAnalyzer.Tests/AvoidAssemblyLocationInSingleFileTests.cs
deleted file mode 100644
index 7d9fe48c6..000000000
--- a/test/ILLink.RoslynAnalyzer.Tests/AvoidAssemblyLocationInSingleFileTests.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Threading.Tasks;
-using Microsoft.CodeAnalysis.Testing;
-using Xunit;
-using VerifyCS = ILLink.RoslynAnalyzer.Tests.CSharpAnalyzerVerifier<
- ILLink.RoslynAnalyzer.AvoidAssemblyLocationInSingleFile>;
-
-namespace ILLink.RoslynAnalyzer.Tests
-{
- public class AvoidAssemblyLocationInSingleFileTests
- {
- static Task VerifySingleFileAnalyzer (string source, params DiagnosticResult[] expected)
- {
- return VerifyCS.VerifyAnalyzerAsync (source,
- TestCaseUtils.UseMSBuildProperties (MSBuildPropertyOptionNames.EnableSingleFileAnalyzer),
- expected);
- }
-
- [Fact]
- public Task GetExecutingAssemblyLocation ()
- {
- const string src = @"
-using System.Reflection;
-class C
-{
- public string M() => Assembly.GetExecutingAssembly().Location;
-}";
-
- return VerifySingleFileAnalyzer (src,
- // (5,26): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3000).WithSpan (5, 26, 5, 66).WithArguments ("System.Reflection.Assembly.Location"));
- }
-
- [Fact]
- public Task AssemblyProperties ()
- {
- var src = @"
-using System.Reflection;
-class C
-{
- public void M()
- {
- var a = Assembly.GetExecutingAssembly();
- _ = a.Location;
- // below methods are marked as obsolete in 5.0
- // _ = a.CodeBase;
- // _ = a.EscapedCodeBase;
- }
-}";
- return VerifySingleFileAnalyzer (src,
- // (8,13): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.Assembly.Location")
- );
- }
-
- [Fact]
- public Task AssemblyMethods ()
- {
- var src = @"
-using System.Reflection;
-class C
-{
- public void M()
- {
- var a = Assembly.GetExecutingAssembly();
- _ = a.GetFile(""/some/file/path"");
- _ = a.GetFiles();
- }
-}";
- return VerifySingleFileAnalyzer (src,
- // (8,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3001).WithSpan (8, 13, 8, 41).WithArguments ("System.Reflection.Assembly.GetFile(string)"),
- // (9,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3001).WithSpan (9, 13, 9, 25).WithArguments ("System.Reflection.Assembly.GetFiles()")
- );
- }
-
- [Fact]
- public Task AssemblyNameAttributes ()
- {
- var src = @"
-using System.Reflection;
-class C
-{
- public void M()
- {
- var a = Assembly.GetExecutingAssembly().GetName();
- _ = a.CodeBase;
- _ = a.EscapedCodeBase;
- }
-}";
- return VerifySingleFileAnalyzer (src,
- // (8,13): warning IL3000: 'System.Reflection.AssemblyName.CodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.AssemblyName.CodeBase"),
- // (9,13): warning IL3000: 'System.Reflection.AssemblyName.EscapedCodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3000).WithSpan (9, 13, 9, 30).WithArguments ("System.Reflection.AssemblyName.EscapedCodeBase")
- );
- }
-
- [Fact]
- public Task FalsePositive ()
- {
- // This is an OK use of Location and GetFile since these assemblies were loaded from
- // a file, but the analyzer is conservative
- var src = @"
-using System.Reflection;
-class C
-{
- public void M()
- {
- var a = Assembly.LoadFrom(""/some/path/not/in/bundle"");
- _ = a.Location;
- _ = a.GetFiles();
- }
-}";
- return VerifySingleFileAnalyzer (src,
- // (8,13): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.Assembly.Location"),
- // (9,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
- VerifyCS.Diagnostic (AvoidAssemblyLocationInSingleFile.IL3001).WithSpan (9, 13, 9, 25).WithArguments ("System.Reflection.Assembly.GetFiles()")
- );
- }
-
- [Fact]
- public Task PublishSingleFileIsNotSet ()
- {
- var src = @"
-using System.Reflection;
-class C
-{
- public void M()
- {
- var a = Assembly.GetExecutingAssembly().Location;
- }
-}";
- // If 'PublishSingleFile' is not set to true, no diagnostics should be produced by the analyzer. This will
- // effectively verify that the number of produced diagnostics matches the number of expected ones (zero).
- return VerifyCS.VerifyAnalyzerAsync (src);
- }
- }
-}
diff --git a/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs b/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs
index 07f1aa2b6..5e62159da 100644
--- a/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs
+++ b/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs
@@ -35,7 +35,7 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFieldsOnEvent,
// (12,17): warning IL3002: Using member 'C.E' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app.
- VerifyCS.Diagnostic ().WithSpan (12, 17, 12, 18).WithArguments ("C.E", "", ""));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (12, 17, 12, 18).WithArguments ("C.E", "", ""));
}
[Fact]
@@ -58,7 +58,7 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFilesOnMethod,
// (13,3): warning IL3002: Using member 'C.M1()' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app.
- VerifyCS.Diagnostic ().WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", "", ""));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", "", ""));
}
[Fact]
@@ -81,9 +81,43 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFilesOnProperty,
// (11,3): warning IL3002: Using member 'C.P' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app.
- VerifyCS.Diagnostic ().WithSpan (12, 3, 12, 4).WithArguments ("C.P", "", ""),
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (12, 3, 12, 4).WithArguments ("C.P", "", ""),
// (13,12): warning IL3002: Using member 'C.P' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app.
- VerifyCS.Diagnostic ().WithSpan (13, 35, 13, 36).WithArguments ("C.P", "", ""));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (13, 35, 13, 36).WithArguments ("C.P", "", ""));
+ }
+
+ [Fact]
+ public Task CallDangerousMethodInsideProperty ()
+ {
+ var TestRequiresAssemblyFilesOnMethodInsideProperty = @"
+using System.Diagnostics.CodeAnalysis;
+
+class C
+{
+ bool field;
+
+ [RequiresAssemblyFiles]
+ bool P {
+ get {
+ return field;
+ }
+ set {
+ CallDangerousMethod ();
+ field = value;
+ }
+ }
+
+ [RequiresAssemblyFiles]
+ void CallDangerousMethod () {}
+
+ void M ()
+ {
+ P = false;
+ }
+}";
+ return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFilesOnMethodInsideProperty,
+ // (24,3): warning IL3002: Using member 'C.P' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (24, 3, 24, 4).WithArguments ("C.P", "", ""));
}
[Fact]
@@ -106,7 +140,7 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFilesWithMessageAndUrl,
// (13,3): warning IL3002: Using member 'C.M1()' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app. Message from attribute. https://helpurl
- VerifyCS.Diagnostic ().WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", " Message from attribute.", " https://helpurl"));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", " Message from attribute.", " https://helpurl"));
}
[Fact]
@@ -129,7 +163,7 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestRequiresAssemblyFilesWithMessageAndUrl,
// (13,3): warning IL3002: Using member 'C.M1()' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app. https://helpurl
- VerifyCS.Diagnostic ().WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", "", " https://helpurl"));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (13, 3, 13, 7).WithArguments ("C.M1()", "", " https://helpurl"));
}
[Fact]
@@ -172,7 +206,151 @@ class C
}";
return VerifyRequiresAssemblyFilesAnalyzer (TestNoDiagnosticIsProducedIfCallerIsAnnotated,
// (8,3): warning IL3002: Using member 'C.M2()' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app. Warn from M2.
- VerifyCS.Diagnostic ().WithSpan (8, 3, 8, 7).WithArguments ("C.M2()", " Warn from M2.", ""));
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (8, 3, 8, 7).WithArguments ("C.M2()", " Warn from M2.", ""));
+ }
+
+ [Fact]
+ public Task GetExecutingAssemblyLocation ()
+ {
+ const string src = @"
+using System.Reflection;
+class C
+{
+ public string M() => Assembly.GetExecutingAssembly().Location;
+}";
+
+ return VerifyRequiresAssemblyFilesAnalyzer (src,
+ // (5,26): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (5, 26, 5, 66).WithArguments ("System.Reflection.Assembly.Location"));
+ }
+
+ [Fact]
+ public Task GetAssemblyLocationViaAssemblyProperties ()
+ {
+ var src = @"
+using System.Reflection;
+class C
+{
+ public void M()
+ {
+ var a = Assembly.GetExecutingAssembly();
+ _ = a.Location;
+ // below methods are marked as obsolete in 5.0
+ // _ = a.CodeBase;
+ // _ = a.EscapedCodeBase;
+ }
+}";
+ return VerifyRequiresAssemblyFilesAnalyzer (src,
+ // (8,13): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.Assembly.Location")
+ );
+ }
+
+ [Fact]
+ public Task CallKnownDangerousAssemblyMethods ()
+ {
+ var src = @"
+using System.Reflection;
+class C
+{
+ public void M()
+ {
+ var a = Assembly.GetExecutingAssembly();
+ _ = a.GetFile(""/some/file/path"");
+ _ = a.GetFiles();
+ }
+}";
+ return VerifyRequiresAssemblyFilesAnalyzer (src,
+ // (8,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3001).WithSpan (8, 13, 8, 41).WithArguments ("System.Reflection.Assembly.GetFile(string)"),
+ // (9,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3001).WithSpan (9, 13, 9, 25).WithArguments ("System.Reflection.Assembly.GetFiles()")
+ );
+ }
+
+ [Fact]
+ public Task CallKnownDangerousAssemblyNameAttributes ()
+ {
+ var src = @"
+using System.Reflection;
+class C
+{
+ public void M()
+ {
+ var a = Assembly.GetExecutingAssembly().GetName();
+ _ = a.CodeBase;
+ _ = a.EscapedCodeBase;
+ }
+}";
+ return VerifyRequiresAssemblyFilesAnalyzer (src,
+ // (8,13): warning IL3000: 'System.Reflection.AssemblyName.CodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.AssemblyName.CodeBase"),
+ // (9,13): warning IL3000: 'System.Reflection.AssemblyName.EscapedCodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (9, 13, 9, 30).WithArguments ("System.Reflection.AssemblyName.EscapedCodeBase")
+ );
+ }
+
+ [Fact]
+ public Task GetAssemblyLocationFalsePositive ()
+ {
+ // This is an OK use of Location and GetFile since these assemblies were loaded from
+ // a file, but the analyzer is conservative
+ var src = @"
+using System.Reflection;
+class C
+{
+ public void M()
+ {
+ var a = Assembly.LoadFrom(""/some/path/not/in/bundle"");
+ _ = a.Location;
+ _ = a.GetFiles();
+ }
+}";
+ return VerifyRequiresAssemblyFilesAnalyzer (src,
+ // (8,13): warning IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.Assembly.Location"),
+ // (9,13): warning IL3001: Assemblies embedded in a single-file app cannot have additional files in the manifest.
+ VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3001).WithSpan (9, 13, 9, 25).WithArguments ("System.Reflection.Assembly.GetFiles()")
+ );
+ }
+
+ [Fact]
+ public Task PublishSingleFileIsNotSet ()
+ {
+ var src = @"
+using System.Reflection;
+class C
+{
+ public void M()
+ {
+ var a = Assembly.GetExecutingAssembly().Location;
+ }
+}";
+ // If 'PublishSingleFile' is not set to true, no diagnostics should be produced by the analyzer. This will
+ // effectively verify that the number of produced diagnostics matches the number of expected ones (zero).
+ return VerifyCS.VerifyAnalyzerAsync (src);
+ }
+
+ [Fact]
+ public Task SupressWarningsWithRequiresAssemblyFiles ()
+ {
+ const string src = @"
+using System.Reflection;
+using System.Diagnostics.CodeAnalysis;
+class C
+{
+ [RequiresAssemblyFiles]
+ public void M()
+ {
+ var a = Assembly.GetExecutingAssembly();
+ _ = a.Location;
+ var b = Assembly.GetExecutingAssembly();
+ _ = b.GetFile(""/some/file/path"");
+ _ = b.GetFiles();
+ }
+}";
+
+ return VerifyRequiresAssemblyFilesAnalyzer (src);
}
}
}