From 51827185f6bedd5781af8a0d87cd83eb5460eb4c Mon Sep 17 00:00:00 2001 From: Jose Perez Rodriguez Date: Tue, 16 Jun 2020 15:00:46 -0700 Subject: [PATCH] Adding linker correctness tests to test library annotations for the linker (#37618) --- .../libraries/execute-trimming-tests-steps.yml | 7 ++ eng/pipelines/runtime-linker-tests.yml | 39 +++++++++ .../linker/SupportFiles/Directory.Build.props | 10 +++ .../linker/SupportFiles/Directory.Build.targets | 24 ++++++ eng/testing/linker/project.csproj.template | 11 +++ eng/testing/linker/trimmingTests.targets | 97 ++++++++++++++++++++++ src/libraries/Directory.Build.props | 2 + src/libraries/Directory.Build.targets | 1 + .../TrimmingTests/GenericArraySortHelperTest.cs | 16 ++++ .../System.Runtime.TrimmingTests.proj | 5 ++ src/libraries/restore/runtime/runtime.depproj | 2 +- src/libraries/tests.proj | 10 ++- 12 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 eng/pipelines/libraries/execute-trimming-tests-steps.yml create mode 100644 eng/pipelines/runtime-linker-tests.yml create mode 100644 eng/testing/linker/SupportFiles/Directory.Build.props create mode 100644 eng/testing/linker/SupportFiles/Directory.Build.targets create mode 100644 eng/testing/linker/project.csproj.template create mode 100644 eng/testing/linker/trimmingTests.targets create mode 100644 src/libraries/System.Runtime/tests/TrimmingTests/GenericArraySortHelperTest.cs create mode 100644 src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj diff --git a/eng/pipelines/libraries/execute-trimming-tests-steps.yml b/eng/pipelines/libraries/execute-trimming-tests-steps.yml new file mode 100644 index 0000000..183cebb --- /dev/null +++ b/eng/pipelines/libraries/execute-trimming-tests-steps.yml @@ -0,0 +1,7 @@ +parameters: + archType: '' + +steps: + # Execute tests + - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci -arch ${{ parameters.archType }} $(_osParameter) -s libs.tests -c $(_BuildConfig) /p:TestAssemblies=false /p:TestTrimming=true $(_officialBuildParameter) $(_crossBuildPropertyArg) /bl:$(Build.SourcesDirectory)/artifacts/log/$(buildConfigUpper)/TrimmingTests.binlog + displayName: Run Trimming Tests diff --git a/eng/pipelines/runtime-linker-tests.yml b/eng/pipelines/runtime-linker-tests.yml new file mode 100644 index 0000000..ab65e1d --- /dev/null +++ b/eng/pipelines/runtime-linker-tests.yml @@ -0,0 +1,39 @@ +# The purpose of this pipeline is to exercise local developer workflow in the consolidated +# runtime repo. In particular, it is supposed to run the root "build" script just like any +# normal developer normally would and monitor regressions w.r.t. this fundamental scenario. + +trigger: + batch: true + branches: + include: + - master + - release/*.* + +pr: + branches: + include: + - master + - release/*.* + +jobs: +# +# Checkout repository +# +- template: /eng/pipelines/common/checkout-job.yml + +# +# Build Release config vertical for Windows, Linux, Linux musl and OSX +# +- template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/common/global-build-job.yml + buildConfig: release + platforms: + - Windows_NT_x64 + - OSX_x64 + - Linux_x64 + jobParameters: + testGroup: innerloop + nameSuffix: Runtime_Release + buildArgs: -s clr+libs -c $(_BuildConfig) + extraStepsTemplate: /eng/pipelines/libraries/execute-trimming-tests-steps.yml diff --git a/eng/testing/linker/SupportFiles/Directory.Build.props b/eng/testing/linker/SupportFiles/Directory.Build.props new file mode 100644 index 0000000..f64aabf --- /dev/null +++ b/eng/testing/linker/SupportFiles/Directory.Build.props @@ -0,0 +1,10 @@ + + + true + <_TrimmerDefaultAction>link + true + false + + true + + \ No newline at end of file diff --git a/eng/testing/linker/SupportFiles/Directory.Build.targets b/eng/testing/linker/SupportFiles/Directory.Build.targets new file mode 100644 index 0000000..90ce573 --- /dev/null +++ b/eng/testing/linker/SupportFiles/Directory.Build.targets @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template new file mode 100644 index 0000000..b762f74 --- /dev/null +++ b/eng/testing/linker/project.csproj.template @@ -0,0 +1,11 @@ + + + + Exe + {NetCoreAppCurrent} + {RuntimeIdentifier} + {RuntimePackDir} + {TargetingPackDir} + + + \ No newline at end of file diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets new file mode 100644 index 0000000..7e4f91b --- /dev/null +++ b/eng/testing/linker/trimmingTests.targets @@ -0,0 +1,97 @@ + + + $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'trimmingTests')) + $([MSBuild]::NormalizeDirectory('$(TrimmingTestDir)', 'projects')) + $([MSBuild]::NormalizePath('$(DotNetRoot)', 'dotnet')) + $(MSBuildThisFileDirectory)project.csproj.template + + + + + + + $(TrimmingTestDir) + + + + + + + + + + + + $([MSBuild]::NormalizeDirectory('$(TrimmingTestProjectsDir)', '$(MSBuildProjectName)', '%(Filename)', '$(PackageRID)')) + $(PackageRID) + + + + %(ProjectDir)project.csproj + $([MSBuild]::NormalizePath('%(ProjectDir)', 'bin', '$(Configuration)', '$(NetCoreAppCurrent)', '%(TestRuntimeIdentifier)', 'publish', 'project')) + $([MSBuild]::NormalizeDirectory('%(ProjectDir)', 'bin', '$(Configuration)', '$(NetCoreAppCurrent)', '%(TestRuntimeIdentifier)', 'publish')) + $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'microsoft.netcore.app.runtime.%(TestRuntimeIdentifier)', '$(Configuration)')) + + + + + + %(Identity) + + + + + + + <_projectDir>%(TestConsoleApps.ProjectDir)\ + <_projectFile>%(TestConsoleApps.ProjectFile) + <_projectSourceFile>%(TestConsoleApps.ProjectCompileItems) + + + + + + + + + + + "$(TestDotNetPath)" + $(TestRestoreCommand) msbuild /t:PublishTrimmed + $(TestRestoreCommand) /nr:false + $(TestRestoreCommand) /warnaserror + $(TestRestoreCommand) -p:configuration=Release + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libraries/Directory.Build.props b/src/libraries/Directory.Build.props index df200fa..fd05586 100644 --- a/src/libraries/Directory.Build.props +++ b/src/libraries/Directory.Build.props @@ -57,6 +57,8 @@ false true + true + false diff --git a/src/libraries/Directory.Build.targets b/src/libraries/Directory.Build.targets index 995f353..520de08 100644 --- a/src/libraries/Directory.Build.targets +++ b/src/libraries/Directory.Build.targets @@ -136,6 +136,7 @@ + diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/GenericArraySortHelperTest.cs b/src/libraries/System.Runtime/tests/TrimmingTests/GenericArraySortHelperTest.cs new file mode 100644 index 0000000..d863967 --- /dev/null +++ b/src/libraries/System.Runtime/tests/TrimmingTests/GenericArraySortHelperTest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections; + +class Program +{ + static int Main(string[] args) + { + var x = new[] { 5, 4, 3, 100, 2, 1 }; + var y = new[] { "a", "b", "c", "h", "d", "e" }; + // This will test that GenericArraySortHelper'2 called by reflection will be kept. + Array.Sort(x, y); + // This will test that GenericArraySortHelper'1 called by reflection will be kept. + Array.Sort(y); + return 100; + } +} diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj b/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj new file mode 100644 index 0000000..da4a46f --- /dev/null +++ b/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj @@ -0,0 +1,5 @@ + + + + + diff --git a/src/libraries/restore/runtime/runtime.depproj b/src/libraries/restore/runtime/runtime.depproj index e9ac35f..623a74f 100644 --- a/src/libraries/restore/runtime/runtime.depproj +++ b/src/libraries/restore/runtime/runtime.depproj @@ -80,7 +80,6 @@ @@ -90,6 +89,7 @@ include/%(RecursiveDir) + diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 6e92a43..cb272c9 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -8,6 +8,9 @@ $(ArtifactsBinDir)\*.Tests\**\coverage.opencover.xml $(ArtifactsDir)coverage true + + true + false @@ -17,7 +20,7 @@ - + + + + +