Delete infrastructure files that are no longer used (dotnet/coreclr#24684)
authorJan Kotas <jkotas@microsoft.com>
Tue, 21 May 2019 20:28:49 +0000 (13:28 -0700)
committerGitHub <noreply@github.com>
Tue, 21 May 2019 20:28:49 +0000 (13:28 -0700)
* Delete Jenkins scripts

* Delete support files for the old CoreFX test infrastructure

* Delete CoreFX test file setup utility

Commit migrated from https://github.com/dotnet/coreclr/commit/c03f31fbc4105cbea4053409f91bc25040093d20

12 files changed:
src/coreclr/netci.groovy [deleted file]
src/coreclr/perf.groovy [deleted file]
src/coreclr/tests/CoreFX/CoreFX.issues.json [deleted file]
src/coreclr/tests/CoreFX/CoreFXTestListURL.txt [deleted file]
src/coreclr/tests/CoreFX/CoreFXTestListURL_Linux.txt [deleted file]
src/coreclr/tests/CoreFX/CoreFXTestListURL_OSX.txt [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/CoreFX.TestUtils.TestFileSetup.csproj [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestFileHelper.cs [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestRunHelper.cs [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Program.cs [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/RSPGenerator.cs [deleted file]
src/coreclr/tests/src/Common/CoreFX/TestFileSetup/XUnit/XUnitTestAssembly.cs [deleted file]

diff --git a/src/coreclr/netci.groovy b/src/coreclr/netci.groovy
deleted file mode 100755 (executable)
index bb31ba9..0000000
+++ /dev/null
@@ -1,3839 +0,0 @@
-// Import the utility functionality.
-
-import jobs.generation.*
-
-// The input project name (e.g. dotnet/coreclr)
-def project = GithubProject
-// The input branch name (e.g. master)
-def branch = GithubBranchName
-def projectFolder = Utilities.getFolderName(project) + '/' + Utilities.getFolderName(branch)
-
-// Create a folder for JIT stress jobs and associated folder views
-folder('jitstress')
-Utilities.addStandardFolderView(this, 'jitstress', project)
-
-// Create a folder for testing via illink
-folder('illink')
-Utilities.addStandardFolderView(this, 'illink', project)
-
-def static getOSGroup(def os) {
-    def osGroupMap = ['Ubuntu'      : 'Linux',
-                      'Ubuntu16.04' : 'Linux',
-                      'Ubuntu16.10' : 'Linux',
-                      'RHEL7.2'     : 'Linux',
-                      'Debian8.4'   : 'Linux',
-                      'Fedora24'    : 'Linux',
-                      'CentOS7.1'   : 'Linux',
-                      'Tizen'       : 'Linux',
-                      'OSX10.12'    : 'OSX',
-                      'Windows_NT'  : 'Windows_NT']
-    def osGroup = osGroupMap.get(os, null)
-    assert osGroup != null : "Could not find os group for ${os}"
-    return osGroupMap[os]
-}
-
-// We use this class (vs variables) so that the static functions can access data here.
-class Constants {
-
-    // We have very limited Windows ARM64 hardware (used for ARM/ARM64 testing) and Linux/arm32 and Linux/arm64 hardware.
-    // So only allow certain branches to use it.
-    def static LimitedHardwareBranches = [
-               'master']
-
-    // Innerloop build OS's
-    // The Windows_NT_BuildOnly OS is a way to speed up the Non-Windows builds by avoiding
-    // test execution in the build flow runs.  It generates the exact same build
-    // as Windows_NT but without running the tests.
-    def static osList = [
-               'Ubuntu',
-               'Debian8.4',
-               'OSX10.12',
-               'Windows_NT',
-               'Windows_NT_BuildOnly',
-               'CentOS7.1',
-               'RHEL7.2',
-               'Ubuntu16.04',
-               'Ubuntu16.10',
-               'Fedora24',
-               'Tizen']
-
-    def static crossList = [
-               'Ubuntu',
-               'Debian8.4',
-               'OSX10.12',
-               'Windows_NT',
-               'CentOS7.1',
-               'RHEL7.2']
-
-    // This is a set of JIT stress modes combined with the set of variables that
-    // need to be set to actually enable that stress mode.  The key of the map is the stress mode and
-    // the values are the environment variables
-    def static jitStressModeScenarios = [
-               'minopts'                        : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JITMinOpts' : '1'],
-               'tieredcompilation'              : ['COMPlus_TieredCompilation' : '1'], // this can be removed once tiered compilation is on by default
-               'no_tiered_compilation'          : ['COMPlus_TieredCompilation' : '0'],
-               'no_tiered_compilation_innerloop': ['COMPlus_TieredCompilation' : '0'],
-               'forcerelocs'                    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_ForceRelocs' : '1'],
-               'jitstress1'                     : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '1'],
-               'jitstress2'                     : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2'],
-               'jitstress1_tiered'              : ['COMPlus_TieredCompilation' : '1', 'COMPlus_JitStress' : '1'],
-               'jitstress2_tiered'              : ['COMPlus_TieredCompilation' : '1', 'COMPlus_JitStress' : '2'],
-               'jitstressregs1'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '1'],
-               'jitstressregs2'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '2'],
-               'jitstressregs3'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '3'],
-               'jitstressregs4'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '4'],
-               'jitstressregs8'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '8'],
-               'jitstressregs0x10'              : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x10'],
-               'jitstressregs0x80'              : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x80'],
-               'jitstressregs0x1000'            : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x1000'],
-               'jitstress2_jitstressregs1'      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '1'],
-               'jitstress2_jitstressregs2'      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '2'],
-               'jitstress2_jitstressregs3'      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '3'],
-               'jitstress2_jitstressregs4'      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '4'],
-               'jitstress2_jitstressregs8'      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '8'],
-               'jitstress2_jitstressregs0x10'   : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '0x10'],
-               'jitstress2_jitstressregs0x80'   : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '0x80'],
-               'jitstress2_jitstressregs0x1000' : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '0x1000'],
-               'tailcallstress'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_TailcallStress' : '1'],
-               'jitsse2only'                    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableAVX' : '0', 'COMPlus_EnableSSE3_4' : '0'],
-               'jitnosimd'                      : ['COMPlus_TieredCompilation' : '0', 'COMPlus_FeatureSIMD' : '0'],
-               'jitincompletehwintrinsic'       : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableIncompleteISAClass' : '1'],
-               'jitx86hwintrinsicnoavx'         : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableIncompleteISAClass' : '1', 'COMPlus_EnableAVX' : '0'], // testing the legacy SSE encoding
-               'jitx86hwintrinsicnoavx2'        : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableIncompleteISAClass' : '1', 'COMPlus_EnableAVX2' : '0'], // testing SNB/IVB
-               'jitx86hwintrinsicnosimd'        : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableIncompleteISAClass' : '1', 'COMPlus_FeatureSIMD' : '0'], // match "jitnosimd", may need to remove after decoupling HW intrinsic from FeatureSIMD
-               'jitnox86hwintrinsic'            : ['COMPlus_TieredCompilation' : '0', 'COMPlus_EnableIncompleteISAClass' : '1', 'COMPlus_EnableSSE' : '0' , 'COMPlus_EnableSSE2' : '0' , 'COMPlus_EnableSSE3' : '0' , 'COMPlus_EnableSSSE3' : '0' , 'COMPlus_EnableSSE41' : '0' , 'COMPlus_EnableSSE42' : '0' , 'COMPlus_EnableAVX' : '0' , 'COMPlus_EnableAVX2' : '0' , 'COMPlus_EnableAES' : '0' , 'COMPlus_EnableBMI1' : '0' , 'COMPlus_EnableBMI2' : '0' , 'COMPlus_EnableFMA' : '0' , 'COMPlus_EnableLZCNT' : '0' , 'COMPlus_EnablePCLMULQDQ' : '0' , 'COMPlus_EnablePOPCNT' : '0'],
-               'corefx_baseline'                : ['COMPlus_TieredCompilation' : '0'], // corefx baseline
-               'corefx_minopts'                 : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JITMinOpts' : '1'],
-               'corefx_tieredcompilation'       : ['COMPlus_TieredCompilation' : '1'],  // this can be removed once tiered compilation is on by default
-               'corefx_jitstress1'              : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '1'],
-               'corefx_jitstress2'              : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStress' : '2'],
-               'corefx_jitstressregs1'          : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '1'],
-               'corefx_jitstressregs2'          : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '2'],
-               'corefx_jitstressregs3'          : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '3'],
-               'corefx_jitstressregs4'          : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '4'],
-               'corefx_jitstressregs8'          : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '8'],
-               'corefx_jitstressregs0x10'       : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x10'],
-               'corefx_jitstressregs0x80'       : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x80'],
-               'corefx_jitstressregs0x1000'     : ['COMPlus_TieredCompilation' : '0', 'COMPlus_JitStressRegs' : '0x1000'],
-               'gcstress0x3'                    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0x3'],
-               'gcstress0xc'                    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC'],
-               'zapdisable'                     : ['COMPlus_TieredCompilation' : '0', 'COMPlus_ZapDisable' : '1', 'COMPlus_ReadyToRun' : '0'],
-               'heapverify1'                    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_HeapVerify' : '1'],
-               'gcstress0xc_zapdisable'             : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_ZapDisable' : '1', 'COMPlus_ReadyToRun' : '0'],
-               'gcstress0xc_zapdisable_jitstress2'  : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_ZapDisable' : '1', 'COMPlus_ReadyToRun' : '0', 'COMPlus_JitStress'  : '2'],
-               'gcstress0xc_zapdisable_heapverify1' : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_ZapDisable' : '1', 'COMPlus_ReadyToRun' : '0', 'COMPlus_HeapVerify' : '1'],
-               'gcstress0xc_jitstress1'             : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_JitStress'  : '1'],
-               'gcstress0xc_jitstress2'             : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_JitStress'  : '2'],
-               'gcstress0xc_minopts_heapverify1'    : ['COMPlus_TieredCompilation' : '0', 'COMPlus_GCStress' : '0xC', 'COMPlus_JITMinOpts' : '1', 'COMPlus_HeapVerify' : '1']
-    ]
-
-    // This is a set of ReadyToRun stress scenarios
-    def static r2rStressScenarios = [
-               'r2r_jitstress1'             : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStress": "1"],
-               'r2r_jitstress2'             : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStress": "2"],
-               'r2r_jitstress1_tiered'      : ['COMPlus_TieredCompilation' : '1', "COMPlus_JitStress": "1"],
-               'r2r_jitstress2_tiered'      : ['COMPlus_TieredCompilation' : '1', "COMPlus_JitStress": "2"],
-               'r2r_jitstressregs1'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "1"],
-               'r2r_jitstressregs2'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "2"],
-               'r2r_jitstressregs3'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "3"],
-               'r2r_jitstressregs4'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "4"],
-               'r2r_jitstressregs8'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "8"],
-               'r2r_jitstressregs0x10'      : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "0x10"],
-               'r2r_jitstressregs0x80'      : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "0x80"],
-               'r2r_jitstressregs0x1000'    : ['COMPlus_TieredCompilation' : '0', "COMPlus_JitStressRegs": "0x1000"],
-               'r2r_jitminopts'             : ['COMPlus_TieredCompilation' : '0', "COMPlus_JITMinOpts": "1"], 
-               'r2r_jitforcerelocs'         : ['COMPlus_TieredCompilation' : '0', "COMPlus_ForceRelocs": "1"],
-               'r2r_gcstress15'             : ['COMPlus_TieredCompilation' : '0', "COMPlus_GCStress": "0xF"],
-               'r2r_no_tiered_compilation'  : ['COMPlus_TieredCompilation' : '0'],
-    ]
-
-    // This is the basic set of scenarios
-    def static basicScenarios = [
-               'innerloop',
-               'normal',
-               'ilrt',
-               'r2r',
-               'longgc',
-               'gcsimulator',
-               // 'jitdiff', // jitdiff is currently disabled, until someone spends the effort to make it fully work
-               'standalone_gc',
-               'gc_reliability_framework',
-               'illink',
-               'corefx_innerloop',
-               'crossgen_comparison',
-               'pmi_asm_diffs']
-
-    def static allScenarios = basicScenarios + r2rStressScenarios.keySet() + jitStressModeScenarios.keySet()
-
-    // Valid PR trigger combinations.
-    def static prTriggeredValidInnerLoopCombos = [
-        'Windows_NT': [
-            'arm': [
-                'Checked'
-            ],
-            'arm64': [
-                'Checked'
-            ]
-        ],
-        'Windows_NT_BuildOnly': [
-            'arm': [
-                'Checked'
-            ], 
-        ]
-    ]
-
-    // A set of scenarios that are valid for arm/arm64 tests run on hardware. This is a map from valid scenario name
-    // to Tests.lst file categories to exclude.
-    //
-    // This list should contain a subset of the scenarios from `allScenarios`. Please keep this in the same order as that,
-    // and with the same values, with some commented out, for easier maintenance.
-    //
-    // Note that some scenarios that are commented out should be enabled, but haven't yet been.
-    //
-    def static validArmWindowsScenarios = [
-               'innerloop',
-               'normal',
-               // 'ilrt'
-               'r2r',
-               // 'longgc'
-               // 'formatting'
-               // 'gcsimulator'
-               // 'jitdiff'
-               // 'standalone_gc'
-               // 'gc_reliability_framework'
-               // 'illink'
-               // 'corefx_innerloop'
-               // 'crossgen_comparison'
-               // 'pmi_asm_diffs'
-               'r2r_jitstress1',
-               'r2r_jitstress2',
-               'r2r_jitstress1_tiered',
-               'r2r_jitstress2_tiered',
-               'r2r_jitstressregs1',
-               'r2r_jitstressregs2',
-               'r2r_jitstressregs3',
-               'r2r_jitstressregs4',
-               'r2r_jitstressregs8',
-               'r2r_jitstressregs0x10',
-               'r2r_jitstressregs0x80',
-               'r2r_jitstressregs0x1000',
-               'r2r_jitminopts',
-               'r2r_jitforcerelocs',
-               'r2r_gcstress15',
-               'r2r_no_tiered_compilation',
-               'minopts',
-               'tieredcompilation',
-               'no_tiered_compilation',
-               'no_tiered_compilation_innerloop',
-               'forcerelocs',
-               'jitstress1',
-               'jitstress2',
-               'jitstress1_tiered',
-               'jitstress2_tiered',
-               'jitstressregs1',
-               'jitstressregs2',
-               'jitstressregs3',
-               'jitstressregs4',
-               'jitstressregs8',
-               'jitstressregs0x10',
-               'jitstressregs0x80',
-               'jitstressregs0x1000',
-               'jitstress2_jitstressregs1',
-               'jitstress2_jitstressregs2',
-               'jitstress2_jitstressregs3',
-               'jitstress2_jitstressregs4',
-               'jitstress2_jitstressregs8',
-               'jitstress2_jitstressregs0x10',
-               'jitstress2_jitstressregs0x80',
-               'jitstress2_jitstressregs0x1000',
-               'tailcallstress',
-               // 'jitsse2only'                     // Only relevant to xarch
-               'jitnosimd',                         // Only interesting on platforms where SIMD support exists.
-               // 'jitincompletehwintrinsic'
-               // 'jitx86hwintrinsicnoavx'
-               // 'jitx86hwintrinsicnoavx2'
-               // 'jitx86hwintrinsicnosimd'
-               // 'jitnox86hwintrinsic'
-               'corefx_baseline',                   // corefx tests don't use smarty
-               'corefx_minopts',                    // corefx tests don't use smarty
-               'corefx_tieredcompilation',          // corefx tests don't use smarty
-               'corefx_jitstress1',                 // corefx tests don't use smarty
-               'corefx_jitstress2',                 // corefx tests don't use smarty
-               'corefx_jitstressregs1',             // corefx tests don't use smarty
-               'corefx_jitstressregs2',             // corefx tests don't use smarty
-               'corefx_jitstressregs3',             // corefx tests don't use smarty
-               'corefx_jitstressregs4',             // corefx tests don't use smarty
-               'corefx_jitstressregs8',             // corefx tests don't use smarty
-               'corefx_jitstressregs0x10',          // corefx tests don't use smarty
-               'corefx_jitstressregs0x80',          // corefx tests don't use smarty
-               'corefx_jitstressregs0x1000',        // corefx tests don't use smarty
-               'gcstress0x3',
-               'gcstress0xc',
-               'zapdisable',
-               'heapverify1',
-               'gcstress0xc_zapdisable',
-               'gcstress0xc_zapdisable_jitstress2',
-               'gcstress0xc_zapdisable_heapverify1',
-               'gcstress0xc_jitstress1',
-               'gcstress0xc_jitstress2',
-               'gcstress0xc_minopts_heapverify1',
-
-               //
-               // NOTE: the following scenarios are not defined in the 'allScenarios' list! Is this a bug?
-               //
-
-               'minopts_zapdisable',
-               'gcstress0x3_jitstress1',
-               'gcstress0x3_jitstress2',
-               'gcstress0x3_jitstressregs1',
-               'gcstress0x3_jitstressregs2',
-               'gcstress0x3_jitstressregs3',
-               'gcstress0x3_jitstressregs4',
-               'gcstress0x3_jitstressregs8',
-               'gcstress0x3_jitstressregs0x10',
-               'gcstress0x3_jitstressregs0x80',
-               'gcstress0x3_jitstressregs0x1000',
-               'gcstress0xc_jitstressregs1',
-               'gcstress0xc_jitstressregs2',
-               'gcstress0xc_jitstressregs3',
-               'gcstress0xc_jitstressregs4',
-               'gcstress0xc_jitstressregs8',
-               'gcstress0xc_jitstressregs0x10',
-               'gcstress0xc_jitstressregs0x80',
-               'gcstress0xc_jitstressregs0x1000'
-    ]
-  
-    def static validLinuxArmScenarios = [
-               'innerloop',
-               'normal',
-               // 'ilrt'
-               'r2r',
-               // 'longgc'
-               // 'formatting'
-               // 'gcsimulator'
-               // 'jitdiff'
-               // 'standalone_gc'
-               // 'gc_reliability_framework'
-               // 'illink'
-               // 'corefx_innerloop'
-               'crossgen_comparison',
-               'pmi_asm_diffs',
-               'r2r_jitstress1',
-               'r2r_jitstress2',
-               'r2r_jitstress1_tiered',
-               'r2r_jitstress2_tiered',
-               'r2r_jitstressregs1',
-               'r2r_jitstressregs2',
-               'r2r_jitstressregs3',
-               'r2r_jitstressregs4',
-               'r2r_jitstressregs8',
-               'r2r_jitstressregs0x10',
-               'r2r_jitstressregs0x80',
-               'r2r_jitstressregs0x1000',
-               'r2r_jitminopts',
-               'r2r_jitforcerelocs',
-               'r2r_gcstress15',
-               'r2r_no_tiered_compilation',
-               'minopts',
-               'tieredcompilation',
-               'no_tiered_compilation',
-               'no_tiered_compilation_innerloop',
-               'forcerelocs',
-               'jitstress1',
-               'jitstress2',
-               'jitstress1_tiered',
-               'jitstress2_tiered',
-               'jitstressregs1',
-               'jitstressregs2',
-               'jitstressregs3',
-               'jitstressregs4',
-               'jitstressregs8',
-               'jitstressregs0x10',
-               'jitstressregs0x80',
-               'jitstressregs0x1000',
-               'jitstress2_jitstressregs1',
-               'jitstress2_jitstressregs2',
-               'jitstress2_jitstressregs3',
-               'jitstress2_jitstressregs4',
-               'jitstress2_jitstressregs8',
-               'jitstress2_jitstressregs0x10',
-               'jitstress2_jitstressregs0x80',
-               'jitstress2_jitstressregs0x1000',
-               'tailcallstress',
-               // 'jitsse2only'                          // Only relevant to xarch
-               // 'jitnosimd'                            // Only interesting on platforms where SIMD support exists.
-               // 'jitincompletehwintrinsic'
-               // 'jitx86hwintrinsicnoavx'
-               // 'jitx86hwintrinsicnoavx2'
-               // 'jitx86hwintrinsicnosimd'
-               // 'jitnox86hwintrinsic'
-               'corefx_baseline',
-               'corefx_minopts',
-               'corefx_tieredcompilation',
-               'corefx_jitstress1',
-               'corefx_jitstress2',
-               'corefx_jitstressregs1',
-               'corefx_jitstressregs2',
-               'corefx_jitstressregs3',
-               'corefx_jitstressregs4',
-               'corefx_jitstressregs8',
-               'corefx_jitstressregs0x10',
-               'corefx_jitstressregs0x80',
-               'corefx_jitstressregs0x1000',
-               'gcstress0x3',
-               'gcstress0xc',
-               'zapdisable',
-               'heapverify1',
-               'gcstress0xc_zapdisable',
-               'gcstress0xc_zapdisable_jitstress2',
-               'gcstress0xc_zapdisable_heapverify1',
-               'gcstress0xc_jitstress1',
-               'gcstress0xc_jitstress2',
-               'gcstress0xc_minopts_heapverify1'
-    ]
-
-    def static validLinuxArm64Scenarios = [
-               'innerloop',
-               'normal',
-               // 'ilrt'
-               'r2r',
-               // 'longgc'
-               // 'formatting'
-               // 'gcsimulator'
-               // 'jitdiff'
-               // 'standalone_gc'
-               // 'gc_reliability_framework'
-               // 'illink'
-               // 'corefx_innerloop'
-               'crossgen_comparison',
-               'pmi_asm_diffs',
-               'r2r_jitstress1',
-               'r2r_jitstress2',
-               'r2r_jitstress1_tiered',
-               'r2r_jitstress2_tiered',
-               'r2r_jitstressregs1',
-               'r2r_jitstressregs2',
-               'r2r_jitstressregs3',
-               'r2r_jitstressregs4',
-               'r2r_jitstressregs8',
-               'r2r_jitstressregs0x10',
-               'r2r_jitstressregs0x80',
-               'r2r_jitstressregs0x1000',
-               'r2r_jitminopts',
-               'r2r_jitforcerelocs',
-               'r2r_gcstress15',
-               'r2r_no_tiered_compilation',
-               'minopts',
-               'tieredcompilation',
-               'no_tiered_compilation',
-               'no_tiered_compilation_innerloop',
-               'forcerelocs',
-               'jitstress1',
-               'jitstress2',
-               'jitstress1_tiered',
-               'jitstress2_tiered',
-               'jitstressregs1',
-               'jitstressregs2',
-               'jitstressregs3',
-               'jitstressregs4',
-               'jitstressregs8',
-               'jitstressregs0x10',
-               'jitstressregs0x80',
-               'jitstressregs0x1000',
-               'jitstress2_jitstressregs1',
-               'jitstress2_jitstressregs2',
-               'jitstress2_jitstressregs3',
-               'jitstress2_jitstressregs4',
-               'jitstress2_jitstressregs8',
-               'jitstress2_jitstressregs0x10',
-               'jitstress2_jitstressregs0x80',
-               'jitstress2_jitstressregs0x1000',
-               'tailcallstress',
-               // 'jitsse2only'                         // Only relevant to xarch
-               'jitnosimd',                             // Only interesting on platforms where SIMD support exists.
-               // 'jitincompletehwintrinsic'
-               // 'jitx86hwintrinsicnoavx'
-               // 'jitx86hwintrinsicnoavx2'
-               // 'jitx86hwintrinsicnosimd'
-               // 'jitnox86hwintrinsic'
-               'corefx_baseline',
-               'corefx_minopts',
-               'corefx_tieredcompilation',
-               'corefx_jitstress1',
-               'corefx_jitstress2',
-               'corefx_jitstressregs1',
-               'corefx_jitstressregs2',
-               'corefx_jitstressregs3',
-               'corefx_jitstressregs4',
-               'corefx_jitstressregs8',
-               'corefx_jitstressregs0x10',
-               'corefx_jitstressregs0x80',
-               'corefx_jitstressregs0x1000',
-               'gcstress0x3',
-               'gcstress0xc',
-               'zapdisable',
-               'heapverify1',
-               'gcstress0xc_zapdisable',
-               'gcstress0xc_zapdisable_jitstress2',
-               'gcstress0xc_zapdisable_heapverify1',
-               'gcstress0xc_jitstress1',
-               'gcstress0xc_jitstress2',
-               'gcstress0xc_minopts_heapverify1'
-    ]
-
-    def static configurationList = ['Debug', 'Checked', 'Release']
-
-    // This is the set of architectures
-    // Some of these are pseudo-architectures:
-    //    armem -- ARM builds/runs using an emulator. Used for Tizen runs.
-    def static architectureList = ['arm', 'armem', 'arm64', 'x64', 'x86']
-
-    // This set of architectures that cross build on Windows and run on Windows ARM64 hardware.
-    def static armWindowsCrossArchitectureList = ['arm', 'arm64']
-}
-
-// **************************************************************
-// Create some specific views
-// 
-// These aren't using the Utilities.addStandardFolderView() function, because that creates
-// views based on a single regular expression. These views will be generated by adding a
-// specific set of jobs to them.
-//
-// Utilities.addStandardFolderView() also creates a lot of additional stuff around the
-// view, like "Build Statistics", "Job Statistics", "Unstable Jobs". Until it is determined
-// those are required, don't add them (which simplifies the view pages, as well).
-// **************************************************************
-
-class Views {
-    def static MergeJobView = null
-    def static PeriodicJobView = null
-    def static ArchitectureViews = [:]
-    def static OSViews = [:]
-}
-
-// MergeJobView: include all jobs that execute when a PR change is merged.
-Views.MergeJobView = listView('Merge') {
-    recurse()
-    columns {
-        status()
-        weather()
-        name()
-        lastSuccess()
-        lastFailure()
-        lastDuration()
-        buildButton()
-    }
-}
-
-// PeriodicJobView: include all jobs that execute on a schedule
-Views.PeriodicJobView = listView('Periodic') {
-    recurse()
-    columns {
-        status()
-        weather()
-        name()
-        lastSuccess()
-        lastFailure()
-        lastDuration()
-        buildButton()
-    }
-}
-
-// Create a view for non-PR jobs for each architecture.
-Constants.architectureList.each { architecture ->
-    Views.ArchitectureViews[architecture] = listView(architecture) {
-        recurse()
-        columns {
-            status()
-            weather()
-            name()
-            lastSuccess()
-            lastFailure()
-            lastDuration()
-            buildButton()
-        }
-    }
-}
-
-// Create a view for non-PR jobs for each OS.
-Constants.osList.each { os ->
-    // Don't create one for the special 'Windows_NT_BuildOnly'
-    if (os == 'Windows_NT_BuildOnly') {
-        return
-    }
-    Views.OSViews[os] = listView(os) {
-        recurse()
-        columns {
-            status()
-            weather()
-            name()
-            lastSuccess()
-            lastFailure()
-            lastDuration()
-            buildButton()
-        }
-    }
-}
-
-def static addToMergeView(def job) {
-    Views.MergeJobView.with {
-        jobs {
-            name(job.name)
-        }
-    }
-}
-
-def static addToPeriodicView(def job) {
-    Views.PeriodicJobView.with {
-        jobs {
-            name(job.name)
-        }
-    }
-}
-
-def static addToViews(def job, def isFlowJob, def isPR, def architecture, def os, def configuration, def scenario) {
-    if (isPR) {
-        // No views want PR jobs currently.
-        return
-    }
-
-    // We don't want to include in view any job that is only used by a flow job (because we want the views to have only the
-    // "top-level" jobs. Build only jobs are such jobs.
-    if (os == 'Windows_NT_BuildOnly') {
-        return
-    }
-
-    if (!isFlowJob) {
-        // For non-flow jobs, which ones are only used by flow jobs?
-        if ((architecture == 'arm') || (architecture == 'arm64')) {
-            if (isCoreFxScenario(scenario)) {
-                // We have corefx-specific scenario builds for each of the runs, but these are driven by flow jobs.
-                return
-            }
-
-            // We're left with the basic normal/innerloop builds. We might want to remove these from the views also, if desired.
-            // However, there are a few, like the Debug Build, that is build only, not "Build and Test", that we should leave.
-        }
-    }
-
-    // Add to architecture view.
-    Views.ArchitectureViews[architecture].with {
-        jobs {
-            name(job.name)
-        }
-    }
-
-    // Add to OS view.
-    Views.OSViews[os].with {
-        jobs {
-            name(job.name)
-        }
-    }
-}
-
-def static addPeriodicTriggerHelper(def job, String cronString, boolean alwaysRuns = false) {
-    addToPeriodicView(job)
-    Utilities.addPeriodicTrigger(job, cronString, alwaysRuns)
-}
-
-def static addGithubPushTriggerHelper(def job) {
-    // Disable all Push trigger jobs. All jobs will need to be requested.
-    // addToMergeView(job)
-    // Utilities.addGithubPushTrigger(job)
-}
-
-
-def static setMachineAffinity(def job, def os, def architecture, def options = null) {
-    assert os instanceof String
-    assert architecture instanceof String
-
-    def armArches = ['arm', 'armem', 'arm64']
-
-    if (!(architecture in armArches)) {
-        assert options == null
-        Utilities.setMachineAffinity(job, os, 'latest-or-auto')
-
-        return
-    }
-
-    // This is an arm(64) job.
-    //
-    // There are several options.
-    //
-    // Windows_NT
-    // 
-    // Arm32 (Build) -> latest-arm64
-    //       |-> os == "Windows_NT" && (architecture == "arm") && options['use_arm64_build_machine'] == true
-    // Arm32 (Test)  -> arm64-windows_nt
-    //       |-> os == "Windows_NT" && (architecture == "arm") && options['use_arm64_build_machine'] == false
-    //
-    // Arm64 (Build) -> latest-arm64
-    //       |-> os == "Windows_NT" && architecture == "arm64" && options['use_arm64_build_machine'] == true
-    // Arm64 (Test)  -> arm64-windows_nt
-    //       |-> os == "Windows_NT" && architecture == "arm64" && options['use_arm64_build_machine'] == false
-    //
-    // Ubuntu
-    //
-    // Arm32 emulator (Build, Test) -> arm-cross-latest
-    //       |-> os == "Tizen" && (architecture == "armem")
-    //
-    // Arm32 hardware (Flow) -> Ubuntu 16.04 latest-or-auto (don't use limited arm hardware)
-    //       |-> os == "Ubuntu" && (architecture == "arm") && options['is_flow_job'] == true
-    // Arm32 hardware (Build) -> Ubuntu 16.04 latest-or-auto
-    //       |-> os == "Ubuntu" && (architecture == "arm") && options['is_build_job'] == true
-    // Arm32 hardware (Test) -> Helix ubuntu.1404.arm32.open queue
-    //       |-> os == "Ubuntu" && (architecture == "arm")
-    //
-    // Arm64 (Build) -> arm64-cross-latest
-    //       |-> os != "Windows_NT" && architecture == "arm64" && options['is_build_job'] == true
-    // Arm64 (Test) -> Helix Ubuntu.1604.Arm64.Iron.Open queue
-    //       |-> os != "Windows_NT" && architecture == "arm64"
-    //
-    // Note: we are no longer using Jenkins tags "arm64-huge-page-size", "arm64-small-page-size".
-    // Support for Linux arm64 large page size has been removed for now, as it wasn't being used.
-    //
-    // Note: we are no longer using Jenkins tag 'latest-arm64' for arm/arm64 Windows build machines. Instead,
-    // we are using public VS2017 arm/arm64 tools in a VM from Helix.
-
-    // This has to be a arm arch
-    assert architecture in armArches
-    if (os == "Windows_NT") {
-        // arm32/arm64 Windows jobs share the same machines for now
-        def isBuild = options['use_arm64_build_machine'] == true
-
-        if (isBuild == true) {
-            job.with {
-                label('Windows.10.Amd64.ClientRS4.DevEx.Open')
-            }
-        } else {
-            Utilities.setMachineAffinity(job, 'windows.10.arm64.open')
-        }
-    } else {
-        assert os != 'Windows_NT'
-
-        if (architecture == 'armem') {
-            // arm emulator (Tizen). Build and test on same machine,
-            // using Docker.
-            assert os == 'Tizen'
-            Utilities.setMachineAffinity(job, 'Ubuntu', 'arm-cross-latest')
-        }
-        else {
-            // arm/arm64 Ubuntu on hardware.
-            assert architecture == 'arm' || architecture == 'arm64'
-            def isFlow  = (options != null) && (options['is_flow_job'] == true)
-            def isBuild = (options != null) && (options['is_build_job'] == true)
-            if (isFlow || isBuild) {
-                // arm/arm64 Ubuntu build machine. Build uses docker, so the actual host OS is not
-                // very important. Therefore, use latest or auto. Flow jobs don't need to use arm hardware.
-                Utilities.setMachineAffinity(job, 'Ubuntu16.04', 'latest-or-auto')
-            } else {
-                // arm/arm64 Ubuntu test machine. Specify the Helix queue name here.
-                if (architecture == 'arm64') {
-                    assert os == 'Ubuntu16.04'
-                    job.with {
-                        label('Ubuntu.1604.Arm64.Iron.Open')
-                    }
-                }
-                else {
-                    assert os == 'Ubuntu'
-                    job.with {
-                        label('ubuntu.1404.arm32.open')
-                    }
-                }
-            }
-        }
-    }
-}
-
-// setJobMachineAffinity: compute the machine affinity options for a job,
-// then set the job with those affinity options.
-def static setJobMachineAffinity(def architecture, def os, def isBuildJob, def isTestJob, def isFlowJob, def job)
-{
-    assert (isBuildJob  && !isTestJob && !isFlowJob) ||
-           (!isBuildJob && isTestJob  && !isFlowJob) ||
-           (!isBuildJob && !isTestJob && isFlowJob)
-
-    def affinityOptions = null
-    def affinityArchitecture = architecture
-
-    if (os == "Windows_NT") {
-        if (architecture in Constants.armWindowsCrossArchitectureList) {
-            if (isBuildJob) {
-                affinityOptions = [ "use_arm64_build_machine" : true ]
-            } else if (isTestJob) {
-                affinityOptions = [ "use_arm64_build_machine" : false ]
-            } else if (isFlowJob) {
-                // For the flow jobs set the machine affinity as x64
-                affinityArchitecture = 'x64'
-            }
-        }
-    }
-    else {
-        if ((architecture == 'arm64') || (architecture == 'arm')) {
-            if (isBuildJob) {
-                affinityOptions = ['is_build_job': true]
-            } else if (isFlowJob) {
-                affinityOptions = ['is_flow_job': true]
-            }
-        }
-    }
-
-    setMachineAffinity(job, os, affinityArchitecture, affinityOptions)
-}
-
-def static isGCStressRelatedTesting(def scenario) {
-    // The 'r2r_gcstress15' scenario is a basic scenario.
-    // Detect it and make it a GCStress related.
-    if (scenario == 'r2r_gcstress15')
-    {
-        return true;
-    }
-
-    def gcStressTestEnvVars = [ 'COMPlus_GCStress', 'COMPlus_ZapDisable', 'COMPlus_HeapVerify']
-    def scenarioName = scenario.toLowerCase()
-    def isGCStressTesting = false
-    Constants.jitStressModeScenarios[scenario].each{ k, v ->
-        if (k in gcStressTestEnvVars) {
-            isGCStressTesting = true;
-        }
-    }
-    return isGCStressTesting
-}
-
-def static isCoreFxScenario(def scenario) {
-    def corefx_prefix = 'corefx_'
-    if (scenario.length() < corefx_prefix.length()) {
-        return false
-    }
-    return scenario.substring(0,corefx_prefix.length()) == corefx_prefix
-}
-
-def static isR2RBaselineScenario(def scenario) {
-    return (scenario == 'r2r')
-}
-
-def static isR2RStressScenario(def scenario) {
-    return Constants.r2rStressScenarios.containsKey(scenario)
-}
-
-def static isR2RScenario(def scenario) {
-    return isR2RBaselineScenario(scenario) || isR2RStressScenario(scenario)
-}
-
-def static isJitStressScenario(def scenario) {
-    return Constants.jitStressModeScenarios.containsKey(scenario)
-}
-
-def static isLongGc(def scenario) {
-    return (scenario == 'longgc' || scenario == 'gcsimulator')
-}
-
-def static isJitDiff(def scenario) {
-    return (scenario == 'jitdiff')
-}
-
-def static isGcReliabilityFramework(def scenario) {
-    return (scenario == 'gc_reliability_framework')
-}
-
-def static isArmWindowsScenario(def scenario) {
-    return Constants.validArmWindowsScenarios.contains(scenario)
-}
-
-def static isValidPrTriggeredInnerLoopJob(os, architecture, configuration, isBuildOnly) {
-    if (isBuildOnly == true) {
-        os = 'Windows_NT_BuildOnly'
-    }
-
-    def validOsPrTriggerArchConfigs = Constants.prTriggeredValidInnerLoopCombos[os]
-    if (validOsPrTriggerArchConfigs != null) {
-        def validOsPrTriggerConfigs = validOsPrTriggerArchConfigs[architecture]
-        if (validOsPrTriggerConfigs != null) {
-            if (configuration in validOsPrTriggerConfigs) {
-                return true
-            }
-        }
-    }
-
-    return false
-}
-
-// This means the job builds and runs the 'innerloop' test set. This does not mean the job is 
-// scheduled with a default PR trigger despite the correlation being true at the moment.
-def static isInnerloopTestScenario(def scenario) {
-    return (scenario == 'innerloop' || scenario == 'no_tiered_compilation_innerloop')
-}
-
-def static isCrossGenComparisonScenario(def scenario) {
-    return (scenario == 'crossgen_comparison')
-}
-
-def static shouldGenerateCrossGenComparisonJob(def os, def architecture, def configuration, def scenario) {
-    assert isCrossGenComparisonScenario(scenario)
-    return ((os == 'Ubuntu' && architecture == 'arm') || (os == 'Ubuntu16.04' && architecture == 'arm64')) && (configuration == 'Checked' || configuration == 'Release')
-}
-
-def static getFxBranch(def branch) {
-    def fxBranch = branch
-    // Map 'dev/unix_test_workflow' to 'master' so we can test CoreFX jobs in the CoreCLR dev/unix_test_workflow
-    // branch even though CoreFX doesn't have such a branch.
-    if (branch == 'dev/unix_test_workflow') {
-        fxBranch = 'master'
-    }
-    return fxBranch
-}
-
-def static setJobTimeout(newJob, isPR, architecture, configuration, scenario, isBuildOnly) {
-    // 2 hours (120 minutes) is the default timeout
-    def timeout = 120
-
-    if (!isInnerloopTestScenario(scenario)) {
-        // Pri-1 test builds take a long time (see calculateBuildCommands()). So up the Pri-1 build jobs timeout.
-        timeout = 240
-    }
-
-    if (!isBuildOnly) {
-        // Note that these can only increase, never decrease, the Pri-1 timeout possibly set above.
-        if (isGCStressRelatedTesting(scenario)) {
-            timeout = 4320
-        }
-        else if (isCoreFxScenario(scenario)) {
-            timeout = 360
-        }
-        else if (isJitStressScenario(scenario)) {
-            timeout = 300
-        }
-        else if (isR2RBaselineScenario(scenario)) {
-            timeout = 240
-        }
-        else if (isLongGc(scenario)) {
-            timeout = 1440
-        }
-        else if (isJitDiff(scenario)) {
-            timeout = 240
-        }
-        else if (isGcReliabilityFramework(scenario)) {
-            timeout = 1440
-        }
-        else if (architecture == 'armem' || architecture == 'arm64') {
-            timeout = 240
-        }
-
-        if (architecture == 'arm') {
-            // ARM32 machines are particularly slow.
-            timeout += 120
-        }
-    }
-
-    if (configuration == 'Debug') {
-        // Debug runs can be very slow. Add an hour.
-        timeout += 60
-    }
-
-    // If we've changed the timeout from the default, set it in the job.
-
-    if (timeout != 120) {
-        Utilities.setJobTimeout(newJob, timeout)
-    }
-}
-
-def static getJobFolder(def scenario) {
-    if (isJitStressScenario(scenario) || isR2RStressScenario(scenario)) {
-        return 'jitstress'
-    }
-    if (scenario == 'illink') {
-        return 'illink'
-    }
-    return ''
-}
-
-def static getStressModeDisplayName(def scenario) {
-    def displayStr = ''
-    Constants.jitStressModeScenarios[scenario].each{ k, v ->
-        def prefixLength = 'COMPlus_'.length()
-        if (k.length() >= prefixLength) {
-            def modeName = k.substring(prefixLength, k.length())
-            if (displayStr != '') {
-                // Separate multiple variables with a space.
-                displayStr += ' '
-            }
-            displayStr += modeName + '=' + v
-        }
-    }
-
-    if (isCoreFxScenario(scenario)) {
-        displayStr = ('CoreFx ' + displayStr).trim()
-    }
-
-    return displayStr
-}
-
-def static getR2RDisplayName(def scenario) {
-    // Assume the scenario name is one from the r2rStressScenarios dict, and remove its "r2r_" prefix.
-    def displayStr = scenario
-    def prefixLength = 'r2r_'.length()
-    if (displayStr.length() >= prefixLength) {
-        displayStr = "R2R " + displayStr.substring(prefixLength, displayStr.length())
-    } else if (scenario == 'r2r') {
-        displayStr = "R2R"
-    }
-    return displayStr
-}
-
-def static getScenarioDisplayString(def scenario) {
-    switch (scenario) {
-        case 'innerloop':
-            return "Innerloop Build and Test"
-
-        case 'no_tiered_compilation_innerloop':
-            def displayStr = getStressModeDisplayName(scenario)
-            return "Innerloop Build and Test (Jit - ${displayStr})"
-
-        case 'corefx_innerloop':
-            return "CoreFX Tests"
-
-        case 'normal':
-            return "Build and Test"
-
-        case 'jitdiff':
-            return "Jit Diff Build and Test"
-
-        case 'ilrt':
-            return "IL RoundTrip Build and Test"
-
-        case 'longgc':
-            return "Long-Running GC Build & Test"
-
-        case 'gcsimulator':
-            return "GC Simulator"
-
-        case 'standalone_gc':
-            return "Standalone GC"
-
-        case 'gc_reliability_framework':
-            return "GC Reliability Framework"
-
-        case 'illink':
-            return "via ILLink"
-
-        default:
-            if (isJitStressScenario(scenario)) {
-                def displayStr = getStressModeDisplayName(scenario)
-                return "Build and Test (Jit - ${displayStr})"
-            }
-            else if (isR2RScenario(scenario)) {
-                def displayStr = getR2RDisplayName(scenario)
-                return "${displayStr} Build and Test"
-            }
-            else {
-                return "${scenario}"
-            }
-            break
-    }
-
-    println("Unknown scenario: ${scenario}");
-    assert false
-}
-
-//
-// Functions to create an environment script.
-//      envScriptCreate -- initialize the script (call first)
-//      envScriptFinalize -- finalize the script (call last)
-//      envScriptSetStressModeVariables -- set stress mode variables in the env script
-//      envScriptAppendExistingScript -- append an existing script to the generated script
-//
-// Each script returns a string of commands. Concatenate all the strings together before
-// adding them to the builds commands, to make sure they get executed as one Jenkins script.
-//
-
-// Initialize the environment setting script.
-def static envScriptCreate(def os, def stepScriptLocation) {
-    def stepScript = ''
-    if (os == 'Windows_NT') {
-        stepScript += "echo Creating TestEnv script\r\n"
-        stepScript += "if exist ${stepScriptLocation} del ${stepScriptLocation}\r\n"
-
-        // Create at least an empty script.
-        stepScript += "echo. > ${stepScriptLocation}\r\n"
-    }
-    else {
-        stepScript += "echo Creating environment setting script\n"
-        stepScript += "echo \\#\\!/usr/bin/env bash > ${stepScriptLocation}\n"
-    }
-
-    return stepScript
-}
-
-// Generates the string for setting stress mode variables.
-def static envScriptSetStressModeVariables(def os, def stressModeVars, def stepScriptLocation) {
-    def stepScript = ''
-    if (os == 'Windows_NT') {
-        stressModeVars.each{ k, v ->
-            // Write out what we are writing to the script file
-            stepScript += "echo Setting ${k}=${v}\r\n"
-            // Write out the set itself to the script file`
-            stepScript += "echo set ${k}=${v} >> ${stepScriptLocation}\r\n"
-        }
-    }
-    else {
-        stressModeVars.each{ k, v ->
-            // Write out what we are writing to the script file
-            stepScript += "echo Setting ${k}=${v}\n"
-            // Write out the set itself to the script file`
-            stepScript += "echo export ${k}=${v} >> ${stepScriptLocation}\n"
-        }
-    }
-
-    return stepScript
-}
-
-// Append an existing script to an environment script.
-// Returns string of commands to do this.
-def static envScriptAppendExistingScript(def os, def appendScript, def stepScriptLocation) {
-    assert (os == 'Windows_NT')
-    def stepScript = ''
-
-    stepScript += "echo Appending ${appendScript} to ${stepScriptLocation}\r\n"
-    stepScript += "type ${appendScript} >> ${stepScriptLocation}\r\n"
-
-    return stepScript
-}
-
-// Finalize an environment setting script.
-// Returns string of commands to do this.
-def static envScriptFinalize(def os, def stepScriptLocation) {
-    def stepScript = ''
-
-    if (os == 'Windows_NT') {
-        // Display the resulting script. This is useful when looking at the output log file.
-        stepScript += "echo Display the total script ${stepScriptLocation}\r\n"
-        stepScript += "type ${stepScriptLocation}\r\n"
-    }
-    else {
-        stepScript += "chmod +x ${stepScriptLocation}\n"
-    }
-
-    return stepScript
-}
-
-def static isNeedDocker(def architecture, def os, def isBuild) {
-    if (isBuild) {
-        if (architecture == 'x86' && os == 'Ubuntu') {
-            return true
-        }
-        else if (architecture == 'armem') {
-            return true
-        }
-        else if (architecture == 'arm') {
-            if (os == 'Ubuntu') {
-                return true
-            }
-        }
-        else if (architecture == 'arm64') {
-            if (os == 'Ubuntu16.04') {
-                return true
-            }
-        }
-    }
-    else {
-        if (architecture == 'x86' && os == 'Ubuntu') {
-            return true
-        }
-    }
-    return false
-}
-
-def static getDockerImageName(def architecture, def os, def isBuild) {
-    // We must change some docker private images to official later
-    if (isBuild) {
-        if (architecture == 'x86' && os == 'Ubuntu') {
-            return "hseok82/dotnet-buildtools-prereqs:ubuntu-16.04-crossx86-ef0ac75-20175511035548"
-        }
-        else if (architecture == 'armem') {
-            if (os == 'Tizen') {
-                return "tizendotnet/dotnet-buildtools-prereqs:ubuntu-16.04-cross-e435274-20180426002255-tizen-rootfs-5.0m1"
-            }
-        }
-        else if (architecture == 'arm') {
-            if (os == 'Ubuntu') {
-                return "mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-e435274-20180426002420"
-            }
-        }
-        else if (architecture == 'arm64') {
-            if (os == 'Ubuntu16.04') {
-                return "mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921"
-            }
-        }
-    }
-    else {
-        if (architecture == 'x86' && os == 'Ubuntu') {
-            return "hseok82/dotnet-buildtools-prereqs:ubuntu1604_x86_test"
-        }
-    }
-    println("Unknown architecture to use docker: ${architecture} ${os}");
-    assert false
-}
-
-def static getTestArtifactsTgzFileName(def osGroup, def architecture, def configuration) {
-    return "bin-tests-${osGroup}.${architecture}.${configuration}.tgz"
-}
-
-// We have a limited amount of some hardware. For these, scale back the periodic testing we do,
-// and only allowing using this hardware in some specific branches.
-def static jobRequiresLimitedHardware(def architecture, def os) {
-    if (architecture == 'arm') {
-        // arm Windows and Linux hardware is limited.
-        return true
-    }
-    else if (architecture == 'arm64') {
-        // arm64 Windows and Linux hardware is limited.
-        return true
-    }
-    else {
-        return false
-    }
-}
-
-// Calculates the name of the build job based on some typical parameters.
-//
-def static getJobName(def configuration, def architecture, def os, def scenario, def isBuildOnly) {
-    // If the architecture is x64, do not add that info into the build name.
-    // Need to change around some systems and other builds to pick up the right builds
-    // to do that.
-
-    def suffix = scenario != 'normal' ? "_${scenario}" : '';
-    if (isBuildOnly) {
-        suffix += '_bld'
-    }
-    def baseName = ''
-    switch (architecture) {
-        case 'x64':
-            if (scenario == 'normal') {
-                // For now we leave x64 off of the name for compatibility with other jobs
-                baseName = configuration.toLowerCase() + '_' + os.toLowerCase()
-            }
-            else if (scenario == 'formatting') {
-                // we don't care about the configuration for the formatting job. It runs all configs
-                baseName = architecture.toLowerCase() + '_' + os.toLowerCase()
-            }
-            else {
-                baseName = architecture.toLowerCase() + '_' + configuration.toLowerCase() + '_' + os.toLowerCase()
-            }
-            break
-        case 'armem':
-            // These are cross builds
-            assert os == 'Tizen'
-            baseName = 'armel_cross_' + configuration.toLowerCase() + '_' + os.toLowerCase()
-            break
-        case 'arm':
-        case 'arm64':
-            // These are cross builds
-            baseName = architecture.toLowerCase() + '_cross_' + configuration.toLowerCase() + '_' + os.toLowerCase()
-            break
-        case 'x86':
-            baseName = architecture.toLowerCase() + '_' + configuration.toLowerCase() + '_' + os.toLowerCase()
-            break
-        default:
-            println("Unknown architecture: ${architecture}");
-            assert false
-            break
-    }
-
-    return baseName + suffix
-}
-
-def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def os, def configuration, def scenario, def isFlowJob, def isWindowsBuildOnlyJob, def bidailyCrossList) {
-
-    // The dev/unix_test_workflow branch is used for Jenkins CI testing. We generally do not need any non-PR
-    // triggers in the branch, because that would use machine resources unnecessarily.
-    if (branch == 'dev/unix_test_workflow') {
-        return
-    }
-
-    // Limited hardware is restricted for non-PR triggers to certain branches.
-    if (jobRequiresLimitedHardware(architecture, os) && (!(branch in Constants.LimitedHardwareBranches))) {
-        return
-    }
-
-    // Ubuntu x86 CI jobs are failing. Disable non-PR triggered jobs to avoid these constant failures
-    // until this is fixed. Tracked by https://github.com/dotnet/coreclr/issues/19003.
-    if (architecture == 'x86' && os == 'Ubuntu') {
-        return
-    }
-
-    def isNormalOrInnerloop = (scenario == "normal" || scenario == "innerloop")
-
-    // Check scenario.
-    switch (scenario) {
-        case 'crossgen_comparison':
-            if (isFlowJob && (configuration == 'Checked' || configuration == 'Release')) {
-                if (os == 'Ubuntu' && architecture == 'arm') {
-                    // Not enough Linux/arm32 hardware for this.
-                    // addPeriodicTriggerHelper(job, '@daily')
-                }
-                if (os == 'Ubuntu16.04' && architecture == 'arm64') {
-                    addPeriodicTriggerHelper(job, '@daily')
-                }
-            }
-            break
-
-        case 'pmi_asm_diffs':
-            // No non-PR triggers for now.
-            break
-
-        case 'normal':
-            switch (architecture) {
-                case 'x64':
-                case 'x86':
-                    if (isFlowJob && architecture == 'x86' && os == 'Ubuntu') {
-                        addPeriodicTriggerHelper(job, '@daily')
-                    }
-                    else if (isFlowJob || os == 'Windows_NT' || (architecture == 'x64' && !(os in Constants.crossList))) {
-                        addGithubPushTriggerHelper(job)
-                    }
-                    break
-                case 'arm64':
-                    if (os == 'Windows_NT') {
-                        if (isFlowJob || (isNormalOrInnerloop && (configuration == 'Debug'))) {
-                            // We would normally want a per-push trigger, but with limited hardware we can't keep up.
-                            // Do the builds daily.
-                            addPeriodicTriggerHelper(job, '@daily')
-                        }
-                    }
-                    else {
-                        // Only the flow jobs get push triggers; the build and test jobs are triggered by the flow job.
-                        if (isFlowJob) {
-                            addPeriodicTriggerHelper(job, '@daily')
-                        }
-                    }
-                    break
-                case 'arm':
-                    if (os == 'Windows_NT') {
-                        if (isFlowJob || (isNormalOrInnerloop && (configuration == 'Debug'))) {
-                            // We would normally want a push trigger, but with limited hardware we can't keep up.
-                            // Do the builds daily.
-                            addPeriodicTriggerHelper(job, '@daily')
-                        }
-                    }
-                    else {
-                        assert os == 'Ubuntu'
-                        // Only the flow jobs get push triggers; the build and test jobs are triggered by the flow job.
-                        if (isFlowJob) {
-                            // Currently no push triggers, with limited arm Linux hardware.
-                            // TODO: If we have enough machine capacity, add some arm Linux push triggers.
-
-                            // Duplicated by AzDO
-                            // addPeriodicTriggerHelper(job, '@daily')
-                        }
-                    }
-                    break
-                case 'armem':
-                    addGithubPushTriggerHelper(job)
-                    break
-                default:
-                    println("Unknown architecture: ${architecture}");
-                    assert false
-                    break
-            }
-            break
-        case 'r2r':
-            assert !(os in bidailyCrossList)
-            // r2r gets a push trigger for checked/release
-            if (configuration == 'Checked' || configuration == 'Release') {
-                if (architecture == 'x64' && os != 'OSX10.12') {
-                    //Flow jobs should be Windows, Ubuntu, OSX0.12, or CentOS
-                    if (isFlowJob || os == 'Windows_NT') {
-                        addGithubPushTriggerHelper(job)
-                    }
-                // OSX10.12 r2r jobs should only run every 12 hours, not daily.
-                } else if (architecture == 'x64' && os == 'OSX10.12'){
-                    if (isFlowJob) {
-                        addPeriodicTriggerHelper(job, 'H H/12 * * *')
-                    }
-                }
-                // For x86, only add per-commit jobs for Windows
-                else if (architecture == 'x86') {
-                    if (os == 'Windows_NT') {
-                        addGithubPushTriggerHelper(job)
-                    }
-                }
-                // arm r2r jobs should only run weekly.
-                else if (architecture == 'arm') {
-                    if (isFlowJob) {
-                        // Linux arm32 done in AzDO
-                        if (os == 'Windows_NT') {
-                            addPeriodicTriggerHelper(job, '@weekly')
-                        }
-                    }
-                }
-                // arm64 r2r jobs should only run weekly.
-                else if (architecture == 'arm64') {
-                    if (isFlowJob) {
-                        addPeriodicTriggerHelper(job, '@weekly')
-                    }
-                }
-            }
-            break
-        case 'r2r_jitstress1':
-        case 'r2r_jitstress2':
-        case 'r2r_jitstress1_tiered':
-        case 'r2r_jitstress2_tiered':
-        case 'r2r_jitstressregs1':
-        case 'r2r_jitstressregs2':
-        case 'r2r_jitstressregs3':
-        case 'r2r_jitstressregs4':
-        case 'r2r_jitstressregs8':
-        case 'r2r_jitstressregs0x10':
-        case 'r2r_jitstressregs0x80':
-        case 'r2r_jitstressregs0x1000':
-        case 'r2r_jitminopts':
-        case 'r2r_jitforcerelocs':
-        case 'r2r_gcstress15':
-        case 'r2r_no_tiered_compilation':
-            assert !(os in bidailyCrossList)
-
-            // GCStress=C is currently not supported on OS X
-            if (os == 'OSX10.12' && isGCStressRelatedTesting(scenario)) {
-                break
-            }
-
-            if (configuration == 'Checked' || configuration == 'Release') {
-                if (architecture == 'x64') {
-                    //Flow jobs should be Windows, Ubuntu, OSX10.12, or CentOS
-                    if (isFlowJob || os == 'Windows_NT') {
-                        addPeriodicTriggerHelper(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-                    }
-                }
-                // For x86, only add periodic jobs for Windows
-                else if (architecture == 'x86') {
-                    if (os == 'Windows_NT') {
-                        addPeriodicTriggerHelper(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-                    }
-                }
-                else if (architecture == 'arm') {
-                    if (isFlowJob) {
-                        // Linux arm32 duplicated by AzDO
-                        if (os == 'Windows_NT') {
-                            addPeriodicTriggerHelper(job, '@weekly')
-                        }
-                    }
-                }
-                else if (architecture == 'arm64') {
-                    if (isFlowJob) {
-                        addPeriodicTriggerHelper(job, '@weekly')
-                    }
-                }
-            }
-            break
-        case 'longgc':
-            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX10.12')
-            assert configuration == 'Release'
-            assert architecture == 'x64'
-            addPeriodicTriggerHelper(job, '@daily')
-            // TODO: Add once external email sending is available again
-            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-            break
-        case 'gcsimulator':
-            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX10.12')
-            assert configuration == 'Release'
-            assert architecture == 'x64'
-            addPeriodicTriggerHelper(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-            // TODO: Add once external email sending is available again
-            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-            break
-        case 'standalone_gc':
-            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX10.12')
-            assert (configuration == 'Release' || configuration == 'Checked')
-            // TODO: Add once external email sending is available again
-            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-            addPeriodicTriggerHelper(job, '@daily')
-            break
-        case 'gc_reliability_framework':
-            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX10.12')
-            assert (configuration == 'Release' || configuration == 'Checked')
-            // Only triggered by phrase.
-            break
-        case 'ilrt':
-            assert !(os in bidailyCrossList)
-            // ILASM/ILDASM roundtrip one gets a daily build, and only for release
-            if (architecture == 'x64' && configuration == 'Release') {
-                if (isFlowJob || os == 'Windows_NT') {
-                    addPeriodicTriggerHelper(job, '@daily')
-                }
-            }
-            break
-        case 'jitdiff':
-            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX10.12')
-            assert configuration == 'Checked'
-            assert (architecture == 'x64' || architecture == 'x86')
-            addGithubPushTriggerHelper(job)
-            break
-        case 'formatting':
-            assert (os == 'Windows_NT' || os == "Ubuntu")
-            assert architecture == 'x64'
-            addGithubPushTriggerHelper(job)
-            break
-        case 'jitstressregs1':
-        case 'jitstressregs2':
-        case 'jitstressregs3':
-        case 'jitstressregs4':
-        case 'jitstressregs8':
-        case 'jitstressregs0x10':
-        case 'jitstressregs0x80':
-        case 'jitstressregs0x1000':
-        case 'minopts':
-        case 'tieredcompilation':
-        case 'no_tiered_compilation':
-        case 'forcerelocs':
-        case 'jitstress1':
-        case 'jitstress2':
-        case 'jitstress1_tiered':
-        case 'jitstress2_tiered':
-        case 'jitstress2_jitstressregs1':
-        case 'jitstress2_jitstressregs2':
-        case 'jitstress2_jitstressregs3':
-        case 'jitstress2_jitstressregs4':
-        case 'jitstress2_jitstressregs8':
-        case 'jitstress2_jitstressregs0x10':
-        case 'jitstress2_jitstressregs0x80':
-        case 'jitstress2_jitstressregs0x1000':
-        case 'tailcallstress':
-        case 'jitsse2only':
-        case 'jitnosimd':
-        case 'jitnox86hwintrinsic':
-        case 'jitincompletehwintrinsic':
-        case 'jitx86hwintrinsicnoavx':
-        case 'jitx86hwintrinsicnoavx2':
-        case 'jitx86hwintrinsicnosimd':
-        case 'corefx_baseline':
-        case 'corefx_minopts':
-        case 'corefx_tieredcompilation':
-        case 'corefx_jitstress1':
-        case 'corefx_jitstress2':
-        case 'corefx_jitstressregs1':
-        case 'corefx_jitstressregs2':
-        case 'corefx_jitstressregs3':
-        case 'corefx_jitstressregs4':
-        case 'corefx_jitstressregs8':
-        case 'corefx_jitstressregs0x10':
-        case 'corefx_jitstressregs0x80':
-        case 'corefx_jitstressregs0x1000':
-        case 'zapdisable':
-            if (os == 'CentOS7.1') {
-                break
-            }
-            if (os in bidailyCrossList) {
-                break
-            }
-            if ((os == 'Ubuntu') && (architecture == 'arm') && !isCoreFxScenario(scenario)) {
-                // Linux arm32 duplicated by AzDO
-                break
-            }
-            // ARM corefx testing uses non-flow jobs to provide the configuration-specific
-            // build for the flow job. We don't need cron jobs for these. Note that the
-            // Windows ARM jobs depend on a Windows "build only" job that exits the trigger
-            // function very early, so only non-Windows gets here.
-            if ((architecture == 'arm') && isCoreFxScenario(scenario) && !isFlowJob) {
-                break
-            }
-            if ((architecture == 'arm64') && isCoreFxScenario(scenario) && !isFlowJob) {
-                break
-            }
-            if (jobRequiresLimitedHardware(architecture, os)) {
-                if ((architecture == 'arm64') && (os == 'Ubuntu16.04')) {
-                    // These jobs are very fast on Linux/arm64 hardware, so run them daily.
-                    addPeriodicTriggerHelper(job, '@daily')
-                }
-                else if (scenario == 'corefx_baseline') {
-                    addPeriodicTriggerHelper(job, '@daily')
-                }
-                else {
-                    addPeriodicTriggerHelper(job, '@weekly')
-                }
-            }
-            else {
-                addPeriodicTriggerHelper(job, '@daily')
-            }
-            break
-        case 'heapverify1':
-        case 'gcstress0x3':
-            if (os == 'CentOS7.1') {
-                break
-            }
-            if (os in bidailyCrossList) {
-                break
-            }
-            if ((os == 'Ubuntu') && (architecture == 'arm')) {
-                // Linux arm32 duplicated by AzDO
-                break
-            }
-            addPeriodicTriggerHelper(job, '@weekly')
-            break
-        case 'gcstress0xc':
-        case 'gcstress0xc_zapdisable':
-        case 'gcstress0xc_zapdisable_jitstress2':
-        case 'gcstress0xc_zapdisable_heapverify1':
-        case 'gcstress0xc_jitstress1':
-        case 'gcstress0xc_jitstress2':
-        case 'gcstress0xc_minopts_heapverify1':
-            if (os == 'OSX10.12') {
-                // GCStress=C is currently not supported on OS X
-                break
-            }
-            if (os == 'CentOS7.1') {
-                break
-            }
-            if (os in bidailyCrossList) {
-                break
-            }
-            if ((os == 'Ubuntu') && (architecture == 'arm')) {
-                // Linux arm32 duplicated by AzDO
-                break
-            }
-            addPeriodicTriggerHelper(job, '@weekly')
-            break
-
-        case 'illink':
-            // Testing on other operating systems TBD
-            assert (os == 'Windows_NT' || os == 'Ubuntu')
-            if (architecture == 'x64' || architecture == 'x86') {
-                if (configuration == 'Checked') {
-                    addPeriodicTriggerHelper(job, '@daily')
-                }
-            }
-            break
-
-        default:
-            println("Unknown scenario: ${scenario}");
-            assert false
-            break
-    }
-    return
-}
-
-// **************************
-// Define the basic inner loop builds for PR and commit.  This is basically just the set
-// of coreclr builds over linux/osx 10.12/windows and debug/release/checked.  In addition, the windows
-// builds will do a couple extra steps.
-// **************************
-
-// Adds a trigger for the PR build if one is needed.  If isFlowJob is true, then this is the
-// flow job that rolls up the build and test for non-windows OS's.  // If the job is a windows build only job,
-// it's just used for internal builds
-// If you add a job with a trigger phrase, please add that phrase to coreclr/Documentation/project-docs/ci-trigger-phrases.md
-def static addTriggers(def job, def branch, def isPR, def architecture, def os, def configuration, def scenario, def isFlowJob, def isWindowsBuildOnlyJob) {
-    def isNormalOrInnerloop = (scenario == "normal" || scenario == "innerloop")
-    
-    if (isWindowsBuildOnlyJob) {
-        return
-    }
-
-    def bidailyCrossList = ['RHEL7.2', 'Debian8.4']
-    // Non pull request builds.
-    if (!isPR) {
-        addNonPRTriggers(job, branch, isPR, architecture, os, configuration, scenario, isFlowJob, isWindowsBuildOnlyJob, bidailyCrossList)
-        return
-    }
-
-    def arm64Users = [
-        'adityamandaleeka',
-        'AndyAyersMS',
-        'briansull',
-        'BruceForstall',
-        'CarolEidt',
-        'davidwrighton',
-        'echesakovMSFT',
-        'erozenfeld',
-        'janvorli',
-        'jashook',
-        'pgodeq',
-        'RussKeldorph',
-        'sandreenko',
-        'swaroop-sridhar',
-        'jkotas',
-        'markwilkie',
-        'weshaggard',
-        'tannergooding'
-    ]
-
-    // Pull request builds.  Generally these fall into two categories: default triggers and on-demand triggers
-    // We generally only have a distinct set of default triggers but a bunch of on-demand ones.
-
-    def contextString = ""
-    def triggerString = ""
-    def needsTrigger = true
-    def isDefaultTrigger = false
-    def isArm64PrivateJob = false
-    def scenarioString = ""
-
-    // Set up default context string and trigger phrases. This is overridden in places, sometimes just to keep
-    // the existing non-standard descriptions and phrases. In some cases, the scenarios are asymmetric, as for
-    // some jobs where the Debug configuration just does builds, no tests.
-    //
-    // Some configurations, like arm32/arm64, always use the exact scenario name as part of the context string.
-    // This makes it possible to copy/paste the displayed context string as "@dotnet-bot test <context-string>"
-    // to invoke the trigger. Any "fancy" context string makes that impossible, requiring the user to either 
-    // remember the mapping from context string to trigger string, or use "@dotnet-bot help" to look it up.
-
-    if (architecture == 'armem') {
-        assert os == 'Tizen'
-        architecture = 'armel'
-    }
-
-    switch (architecture) {
-        case 'armel':
-        case 'arm':
-        case 'arm64':
-            contextString = "${os} ${architecture} Cross ${configuration}"
-            triggerString = "(?i).*test\\W+${os}\\W+${architecture}\\W+Cross\\W+${configuration}"
-
-            if (scenario == 'innerloop') {
-                contextString += " Innerloop"
-                triggerString += "\\W+Innerloop"
-            }
-            else {
-                contextString += " ${scenario}"
-                triggerString += "\\W+${scenario}"
-            }
-
-            if (scenario == 'pmi_asm_diffs') {
-                // Don't add the "Build and Test" part
-            }
-            else if (configuration == 'Debug') {
-                contextString += " Build"
-                triggerString += "\\W+Build"
-            }
-            else {
-                contextString += " Build and Test"
-                triggerString += "\\W+Build and Test"
-            }
-
-            triggerString += ".*"
-            break
-
-        default:
-            scenarioString = getScenarioDisplayString(scenario)
-            contextString = "${os} ${architecture} ${configuration} ${scenarioString}"
-            triggerString = "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}"
-
-            switch (scenario) {
-                case 'normal':
-                    triggerString += "\\W+Build and Test.*"
-                    break
-
-                case 'corefx_innerloop': // maintain this asymmetry
-                    triggerString += "\\W+CoreFX Tests.*"
-                    break
-
-                default:
-                    triggerString += "\\W+${scenario}.*"
-                    break
-            }
-
-            triggerString += ".*"
-            break
-    }
-
-    // Now determine what kind of trigger this job needs, if any. Any job should be triggerable, except for
-    // non-flow jobs that are only used as part of flow jobs.
-
-    switch (architecture) {
-        case 'x64': // editor brace matching: {
-            if (scenario == 'formatting') {
-                assert configuration == 'Checked'
-                if (os == 'Windows_NT' || os == 'Ubuntu') {
-                    isDefaultTrigger = true
-                    contextString = "${os} ${architecture} Formatting"
-                }
-                break
-            }
-
-            if (scenario == 'pmi_asm_diffs') {
-                // Everything is already set.
-                // No default triggers.
-                break
-            }
-
-            switch (os) {
-                // OpenSUSE, Debian & RedHat get trigger phrases for pri 0 build, and pri 1 build & test
-                case 'Debian8.4':
-                case 'RHEL7.2':
-                    if (scenario == 'innerloop') {
-                        assert !isFlowJob
-                        contextString = "${os} ${architecture} ${configuration} Innerloop Build"
-                        isDefaultTrigger = true
-                        break
-                    }
-
-                    // fall through
-
-                case 'Fedora24':
-                case 'Ubuntu16.04':
-                case 'Ubuntu16.10':
-                    assert !isFlowJob
-                    assert scenario != 'innerloop'
-                    contextString = "${os} ${architecture} ${configuration} Build"
-                    triggerString = "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}\\W+Build.*"
-                    break
-
-                case 'Ubuntu':
-                    if (scenario == 'illink') {
-                        break
-                    }
-                    else if (scenario == 'corefx_innerloop') {
-                        if (configuration == 'Checked') {
-                            isDefaultTrigger = true
-                        }
-                        break
-                    }
-
-                    // fall through
-
-                case 'OSX10.12':
-                    // Triggers on the non-flow jobs aren't necessary here
-                    // Corefx testing uses non-flow jobs.
-                    if (!isFlowJob && !isCoreFxScenario(scenario)) {
-                        needsTrigger = false
-                        break
-                    }
-                    switch (scenario) {
-                        case 'innerloop':
-                            isDefaultTrigger = true
-                            break
-
-                        case 'no_tiered_compilation_innerloop':
-                            if (os == 'Ubuntu') {
-                                isDefaultTrigger = true
-                            }
-                            break
-
-                        default:
-                            break
-                    }
-                    break
-
-                case 'CentOS7.1':
-                    switch (scenario) {
-                        case 'innerloop':
-                            // CentOS uses checked for default PR tests while debug is build only
-                            if (configuration == 'Debug') {
-                                isDefaultTrigger = true
-                                contextString = "${os} ${architecture} ${configuration} Innerloop Build"
-                                break
-                            }
-                            
-                            // Make sure this is a flow job to get build and test.
-                            if (!isFlowJob) {
-                                needsTrigger = false
-                                break
-                            }
-
-                            if (configuration == 'Checked') {
-                                assert job.name.contains("flow")
-                                isDefaultTrigger = true
-                                contextString = "${os} ${architecture} ${configuration} Innerloop Build and Test"
-                            }
-                            break
-
-                        case 'normal':
-                            // Make sure this is a flow job to get build and test.
-                            if (!isFlowJob) {
-                                needsTrigger = false
-                                break
-                            }
-                            break
-
-                        default:
-                            break
-                    }
-                    break
-
-                case 'Windows_NT':
-                    switch (scenario) {
-                        case 'innerloop':
-                        case 'no_tiered_compilation_innerloop':
-                            isDefaultTrigger = true
-                            break
-
-                        case 'corefx_innerloop':
-                            if (configuration == 'Checked' || configuration == 'Release') {
-                                isDefaultTrigger = true
-                            }
-                            break
-
-                        default:
-                            break
-                    }
-                    break
-
-                default:
-                    println("Unknown os: ${os}");
-                    assert false
-                    break
-
-            } // switch (os)
-
-            break
-        // editor brace matching: }
-
-        case 'armel': // editor brace matching: {
-            job.with {
-                publishers {
-                    azureVMAgentPostBuildAction {
-                        agentPostBuildAction('Delete agent if the build was not successful (when idle).')
-                    }
-                }
-            }
-
-            switch (os) {
-                case 'Tizen':
-                    if (scenario == 'innerloop') {
-                        if (configuration == 'Checked') {
-                            isDefaultTrigger = true
-                        }
-                    }
-                    break
-            }
-
-            break
-        // editor brace matching: }
-
-        case 'arm':
-        case 'arm64': // editor brace matching: {
-
-            switch (os) {
-                case 'Ubuntu':
-                case 'Ubuntu16.04':
-
-                    // Triggers on the non-flow jobs aren't necessary
-                    if (!isFlowJob) {
-                        needsTrigger = false
-                        break
-                    }
-                    if (os == 'Ubuntu' && architecture == 'arm') {
-                        switch (scenario) {
-                            case 'innerloop':
-                            case 'no_tiered_compilation_innerloop':
-                                if (configuration == 'Checked') {
-                                    isDefaultTrigger = true
-                                }
-                                break
-                             case 'crossgen_comparison':
-                                if (configuration == 'Checked' || configuration == 'Release') {
-                                    isDefaultTrigger = true
-                                }
-                                break
-                        }
-                    }
-                    break
-
-                case 'Windows_NT':
-                    assert isArmWindowsScenario(scenario)
-
-                    // For Debug normal/innerloop scenario, we don't do test runs, so we don't use flow jobs. That means we need a trigger for
-                    // the non-flow Build job. All others need a trigger on the flow job.
-                    def needsFlowJobTrigger = !(isNormalOrInnerloop && (configuration == 'Debug'))
-                    if (isFlowJob != needsFlowJobTrigger) {
-                        needsTrigger = false
-                        break
-                    }
-
-                    switch (scenario) {
-                        case 'innerloop':
-                            if (configuration == 'Checked') {
-                                isDefaultTrigger = true
-                                isArm64PrivateJob = true
-                            }
-                            break
-                        default:
-                            isArm64PrivateJob = true
-                            break
-                    }
-                    break
-                default:
-                    println("NYI os: ${os}");
-                    assert false
-                    break
-            }
-            break
-
-        // editor brace matching: }
-        case 'x86': // editor brace matching: {
-            assert ((os == 'Windows_NT') || ((os == 'Ubuntu') && isNormalOrInnerloop))
-            if (os == 'Ubuntu') {
-                // Triggers on the non-flow jobs aren't necessary here
-                if (!isFlowJob) {
-                    needsTrigger = false
-                    break
-                }
-                
-                // on-demand only for ubuntu x86
-                contextString = "${os} ${architecture} ${configuration} Build"
-                triggerString = "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}.*"
-                break
-            }
-            switch (scenario) {
-                case 'innerloop':
-                case 'no_tiered_compilation_innerloop':
-                    isDefaultTrigger = true
-                    break
-                default:
-                    break
-            }
-            break
-
-        // editor brace matching: }
-
-        default:
-            println("Unknown architecture: ${architecture}");
-            assert false
-            break
-    }
-
-    if (needsTrigger) {
-        if (isArm64PrivateJob) {
-            // ignore isDefaultTrigger to disable Jenkins by default
-            if (false) {
-                Utilities.addDefaultPrivateGithubPRTriggerForBranch(job, branch, contextString, null, arm64Users)
-            }
-            else {
-                Utilities.addPrivateGithubPRTriggerForBranch(job, branch, contextString, triggerString, null, arm64Users)
-            }
-        }
-        else {
-            // ignore isDefaultTrigger to disable Jenkins by default
-            if (false) {
-                Utilities.addGithubPRTriggerForBranch(job, branch, contextString)
-            }
-            else {
-                Utilities.addGithubPRTriggerForBranch(job, branch, contextString, triggerString)
-            }
-        }
-    }
-}
-
-def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR, def architecture, def configuration, def os, def isBuildOnly) {
-    def buildCommands = []
-    def osGroup = getOSGroup(os)
-    def lowerConfiguration = configuration.toLowerCase()
-
-    // Which set of tests to build? Innerloop tests build Pri-0.
-    // Currently, we only generate asm diffs on Pri-0 tests, if we generate asm diffs on tests at all.
-    // CoreFX testing skipts building tests altogether (done below).
-    // All other scenarios build Pri-1 tests.
-    def priority = '1'
-    if (isInnerloopTestScenario(scenario)) {
-        priority = '0'
-    }
-
-    def doCoreFxTesting = isCoreFxScenario(scenario)
-
-    def buildCoreclrTests = true
-    if (doCoreFxTesting || (scenario == 'pmi_asm_diffs')) {
-        // These scenarios don't need the coreclr tests build.
-        buildCoreclrTests = false
-    }
-
-    // Calculate the build steps, archival, and xunit results
-    switch (os) {
-        case 'Windows_NT': // editor brace matching: {
-            switch (architecture) {
-                case 'x64':
-                case 'x86':
-                    def arch = architecture
-                    def buildOpts = ''
-
-                    if (scenario == 'formatting') {
-                        buildCommands += "python -u tests\\scripts\\format.py -c %WORKSPACE% -o Windows_NT -a ${arch}"
-                        Utilities.addArchival(newJob, "format.patch", "", true, false)
-                        break
-                    }
-
-                    if (scenario == 'illink') {
-                        buildCommands += "tests\\scripts\\build_illink.cmd clone ${arch}"
-                    }
-
-                    // If it is a release build for Windows, ensure PGO is used, else fail the build.
-                    if ((lowerConfiguration == 'release') &&
-                        (scenario in Constants.basicScenarios)) {
-
-                        buildOpts += ' -enforcepgo'
-                    }
-
-                    if (buildCoreclrTests) {
-                        buildOpts += " -priority=${priority}"
-                    } else {
-                        buildOpts += ' skiptests';
-                    }
-
-                    // Set __TestIntermediateDir to something short. If __TestIntermediateDir is already set, build-test.cmd will
-                    // output test binaries to that directory. If it is not set, the binaries are sent to a default directory whose name is about
-                    // 35 characters long.
-
-                    buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} ${buildOpts}"
-
-                    if (scenario == 'pmi_asm_diffs') {
-                        // Now, generate the layout. We don't have any tests, but we need to restore the packages before calling runtest.cmd.
-                        // Call build-test.cmd to do this. It will do a little more than we need, but that's ok.
-                        buildCommands += "build-test.cmd ${lowerConfiguration} ${arch} skipmanaged skipnative"
-                        buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} GenerateLayoutOnly"
-
-                        // TODO: Add -target_branch and -commit_hash arguments based on GitHub variables.
-                        buildCommands += "python -u %WORKSPACE%\\tests\\scripts\\run-pmi-diffs.py -arch ${arch} -ci_arch ${architecture} -build_type ${configuration}"
-
-                        // ZIP up the asm
-                        buildCommands += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('_\\pmi\\asm', '.\\dasm.${os}.${architecture}.${configuration}.zip')\"";
-
-                        // Archive the asm
-                        Utilities.addArchival(newJob, "dasm.${os}.${architecture}.${configuration}.zip")
-                        break
-                    }
-
-                    if (!isBuildOnly) {
-                        def runtestArguments = ''
-                        def testOpts = 'collectdumps'
-
-                        if (isR2RScenario(scenario)) {
-
-                            // If this is a ReadyToRun scenario, pass 'crossgen'
-                            // to cause framework assemblies to be crossgen'ed. Pass 'runcrossgentests'
-                            // to cause the tests to be crossgen'ed.
-
-                            testOpts += ' crossgen runcrossgentests'
-                        }
-                        else if (scenario == 'jitdiff') {
-                            testOpts += ' jitdisasm crossgen'
-                        }
-                        else if (scenario == 'ilrt') {
-                            testOpts += ' ilasmroundtrip'
-                        }
-                        else if (isLongGc(scenario)) {
-                            testOpts += " ${scenario} sequential"
-                        }
-                        else if (scenario == 'standalone_gc') {
-                            testOpts += ' gcname clrgc.dll'
-                        }
-                        else if (scenario == 'illink') {
-                            testOpts += " link %WORKSPACE%\\linker\\linker\\bin\\netcore_Release\\netcoreapp2.0\\win10-${arch}\\publish\\illink.exe"
-                        }
-
-                        // Default per-test timeout is 10 minutes. For stress modes and Debug scenarios, increase this
-                        // to 30 minutes (30 * 60 * 1000 = 180000). The "timeout" argument to runtest.cmd sets this, by
-                        // taking a timeout value in milliseconds. (Note that it sets the __TestTimeout environment variable,
-                        // which is read by the xunit harness.)
-                        if (isJitStressScenario(scenario) || isR2RStressScenario(scenario) || (lowerConfiguration == 'debug'))
-                        {
-                            def timeout = 1800000
-                            testOpts += " timeout ${timeout}"
-                        }
-
-                        // If we are running a stress mode, we should write out the set of key
-                        // value env pairs to a file at this point and then we'll pass that to runtest.cmd
-
-                        def envScriptPath = ''
-                        if (isJitStressScenario(scenario) || isR2RStressScenario(scenario)) {
-                            def buildCommandsStr = ''
-                            envScriptPath = "%WORKSPACE%\\SetStressModes.bat"
-                            buildCommandsStr += envScriptCreate(os, envScriptPath)
-
-                            if (isJitStressScenario(scenario)) {
-                                buildCommandsStr += envScriptSetStressModeVariables(os, Constants.jitStressModeScenarios[scenario], envScriptPath)
-                            }
-                            else if (isR2RStressScenario(scenario)) {
-                                buildCommandsStr += envScriptSetStressModeVariables(os, Constants.r2rStressScenarios[scenario], envScriptPath)
-                            }
-
-                            envScriptFinalize(os, envScriptPath)
-
-                            // Note that buildCommands is an array of individually executed commands; we want all the commands used to 
-                            // create the SetStressModes.bat script to be executed together, hence we accumulate them as strings
-                            // into a single script.
-                            buildCommands += buildCommandsStr
-                        }
-                        if (envScriptPath != '') {
-                            testOpts += " TestEnv ${envScriptPath}"
-                        }
-
-                        runtestArguments = "${lowerConfiguration} ${arch} ${testOpts}"
-
-                        if (doCoreFxTesting) {
-                            if (scenario == 'corefx_innerloop') {
-                                // Create CORE_ROOT and testhost
-                                buildCommands += "build-test.cmd ${lowerConfiguration} ${arch} buildtesthostonly"                                
-                                buildCommands += "tests\\runtest.cmd ${runtestArguments} CoreFXTestsAll"
-
-                                // Archive and process (only) the test results
-                                Utilities.addArchival(newJob, "bin/Logs/**/testResults.xml", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                                Utilities.addXUnitDotNETResults(newJob, "bin/Logs/**/testResults.xml")
-                            }
-                            else {
-                                def workspaceRelativeFxRoot = "_/fx"
-                                def absoluteFxRoot = "%WORKSPACE%\\_\\fx"
-                                def fxBranch = getFxBranch(branch)
-                                def exclusionRspPath = "%WORKSPACE%\\tests\\scripts\\run-corefx-tests-exclusions.txt"
-
-                                buildCommands += "python -u %WORKSPACE%\\tests\\scripts\\run-corefx-tests.py -arch ${arch} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${fxBranch} -env_script ${envScriptPath} -exclusion_rsp_file ${exclusionRspPath}"
-
-                                // Archive and process (only) the test results
-                                Utilities.addArchival(newJob, "${workspaceRelativeFxRoot}/artifacts/bin/**/testResults.xml", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                                Utilities.addXUnitDotNETResults(newJob, "${workspaceRelativeFxRoot}/artifacts/bin/**/testResults.xml")
-
-                                //Archive additional build stuff to diagnose why my attempt at fault injection isn't causing CI to fail
-                                Utilities.addArchival(newJob, "SetStressModes.bat", "", true, false)
-                                Utilities.addArchival(newJob, "${workspaceRelativeFxRoot}/artifacts/bin/testhost/**", "", true, false)
-                            }
-                        }
-                        else if (isGcReliabilityFramework(scenario)) {
-                            buildCommands += "tests\\runtest.cmd ${runtestArguments} GenerateLayoutOnly"
-                            buildCommands += "tests\\scripts\\run-gc-reliability-framework.cmd ${arch} ${configuration}"
-                        }
-                        else {
-                            def buildCommandsStr = "call tests\\runtest.cmd ${runtestArguments}\r\n"
-                            if (!isBuildOnly) {
-                                // If we ran the tests, collect the test logs collected by xunit. We want to do this even if the tests fail, so we
-                                // must do it in the same batch file as the test run.
-
-                                buildCommandsStr += "echo on\r\n" // Show the following commands in the log. "echo" doesn't alter the errorlevel.
-                                buildCommandsStr += "set saved_errorlevel=%errorlevel%\r\n"
-                                buildCommandsStr += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${arch}.${configuration}\\Reports', '.\\bin\\tests\\testReports.zip')\"\r\n";
-                                buildCommandsStr += "exit /b %saved_errorlevel%\r\n"
-
-                                def doNotFailIfNothingArchived = true
-                                def archiveOnlyIfSuccessful = false
-                                Utilities.addArchival(newJob, "bin/tests/testReports.zip", "", doNotFailIfNothingArchived, archiveOnlyIfSuccessful)
-                            }
-                            buildCommands += buildCommandsStr
-                        }
-                    } // end if (!isBuildOnly)
-
-                    if (!doCoreFxTesting) {
-                        // Run the rest of the build
-                        // Build the mscorlib for the other OS's
-                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} linuxmscorlib"
-                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} osxmscorlib"
-                       
-                        if (arch == 'x64') {
-                            buildCommands += "build.cmd ${lowerConfiguration} arm64 linuxmscorlib"
-                        }
-
-                        if (!isJitStressScenario(scenario)) {
-                            // Zip up the tests directory so that we don't use so much space/time copying
-                            // 10s of thousands of files around.
-                            buildCommands += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${arch}.${configuration}', '.\\bin\\tests\\tests.zip')\"";
-
-                            // For Windows, pull full test results and test drops for x86/x64.
-                            // No need to pull for stress mode scenarios (downstream builds use the default scenario)
-                            Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip", "bin/Product/**/.nuget/**")
-                        }
-
-                        if (scenario == 'jitdiff') {
-                            // retrieve jit-dasm output for base commit, and run jit-diff
-                            if (!isBuildOnly) {
-                                // if this is a build only job, we want to keep the default (build) artifacts for the flow job
-                                Utilities.addArchival(newJob, "bin/tests/${osGroup}.${arch}.${configuration}/dasm/**")
-                            }
-                        }
-
-                        if (!isBuildOnly) {
-                            Utilities.addXUnitDotNETResults(newJob, 'bin/**/TestRun*.xml', true)
-                        }
-                    }
-
-                    // Archive the logs, even if the build failed (which is when they are most interesting).
-                    Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                    break
-                case 'arm':
-                case 'arm64':
-                    assert isArmWindowsScenario(scenario)
-
-                    def buildOpts = ''
-
-                    if (buildCoreclrTests) {
-                        buildOpts += " -priority=${priority}"
-                    } else {
-                        buildOpts += ' skiptests'
-                    }
-
-                    // This is now a build only job. Do not run tests. Use the flow job.
-                    buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture} ${buildOpts}"
-
-                    if (doCoreFxTesting) {
-                        assert isBuildOnly
-
-                        // Set the stress mode variables; this is incorporated into the generated CoreFx RunTests.cmd files.
-                        def envScriptPath = ''
-                        def buildCommandsStr = ''
-                        envScriptPath = "%WORKSPACE%\\SetStressModes.bat"
-                        buildCommandsStr += envScriptCreate(os, envScriptPath)
-                        buildCommandsStr += envScriptSetStressModeVariables(os, Constants.jitStressModeScenarios[scenario], envScriptPath)
-                        envScriptFinalize(os, envScriptPath)
-                        buildCommands += buildCommandsStr
-
-                        def workspaceRelativeFxRootLinux = "_/fx"
-                        def workspaceRelativeFxRootWin = "_\\fx"
-                        def absoluteFxRoot = "%WORKSPACE%\\_\\fx"
-                        def fxBranch = getFxBranch(branch)
-
-                        buildCommands += "python -u %WORKSPACE%\\tests\\scripts\\run-corefx-tests.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${fxBranch} -env_script ${envScriptPath} -no_run_tests"
-
-                        // Zip up the CoreFx runtime and tests. We don't need the CoreCLR binaries; they have been copied to the CoreFX tree.
-                        buildCommands += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('${workspaceRelativeFxRootWin}\\artifacts\\bin\\testhost\\netcoreapp-Windows_NT-Release-${architecture}', '${workspaceRelativeFxRootWin}\\fxruntime.zip')\"";
-                        buildCommands += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('${workspaceRelativeFxRootWin}\\artifacts\\bin\\tests', '${workspaceRelativeFxRootWin}\\fxtests.zip')\"";
-
-                        Utilities.addArchival(newJob, "${workspaceRelativeFxRootLinux}/fxruntime.zip")
-                        Utilities.addArchival(newJob, "${workspaceRelativeFxRootLinux}/fxtests.zip")
-                    } else {
-                        // Zip up the tests directory so that we don't use so much space/time copying
-                        // 10s of thousands of files around.
-                        buildCommands += "powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${architecture}.${configuration}', '.\\bin\\tests\\tests.zip')\"";
-
-                        // Add archival.
-                        Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip", "bin/Product/**/.nuget/**")
-                    }
-
-                    // Archive the logs, even if the build failed (which is when they are most interesting).
-                    Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                    break
-                default:
-                    println("Unknown architecture: ${architecture}");
-                    assert false
-                    break
-            }
-            break
-        // end case 'Windows_NT'; editor brace matching: }
-        case 'Ubuntu':
-        case 'Ubuntu16.04':
-        case 'Ubuntu16.10':
-        case 'Debian8.4':
-        case 'OSX10.12':
-        case 'CentOS7.1':
-        case 'RHEL7.2':
-        case 'Tizen':
-        case 'Fedora24': // editor brace matching: {
-            switch (architecture) {
-                case 'x86':
-                    if (os == 'Ubuntu') {
-                        // build and PAL test
-                        def dockerImage = getDockerImageName(architecture, os, true)
-                        buildCommands += "docker run -i --rm -v \${WORKSPACE}:/opt/code -w /opt/code -e ROOTFS_DIR=/crossrootfs/x86 ${dockerImage} ./build.sh ${architecture} cross ${lowerConfiguration}"
-                        dockerImage = getDockerImageName(architecture, os, false)
-                        buildCommands += "docker run -i --rm -v \${WORKSPACE}:/opt/code -w /opt/code ${dockerImage} ./src/pal/tests/palsuite/runpaltests.sh /opt/code/bin/obj/${osGroup}.${architecture}.${configuration} /opt/code/bin/paltestout"
-                        Utilities.addArchival(newJob, "bin/Product/**,bin/obj/*/tests/**/*.so", "bin/Product/**/.nuget/**")
-                        Utilities.addXUnitDotNETResults(newJob, '**/pal_tests.xml')
-                    }
-                    break
-
-                case 'x64':
-                    if (scenario == 'formatting') {
-                        buildCommands += "python tests/scripts/format.py -c \${WORKSPACE} -o Linux -a ${architecture}"
-                        Utilities.addArchival(newJob, "format.patch", "", true, false)
-                        break
-                    }
-
-                    if (scenario == 'pmi_asm_diffs') {
-                        buildCommands += "./build.sh ${lowerConfiguration} ${architecture} skiptests skipbuildpackages"
-                        buildCommands += "./build-test.sh ${lowerConfiguration} ${architecture} generatelayoutonly"
-
-                        // TODO: Add -target_branch and -commit_hash arguments based on GitHub variables.
-                        buildCommands += "python -u \${WORKSPACE}/tests/scripts/run-pmi-diffs.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration}"
-
-                        // Archive the asm
-                        buildCommands += "tar -czf dasm.${os}.${architecture}.${configuration}.tgz ./_/pmi/asm"
-                        Utilities.addArchival(newJob, "dasm.${os}.${architecture}.${configuration}.tgz")
-                        break
-                    }
-
-                    if (scenario == 'illink') {
-                        assert(os == 'Ubuntu')
-                        buildCommands += "./tests/scripts/build_illink.sh --clone --arch=${architecture}"
-                    }
-
-                    if (!doCoreFxTesting) {
-                        // We run pal tests on all OS but generate mscorlib (and thus, nuget packages)
-                        // only on supported OS platforms.
-                        def bootstrapRid = Utilities.getBoostrapPublishRid(os)
-                        def bootstrapRidEnv = bootstrapRid != null ? "__PUBLISH_RID=${bootstrapRid} " : ''
-
-                        buildCommands += "${bootstrapRidEnv}./build.sh ${lowerConfiguration} ${architecture}"
-
-                        def testBuildOpts = ""
-                        if (priority == '1') {
-                            testBuildOpts = "priority1"
-                        }
-
-                        buildCommands += "./build-test.sh ${lowerConfiguration} ${architecture} ${testBuildOpts}"
-                        buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${architecture}.${configuration} \${WORKSPACE}/bin/paltestout"
-
-                        // Archive the bin/tests folder for *_tst jobs
-                        def testArtifactsTgzFileName = getTestArtifactsTgzFileName(osGroup, architecture, configuration)
-                        buildCommands += "tar -czf ${testArtifactsTgzFileName} bin/tests/${osGroup}.${architecture}.${configuration}"
-                        Utilities.addArchival(newJob, "${testArtifactsTgzFileName}", "")
-                        // And pal tests
-                        Utilities.addXUnitDotNETResults(newJob, '**/pal_tests.xml')
-                    }
-                    else {
-                        if (scenario == 'corefx_innerloop') {
-                            assert os == 'Ubuntu' || 'OSX10.12'
-                            assert architecture == 'x64'
-
-                            buildCommands += "./build.sh ${lowerConfiguration} ${architecture} skiptests"
-                            buildCommands += "./build-test.sh ${lowerConfiguration} ${architecture} generatetesthostonly"
-                            buildCommands += "./tests/runtest.sh ${lowerConfiguration} --corefxtestsall --testHostDir=\${WORKSPACE}/bin/tests/${osGroup}.${architecture}.${configuration}/testhost/ --coreclr-src=\${WORKSPACE}"
-
-                            // Archive and process (only) the test results
-                            Utilities.addArchival(newJob, "bin/Logs/**/testResults.xml", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                            Utilities.addXUnitDotNETResults(newJob, "bin/Logs/**/testResults.xml")
-                        }
-                        else {
-                            // Corefx stress testing
-                            assert os == 'Ubuntu'
-                            assert architecture == 'x64'
-                            assert lowerConfiguration == 'checked'
-                            assert isJitStressScenario(scenario)
-
-                            // Build coreclr
-                            buildCommands += "./build.sh ${lowerConfiguration} ${architecture}"
-
-                            def scriptFileName = "\$WORKSPACE/set_stress_test_env.sh"
-
-                            def envScriptCmds = envScriptCreate(os, scriptFileName)
-                            envScriptCmds += envScriptSetStressModeVariables(os, Constants.jitStressModeScenarios[scenario], scriptFileName)
-                            envScriptCmds += envScriptFinalize(os, scriptFileName)
-                            buildCommands += envScriptCmds
-
-                            // Build and text corefx
-                            def workspaceRelativeFxRoot = "_/fx"
-                            def absoluteFxRoot = "\$WORKSPACE/${workspaceRelativeFxRoot}"
-                            def fxBranch = getFxBranch(branch)
-                            def exclusionRspPath = "\$WORKSPACE/tests/scripts/run-corefx-tests-exclusions.txt"
-
-                            buildCommands += "python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${fxBranch} -env_script ${scriptFileName} -exclusion_rsp_file ${exclusionRspPath}"
-
-                            // Archive and process (only) the test results
-                            Utilities.addArchival(newJob, "${workspaceRelativeFxRoot}/artifacts/bin/**/testResults.xml", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                            Utilities.addXUnitDotNETResults(newJob, "${workspaceRelativeFxRoot}/artifacts/bin/**/testResults.xml")
-                        }
-                    }
-
-                    // Archive the logs, even if the build failed (which is when they are most interesting).
-                    Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-                    break
-                case 'armem':
-                    // Emulator cross builds for ARM runs on Tizen currently
-                    assert os == 'Tizen'
-
-                    def arm_abi = "armel"
-                    def linuxCodeName = "tizen"
-
-                    // Unzip the Windows test binaries first. Exit with 0
-                    buildCommands += "unzip -q -o ./bin/tests/tests.zip -d ./bin/tests/Windows_NT.x64.${configuration} || exit 0"
-
-                    // Unpack the corefx binaries
-                    buildCommands += "mkdir ./bin/CoreFxBinDir"
-                    buildCommands += "tar -xf ./artifacts/bin/build.tar.gz -C ./bin/CoreFxBinDir"
-
-                    // Call the ARM CI script to cross build and test using docker
-                    buildCommands += """./tests/scripts/arm32_ci_script.sh \\
-                    --mode=docker \\
-                    --${arm_abi} \\
-                    --linuxCodeName=${linuxCodeName} \\
-                    --buildConfig=${lowerConfiguration} \\
-                    --testRootDir=./bin/tests/Windows_NT.x64.${configuration} \\
-                    --coreFxBinDir=./bin/CoreFxBinDir \\
-                    --testDirFile=./tests/testsRunningInsideARM.txt"""
-
-                    // Basic archiving of the build, no pal tests
-                    Utilities.addArchival(newJob, "bin/Product/**,bin/obj/*/tests/**/*.dylib,bin/obj/*/tests/**/*.so", "bin/Product/**/.nuget/**")
-                    break
-                case 'arm64':
-                case 'arm':
-                    // Non-Windows ARM cross builds on hardware run on Ubuntu only
-                    assert (os == 'Ubuntu') || (os == 'Ubuntu16.04')
-
-                    // Add some useful information to the log file. Ignore return codes.
-                    buildCommands += "uname -a || true"
-
-                    // Cross build the Ubuntu/arm product using docker with a docker image that contains the correct
-                    // Ubuntu cross-compilation toolset (running on a Ubuntu x64 host).
-                    // For CoreFX testing, we only need the product build; we don't need to generate the layouts. The product
-                    // build is then copied into the corefx layout by the run-corefx-test.py script. For CoreFX testing, we
-                    // ZIP up the generated CoreFX runtime and tests.
-
-                    def dockerImage = getDockerImageName(architecture, os, true)
-                    def dockerCmd = "docker run -i --rm -v \${WORKSPACE}:\${WORKSPACE} -w \${WORKSPACE} -e ROOTFS_DIR=/crossrootfs/${architecture} ${dockerImage} "
-
-                    buildCommands += "${dockerCmd}\${WORKSPACE}/build.sh ${lowerConfiguration} ${architecture} cross"
-
-                    if (doCoreFxTesting) {
-                        def scriptFileName = "\$WORKSPACE/set_stress_test_env.sh"
-
-                        def envScriptCmds = envScriptCreate(os, scriptFileName)
-                        envScriptCmds += envScriptSetStressModeVariables(os, Constants.jitStressModeScenarios[scenario], scriptFileName)
-                        envScriptCmds += envScriptFinalize(os, scriptFileName)
-                        buildCommands += envScriptCmds
-
-                        // Build and text corefx
-                        def workspaceRelativeFxRootLinux = "_/fx"
-                        def absoluteFxRoot = "\$WORKSPACE/${workspaceRelativeFxRootLinux}"
-                        def fxBranch = getFxBranch(branch)
-
-                        buildCommands += "${dockerCmd}python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${fxBranch} -env_script ${scriptFileName} -no_run_tests"
-
-                        // Docker creates files with root permission, so we need to zip in docker also, or else we'll get permission errors.
-                        buildCommands += "${dockerCmd}zip -r ${workspaceRelativeFxRootLinux}/fxruntime.zip ${workspaceRelativeFxRootLinux}/artifacts/bin/testhost/netcoreapp-Linux-Release-${architecture}"
-                        buildCommands += "${dockerCmd}zip -r ${workspaceRelativeFxRootLinux}/fxtests.zip ${workspaceRelativeFxRootLinux}/artifacts/bin/tests"
-
-                        Utilities.addArchival(newJob, "${workspaceRelativeFxRootLinux}/fxruntime.zip")
-                        Utilities.addArchival(newJob, "${workspaceRelativeFxRootLinux}/fxtests.zip")
-                    }
-                    else if (isCrossGenComparisonScenario(scenario)) {
-                        buildCommands += "${dockerCmd}\${WORKSPACE}/build-test.sh ${lowerConfiguration} ${architecture} cross generatelayoutonly"
-
-                        def workspaceRelativeProductBinDir = "bin/Product/${osGroup}.${architecture}.${configuration}"
-                        def workspaceRelativeCoreLib = "${workspaceRelativeProductBinDir}/IL/System.Private.CoreLib.dll"
-                        def workspaceRelativeCoreRootDir = "bin/tests/${osGroup}.${architecture}.${configuration}/Tests/Core_Root"
-                        def workspaceRelativeCrossGenComparisonScript = "tests/scripts/crossgen_comparison.py"
-                        def workspaceRelativeResultsDir = "_"
-                        def workspaceRelativeArtifactsArchive = "${os}.${architecture}.${configuration}.${scenario}.zip"
-                        def crossGenComparisonCmd = "python -u \${WORKSPACE}/${workspaceRelativeCrossGenComparisonScript} "
-                        def crossArch = "x64"
-                        def crossGenExecutable = "\${WORKSPACE}/${workspaceRelativeProductBinDir}/${crossArch}/crossgen"
-                        def workspaceRelativeCrossArchResultDir = "${workspaceRelativeResultsDir}/${osGroup}.${crossArch}_${architecture}.${configuration}"
-
-                        buildCommands += "${dockerCmd}mkdir -p \${WORKSPACE}/${workspaceRelativeCrossArchResultDir}"
-                        buildCommands += "${dockerCmd}${crossGenComparisonCmd}crossgen_corelib --crossgen ${crossGenExecutable} --il_corelib \${WORKSPACE}/${workspaceRelativeCoreLib} --result_dir \${WORKSPACE}/${workspaceRelativeCrossArchResultDir}"
-                        buildCommands += "${dockerCmd}${crossGenComparisonCmd}crossgen_framework --crossgen ${crossGenExecutable} --core_root \${WORKSPACE}/${workspaceRelativeCoreRootDir} --result_dir \${WORKSPACE}/${workspaceRelativeCrossArchResultDir}"
-
-                        buildCommands += "${dockerCmd}zip -r ${workspaceRelativeArtifactsArchive} ${workspaceRelativeCoreLib} ${workspaceRelativeCoreRootDir} ${workspaceRelativeCrossGenComparisonScript} ${workspaceRelativeResultsDir}"
-                        Utilities.addArchival(newJob, "${workspaceRelativeArtifactsArchive}")
-                    }
-                    else if (scenario == 'pmi_asm_diffs') {
-                        buildCommands += "${dockerCmd}\${WORKSPACE}/build-test.sh ${lowerConfiguration} ${architecture} cross generatelayoutonly"
-
-                        // Pass `--skip_diffs` -- the actual diffs will be done on an arm machine in the test job. This is the build job.
-                        // TODO: Add -target_branch and -commit_hash arguments based on GitHub variables.
-                        buildCommands += "python -u \${WORKSPACE}/tests/scripts/run-pmi-diffs.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} --skip_diffs"
-
-                        // Archive what we created.
-                        buildCommands += "tar -czf product.${os}.${architecture}.${lowerConfiguration}.tgz ./bin/Product/Linux.${architecture}.${configuration}"
-                        buildCommands += "tar -czf product.baseline.${os}.${architecture}.${lowerConfiguration}.tgz ./_/pmi/base/bin/Product/Linux.${architecture}.${configuration}"
-                        buildCommands += "tar -czf coreroot.${os}.${architecture}.${lowerConfiguration}.tgz ./bin/tests/Linux.${architecture}.${configuration}/Tests/Core_Root"
-                        buildCommands += "tar -czf coreroot.baseline.${os}.${architecture}.${lowerConfiguration}.tgz ./_/pmi/base/bin/tests/Linux.${architecture}.${configuration}/Tests/Core_Root"
-
-                        // Archive the built artifacts
-                        Utilities.addArchival(newJob, "product.${os}.${architecture}.${lowerConfiguration}.tgz,product.baseline.${os}.${architecture}.${lowerConfiguration}.tgz,coreroot.${os}.${architecture}.${lowerConfiguration}.tgz,coreroot.baseline.${os}.${architecture}.${lowerConfiguration}.tgz")
-                    }
-                    else {
-                        // Then, using the same docker image, build the tests and generate the CORE_ROOT layout.
-
-                        def testBuildOpts = ""
-                        if (priority == '1') {
-                            testBuildOpts = "priority1"
-                        }
-
-                        buildCommands += "${dockerCmd}\${WORKSPACE}/build-test.sh ${lowerConfiguration} ${architecture} cross ${testBuildOpts}"
-
-                        // ZIP up the built tests (including CORE_ROOT and native test components copied to the CORE_ROOT) for the test job (created in the flow job code)
-                        def testArtifactsTgzFileName = getTestArtifactsTgzFileName(osGroup, architecture, configuration)
-                        buildCommands += "tar -czf ${testArtifactsTgzFileName} bin/tests/${osGroup}.${architecture}.${configuration}"
-
-                        Utilities.addArchival(newJob, "${testArtifactsTgzFileName}", "")
-                    }
-
-                    // Archive the logs, even if the build failed (which is when they are most interesting).
-                    Utilities.addArchival(newJob, "bin/Logs/*.log,bin/Logs/*.wrn,bin/Logs/*.err,bin/Logs/MsbuildDebugLogs/*", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-
-                    // We need to clean up the build machines; the docker build leaves newly built files with root permission, which
-                    // the cleanup task in Jenkins can't remove.
-                    newJob.with {
-                        publishers {
-                            azureVMAgentPostBuildAction {
-                                agentPostBuildAction('Delete agent after build execution (when idle).')
-                            }
-                        }
-                    }
-                    break
-                default:
-                    println("Unknown architecture: ${architecture}");
-                    assert false
-                    break
-            }
-            break
-        // editor brace matching: }
-        default:
-            println("Unknown os: ${os}");
-            assert false
-            break
-    } // os
-
-    return buildCommands
-}
-
-// Determine if we should generate a job for the given parameters. This is for non-flow jobs: either build and test, or build only.
-// Returns true if the job should be generated.
-def static shouldGenerateJob(def scenario, def isPR, def architecture, def configuration, def os, def isBuildOnly)
-{
-    def windowsArmJob = ((os == "Windows_NT") && (architecture in Constants.armWindowsCrossArchitectureList))
-
-    // Innerloop jobs (except corefx_innerloop) are no longer created in Jenkins
-    // The only exception is windows arm(64)
-    if (isInnerloopTestScenario(scenario) && isPR && !windowsArmJob) {
-        assert scenario != 'corefx_innerloop'
-        return false;
-    }
-
-    if (!isPR) {
-        if (isInnerloopTestScenario(scenario)) {
-            return false
-        }
-
-        if (scenario == 'corefx_innerloop') {
-            return false
-        }
-    }
-
-    // Tizen is only supported for armem architecture
-    if (os == 'Tizen' && architecture != 'armem') {
-        return false
-    }
-
-    // Filter based on architecture.
-
-    switch (architecture) {
-        case 'arm':
-            if ((os != 'Windows_NT') && (os != 'Ubuntu')) {
-                return false
-            }
-            break
-        case 'arm64':
-            if ((os != 'Windows_NT') && (os != 'Ubuntu16.04')) {
-                return false
-            }
-            break
-        case 'armem':
-            if (os != 'Tizen') {
-                return false
-            }
-            break
-        case 'x86':
-            if ((os != 'Windows_NT') && (os != 'Ubuntu')) {
-                return false
-            }
-            break
-        case 'x64':
-            // Everything implemented
-            break
-        default:
-            println("Unknown architecture: ${architecture}")
-            assert false
-            break
-    }
-
-    // Which (Windows) build only jobs are required?
-
-    def isNormalOrInnerloop = (scenario == 'innerloop' || scenario == 'normal')
-
-    if (isBuildOnly) {
-        switch (architecture) {
-            case 'arm':
-            case 'arm64':
-                // We use build only jobs for Windows arm/arm64 cross-compilation corefx testing, so we need to generate builds for that.
-                if (!isCoreFxScenario(scenario)) {
-                    return false
-                }
-                break
-            case 'x64':
-            case 'x86':
-                if (!isNormalOrInnerloop) {
-                    return false
-                }
-                break
-            default:
-                return false
-        }
-    }
-
-    // Filter based on scenario.
-
-    if (isJitStressScenario(scenario)) {
-        if (configuration != 'Checked') {
-            return false
-        }
-
-        def isEnabledOS = (os == 'Windows_NT') ||
-                          (os == 'Ubuntu' && (architecture == 'x64') && isCoreFxScenario(scenario)) ||
-                          (os == 'Ubuntu' && architecture == 'arm') ||
-                          (os == 'Ubuntu16.04' && architecture == 'arm64')
-        if (!isEnabledOS) {
-            return false
-        }
-
-        switch (architecture) {
-            case 'x64':
-                break
-
-            case 'x86':
-                // x86 ubuntu: no stress modes
-                if (os == 'Ubuntu') {
-                    return false
-                }
-                break
-
-            case 'arm':
-            case 'arm64':
-                // We use build only jobs for Windows arm/arm64 cross-compilation corefx testing, so we need to generate builds for that.
-                // No "regular" Windows arm corefx jobs, e.g.
-                // For Ubuntu arm corefx testing, we use regular jobs (not "build only" since only Windows has "build only", and
-                // the Ubuntu arm "regular" jobs don't run tests anyway).
-                if (os == 'Windows_NT') {
-                    if (! (isBuildOnly && isCoreFxScenario(scenario)) ) {
-                        return false
-                    }
-                }
-                else {
-                    if (!isCoreFxScenario(scenario)) {
-                        return false
-                    }
-                }
-                break
-
-            default:
-                // armem: no stress jobs for ARM emulator.
-                return false
-        }
-    }
-    else if (isR2RScenario(scenario)) {
-        if (os != 'Windows_NT') {
-            return false
-        }
-
-        if (isR2RBaselineScenario(scenario)) {
-            // no need for Debug scenario; Checked is sufficient
-            if (configuration != 'Checked' && configuration != 'Release') {
-                return false
-            }
-        }
-        else if (isR2RStressScenario(scenario)) {
-            // Stress scenarios only run with Checked builds, not Release (they would work with Debug, but be slow).
-            if (configuration != 'Checked') {
-                return false
-            }
-        }
-
-        switch (architecture) {
-            case 'arm':
-            case 'arm64':
-                // Windows arm/arm64 ready-to-run jobs use flow jobs and test jobs, but depend on "normal" (not R2R specific) build jobs.
-                return false
-
-            default:
-                break
-        }
-    }
-    else if (isCrossGenComparisonScenario(scenario)) {
-        return shouldGenerateCrossGenComparisonJob(os, architecture, configuration, scenario)
-    }
-    else {
-        // Skip scenarios
-        switch (scenario) {
-            case 'ilrt':
-                // The ilrt build isn't necessary except for Windows_NT2003.  Non-Windows NT uses
-                // the default scenario build
-                if (os != 'Windows_NT') {
-                    return false
-                }
-                // Only x64 for now
-                if (architecture != 'x64') {
-                    return false
-                }
-                // Release only
-                if (configuration != 'Release') {
-                    return false
-                }
-                break
-            case 'jitdiff':
-                if (os != 'Windows_NT' && os != 'Ubuntu' && os != 'OSX10.12') {
-                    return false
-                }
-                if (architecture != 'x64') {
-                    return false
-                }
-                if (configuration != 'Checked') {
-                    return false
-                }
-                break
-            case 'longgc':
-            case 'gcsimulator':
-                if (os != 'Windows_NT' && os != 'Ubuntu' && os != 'OSX10.12') {
-                    return false
-                }
-                if (architecture != 'x64') {
-                    return false
-                }
-                if (configuration != 'Release') {
-                    return false
-                }
-                break
-            case 'gc_reliability_framework':
-            case 'standalone_gc':
-                if (os != 'Windows_NT' && os != 'Ubuntu' && os != 'OSX10.12') {
-                    return false
-                }
-
-                if (architecture != 'x64') {
-                    return false
-                }
-
-                if (configuration != 'Release' && configuration != 'Checked') {
-                    return false
-                }
-                break
-            // We only run Windows and Ubuntu x64 Checked for formatting right now
-            case 'formatting':
-                if (os != 'Windows_NT' && os != 'Ubuntu') {
-                    return false
-                }
-                if (architecture != 'x64') {
-                    return false
-                }
-                if (configuration != 'Checked') {
-                    return false
-                }
-                break
-            case 'illink':
-                if (os != 'Windows_NT' && (os != 'Ubuntu' || architecture != 'x64')) {
-                    return false
-                }
-                if (architecture != 'x64' && architecture != 'x86') {
-                    return false
-                }
-                break
-            case 'normal':
-                // Nothing skipped
-                break
-            case 'innerloop':
-                if (!isValidPrTriggeredInnerLoopJob(os, architecture, configuration, isBuildOnly)) {
-                    return false
-                }
-                break
-            case 'corefx_innerloop':
-                if (os != 'Windows_NT' && os != 'Ubuntu' &&  os != 'OSX10.12') {
-                    return false
-                }
-                if (architecture != 'x64') {
-                    return false
-                }
-                break
-            case 'pmi_asm_diffs':
-                if (configuration != 'Checked') {
-                    return false
-                }
-                if (architecture == 'armem') {
-                    return false
-                }
-                // Currently, we don't support pmi_asm_diffs for Windows arm/arm64. We don't have a dotnet CLI available to
-                // build jitutils. The jobs are not in validArmWindowsScenarios.
-                if ((os == 'Windows_NT') && (architecture == 'arm' || architecture == 'arm64')) {
-                    return false
-                }
-                // Currently, no support for Linux x86.
-                if ((os != 'Windows_NT') && (architecture == 'x86')) {
-                    return false
-                }
-                break
-            default:
-                println("Unknown scenario: ${scenario}")
-                assert false
-                break
-        }
-    }
-
-    // The job was not filtered out, so we should generate it!
-    return true
-}
-
-Constants.allScenarios.each { scenario ->
-    [true, false].each { isPR ->
-        Constants.architectureList.each { architecture ->
-            Constants.configurationList.each { configuration ->
-                Constants.osList.each { os ->
-                    // If the OS is Windows_NT_BuildOnly, set the isBuildOnly flag to true
-                    // and reset the os to Windows_NT
-                    def isBuildOnly = false
-                    if (os == 'Windows_NT_BuildOnly') {
-                        isBuildOnly = true
-                        os = 'Windows_NT'
-                    }
-
-                    if (!shouldGenerateJob(scenario, isPR, architecture, configuration, os, isBuildOnly)) {
-                        return
-                    }
-
-                    // Calculate names
-                    def jobName = getJobName(configuration, architecture, os, scenario, isBuildOnly)
-                    def folderName = getJobFolder(scenario)
-
-                    // Create the new job
-                    def newJob = job(Utilities.getFullJobName(project, jobName, isPR, folderName)) {}
-
-                    addToViews(newJob, false, isPR, architecture, os, configuration, scenario) // isFlowJob == false
-
-                    setJobMachineAffinity(architecture, os, true, false, false, newJob) // isBuildJob = true, isTestJob = false, isFlowJob = false
-
-                    Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-                    addTriggers(newJob, branch, isPR, architecture, os, configuration, scenario, false, isBuildOnly) // isFlowJob==false
-                    setJobTimeout(newJob, isPR, architecture, configuration, scenario, isBuildOnly)
-
-                    // Copy Windows build test binaries and corefx build artifacts for Linux cross build for armem.
-                    // We don't use a flow job for this, but we do depend on there being existing builds with these
-                    // artifacts produced.
-                    if ((architecture == 'armem') && (os == 'Tizen')) {
-                        // Define the Windows Tests and Corefx build job names
-                        def lowerConfiguration = configuration.toLowerCase()
-                        def WindowsTestsName = projectFolder + '/' +
-                                               Utilities.getFullJobName(project,
-                                                                        getJobName(lowerConfiguration, 'x64' , 'windows_nt', 'normal', true),
-                                                                        false)
-                        def fxBranch = getFxBranch(branch)
-                        def corefxFolder = Utilities.getFolderName('dotnet/corefx') + '/' +
-                                           Utilities.getFolderName(fxBranch)
-
-                        def arm_abi = 'armel'
-                        def corefx_os = 'tizen'
-
-                        // Let's use release CoreFX to test checked CoreCLR,
-                        // because we do not generate checked CoreFX in CoreFX CI yet.
-                        def corefx_lowerConfiguration = lowerConfiguration
-                        if (lowerConfiguration == 'checked') {
-                            corefx_lowerConfiguration = 'release'
-                        }
-
-                        // Copy the Windows test binaries and the Corefx build binaries
-                        newJob.with {
-                            steps {
-                                copyArtifacts(WindowsTestsName) {
-                                    includePatterns('bin/tests/tests.zip')
-                                    buildSelector {
-                                        latestSuccessful(true)
-                                    }
-                                }
-                                copyArtifacts("${corefxFolder}/${corefx_os}_${arm_abi}_cross_${corefx_lowerConfiguration}") {
-                                    includePatterns('artifacts/bin/build.tar.gz')
-                                    buildSelector {
-                                        latestSuccessful(true)
-                                    }
-                                }
-                            } // steps
-                        } // newJob.with
-                    }
-
-                    def buildCommands = calculateBuildCommands(newJob, scenario, branch, isPR, architecture, configuration, os, isBuildOnly)
-
-                    newJob.with {
-                        steps {
-                            if (os == 'Windows_NT') {
-                                buildCommands.each { buildCommand ->
-                                    batchFile(buildCommand)
-                                }
-                            }
-                            else {
-                                buildCommands.each { buildCommand ->
-                                    shell(buildCommand)
-                                }
-                            }
-                        } // steps
-                    } // newJob.with
-
-                } // os
-            } // configuration
-        } // architecture
-    } // isPR
-} // scenario
-
-// Create a Windows ARM/ARM64 test job that will be used by a flow job.
-// Returns the newly created job.
-def static CreateWindowsArmTestJob(def dslFactory, def project, def architecture, def os, def configuration, def scenario, def isPR, def inputCoreCLRBuildName)
-{
-    def osGroup = getOSGroup(os)
-    def jobName = getJobName(configuration, architecture, os, scenario, false) + "_tst"
-
-    def jobFolder = getJobFolder(scenario)
-    def newJob = dslFactory.job(Utilities.getFullJobName(project, jobName, isPR, jobFolder)) {
-        parameters {
-            stringParam('CORECLR_BUILD', '', "Build number to copy CoreCLR ${osGroup} binaries from")
-        }
-
-        steps {
-            // Set up the copies
-
-            // Coreclr build we are trying to test
-            //
-            //  ** NOTE ** This will, correctly, overwrite the CORE_ROOT from the Windows test archive
-
-            copyArtifacts(inputCoreCLRBuildName) {
-                excludePatterns('**/testResults.xml', '**/*.ni.dll')
-                buildSelector {
-                    buildNumber('${CORECLR_BUILD}')
-                }
-            }
-
-            if (isCoreFxScenario(scenario)) {
-
-                // Only arm/arm64 supported for corefx testing now.
-                assert architecture == 'arm' || architecture == 'arm64'
-
-                // Unzip CoreFx runtime
-                batchFile("powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('_\\fx\\fxruntime.zip', '_\\fx\\artifacts\\bin\\testhost\\netcoreapp-Windows_NT-Release-${architecture}')\"")
-
-                // Unzip CoreFx tests.
-                batchFile("powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('_\\fx\\fxtests.zip', '_\\fx\\artifacts\\bin\\tests')\"")
-
-                // Add the script to run the corefx tests
-                def corefx_runtime_path   = "%WORKSPACE%\\_\\fx\\artifacts\\bin\\testhost\\netcoreapp-Windows_NT-Release-${architecture}"
-                def corefx_tests_dir      = "%WORKSPACE%\\_\\fx\\artifacts\\bin\\tests"
-                def corefx_exclusion_file = "%WORKSPACE%\\tests\\${architecture}\\corefx_test_exclusions.txt"
-                def exclusionRspPath      = "%WORKSPACE%\\tests\\scripts\\run-corefx-tests-exclusions.txt"
-                batchFile("call %WORKSPACE%\\tests\\scripts\\run-corefx-tests.bat ${corefx_runtime_path} ${corefx_tests_dir} ${corefx_exclusion_file} ${architecture} ${exclusionRspPath}")
-
-            } else { // !isCoreFxScenario(scenario)
-
-                // Unzip tests.
-                batchFile("powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('bin\\tests\\tests.zip', 'bin\\tests\\${osGroup}.${architecture}.${configuration}')\"")
-
-                def buildCommands = ""
-
-                def coreRootLocation = "%WORKSPACE%\\bin\\tests\\Windows_NT.${architecture}.${configuration}\\Tests\\Core_Root"
-                def addEnvVariable =  { variable, value -> buildCommands += "set ${variable}=${value}\r\n"}
-                def addCommand = { cmd -> buildCommands += "${cmd}\r\n"}
-
-                // Make sure Command Extensions are enabled. Used so %ERRORLEVEL% is available.
-                addCommand("SETLOCAL ENABLEEXTENSIONS")
-
-                // For all jobs 
-                addEnvVariable("CORE_ROOT", coreRootLocation)
-                addEnvVariable("COMPlus_NoGuiOnAssert", "1")
-                addEnvVariable("COMPlus_ContinueOnAssert", "0")
-
-                // If we are running a stress mode, we'll set those variables as well
-                if (isJitStressScenario(scenario) || isR2RStressScenario(scenario)) {
-                    def stressValues = null
-                    if (isJitStressScenario(scenario)) {
-                        stressValues = Constants.jitStressModeScenarios[scenario]
-                    }
-                    else {
-                        stressValues = Constants.r2rStressScenarios[scenario]
-                    }
-
-                    stressValues.each { key, value -> 
-                        addEnvVariable(key, value)
-                    }
-                }
-
-                if (isR2RScenario(scenario)) {
-                    // Crossgen the framework assemblies.
-                    buildCommands += """
-@for %%F in (%CORE_ROOT%\\*.dll) do @call :PrecompileAssembly "%CORE_ROOT%" "%%F" %%~nxF
-@goto skip_PrecompileAssembly
-
-:PrecompileAssembly
-@REM Skip mscorlib since it is already precompiled.
-@if /I "%3" == "mscorlib.dll" exit /b 0
-@if /I "%3" == "mscorlib.ni.dll" exit /b 0
-
-"%CORE_ROOT%\\crossgen.exe" /Platform_Assemblies_Paths "%CORE_ROOT%" %2 >nul 2>nul
-@if "%errorlevel%" == "-2146230517" (
-    echo %2 is not a managed assembly.
-) else if "%errorlevel%" == "-2146234344" (
-    echo %2 is not a managed assembly.
-) else if %errorlevel% neq 0 (
-    echo Unable to precompile %2
-) else (
-    echo Precompiled %2
-)
-@exit /b 0
-
-:skip_PrecompileAssembly
-"""
-
-                    // Set RunCrossGen variable to cause test wrappers to invoke their logic to run
-                    // crossgen on tests before running them.
-                    addEnvVariable("RunCrossGen", "true")
-                } // isR2RScenario(scenario)
-
-                // Run runtest.cmd
-                // Do not run generate layout. It will delete the correct CORE_ROOT, and we do not have a correct product
-                // dir to copy from.
-                def runtestCommand = "call %WORKSPACE%\\tests\\runtest.cmd ${architecture} ${configuration} skipgeneratelayout"
-
-                addCommand("${runtestCommand}")
-                addCommand("echo on") // Show the following commands in the log. "echo" doesn't alter the errorlevel.
-                addCommand("set saved_errorlevel=%errorlevel%")
-
-                // Collect the test logs collected by xunit. Ignore errors here. We want to collect these even if the run
-                // failed for some reason, so it needs to be in this batch file.
-
-                addCommand("powershell -NoProfile -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${architecture}.${configuration}\\Reports', '.\\bin\\tests\\testReports.zip')\"");
-
-                // Use the runtest.cmd errorlevel as the script errorlevel.
-                addCommand("exit /b %saved_errorlevel%")
-
-                batchFile(buildCommands)
-            } // non-corefx testing
-        } // steps
-    } // job
-
-    if (!isCoreFxScenario(scenario)) {
-        def doNotFailIfNothingArchived = true
-        def archiveOnlyIfSuccessful = false
-        Utilities.addArchival(newJob, "bin/tests/testReports.zip", "", doNotFailIfNothingArchived, archiveOnlyIfSuccessful)
-
-        Utilities.addXUnitDotNETResults(newJob, 'bin/**/TestRun*.xml', true)
-    }
-
-    return newJob
-}
-
-// Create a test job not covered by the "Windows ARM" case that will be used by a flow job.
-// E.g., non-Windows tests.
-// Returns the newly created job.
-def static CreateOtherTestJob(def dslFactory, def project, def branch, def architecture, def os, def configuration, def scenario, def isPR, def inputCoreCLRBuildName)
-{
-    def lowerConfiguration = configuration.toLowerCase()
-
-    def isUbuntuArm64Job = ((os == "Ubuntu16.04") && (architecture == 'arm64'))
-    def isUbuntuArm32Job = ((os == "Ubuntu") && (architecture == 'arm'))
-    def isUbuntuArmJob = isUbuntuArm32Job || isUbuntuArm64Job
-
-    def doCoreFxTesting = isCoreFxScenario(scenario)
-    def isPmiAsmDiffsScenario = (scenario == 'pmi_asm_diffs')
-
-    def workspaceRelativeFxRootLinux = "_/fx" // only used for CoreFX testing
-
-    def osGroup = getOSGroup(os)
-    def jobName = getJobName(configuration, architecture, os, scenario, false) + "_tst"
-
-    def testOpts = ''
-    def useServerGC = false
-
-    // Enable Server GC for Ubuntu PR builds
-    // REVIEW: why? Does this apply to all architectures? Why only PR?
-    if (os == 'Ubuntu' && isPR) {
-        testOpts += ' --useServerGC'
-        useServerGC = true
-    }
-
-    if (isR2RScenario(scenario)) {
-
-        testOpts += ' --crossgen --runcrossgentests'
-
-        if (scenario == 'r2r_jitstress1') {
-            testOpts += ' --jitstress=1'
-        }
-        else if (scenario == 'r2r_jitstress2') {
-            testOpts += ' --jitstress=2'
-        }
-        else if (scenario == 'r2r_jitstress1_tiered') {
-            testOpts += ' --jitstress=1'
-        }
-        else if (scenario == 'r2r_jitstress2_tiered') {
-            testOpts += ' --jitstress=2'
-        }
-        else if (scenario == 'r2r_jitstressregs1') {
-            testOpts += ' --jitstressregs=1'
-        }
-        else if (scenario == 'r2r_jitstressregs2') {
-            testOpts += ' --jitstressregs=2'
-        }
-        else if (scenario == 'r2r_jitstressregs3') {
-            testOpts += ' --jitstressregs=3'
-        }
-        else if (scenario == 'r2r_jitstressregs4') {
-            testOpts += ' --jitstressregs=4'
-        }
-        else if (scenario == 'r2r_jitstressregs8') {
-            testOpts += ' --jitstressregs=8'
-        }
-        else if (scenario == 'r2r_jitstressregs0x10') {
-            testOpts += ' --jitstressregs=0x10'
-        }
-        else if (scenario == 'r2r_jitstressregs0x80') {
-            testOpts += ' --jitstressregs=0x80'
-        }
-        else if (scenario == 'r2r_jitstressregs0x1000') {
-            testOpts += ' --jitstressregs=0x1000'
-        }
-        else if (scenario == 'r2r_jitminopts') {
-            testOpts += ' --jitminopts'
-        }
-        else if (scenario == 'r2r_jitforcerelocs') {
-            testOpts += ' --jitforcerelocs'
-        }
-        else if (scenario == 'r2r_gcstress15') {
-            testOpts += ' --gcstresslevel=0xF'
-        }
-    }
-    else if (scenario == 'jitdiff') {
-        testOpts += ' --jitdisasm --crossgen'
-    }
-    else if (scenario == 'illink') {
-        testOpts += ' --link=\$WORKSPACE/linker/linker/bin/netcore_Release/netcoreapp2.0/ubuntu-x64/publish/illink'
-    }
-    else if (isLongGc(scenario)) {
-        // Long GC tests behave very poorly when they are not
-        // the only test running (many of them allocate until OOM).
-        testOpts += ' --sequential'
-
-        // A note - runtest.sh does have "--long-gc" and "--gcsimulator" options
-        // for running long GC and GCSimulator tests, respectively. We don't use them
-        // here because using a playlist file produces much more readable output on the CI machines
-        // and reduces running time.
-        //
-        // The Long GC playlist contains all of the tests that are
-        // going to be run. The GCSimulator playlist contains all of
-        // the GC simulator tests.
-        if (scenario == 'longgc') {
-            testOpts += ' --long-gc --playlist=./tests/longRunningGcTests.txt'
-        }
-        else if (scenario == 'gcsimulator') {
-            testOpts += ' --gcsimulator --playlist=./tests/gcSimulatorTests.txt'
-        }
-    }
-    else if (isGcReliabilityFramework(scenario)) {
-        testOpts += ' --build-overlay-only'
-    }
-    else if (scenario == 'standalone_gc') {
-        if (osGroup == 'OSX') {
-            testOpts += ' --gcname=libclrgc.dylib'
-        }
-        else if (osGroup == 'Linux') {
-            testOpts += ' --gcname=libclrgc.so'
-        }
-        else {
-            println("Unexpected OS group: ${osGroup} for os ${os}")
-            assert false
-        }
-    }
-
-    def jobFolder = getJobFolder(scenario)
-    def newJob = dslFactory.job(Utilities.getFullJobName(project, jobName, isPR, jobFolder)) {
-        parameters {
-            stringParam('CORECLR_BUILD', '', "Build number to copy CoreCLR ${osGroup} binaries from")
-        }
-
-        steps {
-            // Set up the copies
-
-            // Coreclr build we are trying to test
-            //
-            // HACK: the Ubuntu arm64 copyArtifacts Jenkins plug-in is ridiculously slow (45 minutes to
-            // 1.5 hours for this step). Instead, directly use wget, which is fast (1 minute).
-
-            if (!isUbuntuArm64Job) {
-                copyArtifacts(inputCoreCLRBuildName) {
-                    excludePatterns('**/testResults.xml', '**/*.ni.dll')
-                    buildSelector {
-                        buildNumber('${CORECLR_BUILD}')
-                    }
-                }
-            }
-
-            if (isUbuntuArmJob) {
-                // Add some useful information to the log file. Ignore return codes.
-                shell("uname -a || true")
-            }
-
-            if (isUbuntuArm64Job) {
-                // Copy the required artifacts directly, using wget, e.g.:
-                // 
-                //  https://ci.dot.net/job/dotnet_coreclr/job/master/job/arm64_cross_checked_ubuntu16.04_innerloop_prtest/16/artifact/testnativebin.checked.zip
-                //  https://ci.dot.net/job/dotnet_coreclr/job/master/job/arm64_cross_checked_ubuntu16.04_innerloop_prtest/16/artifact/tests.checked.zip
-                // 
-                // parameterized as:
-                //
-                //  https://ci.dot.net/job/${mungedProjectName}/job/${mungedBranchName}/job/${inputJobName}/${CORECLR_BUILD}/artifact/testnativebin.checked.zip
-                //  https://ci.dot.net/job/${mungedProjectName}/job/${mungedBranchName}/job/${inputJobName}/${CORECLR_BUILD}/artifact/tests.checked.zip
-                //
-                // CoreFX example artifact URLs:
-                //
-                //  https://ci.dot.net/job/dotnet_coreclr/job/dev_unix_test_workflow/job/jitstress/job/arm64_cross_checked_ubuntu16.04_corefx_baseline_prtest/1/artifact/_/fx/fxruntime.zip
-                //  https://ci.dot.net/job/dotnet_coreclr/job/dev_unix_test_workflow/job/jitstress/job/arm64_cross_checked_ubuntu16.04_corefx_baseline_prtest/1/artifact/_/fx/fxtests.zip
-                //
-                // Note that the source might be in a "jitstress" folder.
-                //
-                // Use `--progress=dot:giga` to display some progress output, but limit it in the log file.
-                //
-                // Use `--directory-prefix=_/fx` to specify where to put the corefx files (to match what other platforms do). Use this instead of `-O`.
-
-                shell("echo \"Using wget instead of the Jenkins copy artifacts plug-in to copy artifacts from ${inputCoreCLRBuildName}\"")
-
-                def mungedProjectName = Utilities.getFolderName(project)
-                def mungedBranchName = Utilities.getFolderName(branch)
-
-                def doCrossGenComparison = isCrossGenComparisonScenario(scenario)
-                def inputCoreCLRBuildScenario = isInnerloopTestScenario(scenario) ? 'innerloop' : 'normal'
-                if (isPmiAsmDiffsScenario || doCoreFxTesting || doCrossGenComparison) {
-                    // These depend on unique builds for each scenario
-                    inputCoreCLRBuildScenario = scenario
-                }
-                def sourceJobName = getJobName(configuration, architecture, os, inputCoreCLRBuildScenario, false)
-                def inputJobName = Utilities.getFullJobName(sourceJobName, isPR)
-
-                // Need to add the sub-folder if necessary.
-                def inputJobPath = "job/${inputJobName}"
-                def folderName = getJobFolder(inputCoreCLRBuildScenario)
-                if (folderName != '') {
-                    inputJobPath = "job/${folderName}/job/${inputJobName}"
-                }
-
-                def inputUrlRoot = "https://ci.dot.net/job/${mungedProjectName}/job/${mungedBranchName}/${inputJobPath}/\${CORECLR_BUILD}/artifact"
-
-                if (isPmiAsmDiffsScenario) {
-                    def workspaceRelativeRootLinux = "_/pmi"
-                    shell("mkdir -p ${workspaceRelativeRootLinux}")
-                    shell("wget --progress=dot:giga ${inputUrlRoot}/product.${os}.${architecture}.${lowerConfiguration}.tgz")
-                    shell("wget --progress=dot:giga ${inputUrlRoot}/product.baseline.${os}.${architecture}.${lowerConfiguration}.tgz")
-                    shell("wget --progress=dot:giga ${inputUrlRoot}/coreroot.${os}.${architecture}.${lowerConfiguration}.tgz")
-                    shell("wget --progress=dot:giga ${inputUrlRoot}/coreroot.baseline.${os}.${architecture}.${lowerConfiguration}.tgz")
-                }
-                else if (doCoreFxTesting) {
-                    shell("mkdir -p ${workspaceRelativeFxRootLinux}")
-                    shell("wget --progress=dot:giga --directory-prefix=${workspaceRelativeFxRootLinux} ${inputUrlRoot}/${workspaceRelativeFxRootLinux}/fxtests.zip")
-                    shell("wget --progress=dot:giga --directory-prefix=${workspaceRelativeFxRootLinux} ${inputUrlRoot}/${workspaceRelativeFxRootLinux}/fxruntime.zip")
-                }
-                else {
-                    def testArtifactsTgzFileName = getTestArtifactsTgzFileName(osGroup, architecture, configuration)
-                    shell("wget --progress=dot:giga ${inputUrlRoot}/${testArtifactsTgzFileName}")
-                }
-            }
-
-            if (architecture == 'x86') {
-                shell("mkdir ./bin/CoreFxNative")
-
-                def fxBranch = getFxBranch(branch)
-                def corefxFolder = Utilities.getFolderName('dotnet/corefx') + '/' + Utilities.getFolderName(fxBranch)
-
-                copyArtifacts("${corefxFolder}/ubuntu16.04_x86_release") {
-                    includePatterns('artifacts/bin/build.tar.gz')
-                    targetDirectory('bin/CoreFxNative')
-                    buildSelector {
-                        latestSuccessful(true)
-                    }
-                }
-
-                shell("mkdir ./bin/CoreFxBinDir")
-                shell("tar -xf ./bin/CoreFxNative/artifacts/bin/build.tar.gz -C ./bin/CoreFxBinDir")
-            }
-
-            if (isPmiAsmDiffsScenario) {
-                shell("tar -xzf ./product.${os}.${architecture}.${lowerConfiguration}.tgz || exit 0")
-                shell("tar -xzf ./product.baseline.${os}.${architecture}.${lowerConfiguration}.tgz || exit 0")
-                shell("tar -xzf ./coreroot.${os}.${architecture}.${lowerConfiguration}.tgz || exit 0")
-                shell("tar -xzf ./coreroot.baseline.${os}.${architecture}.${lowerConfiguration}.tgz || exit 0")
-            }
-            // CoreFX testing downloads the CoreFX tests, not the coreclr tests. Also, unzip the built CoreFX layout/runtime directories.
-            else if (doCoreFxTesting) {
-                shell("unzip -q -o ${workspaceRelativeFxRootLinux}/fxtests.zip || exit 0")
-                shell("unzip -q -o ${workspaceRelativeFxRootLinux}/fxruntime.zip || exit 0")
-            }
-            else {
-                def testArtifactsTgzFileName = getTestArtifactsTgzFileName(osGroup, architecture, configuration)
-                shell("tar -xzf ./${testArtifactsTgzFileName} || exit 0") // extracts to ./bin/tests/${osGroup}.${architecture}.${configuration}
-            }
-
-            // Execute the tests
-            def runDocker = isNeedDocker(architecture, os, false)
-            def dockerPrefix = ""
-            def dockerCmd = ""
-            if (runDocker) {
-                def dockerImage = getDockerImageName(architecture, os, false)
-                dockerPrefix = "docker run -i --rm -v \${WORKSPACE}:\${WORKSPACE} -w \${WORKSPACE} "
-                dockerCmd = dockerPrefix + "${dockerImage} "
-            }
-
-            // If we are running a stress mode, we'll set those variables first.
-            // For CoreFX, the stress variables are already built into the CoreFX test build per-test wrappers.
-            if (!doCoreFxTesting && isJitStressScenario(scenario)) {
-                def scriptFileName = "\${WORKSPACE}/set_stress_test_env.sh"
-                def envScriptCmds = envScriptCreate(os, scriptFileName)
-                envScriptCmds += envScriptSetStressModeVariables(os, Constants.jitStressModeScenarios[scenario], scriptFileName)
-                envScriptCmds += envScriptFinalize(os, scriptFileName)
-                shell("${envScriptCmds}")
-                testOpts += " --test-env=${scriptFileName}"
-            }
-
-            // setup-stress-dependencies.sh, invoked by runtest.sh to download the coredistools package, depends on the "dotnet"
-            // tool downloaded by the "init-tools.sh" script. However, it only invokes setup-stress-dependencies.sh for x64. The
-            // coredistools package is used by GCStress on x86 and x64 to disassemble code to determine instruction boundaries.
-            // On arm/arm64, it is not required as determining instruction boundaries is trivial.
-            if (isGCStressRelatedTesting(scenario)) {
-                if (architecture == 'x64') {
-                    shell('./init-tools.sh')
-                }
-            }
-
-            if (isPmiAsmDiffsScenario) {
-                shell("""\
-python -u \${WORKSPACE}/tests/scripts/run-pmi-diffs.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} --skip_baseline_build""")
-
-                shell("tar -czf dasm.${os}.${architecture}.${configuration}.tgz ./_/pmi/asm")
-            }
-            else if (doCoreFxTesting) {
-                def exclusionRspPath = "\${WORKSPACE}/tests/scripts/run-corefx-tests-exclusions.txt"
-                shell("""\
-\${WORKSPACE}/tests/scripts/run-corefx-tests.sh --test-exclude-file \${WORKSPACE}/tests/${architecture}/corefx_linux_test_exclusions.txt --runtime \${WORKSPACE}/${workspaceRelativeFxRootLinux}/artifacts/bin/testhost/netcoreapp-Linux-Release-${architecture} --arch ${architecture} --corefx-tests \${WORKSPACE}/${workspaceRelativeFxRootLinux}/artifacts/bin --configurationGroup Release --exclusion-rsp-file ${exclusionRspPath}""")
-            }
-            else {
-                def runScript = "${dockerCmd}./tests/runtest.sh"
-
-                shell("""\
-${runScript} \\
-    ${lowerConfiguration} \\
-    --testRootDir=\"\${WORKSPACE}/bin/tests/${osGroup}.${architecture}.${configuration}\" \\
-    --coreOverlayDir=\"\${WORKSPACE}/bin/tests/${osGroup}.${architecture}.${configuration}/Tests/Core_Root\" \\
-    --limitedDumpGeneration ${testOpts}""")
-            }
-
-            if (isGcReliabilityFramework(scenario)) {
-                // runtest.sh doesn't actually execute the reliability framework - do it here.
-                if (useServerGC) {
-                    if (runDocker) {
-                        dockerCmd = dockerPrefix + "-e COMPlus_gcServer=1 ${dockerImage} "
-                    }
-                    else {
-                        shell("export COMPlus_gcServer=1")
-                    }
-                }
-
-                shell("${dockerCmd}./tests/scripts/run-gc-reliability-framework.sh ${architecture} ${configuration}")
-            }
-        } // steps
-    } // job
-
-    // Experimental: If on Ubuntu 14.04, then attempt to pull in crash dump links
-    if (os in ['Ubuntu']) {
-        SummaryBuilder summaries = new SummaryBuilder()
-        summaries.addLinksSummaryFromFile('Crash dumps from this run:', 'dumplings.txt')
-        summaries.emit(newJob)
-    }
-
-    if (isPmiAsmDiffsScenario) {
-        // Archive the asm
-        Utilities.addArchival(newJob, "dasm.${os}.${architecture}.${configuration}.tgz")
-    }
-    else if (doCoreFxTesting) {
-        Utilities.addArchival(newJob, "${workspaceRelativeFxRootLinux}/artifacts/bin/**/testResults.xml", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-        if ((os == "Ubuntu") && (architecture == 'arm')) {
-            // We have a problem with the xunit plug-in, where it is consistently failing on Ubuntu arm32 test result uploading with this error:
-            //
-            //   [xUnit] [ERROR] - The plugin hasn't been performed correctly: remote file operation failed: /ssd/j/workspace/dotnet_coreclr/master/jitstress/arm_cross_checked_ubuntu_corefx_baseline_tst at hudson.remoting.Channel@3697f46d:JNLP4-connect connection from 131.107.159.149/131.107.159.149:58529: java.io.IOException: Remote call on JNLP4-connect connection from 131.107.159.149/131.107.159.149:58529 failed
-            //
-            // We haven't been able to identify the reason. So, do not add xunit parsing of the test data in this scenario.
-            // This is tracked by: https://github.com/dotnet/coreclr/issues/19447.
-        }
-        else {
-            Utilities.addXUnitDotNETResults(newJob, "${workspaceRelativeFxRootLinux}/artifacts/bin/**/testResults.xml")
-        }
-    }
-    else {
-        Utilities.addXUnitDotNETResults(newJob, '**/coreclrtests.xml')
-    }
-
-    return newJob
-}
-
-def static CreateNonWindowsCrossGenComparisonTestJob(def dslFactory, def project, def architecture, def os, def configuration, def scenario, def isPR, def inputCoreCLRBuildName)
-{
-    assert isCrossGenComparisonScenario(scenario)
-
-    def osGroup = getOSGroup(os)
-    def jobName = getJobName(configuration, architecture, os, scenario, false) + "_tst"
-
-    def workspaceRelativeResultsDir = "_"
-    def workspaceRelativeNativeArchResultDir = "${workspaceRelativeResultsDir}/${osGroup}.${architecture}_${architecture}.${configuration}"
-
-    def crossArch = "x64"
-    def workspaceRelativeCrossArchResultDir = "${workspaceRelativeResultsDir}/${osGroup}.${crossArch}_${architecture}.${configuration}"
-
-    def jobFolder = getJobFolder(scenario)
-    def newJob = dslFactory.job(Utilities.getFullJobName(project, jobName, isPR, jobFolder)) {
-        parameters {
-            stringParam('CORECLR_BUILD', '', "Build number to copy CoreCLR ${osGroup} binaries from")
-        }
-
-        def workspaceRelativeArtifactsArchive = "${os}.${architecture}.${configuration}.${scenario}.zip"
-
-        steps {
-            copyArtifacts(inputCoreCLRBuildName) {
-                includePatterns("${workspaceRelativeArtifactsArchive}")
-                buildSelector {
-                    buildNumber('${CORECLR_BUILD}')
-                }
-            }
-
-            shell("unzip -o ${workspaceRelativeArtifactsArchive} || exit 0")
-
-            def workspaceRelativeCoreLib = "bin/Product/${osGroup}.${architecture}.${configuration}/IL/System.Private.CoreLib.dll"
-            def workspaceRelativeCoreRootDir = "bin/tests/${osGroup}.${architecture}.${configuration}/Tests/Core_Root"
-            def workspaceRelativeCrossGenComparisonScript = "tests/scripts/crossgen_comparison.py"
-            def workspaceRelativeCrossGenExecutable = "${workspaceRelativeCoreRootDir}/crossgen"
-
-            def crossGenComparisonCmd = "python -u \${WORKSPACE}/${workspaceRelativeCrossGenComparisonScript} "
-            def crossGenExecutable = "\${WORKSPACE}/${workspaceRelativeCrossGenExecutable}"
-
-            shell("mkdir -p ${workspaceRelativeNativeArchResultDir}")
-            shell("${crossGenComparisonCmd}crossgen_corelib --crossgen ${crossGenExecutable} --il_corelib \${WORKSPACE}/${workspaceRelativeCoreLib} --result_dir \${WORKSPACE}/${workspaceRelativeNativeArchResultDir}")
-            shell("${crossGenComparisonCmd}crossgen_framework --crossgen ${crossGenExecutable} --core_root \${WORKSPACE}/${workspaceRelativeCoreRootDir} --result_dir \${WORKSPACE}/${workspaceRelativeNativeArchResultDir}")
-
-            shell("${crossGenComparisonCmd}compare --base_dir \${WORKSPACE}/${workspaceRelativeNativeArchResultDir} --diff_dir \${WORKSPACE}/${workspaceRelativeCrossArchResultDir}")
-        } // steps
-    }  // job
-
-    Utilities.addArchival(newJob, "${workspaceRelativeNativeArchResultDir}/**", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-    Utilities.addArchival(newJob, "${workspaceRelativeCrossArchResultDir}/**", "", /* doNotFailIfNothingArchived */ true, /* archiveOnlyIfSuccessful */ false)
-
-    return newJob
-}
-
-// Create a test job that will be used by a flow job.
-// Returns the newly created job.
-// Note that we don't add tests jobs to the various views, since they are always used by a flow job, which is in the views,
-// and we want the views to be the minimal set of "top-level" jobs that represent all work.
-def static CreateTestJob(def dslFactory, def project, def branch, def architecture, def os, def configuration, def scenario, def isPR, def inputCoreCLRBuildName)
-{
-    def windowsArmJob = ((os == "Windows_NT") && (architecture in Constants.armWindowsCrossArchitectureList))
-
-    def newJob = null
-    if (windowsArmJob) {
-        newJob = CreateWindowsArmTestJob(dslFactory, project, architecture, os, configuration, scenario, isPR, inputCoreCLRBuildName)
-    }
-    else if (isCrossGenComparisonScenario(scenario)) {
-        newJob = CreateNonWindowsCrossGenComparisonTestJob(dslFactory, project, architecture, os, configuration, scenario, isPR, inputCoreCLRBuildName)
-    }
-    else {
-        newJob = CreateOtherTestJob(dslFactory, project, branch, architecture, os, configuration, scenario, isPR, inputCoreCLRBuildName)
-    }
-
-    setJobMachineAffinity(architecture, os, false, true, false, newJob) // isBuildJob = false, isTestJob = true, isFlowJob = false
-
-    if (scenario == 'jitdiff') {
-        def osGroup = getOSGroup(os)
-        Utilities.addArchival(newJob, "bin/tests/${osGroup}.${architecture}.${configuration}/dasm/**")
-    }
-
-    Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-    setJobTimeout(newJob, isPR, architecture, configuration, scenario, false)
-
-    return newJob
-}
-
-// Create a flow job to tie together a build job with the given test job.
-// Returns the new flow job.
-def static CreateFlowJob(def dslFactory, def project, def branch, def architecture, def os, def configuration, def scenario, def isPR, def fullTestJobName, def inputCoreCLRBuildName)
-{
-    // Windows CoreCLR build and Linux CoreCLR build (in parallel) ->
-    // Linux CoreCLR test
-    def flowJobName = getJobName(configuration, architecture, os, scenario, false) + "_flow"
-    def jobFolder = getJobFolder(scenario)
-
-    def newFlowJob = dslFactory.buildFlowJob(Utilities.getFullJobName(project, flowJobName, isPR, jobFolder)) {
-        buildFlow("""\
-coreclrBuildJob = build(params, '${inputCoreCLRBuildName}')
-
-// And then build the test build
-build(params + [CORECLR_BUILD: coreclrBuildJob.build.number], '${fullTestJobName}')
-""")
-    }
-    JobReport.Report.addReference(inputCoreCLRBuildName)
-    JobReport.Report.addReference(fullTestJobName)
-
-    addToViews(newFlowJob, true, isPR, architecture, os, configuration, scenario) // isFlowJob = true
-
-    setJobMachineAffinity(architecture, os, false, false, true, newFlowJob) // isBuildJob = false, isTestJob = false, isFlowJob = true
-
-    Utilities.standardJobSetup(newFlowJob, project, isPR, "*/${branch}")
-    addTriggers(newFlowJob, branch, isPR, architecture, os, configuration, scenario, true, false) // isFlowJob==true, isWindowsBuildOnlyJob==false
-
-    return newFlowJob
-}
-
-// Determine if we should generate a flow job for the given parameters.
-// Returns true if the job should be generated.
-def static shouldGenerateFlowJob(def scenario, def isPR, def architecture, def configuration, def os)
-{
-    // The various "innerloop" jobs are only available as PR triggered.
-
-    if (!isPR) {
-        if (isInnerloopTestScenario(scenario)) {
-            return false
-        }
-
-        if (scenario == 'corefx_innerloop') {
-            return false
-        }
-    }
-
-    // Disable flow jobs for innerloop pr.
-    //
-    // The only exception is windows arm(64)
-    if (isInnerloopTestScenario(scenario) && isPR && os != 'Windows_NT') {
-        assert scenario != 'corefx_innerloop'
-
-        return false;
-    }
-
-    // Filter based on OS and architecture.
-
-    switch (architecture) {
-        case 'arm':
-            if (os != "Ubuntu" && os != "Windows_NT") {
-                return false
-            }
-            break
-        case 'arm64':
-            if (os != "Ubuntu16.04" && os != "Windows_NT") {
-                return false
-            }
-            break
-        case 'x86':
-            if (os != "Ubuntu") {
-                return false
-            }
-            break
-        case 'x64':
-            if (!(os in Constants.crossList)) {
-                return false
-            }
-            if (os == "Windows_NT") {
-                return false
-            }
-            break
-        case 'armem':
-            // No flow jobs
-            return false
-        default:
-            println("Unknown architecture: ${architecture}")
-            assert false
-            break
-    }
-
-    def isNormalOrInnerloop = (scenario == 'innerloop' || scenario == 'normal')
-
-    // Filter based on scenario in OS.
-
-    if (os == 'Windows_NT') {
-        assert architecture == 'arm' || architecture == 'arm64'
-        if (!isArmWindowsScenario(scenario)) {
-            return false
-        }
-        if (isNormalOrInnerloop && (configuration == 'Debug')) {
-            // The arm32/arm64 Debug configuration for innerloop/normal scenario is a special case: it does a build only, and no test run.
-            // To do that, it doesn't require a flow job.
-            return false
-        }
-    }
-    else {
-        // Non-Windows
-        if (architecture == 'arm') {
-            if (!(scenario in Constants.validLinuxArmScenarios)) {
-                return false
-            }
-        }
-        else if (architecture == 'arm64') {
-            if (!(scenario in Constants.validLinuxArm64Scenarios)) {
-                return false
-            }
-        }
-        else if (architecture == 'x86') {
-            // Linux/x86 only want innerloop and default test
-            if (!isNormalOrInnerloop) {
-                return false
-            }
-        }
-        else if (architecture == 'x64') {
-            // Linux/x64 corefx testing doesn't need a flow job; the "build" job runs run-corefx-tests.py which
-            // builds and runs the corefx tests. Other Linux/x64 flow jobs are required to get the test
-            // build from a Windows machine.
-            if (isCoreFxScenario(scenario)) {
-                return false
-            }
-        }
-    }
-
-    // For CentOS, we only want Checked/Release builds.
-    if (os == 'CentOS7.1') {
-        if (configuration != 'Checked' && configuration != 'Release') {
-            return false
-        }
-        if (!isNormalOrInnerloop && !isR2RScenario(scenario)) {
-            return false
-        }
-    }
-
-    // For RedHat and Debian, we only do Release builds.
-    else if (os == 'RHEL7.2' || os == 'Debian8.4') {
-        if (configuration != 'Release') {
-            return false
-        }
-        if (!isNormalOrInnerloop) {
-            return false
-        }
-    }
-
-    // Next, filter based on scenario.
-
-    if (isJitStressScenario(scenario)) {
-        if (configuration != 'Checked') {
-            return false
-        }
-    }
-    else if (isR2RBaselineScenario(scenario)) {
-        if (configuration != 'Checked' && configuration != 'Release') {
-            return false
-        }
-    }
-    else if (isR2RStressScenario(scenario)) {
-        if (configuration != 'Checked') {
-            return false
-        }
-    }
-    else if (isCrossGenComparisonScenario(scenario)) {
-        return shouldGenerateCrossGenComparisonJob(os, architecture, configuration, scenario)
-    }
-    else {
-        // Skip scenarios
-        switch (scenario) {
-            case 'ilrt':
-            case 'longgc':
-            case 'gcsimulator':
-                // Long GC tests take a long time on non-Release builds
-                // ilrt is also Release only
-                if (configuration != 'Release') {
-                    return false
-                }
-                break
-
-            case 'jitdiff':
-                if (configuration != 'Checked') {
-                    return false
-                }
-                break
-
-            case 'gc_reliability_framework':
-            case 'standalone_gc':
-                if (configuration != 'Release' && configuration != 'Checked') {
-                    return false
-                }
-                break
-
-            case 'formatting':
-                return false
-
-            case 'illink':
-                if (os != 'Windows_NT' && os != 'Ubuntu') {
-                    return false
-                }
-                break
-
-            case 'normal':
-                // Nothing skipped
-                break
-
-            case 'innerloop':
-                if (!isValidPrTriggeredInnerLoopJob(os, architecture, configuration, false)) {
-                    return false
-                }
-                break
-
-            case 'pmi_asm_diffs':
-                if (configuration != 'Checked') {
-                    return false
-                }
-                // No need for flow job except for Linux arm/arm64
-                if ((os != 'Windows_NT') && (architecture != 'arm') && (architecture != 'arm64')) {
-                    return false
-                }
-                break
-
-            case 'corefx_innerloop':
-                // No flow job needed
-                return false
-
-            default:
-                println("Unknown scenario: ${scenario}")
-                assert false
-                break
-        }
-    }
-
-    // The job was not filtered out, so we should generate it!
-    return true
-}
-
-// Create jobs requiring flow jobs. This includes x64 non-Windows, arm/arm64 Ubuntu, and arm/arm64 Windows.
-Constants.allScenarios.each { scenario ->
-    [true, false].each { isPR ->
-        Constants.architectureList.each { architecture ->
-            Constants.configurationList.each { configuration ->
-                Constants.osList.each { os ->
-
-                    if (!shouldGenerateFlowJob(scenario, isPR, architecture, configuration, os)) {
-                        return
-                    }
-
-                    def windowsArmJob = ((os == "Windows_NT") && (architecture in Constants.armWindowsCrossArchitectureList))
-                    def doCoreFxTesting = isCoreFxScenario(scenario)
-                    def doCrossGenComparison = isCrossGenComparisonScenario(scenario)
-                    def isPmiAsmDiffsScenario = (scenario == 'pmi_asm_diffs')
-
-                    // Figure out the job name of the CoreCLR build the test will depend on.
-
-                    def inputCoreCLRBuildScenario = isInnerloopTestScenario(scenario) ? 'innerloop' : 'normal'
-                    def inputCoreCLRBuildIsBuildOnly = false
-                    if (doCoreFxTesting || isPmiAsmDiffsScenario) {
-                        // Every CoreFx test depends on its own unique build.
-                        inputCoreCLRBuildScenario = scenario
-                        if (windowsArmJob) {
-                            // Only Windows ARM corefx jobs use "build only" jobs. Others, such as Ubuntu ARM corefx, use "regular" jobs.
-                            inputCoreCLRBuildIsBuildOnly = true
-                        }
-                    }
-                    else if (doCrossGenComparison) {
-                        inputCoreCLRBuildScenario = scenario
-                    }
-
-                    def inputCoreCLRFolderName = getJobFolder(inputCoreCLRBuildScenario)
-                    def inputCoreCLRBuildName = projectFolder + '/' +
-                        Utilities.getFullJobName(project, getJobName(configuration, architecture, os, inputCoreCLRBuildScenario, inputCoreCLRBuildIsBuildOnly), isPR, inputCoreCLRFolderName)
-
-                    // =============================================================================================
-                    // Create the test job
-                    // =============================================================================================
-
-                    def testJob = CreateTestJob(this, project, branch, architecture, os, configuration, scenario, isPR, inputCoreCLRBuildName)
-
-                    // =============================================================================================
-                    // Create a build flow to join together the build and tests required to run this test.
-                    // =============================================================================================
-
-                    if (os == 'RHEL7.2' || os == 'Debian8.4') {
-                        // Do not create the flow job for RHEL jobs.
-                        return
-                    }
-
-                    def fullTestJobName = projectFolder + '/' + testJob.name
-                    def flowJob = CreateFlowJob(this, project, branch, architecture, os, configuration, scenario, isPR, fullTestJobName, inputCoreCLRBuildName)
-
-                } // os
-            } // configuration
-        } // architecture
-    } // isPR
-} // scenario
-
-JobReport.Report.generateJobReport(out)
-
-// Make the call to generate the help job
-Utilities.createHelperJob(this, project, branch,
-    "Welcome to the ${project} Repository",  // This is prepended to the help message
-    "Have a nice day!")  // This is appended to the help message.  You might put known issues here.
-
-Utilities.addCROSSCheck(this, project, branch)
diff --git a/src/coreclr/perf.groovy b/src/coreclr/perf.groovy
deleted file mode 100644 (file)
index a8316e4..0000000
+++ /dev/null
@@ -1,957 +0,0 @@
-// Import the utility functionality.
-
-import jobs.generation.*;
-
-def project = GithubProject
-def branch = GithubBranchName
-def projectName = Utilities.getFolderName(project)
-def projectFolder = projectName + '/' + Utilities.getFolderName(branch)
-
-def static getOSGroup(def os) {
-    def osGroupMap = ['Ubuntu14.04':'Linux',
-        'RHEL7.2': 'Linux',
-        'Ubuntu16.04': 'Linux',
-        'Debian8.4':'Linux',
-        'Fedora24':'Linux',
-        'OSX':'OSX',
-        'Windows_NT':'Windows_NT',
-        'FreeBSD':'FreeBSD',
-        'CentOS7.1': 'Linux',
-        'OpenSUSE13.2': 'Linux',
-        'OpenSUSE42.1': 'Linux',
-        'LinuxARMEmulator': 'Linux']
-    def osGroup = osGroupMap.get(os, null)
-    assert osGroup != null : "Could not find os group for ${os}"
-    return osGroupMap[os]
-}
-
-// Setup perflab tests runs
-[true, false].each { isPR ->
-    ['Windows_NT'].each { os ->
-        ['x64', 'x86'].each { arch ->
-            [true, false].each { isSmoketest ->
-                ['ryujit'].each { jit ->
-                    ['full_opt', 'min_opt'].each { opt_level ->
-
-                        def architecture = arch
-                        def jobName = isSmoketest ? "perf_perflab_${os}_${arch}_${opt_level}_${jit}_smoketest" : "perf_perflab_${os}_${arch}_${opt_level}_${jit}"
-                        def testEnv = ""
-                        def python = "C:\\Python35\\python.exe"
-
-                        def newJob = job(Utilities.getFullJobName(project, jobName, isPR)) {
-                            // Set the label.
-                            if (isSmoketest) {
-                                label('Windows.10.Amd64.ClientRS4.DevEx.15.8.Open')
-                                python = "C:\\python3.7.0\\python.exe"
-                            }
-                            else {
-                                label('windows_server_2016_clr_perf')
-                            }
-
-                            wrappers {
-                                credentialsBinding {
-                                    string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                                }
-                            }
-
-                            if (isPR) {
-                                parameters {
-                                    stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                                }
-                            }
-
-                            if (isSmoketest) {
-                                parameters {
-                                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION', '2', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION_INNER_SPECIFIED', '2', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                                }
-                            }
-                            else{
-                                parameters {
-                                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION', '21', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION_INNER_SPECIFIED', '21', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                                }
-                            }
-
-                            def configuration = 'Release'
-                            def runType = isPR ? 'private' : 'rolling'
-                            def benchViewName = isPR ? 'coreclr private %BenchviewCommitName%' : 'coreclr rolling %GIT_BRANCH_WITHOUT_ORIGIN% %GIT_COMMIT%'
-                            def uploadString = isSmoketest ? '' : '-uploadToBenchview'
-
-                            steps {
-                                // Batch
-
-                                batchFile("powershell -NoProfile wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile \"%WORKSPACE%\\nuget.exe\"")
-                                batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\"")
-                                batchFile("\"%WORKSPACE%\\nuget.exe\" install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-                                //Do this here to remove the origin but at the front of the branch name as this is a problem for BenchView
-                                //we have to do it all as one statement because cmd is called each time and we lose the set environment variable
-                                batchFile("if \"%GIT_BRANCH:~0,7%\" == \"origin/\" (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH:origin/=%\") else (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH%\")\n" +
-                                "set \"BENCHVIEWNAME=${benchViewName}\"\n" +
-                                "set \"BENCHVIEWNAME=%BENCHVIEWNAME:\"=\"\"%\"\n" +
-                                "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\submission-metadata.py\" --name \"%BENCHVIEWNAME%\" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                                "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\build.py\" git --branch %GIT_BRANCH_WITHOUT_ORIGIN% --type ${runType}")
-                                batchFile("${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\machinedata.py\"")
-                                batchFile("set __TestIntermediateDir=int&&build.cmd ${configuration} ${architecture}")
-
-                                batchFile("tests\\runtest.cmd ${configuration} ${architecture} GenerateLayoutOnly")
-
-                                def runXUnitPerfCommonArgs = "-arch ${arch} -configuration ${configuration} -os ${os} -generateBenchviewData \"%WORKSPACE%\\Microsoft.Benchview.JSONFormat\\tools\" ${uploadString} -runtype ${runType} ${testEnv} -optLevel ${opt_level} -jitName ${jit} -outputdir \"%WORKSPACE%\\bin\\sandbox_logs\" -stabilityPrefix \"START \\\"CORECLR_PERF_RUN\\\" /B /WAIT /HIGH /AFFINITY 0x2\""
-
-                                // Run with just stopwatch: Profile=Off
-                                batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\performance\\perflab\\Perflab -library")
-                                batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\Jit\\Performance\\CodeQuality")
-
-                                // Run with the full set of counters enabled: Profile=On
-                                if (opt_level != 'min_opt') {
-                                    batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\performance\\perflab\\Perflab -library -collectionFlags default+BranchMispredictions+CacheMisses+InstructionRetired+gcapi")
-                                    batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\Jit\\Performance\\CodeQuality -collectionFlags default+BranchMispredictions+CacheMisses+InstructionRetired+gcapi")
-                                }
-                            }
-                        }
-
-                        def archiveSettings = new ArchivalSettings()
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*_log.txt')
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*.csv')
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*.xml')
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*.log')
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*.md')
-                        archiveSettings.addFiles('bin/sandbox_logs/**/*.etl')
-                        archiveSettings.addFiles('machinedata.json')
-                        archiveSettings.setAlwaysArchive()
-
-                        Utilities.addArchival(newJob, archiveSettings)
-                        Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-                        newJob.with {
-                            logRotator {
-                                artifactDaysToKeep(14)
-                                daysToKeep(30)
-                                artifactNumToKeep(100)
-                                numToKeep(200)
-                            }
-                            wrappers {
-                                timeout {
-                                    absolute(240)
-                                }
-                            }
-                        }
-
-                        if (isPR) {
-                            TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-                            if (isSmoketest) {
-                                builder.setGithubContext("${os} ${arch} ${opt_level} ${jit} CoreCLR Perf Tests Correctness")
-                            }
-                            else {
-                                builder.setGithubContext("${os} ${arch} ${opt_level} ${jit} CoreCLR Perf Tests")
-
-                                def opts = ""
-                                if (opt_level == 'min_opt') {
-                                    opts = '\\W+min_opts'
-                                }
-                                def jitt = ""
-                                if (jit != 'ryujit') {
-                                    jitt = "\\W+${jit}"
-                                }
-
-                                builder.triggerOnlyOnComment()
-                                builder.setCustomTriggerPhrase("(?i).*test\\W+${os}\\W+${arch}${opts}${jitt}\\W+perf.*")
-                            }
-
-                            builder.triggerForBranch(branch)
-                            builder.emitTrigger(newJob)
-                        }
-                        else if (opt_level == 'full_opt') {
-                            // Set a push trigger
-                            TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-                            builder.emitTrigger(newJob)
-                        }
-                        else {
-                            // Set periodic trigger
-                            Utilities.addPeriodicTrigger(newJob, '@daily')
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-// Setup throughput perflab tests runs
-[true, false].each { isPR ->
-    ['Windows_NT'].each { os ->
-        ['x64', 'x86'].each { arch ->
-            ['ryujit'].each { jit ->
-                [true, false].each { pgo_optimized ->
-                    ['full_opt', 'min_opt'].each { opt_level ->
-                        def architecture = arch
-
-                        def python = "C:\\Python35\\python.exe"
-
-                        pgo_build = ""
-                        pgo_test = ""
-                        pgo_string = "pgo"
-                        if (!pgo_optimized) {
-                            pgo_build = " -nopgooptimize"
-                            pgo_test = " -nopgo"
-                            pgo_string = "nopgo"
-                        }
-
-                        def newJob = job(Utilities.getFullJobName(project, "perf_throughput_perflab_${os}_${arch}_${opt_level}_${jit}_${pgo_string}", isPR)) {
-                            // Set the label.
-                            label('windows_server_2016_clr_perf')
-                            wrappers {
-                                credentialsBinding {
-                                    string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                                }
-                            }
-
-                            if (isPR) {
-                                parameters {
-                                    stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that will be used to build the full title of a run in Benchview.')
-                                }
-                            }
-
-                            def configuration = 'Release'
-                            def runType = isPR ? 'private' : 'rolling'
-                            def benchViewName = isPR ? 'coreclr-throughput private %BenchviewCommitName%' : 'coreclr-throughput rolling %GIT_BRANCH_WITHOUT_ORIGIN% %GIT_COMMIT%'
-
-                            steps {
-                                // Batch
-                                batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\"")
-                                batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.ThroughputBenchmarks.${architecture}.${os}\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.ThroughputBenchmarks.${architecture}.${os}\"")
-                                batchFile("C:\\Tools\\nuget.exe install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-                                batchFile("C:\\Tools\\nuget.exe install Microsoft.BenchView.ThroughputBenchmarks.${architecture}.${os} -Source https://dotnet.myget.org/F/dotnet-core -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-                                //Do this here to remove the origin but at the front of the branch name as this is a problem for BenchView
-                                //we have to do it all as one statement because cmd is called each time and we lose the set environment variable
-                                batchFile("if \"%GIT_BRANCH:~0,7%\" == \"origin/\" (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH:origin/=%\") else (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH%\")\n" +
-                                "set \"BENCHVIEWNAME=${benchViewName}\"\n" +
-                                "set \"BENCHVIEWNAME=%BENCHVIEWNAME:\"=\"\"%\"\n" +
-                                "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\submission-metadata.py\" --name \"${benchViewName}\" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                                "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\build.py\" git --branch %GIT_BRANCH_WITHOUT_ORIGIN% --type ${runType}")
-                                batchFile("${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\machinedata.py\"")
-                                batchFile("set __TestIntermediateDir=int&&build.cmd ${configuration} ${architecture}${pgo_build} skiptests")
-                                batchFile("${python} -u tests\\scripts\\run-throughput-perf.py -arch ${arch} -os ${os} -configuration ${configuration} -opt_level ${opt_level} -jit_name ${jit}${pgo_test} -clr_root \"%WORKSPACE%\" -assembly_root \"%WORKSPACE%\\Microsoft.BenchView.ThroughputBenchmarks.${architecture}.${os}\\lib\" -benchview_path \"%WORKSPACE%\\Microsoft.Benchview.JSONFormat\\tools\" -run_type ${runType}")
-                            }
-                        }
-
-                        // Save machinedata.json to /artifact/bin/ Jenkins dir
-                        def archiveSettings = new ArchivalSettings()
-                        archiveSettings.addFiles('throughput-*.csv')
-                        archiveSettings.setAlwaysArchive()
-                        Utilities.addArchival(newJob, archiveSettings)
-
-                        Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-                        if (isPR) {
-                            def opts = ""
-                            if (opt_level == 'min_opt') {
-                                opts = '\\W+min_opts'
-                            }
-
-                            def jitt = ""
-                            if (jit != 'ryujit') {
-                                jitt = "\\W+${jit}"
-                            }
-
-                            def pgo_trigger = ""
-                            if (pgo_optimized) {
-                                pgo_trigger = "\\W+nopgo"
-                            }
-
-
-                            TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-                            builder.setGithubContext("${os} ${arch} ${opt_level} ${jit} ${pgo_string} CoreCLR Throughput Perf Tests")
-                            builder.triggerOnlyOnComment()
-                            builder.setCustomTriggerPhrase("(?i).*test\\W+${os}\\W+${arch}${opts}${jitt}${pgo_trigger}\\W+throughput.*")
-                            builder.triggerForBranch(branch)
-                            builder.emitTrigger(newJob)
-                        }
-                        else if (opt_level == 'full_opt' && pgo_optimized) {
-                            // Set a push trigger
-                            TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-                            builder.emitTrigger(newJob)
-                        }
-                        else {
-                            // Set periodic trigger
-                            Utilities.addPeriodicTrigger(newJob, '@daily')
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-def static getFullPerfJobName(def project, def os, def arch, def isPR) {
-    return Utilities.getFullJobName(project, "perf_${os}_${arch}", isPR)
-}
-
-// Create the Linux/OSX/CentOS coreclr test leg for debug and release and each scenario
-[true, false].each { isPR ->
-    ['x64'].each { architecture ->
-        def fullBuildJobName = Utilities.getFullJobName(project, "perf_linux_build", isPR)
-        def configuration = 'Release'
-
-        def crossCompile = ""
-        def crossLayout = ""
-        def python = "python3.5"
-
-        // Build has to happen on RHEL7.2 (that's where we produce the bits we ship)
-        ['RHEL7.2'].each { os ->
-            def newBuildJob = job(fullBuildJobName) {
-                steps {
-                    shell("./build.sh verbose ${architecture} ${configuration}${crossCompile}")
-                    shell("./build-test.sh generatelayoutonly ${architecture} ${configuration}${crossLayout}")
-                }
-            }
-            Utilities.setMachineAffinity(newBuildJob, os, 'latest-or-auto')
-            Utilities.standardJobSetup(newBuildJob, project, isPR, "*/${branch}")
-            Utilities.addArchival(newBuildJob, "bin/Product/**,bin/obj/*/tests/**/*.dylib,bin/obj/*/tests/**/*.so,bin/tests/**", "bin/Product/**/.nuget/**")
-        }
-
-
-        // Actual perf testing on the following OSes
-        def perfOSList = ['Ubuntu16.04']
-
-        perfOSList.each { os ->
-            def newJob = job(getFullPerfJobName(project, os, architecture, isPR)) {
-
-                def machineLabel = 'ubuntu_1604_clr_perf'
-
-                label(machineLabel)
-                wrappers {
-                    credentialsBinding {
-                        string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                    }
-                }
-
-                if (isPR) {
-                    parameters {
-                        stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                    }
-                }
-
-                parameters {
-                    // Cap the maximum number of iterations to 21.
-                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION', '21', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                    stringParam('XUNIT_PERFORMANCE_MAX_ITERATION_INNER_SPECIFIED', '21', 'Sets the number of iterations to twenty one.  We are doing this to limit the amount of data that we upload as 20 iterations is enough to get a good sample')
-                    stringParam('PRODUCT_BUILD', '', 'Build number from which to copy down the CoreCLR Product binaries built for Linux')
-                }
-
-                def osGroup = getOSGroup(os)
-                def runType = isPR ? 'private' : 'rolling'
-                def benchViewName = isPR ? 'coreclr private \$BenchviewCommitName' : 'coreclr rolling \$GIT_BRANCH_WITHOUT_ORIGIN \$GIT_COMMIT'
-                def uploadString = '-uploadToBenchview'
-
-                def runXUnitCommonArgs = "-arch ${architecture} -os ${os} -configuration ${configuration} -stabilityPrefix \"taskset 0x00000002 nice --adjustment=-10\" -generateBenchviewData \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools\" ${uploadString} -runtype ${runType} -outputdir \"\${WORKSPACE}/bin/sandbox_logs\""
-
-                steps {
-                    shell("./tests/scripts/perf-prep.sh --nocorefx")
-                    shell("./init-tools.sh")
-                    copyArtifacts(fullBuildJobName) {
-                        includePatterns("bin/**")
-                        buildSelector {
-                            buildNumber('\${PRODUCT_BUILD}')
-                        }
-                    }
-                    shell("GIT_BRANCH_WITHOUT_ORIGIN=\$(echo \$GIT_BRANCH | sed \"s/[^/]*\\/\\(.*\\)/\\1 /\")\n" +
-                    "${python} \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools/submission-metadata.py\" --name \" ${benchViewName} \" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                    "${python} \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools/build.py\" git --branch \$GIT_BRANCH_WITHOUT_ORIGIN --type ${runType}")
-                    shell("""${python} ./tests/scripts/run-xunit-perf.py -testBinLoc bin/tests/Windows_NT.${architecture}.${configuration}/JIT/Performance/CodeQuality ${runXUnitCommonArgs}""")
-                }
-            }
-
-            def archiveSettings = new ArchivalSettings()
-            archiveSettings.addFiles('bin/sandbox_logs/**/*_log.txt')
-            archiveSettings.addFiles('bin/sandbox_logs/**/*.csv')
-            archiveSettings.addFiles('bin/sandbox_logs/**/*.xml')
-            archiveSettings.addFiles('bin/sandbox_logs/**/*.log')
-            archiveSettings.addFiles('bin/sandbox_logs/**/*.md')
-            archiveSettings.addFiles('bin/sandbox_logs/**/*.etl')
-            archiveSettings.addFiles('machinedata.json')
-            archiveSettings.setAlwaysArchive()
-
-            Utilities.addArchival(newJob, archiveSettings)
-            Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-            // For perf, we need to keep the run results longer
-            newJob.with {
-                // Enable the log rotator
-                logRotator {
-                    artifactDaysToKeep(14)
-                    daysToKeep(30)
-                    artifactNumToKeep(100)
-                    numToKeep(200)
-                }
-                wrappers {
-                    timeout {
-                        absolute(240)
-                    }
-                }
-            }
-        } // os
-
-        def flowJobPerfRunList = perfOSList.collect { os ->
-            "{ build(params + [PRODUCT_BUILD: b.build.number], '${getFullPerfJobName(project, os, architecture, isPR)}') }"
-        }
-        def newFlowJob = buildFlowJob(Utilities.getFullJobName(project, "perf_linux_${architecture}_flow", isPR, '')) {
-            if (isPR) {
-                parameters {
-                    stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                }
-            }
-            buildFlow("""
-// First, build the bits on RHEL7.2
-b = build(params, '${fullBuildJobName}')
-
-// Then, run the perf tests
-parallel(
-    ${flowJobPerfRunList.join(",\n    ")}
-)
-""")
-        }
-
-        Utilities.setMachineAffinity(newFlowJob, 'Windows_NT', 'latest-or-auto')
-        Utilities.standardJobSetup(newFlowJob, project, isPR, "*/${branch}")
-
-        if (isPR) {
-            TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-            builder.setGithubContext("Linux Perf Test Flow")
-            builder.triggerOnlyOnComment()
-            builder.setCustomTriggerPhrase("(?i).*test\\W+linux\\W+perf\\W+flow.*")
-            builder.triggerForBranch(branch)
-            builder.emitTrigger(newFlowJob)
-        }
-        else {
-            // Set a push trigger
-            TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-            builder.emitTrigger(newFlowJob)
-        }
-    } // architecture
-} // isPR
-
-def static getDockerImageName(def architecture, def os, def isBuild) {
-    // We must change some docker private images to official later
-    if (isBuild) {
-        if (architecture == 'arm') {
-            if (os == 'Ubuntu') {
-                return "microsoft/dotnet-buildtools-prereqs:ubuntu-14.04-cross-e435274-20180426002420"
-            }
-        }
-    }
-    println("Unknown architecture to use docker: ${architecture} ${os}");
-    assert false
-}
-
-def static getFullThroughputJobName(def project, def os, def arch, def isPR) {
-    return Utilities.getFullJobName(project, "perf_throughput_${os}_${arch}", isPR)
-}
-
-// Create the Linux/OSX/CentOS coreclr test leg for debug and release and each scenario
-[true, false].each { isPR ->
-    ['x64','arm'].each { architecture ->
-        def fullBuildJobName = Utilities.getFullJobName(project, "perf_throughput_linux_${architecture}_build", isPR)
-        def configuration = 'Release'
-
-        
-        def crossCompile = ""
-        def python = "python3.5"
-        def tgzFile = "bin-Product-Linux.${architecture}.${configuration}.tgz"
-
-        if (architecture == "arm") {
-            python = "python3.6"
-            def buildCommands = []
-            def newBuildJob = job(fullBuildJobName) {
-                def dockerImage = getDockerImageName(architecture, 'Ubuntu', true)
-                def dockerCmd = "docker run -i --rm -v \${WORKSPACE}:\${WORKSPACE} -w \${WORKSPACE} -e ROOTFS_DIR=/crossrootfs/${architecture} ${dockerImage} "
-
-                buildCommands += "${dockerCmd}\${WORKSPACE}/build.sh release ${architecture} cross"
-
-                steps {
-                    buildCommands.each { buildCommand ->
-                        shell(buildCommand)
-                        shell("tar -czf ${tgzFile} bin/Product/Linux.${architecture}.${configuration}")
-                    }
-                }
-
-                publishers {
-                    azureVMAgentPostBuildAction {
-                        agentPostBuildAction('Delete agent after build execution (when idle).')
-                    }
-                }
-            }
-            Utilities.setMachineAffinity(newBuildJob, "Ubuntu16.04", 'latest-or-auto')
-            Utilities.standardJobSetup(newBuildJob, project, isPR, "*/${branch}")
-            Utilities.addArchival(newBuildJob, "${tgzFile}")
-        }
-        else {
-            // Build has to happen on RHEL7.2 (that's where we produce the bits we ship)
-            ['RHEL7.2'].each { os ->
-                def newBuildJob = job(fullBuildJobName) {
-                    steps {
-                        shell("./build.sh verbose ${architecture} ${configuration}${crossCompile}")
-                    }
-                }
-                Utilities.setMachineAffinity(newBuildJob, os, 'latest-or-auto')
-                Utilities.standardJobSetup(newBuildJob, project, isPR, "*/${branch}")
-                Utilities.addArchival(newBuildJob, "bin/Product/**")
-            }
-        }
-
-        // Actual perf testing on the following OSes
-        def throughputOSList = ['Ubuntu16.04']
-        if (architecture == 'arm') {
-            throughputOSList = ['Ubuntu14.04']
-        }
-        def throughputOptLevelList = ['full_opt', 'min_opt']
-
-        def throughputOSOptLevelList = []
-
-        throughputOSList.each { os ->
-            throughputOptLevelList.each { opt_level ->
-                throughputOSOptLevelList.add("${os}_${opt_level}")
-            }
-        }
-
-        throughputOSList.each { os ->
-            throughputOptLevelList.each { opt_level ->
-                def newJob = job(getFullThroughputJobName(project, "${os}_${opt_level}", architecture, isPR)) {
-
-                    def machineLabel = 'ubuntu_1604_clr_perf'
-                    if (architecture == 'arm') {
-                        machineLabel = 'ubuntu_1404_clr_perf_arm'
-                    }
-
-                    label(machineLabel)
-                        wrappers {
-                            credentialsBinding {
-                                string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                            }
-                        }
-
-                    if (isPR) {
-                        parameters {
-                            stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that will be used to build the full title of a run in Benchview.')
-                        }
-                    }
-
-                    parameters {
-                        stringParam('PRODUCT_BUILD', '', 'Build number from which to copy down the CoreCLR Product binaries built for Linux')
-                    }
-
-                    def osGroup = getOSGroup(os)
-                    def runType = isPR ? 'private' : 'rolling'
-                    def benchViewName = isPR ? 'coreclr-throughput private \$BenchviewCommitName' : 'coreclr-throughput rolling \$GIT_BRANCH_WITHOUT_ORIGIN \$GIT_COMMIT'
-                    def archString = architecture == 'arm' ? ' --arch=arm' : ''
-
-                    steps {
-                        shell("bash ./tests/scripts/perf-prep.sh --throughput${archString}")
-                        copyArtifacts(fullBuildJobName) {
-                            if (architecture == 'arm') {
-                                includePatterns("${tgzFile}")
-                            }
-                            else {
-                                includePatterns("bin/Product/**")
-                            }
-                            buildSelector {
-                                buildNumber('\${PRODUCT_BUILD}')
-                            }
-                        }
-                        if (architecture == 'arm') {
-                            shell("tar -xzf ./${tgzFile} || exit 0")
-                        }
-                        shell("GIT_BRANCH_WITHOUT_ORIGIN=\$(echo \$GIT_BRANCH | sed \"s/[^/]*\\/\\(.*\\)/\\1 /\")\n" +
-                        "${python} \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools/submission-metadata.py\" --name \" ${benchViewName} \" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                        "${python} \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools/build.py\" git --branch \$GIT_BRANCH_WITHOUT_ORIGIN --type ${runType}")
-                        shell("""${python} ./tests/scripts/run-throughput-perf.py \\
-                        -arch \"${architecture}\" \\
-                        -os \"${os}\" \\
-                        -configuration \"${configuration}\" \\
-                        -opt_level \"${opt_level}\" \\
-                        -clr_root \"\${WORKSPACE}\" \\
-                        -assembly_root \"\${WORKSPACE}/Microsoft.Benchview.ThroughputBenchmarks.x64.Windows_NT/lib\" \\
-                        -run_type \"${runType}\" \\
-                        -benchview_path \"\${WORKSPACE}/tests/scripts/Microsoft.BenchView.JSONFormat/tools\"""")
-                    }
-                }
-
-                // Save machinedata.json to /artifact/bin/ Jenkins dir
-                def archiveSettings = new ArchivalSettings()
-                archiveSettings.addFiles('throughput-*.csv')
-                archiveSettings.addFiles('machinedata.json')
-                archiveSettings.setAlwaysArchive()
-                Utilities.addArchival(newJob, archiveSettings)
-
-                Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-                // For perf, we need to keep the run results longer
-                newJob.with {
-                    // Enable the log rotator
-                    logRotator {
-                        artifactDaysToKeep(7)
-                        daysToKeep(300)
-                        artifactNumToKeep(25)
-                        numToKeep(1000)
-                    }
-                }
-            } // opt_level
-        } // os
-
-        def flowJobTPRunList = throughputOSOptLevelList.collect { os ->
-            "{ build(params + [PRODUCT_BUILD: b.build.number], '${getFullThroughputJobName(project, os, architecture, isPR)}') }"
-        }
-        def newFlowJob = buildFlowJob(Utilities.getFullJobName(project, "perf_throughput_linux_${architecture}_flow", isPR, '')) {
-            if (isPR) {
-                parameters {
-                    stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                }
-            }
-            buildFlow("""
-    // First, build the bits on RHEL7.2
-    b = build(params, '${fullBuildJobName}')
-
-    // Then, run the perf tests
-    parallel(
-        ${flowJobTPRunList.join(",\n    ")}
-    )
-    """)
-        }
-
-        Utilities.setMachineAffinity(newFlowJob, 'Windows_NT', 'latest-or-auto')
-        Utilities.standardJobSetup(newFlowJob, project, isPR, "*/${branch}")
-
-        if (isPR) {
-            TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-            builder.setGithubContext("Linux ${architecture} Throughput Perf Test Flow")
-            builder.triggerOnlyOnComment()
-            builder.setCustomTriggerPhrase("(?i).*test\\W+linux\\W+throughput\\W+flow.*")
-            builder.triggerForBranch(branch)
-            builder.emitTrigger(newFlowJob)
-        }
-        else {
-            // Set a push trigger
-            TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-            builder.emitTrigger(newFlowJob)
-        }
-    } // architecture
-} // isPR
-
-// Setup CoreCLR-Scenarios tests
-[true, false].each { isPR ->
-    ['Windows_NT'].each { os ->
-        ['x64', 'x86'].each { arch ->
-            ['ryujit'].each { jit ->
-                ['full_opt', 'min_opt', 'tiered'].each { opt_level ->
-                    def architecture = arch
-                    def newJob = job(Utilities.getFullJobName(project, "perf_scenarios_${os}_${arch}_${opt_level}_${jit}", isPR)) {
-
-                        def testEnv = ""
-                        def python = "C:\\Python35\\python.exe"
-
-                        // Set the label.
-                        label('windows_server_2016_clr_perf')
-                        wrappers {
-                            credentialsBinding {
-                                string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                            }
-                        }
-
-                        if (isPR) {
-                            parameters {
-                                stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                            }
-                        }
-
-                        parameters {
-                            stringParam('XUNIT_PERFORMANCE_MAX_ITERATION', '1', 'Size test, one iteration is sufficient')
-                            stringParam('XUNIT_PERFORMANCE_MAX_ITERATION_INNER_SPECIFIED', '1', 'Size test, one iteration is sufficient')
-                        }
-
-                        def configuration = 'Release'
-                        def runType = isPR ? 'private' : 'rolling'
-                        def benchViewName = isPR ? 'CoreCLR-Scenarios private %BenchviewCommitName%' : 'CoreCLR-Scenarios rolling %GIT_BRANCH_WITHOUT_ORIGIN% %GIT_COMMIT%'
-                        def uploadString = '-uploadToBenchview'
-
-                        steps {
-                            // Batch
-                            batchFile("powershell -NoProfile wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile \"%WORKSPACE%\\nuget.exe\"")
-                            batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\"")
-                            batchFile("\"%WORKSPACE%\\nuget.exe\" install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-
-                            //Do this here to remove the origin but at the front of the branch name as this is a problem for BenchView
-                            //we have to do it all as one statement because cmd is called each time and we lose the set environment variable
-                            batchFile("if \"%GIT_BRANCH:~0,7%\" == \"origin/\" (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH:origin/=%\") else (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH%\")\n" +
-                            "set \"BENCHVIEWNAME=${benchViewName}\"\n" +
-                            "set \"BENCHVIEWNAME=%BENCHVIEWNAME:\"=\"\"%\"\n" +
-                            "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\submission-metadata.py\" --name \"%BENCHVIEWNAME%\" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                            "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\build.py\" git --branch %GIT_BRANCH_WITHOUT_ORIGIN% --type ${runType}")
-                            batchFile("${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\machinedata.py\"")
-                            batchFile("set __TestIntermediateDir=int&&build.cmd ${configuration} ${architecture}")
-
-                            batchFile("tests\\runtest.cmd ${configuration} ${architecture} GenerateLayoutOnly")
-
-                            def runXUnitPerfCommonArgs = "-arch ${arch} -configuration ${configuration} -os ${os} -generateBenchviewData \"%WORKSPACE%\\Microsoft.Benchview.JSONFormat\\tools\" ${uploadString} -runtype ${runType} ${testEnv} -optLevel ${opt_level} -jitName ${jit} -outputdir \"%WORKSPACE%\\bin\\sandbox_logs\" -stabilityPrefix \"START \\\"CORECLR_PERF_RUN\\\" /B /WAIT /HIGH\" -scenarioTest"
-
-                            // Profile=Off
-                            batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\performance\\Scenario\\JitBench -group CoreCLR-Scenarios")
-
-                            // Profile=On
-                            if (opt_level != 'min_opt') {
-                                batchFile("${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\performance\\Scenario\\JitBench -group CoreCLR-Scenarios -collectionFlags BranchMispredictions+CacheMisses+InstructionRetired")
-                            }
-                        }
-                    }
-
-                    def archiveSettings = new ArchivalSettings()
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*_log.txt')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.csv')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.xml')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.log')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.md')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.etl')
-                    archiveSettings.addFiles('machinedata.json')
-                    archiveSettings.setAlwaysArchive()
-
-                    Utilities.addArchival(newJob, archiveSettings)
-                    Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-                    newJob.with {
-                        logRotator {
-                            artifactDaysToKeep(14)
-                            daysToKeep(30)
-                            artifactNumToKeep(100)
-                            numToKeep(200)
-                        }
-                        wrappers {
-                            timeout {
-                                absolute(240)
-                            }
-                        }
-                    }
-
-                    if (isPR) {
-                        def opts = ""
-                        if (opt_level == 'min_opt') {
-                            opts = '\\W+min_opts'
-                        }
-                        def jitt = ""
-                        if (jit != 'ryujit') {
-                            jitt = "\\W+${jit}"
-                        }
-
-                        TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-                        builder.setGithubContext("${os} ${arch} ${opt_level} ${jit} Performance Scenarios Tests")
-                        builder.triggerOnlyOnComment()
-                        builder.setCustomTriggerPhrase("(?i).*test\\W+${os}\\W+${arch}${opts}${jitt}\\W+perf\\W+scenarios.*")
-                        builder.triggerForBranch(branch)
-                        builder.emitTrigger(newJob)
-                    }
-                    else if (opt_level == 'full_opt') {
-                        // Set a push trigger
-                        TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-                        builder.emitTrigger(newJob)
-                    }
-                    else {
-                        // Set periodic trigger
-                        Utilities.addPeriodicTrigger(newJob, '@daily')
-                    }
-                }
-            }
-        }
-    }
-}
-
-// Setup size-on-disk test
-['Windows_NT'].each { os ->
-    ['x64', 'x86'].each { arch ->
-        def architecture = arch
-        def newJob = job(Utilities.getFullJobName(project, "sizeondisk_${arch}", false)) {
-            label('Windows.10.Amd64.ClientRS4.DevEx.15.8.Open')
-
-            wrappers {
-                credentialsBinding {
-                    string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                }
-            }
-
-            def channel = 'master'
-            def configuration = 'Release'
-            def runType = 'rolling'
-            def benchViewName = 'Dotnet Size on Disk %DATE% %TIME%'
-            def testBin = "%WORKSPACE%\\bin\\tests\\${os}.${architecture}.${configuration}"
-            def coreRoot = "${testBin}\\Tests\\Core_Root"
-            def benchViewTools = "%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools"
-            def python = "C:\\python3.7.0\\python.exe"
-
-            steps {
-                // Install nuget and get BenchView tools
-                batchFile("powershell -NoProfile wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile \"%WORKSPACE%\\nuget.exe\"")
-                batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\"")
-                batchFile("\"%WORKSPACE%\\nuget.exe\" install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-
-                // Generate submission metadata for BenchView
-                // Do this here to remove the origin but at the front of the branch name as this is a problem for BenchView
-                // we have to do it all as one statement because cmd is called each time and we lose the set environment variable
-                batchFile("if \"%GIT_BRANCH:~0,7%\" == \"origin/\" (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH:origin/=%\") else (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH%\")\n" +
-                "set \"BENCHVIEWNAME=${benchViewName}\"\n" +
-                "set \"BENCHVIEWNAME=%BENCHVIEWNAME:\"=\"\"%\"\n" +
-                "${python} \"${benchViewTools}\\submission-metadata.py\" --name \"%BENCHVIEWNAME%\" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                "${python} \"${benchViewTools}\\build.py\" git --branch %GIT_BRANCH_WITHOUT_ORIGIN% --type ${runType}")
-
-                // Generate machine data from BenchView
-                batchFile("${python} \"${benchViewTools}\\machinedata.py\"")
-
-                // Build CoreCLR and gnerate test layout
-                batchFile("set __TestIntermediateDir=int&&build.cmd ${configuration} ${architecture}")
-                batchFile("tests\\runtest.cmd ${configuration} ${architecture} GenerateLayoutOnly")
-
-                // Run the size on disk benchmark
-                batchFile("\"${coreRoot}\\CoreRun.exe\" \"${testBin}\\sizeondisk\\sodbench\\SoDBench\\SoDBench.exe\" -o \"%WORKSPACE%\\sodbench.csv\" --architecture ${arch} --channel ${channel}")
-
-                // From sodbench.csv, create measurment.json, then submission.json
-                batchFile("${python} \"${benchViewTools}\\measurement.py\" csv \"%WORKSPACE%\\sodbench.csv\" --metric \"Size on Disk\" --unit \"bytes\" --better \"desc\"")
-                batchFile("${python} \"${benchViewTools}\\submission.py\" measurement.json --build build.json --machine-data machinedata.json --metadata submission-metadata.json --group \"Dotnet Size on Disk\" --type ${runType} --config-name ${configuration} --architecture ${arch} --machinepool VM --config Channel ${channel}")
-
-                // If this is a PR, upload submission.json
-                batchFile("${python} \"${benchViewTools}\\upload.py\" submission.json --container coreclr")
-            }
-        }
-
-        def archiveSettings = new ArchivalSettings()
-        archiveSettings.addFiles('bin/toArchive/**')
-        archiveSettings.addFiles('machinedata.json')
-        archiveSettings.setAlwaysArchive()
-
-        Utilities.addArchival(newJob, archiveSettings)
-        Utilities.standardJobSetup(newJob, project, false, "*/${branch}")
-
-        // Set the cron job here.  We run nightly on each flavor, regardless of code changes
-        Utilities.addPeriodicTrigger(newJob, "@daily", true /*always run*/)
-
-        newJob.with {
-            logRotator {
-                artifactDaysToKeep(14)
-                daysToKeep(30)
-                artifactNumToKeep(100)
-                numToKeep(200)
-            }
-            wrappers {
-                timeout {
-                    absolute(240)
-                }
-            }
-        }
-    }
-}
-
-// Setup IlLink tests
-[true, false].each { isPR ->
-    ['Windows_NT'].each { os ->
-        ['x64'].each { arch ->
-            ['ryujit'].each { jit ->
-                ['full_opt'].each { opt_level ->
-                    def architecture = arch
-                    def newJob = job(Utilities.getFullJobName(project, "perf_illink_${os}_${arch}_${opt_level}_${jit}", isPR)) {
-                        label('Windows.10.Amd64.ClientRS4.DevEx.15.8.Open')
-
-                        def testEnv = ""
-                        def python = "C:\\python3.7.0\\python.exe"
-                        wrappers {
-                            credentialsBinding {
-                                string('BV_UPLOAD_SAS_TOKEN', 'CoreCLR Perf BenchView Sas')
-                            }
-                        }
-
-                        if (isPR) {
-                            parameters {
-                                stringParam('BenchviewCommitName', '\${ghprbPullTitle}', 'The name that you will be used to build the full title of a run in Benchview.  The final name will be of the form <branch> private BenchviewCommitName')
-                            }
-                        }
-
-                        parameters {
-                            stringParam('XUNIT_PERFORMANCE_MAX_ITERATION', '1', 'Size test, one iteration is sufficient')
-                            stringParam('XUNIT_PERFORMANCE_MAX_ITERATION_INNER_SPECIFIED', '1', 'Size test, one iteration is sufficient')
-                        }
-
-                        def configuration = 'Release'
-                        def runType = isPR ? 'private' : 'rolling'
-                        def benchViewName = isPR ? 'CoreCLR-Scenarios private %BenchviewCommitName%' : 'CoreCLR-Scenarios rolling %GIT_BRANCH_WITHOUT_ORIGIN% %GIT_COMMIT%'
-                        def uploadString = '-uploadToBenchview'
-
-                        steps {
-                            // Batch
-                            batchFile("powershell -NoProfile wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile \"%WORKSPACE%\\nuget.exe\"")
-                            batchFile("if exist \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\" rmdir /s /q \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\"")
-                            batchFile("\"%WORKSPACE%\\nuget.exe\" install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory \"%WORKSPACE%\" -Prerelease -ExcludeVersion")
-
-                            //Do this here to remove the origin but at the front of the branch name as this is a problem for BenchView
-                            //we have to do it all as one statement because cmd is called each time and we lose the set environment variable
-                            batchFile("if \"%GIT_BRANCH:~0,7%\" == \"origin/\" (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH:origin/=%\") else (set \"GIT_BRANCH_WITHOUT_ORIGIN=%GIT_BRANCH%\")\n" +
-                            "set \"BENCHVIEWNAME=${benchViewName}\"\n" +
-                            "set \"BENCHVIEWNAME=%BENCHVIEWNAME:\"=\"\"%\"\n" +
-                            "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\submission-metadata.py\" --name \"%BENCHVIEWNAME%\" --user-email \"dotnet-bot@microsoft.com\"\n" +
-                            "${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\build.py\" git --branch %GIT_BRANCH_WITHOUT_ORIGIN% --type ${runType}")
-                            batchFile("${python} \"%WORKSPACE%\\Microsoft.BenchView.JSONFormat\\tools\\machinedata.py\"")
-                            batchFile("set __TestIntermediateDir=int&&build.cmd ${configuration} ${architecture}")
-
-                            batchFile("tests\\runtest.cmd ${configuration} ${architecture} GenerateLayoutOnly")
-
-                            def runXUnitPerfCommonArgs = "-arch ${arch} -configuration ${configuration} -os ${os} -generateBenchviewData \"%WORKSPACE%\\Microsoft.Benchview.JSONFormat\\tools\" ${uploadString} -runtype ${runType} ${testEnv} -optLevel ${opt_level} -jitName ${jit} -outputdir \"%WORKSPACE%\\bin\\sandbox_logs\" -scenarioTest"
-
-                            // Scenario: ILLink
-                            batchFile("\"%VS140COMNTOOLS%\\..\\..\\VC\\vcvarsall.bat\" x86_amd64 && " +
-                            "${python} tests\\scripts\\run-xunit-perf.py ${runXUnitPerfCommonArgs} -testBinLoc bin\\tests\\${os}.${architecture}.${configuration}\\performance\\linkbench\\linkbench -group ILLink -nowarmup")
-                        }
-                    }
-
-                    def archiveSettings = new ArchivalSettings()
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*_log.txt')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.csv')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.xml')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.log')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.md')
-                    archiveSettings.addFiles('bin/sandbox_logs/**/*.etl')
-                    archiveSettings.addFiles('machinedata.json')
-                    archiveSettings.setAlwaysArchive()
-
-                    // Set the label (currently we are only measuring size, therefore we are running on VM).
-                    Utilities.addArchival(newJob, archiveSettings)
-                    Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
-
-                    newJob.with {
-                        logRotator {
-                            artifactDaysToKeep(14)
-                            daysToKeep(30)
-                            artifactNumToKeep(100)
-                            numToKeep(200)
-                        }
-                        wrappers {
-                            timeout {
-                                absolute(240)
-                            }
-                        }
-                    }
-
-                    if (isPR) {
-                        TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
-                        builder.setGithubContext("${os} ${arch} ${opt_level} ${jit} IlLink Tests")
-                        builder.triggerOnlyOnComment()
-                        builder.setCustomTriggerPhrase("(?i).*test\\W+${os}\\W+${arch}\\W+illink.*")
-                        builder.triggerForBranch(branch)
-                        builder.emitTrigger(newJob)
-                    }
-                    else {
-                        // Set a push trigger
-                        TriggerBuilder builder = TriggerBuilder.triggerOnCommit()
-                        builder.emitTrigger(newJob)
-                    }
-                }
-            }
-        }
-    }
-}
-
-Utilities.createHelperJob(this, project, branch,
-    "Welcome to the ${project} Perf help",
-    "Have a nice day!")
diff --git a/src/coreclr/tests/CoreFX/CoreFX.issues.json b/src/coreclr/tests/CoreFX/CoreFX.issues.json
deleted file mode 100644 (file)
index cee5f48..0000000
+++ /dev/null
@@ -1,1880 +0,0 @@
-[
-    {
-        "name": "System.Diagnostics.TraceSource.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Diagnostics.TraceSourceTests.DefaultTraceListenerClassTests.EntryAssemblyName_Null_NotIncludedInTrace",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Globalization.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Globalization.Tests.CharUnicodeInfoGetUnicodeCategoryTests.GetUnicodeCategory",
-                    "reason": "We updated the Unicode data and didn't pick yet the updated tests from corefx. we should remove this entry after updating the tests in coreclr."
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNegativeInfinitySymbol.NegativeInfinitySymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentDecimalDigits.PercentDecimalDigits_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyGroupSeparator.CurrencyGroupSeparator_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNumberNegativePattern.NumberNegativePattern_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPositiveInfinitySymbol.PositiveInfinitySymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.StringInfoString.String_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNumberDecimalSeparator.NumberDecimalSeparator_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNumberGroupSeparator.NumberGroupSeparator_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNaNSymbol.NaNSymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPositiveSign.PositiveSign_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyGroupSizes.CurrencyGroupSizes_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentSymbol.PercentSymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.StringInfoCtorTests.Ctor_String_Null_ThrowsArgumentNullException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencySymbol.CurrencySymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentDecimalSeparator.PercentDecimalSeparator_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.DateTimeFormatInfoGetAbbreviatedDayName.GetAbbreviatedDayName_Invalid_ThrowsArgumentOutOfRangeException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNumberDecimalDigits.NumberDecimalDigits_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNegativeSign.NegativeSign_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentGroupSizes.PercentGroupSizes_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoNumberGroupSizes.NumberGroupSizes_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentPositivePattern.PercentPositivePattern_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPerMilleSymbol.PerMilleSymbol_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentGroupSeparator.PercentGroupSeparator_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyNegativePattern.CurrencyNegativePattern_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyPositivePattern.CurrencyPositivePattern_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoPercentNegativePattern.PercentNegativePattern_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyDecimalDigits.CurrencyDecimalDigits_Set_Invalid",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Globalization.Tests.NumberFormatInfoCurrencyDecimalSeparator.CurrencyDecimalSeparator_Set_Invalid",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Globalization.Calendars.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Globalization.Tests.GregorianCalendarCtor.CalendarType_Set_InvalidType_ThrowsArgumentOutOfRangeException",
-                    "reason": "Fixed param name in .NET Core."
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Data.SqlClient.ManualTesting.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Data.SqlClient.Stress.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Data.SqlClient.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.ComponentModel.Composition.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Runtime.Serialization.Formatters.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Runtime.Serialization.Formatters.Tests.BinaryFormatterTests.ValidateAgainstBlobs",
-                    "reason": "The stored blob for type System.CodeDom.MemberAttributes is outdated and needs to be updated."
-                },
-                {
-                    "name": "System.Runtime.Serialization.Formatters.Tests.BinaryFormatterTests.ValidateEqualityComparersAgainstBlobs",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.Serialization.Formatters.Tests.BinaryFormatterTests.ValidateBasicObjectsRoundtrip",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.Serialization.Formatters.Tests.BinaryFormatterTests.RoundtripManyObjectsInOneStream",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Collections.Immutable.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Reflection.Metadata.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Text.Encodings.Web.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.IO.Pipelines.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Data.Common.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Diagnostics.StackTrace.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Diagnostics.Tests.StackTraceTests.ToString_NullFrame_ThrowsNullReferenceException",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Diagnostics.Tracing.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "BasicEventSourceTests.TestsUserErrors.Test_BadEventSource_MismatchedIds",
-                    "reason": "Assert.Equal() Failure Expected: 1 Actual: 2"
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWrite.Test_Write_T_EventListener",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWrite.Test_Write_T_EventListener_UseEvents",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsUserErrors.Test_BadEventSource_MismatchedIds_WithEtwListener",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.FuzzyTests.Test_Write_Fuzzy",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_WriteEvent_InvalidCalls",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_WriteEvent_ZeroKwds",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_EventSourceCreatedEvents_BeforeListener",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_WriteEvent_ToChannel_Coverage",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_WriteEvent_ArgsCornerCases",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_EventSourceCreatedEvents_AfterListener",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsWriteEventToListener.Test_WriteEvent_ArgsBasicTypes",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsEventSourceLifetime.Test_EventSource_Lifetime",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsManifestNegative.Test_GenerateManifest_InvalidEventSources",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsTraits.Test_EventSource_Traits_Dynamic",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                },
-                {
-                    "name": "BasicEventSourceTests.TestsTraits.Test_EventSource_Traits_Contract",
-                    "reason": "Assert.Equal() Failure Expected: Actual:   System.Runtime "
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Diagnostics.DiagnosticSource.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Diagnostics.Tests.DiagnosticSourceEventSourceBridgeTests.TestShortcutKeywords",
-                    "reason": "Assert.Equal() Failure ↓ (pos 0) Expected: Activity1Start Actual:   Event ↑ (pos 0)"
-                },
-                {
-                    "name": "System.Diagnostics.Tests.ActivityTests.IdGenerationInternalParent",
-                    "reason": "Assert.Equal() Failure Expected: úúúda-4ecabd4ccb066678.child1-1. Actual:   úúúda-4ecabd4ccb066678.1."
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Net.HttpListener.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Net.Tests.HttpRequestStreamTests.Read_NullBuffer_ThrowsArgumentNullException",
-                    "reason": "Assert.Throws() Failure Expected: typeof(System.ArgumentNullException) Actual:   typeof(System.NullReferenceException): Object reference not set to an instance of an object."
-                },
-                {
-                    "name": "System.Net.Tests.HttpResponseStreamTests.Write_NullBuffer_ThrowsArgumentNullException",
-                    "reason": "Assert.Throws() Failure Expected: typeof(System.ArgumentNullException) Actual:   typeof(System.NullReferenceException): Object reference not set to an instance of an object."
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Net.Sockets.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Net.Sockets.Tests.KeepAliveTest.Socket_Set_KeepAlive_Interval_Failure",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Net.WebProxy.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name" : "System.Net.Tests.WebProxyTest.WebProxy_BypassOnLocal_SpecialCases",
-                    "reason" : "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.ComponentModel.TypeConverter.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Collections.NonGeneric.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Collections.Tests.HashtableBasicTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.HashtableValuesTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.Hashtable_SyncRootTests.SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.HashtableSynchronizedTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.DictionaryBaseTests.SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.HashtableKeysTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayList_SyncRootTests.GetSyncRoot ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListAdapterTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListBasicTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListFixedIListSizeTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListFixedSizeTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListRangeTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListReadOnlyIListTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListReadOnlyTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListSynchronizedILstTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ArrayListSynchronizedTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.CollectionBaseTests.SyncRoot ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.Queue_SyncRootTests.SyncRoot ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.ReadOnlyCollectionBaseTests.SyncRoot ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.Stack_SyncRootTests.GetSyncRootBasic ",
-                    "reason": "waiting on corefx test update"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Collections.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_Reset_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_MoveNext_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_MoveNext_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_Reset_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_Reset_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_SimpleInt_int_With_Comparer_WrapStructural_SimpleInt.IEnumerable_Generic_Enumerator_MoveNext_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_MoveNext_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_Reset_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_Reset_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_MoveNext_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_Reset_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.IEnumerable_NonGeneric_Enumerator_MoveNext_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_Reset_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_Reset_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_MoveNext_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_MoveNext_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_Reset_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_string_string.IEnumerable_Generic_Enumerator_MoveNext_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_Reset_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_MoveNext_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_MoveNext_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_Reset_ModifiedBeforeEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_Reset_ModifiedAfterEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_int_int.IEnumerable_Generic_Enumerator_MoveNext_ModifiedDuringEnumeration_ThrowsInvalidOperationException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_IDictionary_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_Keys_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.Dictionary_Generic_Tests_Values_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Tests.LinkedList_ICollection_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.Queue_ICollection_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedDictionary_Generic_Tests_Keys_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedDictionary_Generic_Tests_Values_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedDictionary_IDictionary_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedList_Generic_Tests_Keys_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedList_Generic_Tests_Values_AsICollection.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedList_IDictionary_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.SortedSet_ICollection_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Tests.Stack_ICollection_NonGeneric_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Collections.Specialized.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Collections.Specialized.Tests.StringDictionarySyncRootTests.SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.HybridDictionaryValuesTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.HybridDictionaryKeysTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.ListDictionary_CustomComparer_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.ListDictionary_NoComparer_Tests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.ListDictionaryKeysTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.ListDictionaryValuesTests.ICollection_NonGeneric_SyncRoot",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.NameObjectCollectionBaseSyncRootTests.SyncRoot ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.OrderedDictionaryTests.KeysPropertyContainsAllKeys ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.OrderedDictionaryTests.SyncRootTests ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.OrderedDictionaryTests.ValuesPropertyContainsAllValues ",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Collections.Specialized.Tests.StringCollectionTests.SyncRootTest",
-                    "reason": "waiting on corefx test update"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Net.Http.Functional.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Net.Http.Functional.Tests.PlatformHandler_DiagnosticsTest.SendAsync_ExpectedDiagnosticSourceActivityLogging",
-                    "reason": "System.Diagnostics.RemoteExecutorTestBase+RemoteInvokeHandle+RemoteExecutionException System.Diagnostics.RemoteExecutorTestBase+RemoteInvokeHandle+RemoteExecutionException : Remote process failed with an unhandled exception."
-                },
-                {
-                    "name": "System.Net.Http.Functional.Tests.SocketsHttpHandler_DiagnosticsTest.SendAsync_ExpectedDiagnosticSourceActivityLogging",
-                    "reason": "System.Diagnostics.RemoteExecutorTestBase+RemoteInvokeHandle+RemoteExecutionException System.Diagnostics.RemoteExecutorTestBase+RemoteInvokeHandle+RemoteExecutionException : Remote process failed with an unhandled exception."
-                },
-                {
-                    "name": "System.Net.Http.Functional.Tests.SocketsHttpHandler_HttpClientHandlerTest.GetAsync_AllowAutoRedirectTrue_RetainsOriginalFragmentIfAppropriate",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Net.Http.Functional.Tests.SocketsHttpHandler_HttpClientHandler_Http2_Test.Http2_InitialSettings_SentAndAcked",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.IO.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.IO.Tests.CloseTests.AfterDisposeThrows",
-                    "reason": "Readers/writers changed to not null out base stream on dispose"
-                },
-                {
-                    "name": "System.IO.Tests.CloseTests.AfterCloseThrows",
-                    "reason": "Readers/writers changed to not null out base stream on dispose"
-                },
-                {
-                    "name": "System.IO.Tests.StreamWriterWithBufferedStream_CloseTests.AfterDisposeThrows",
-                    "reason": "Readers/writers changed to not null out base stream on dispose"
-                },
-                {
-                    "name": "System.IO.Tests.StreamWriterWithBufferedStream_CloseTests.AfterCloseThrows",
-                    "reason": "Readers/writers changed to not null out base stream on dispose"
-                },
-                {
-                    "name": "System.IO.Tests.CtorTests.NullEncodingThrows",
-                    "reason": "StreamReader/StreamWriter changed to accept null encoding"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.IO.FileSystem.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.IO.Tests.DirectoryInfo_GetSetTimes.SettingUpdatesProperties",
-                    "reason": "Assert.All() Failure: 6 out of 6 items in the collection did not pass."
-                },
-                {
-                    "name": "System.IO.Tests.Directory_GetSetTimes.SettingUpdatesProperties",
-                    "reason": "Assert.All() Failure: 6 out of 6 items in the collection did not pass."
-                },
-                {
-                    "name": "System.IO.Tests.File_GetSetTimes.SettingUpdatesProperties",
-                    "reason": "Assert.All() Failure: 6 out of 6 items in the collection did not pass."
-                },
-                {
-                    "name": "System.IO.Tests.FileInfo_GetSetTimes.SettingUpdatesProperties",
-                    "reason": "Assert.All() Failure: 6 out of 6 items in the collection did not pass."
-                },
-                {
-                    "name": "System.IO.Tests.EncryptDecrypt.EncryptDecrypt_NotSupported",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.IO.Tests.EncryptDecrypt.NullArg_ThrowsException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.IO.Tests.File_Delete.Unix_NonExistentPath_Nop",
-                    "reason": "outdated (deleted from corefx)"
-                },
-                {
-                    "name": "System.IO.Tests.FileInfo_Delete.Unix_NonExistentPath_Nop",
-                    "reason": "outdated (deleted from corefx)"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.IO.Pipelines.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.IO.Pipelines.Tests.FlushAsyncCancellationTests.ReadAsyncCompletesIfFlushAsyncCanceledMidFlush",
-                    "reason": "Unstable"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Drawing.Common.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.InterpolationMode_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-2) is invalid for Enum type 'InterpolationMode'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.CompositingQuality_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-2) is invalid for Enum type 'CompositingQuality'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.PixelOffsetMode_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-2) is invalid for Enum type 'PixelOffsetMode'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.PageUnit_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-1) is invalid for Enum type 'GraphicsUnit'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.SmoothingMode_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-2) is invalid for Enum type 'SmoothingMode'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.CompositingMode_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-1) is invalid for Enum type 'CompositingMode'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.GraphicsTests.TextRenderingHint_SetInvalid_ThrowsInvalidEnumArgumentException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\nExpected: typeof(System.ComponentModel.InvalidEnumArgumentException)\\nActual:   typeof(System.ComponentModel.InvalidEnumArgumentException): The value of argument 'value' (-1) is invalid for Enum type 'TextRenderingHint'.\\nParameter name: value"
-                },
-                {
-                    "name": "System.Drawing.Tests.Graphics_DrawBezierTests.DrawBezier_PointFs",
-                    "reason": "Xunit.Sdk.EqualException Assert.Equal() Failure\\r\\nExpected: Byte[] [208, 0, 8, 33, 6, ...]\\r\\nActual:   Byte[] [153, 27, 131, 228, 197, ...]"
-                },
-                {
-                    "name": "System.Drawing.Tests.Graphics_DrawLineTests.DrawLines_PointFs",
-                    "reason": "Xunit.Sdk.EqualException Assert.Equal() Failure\\r\\nExpected: Byte[] [142, 194, 251, 180, 222, ...]\\r\\nActual:   Byte[] [212, 29, 140, 217, 143, ...]"
-                },
-                {
-                    "name": "System.Drawing.Tests.FontTests.ToLogFont_NullLogFont_ThrowsArgumentNullException",
-                    "reason": "Xunit.Sdk.ThrowsException Assert.Throws() Failure\\r\\nExpected: typeof(System.ArgumentNullException)\\r\\nActual:   typeof(System.AccessViolationException): Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
-                },
-                {
-                    "name": "System.Drawing.Tests.Graphics_DrawBezierTests.DrawBezier_Point",
-                    "reason": "https://github.com/dotnet/corefx/issues/30180"
-                },
-                {
-                    "name": "System.Drawing.Tests.Graphics_DrawBezierTests.DrawBezier_Point",
-                    "reason": "https://github.com/dotnet/corefx/issues/30180"
-                },
-                {
-                    "name": "System.Drawing.Tests.IconTests.ExtractAssociatedIcon_InvalidFilePath_ThrowsArgumentException",
-                    "reason": "https://github.com/dotnet/corefx/issues/34122"
-                },
-                {
-                    "name": "System.Drawing.Tests.FontTests.ToLogFont_DisposedGraphics_ThrowsArgumentException",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Text.Encoding.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Text.Tests.EncoderConvert2.EncoderASCIIConvertMixedASCIIUnicodeCharArrayPartial",
-                    "reason": "https://github.com/dotnet/coreclr/issues/23864"
-                },
-                {
-                    "name": "System.Text.Tests.EncoderConvert2.EncoderUTF8ConvertMixedASCIIUnicodeCharArrayPartial",
-                    "reason": "https://github.com/dotnet/coreclr/issues/23864"
-                },
-                {
-                    "name": "System.Text.Tests.EncoderConvert2.EncoderUTF8ConvertUnicodeCharArrayPartial",
-                    "reason": "https://github.com/dotnet/coreclr/issues/23864"
-                },
-                {
-                    "name": "System.Text.Tests.NegativeEncodingTests.GetByteCount_Invalid",
-                    "reason": "https://github.com/dotnet/coreclr/issues/23864"
-                },
-                {
-                    "name": "System.Text.Tests.UTF8EncodingDecode.Decode_InvalidBytes",
-                    "reason": "https://github.com/dotnet/coreclr/issues/23864"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Text.RegularExpressions.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Text.RegularExpressions.Tests.RegexMatchTests.Match_ExcessPrefix",
-                    "reason": "https://github.com/dotnet/coreclr/issues/18912"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Threading.Thread.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Threading.Threads.Tests.ThreadTests.ApartmentState_NoAttributePresent_STA_Windows_Core",
-                    "reason": "https://github.com/dotnet/coreclr/issues/19478"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Threading.ThreadPool.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Threading.ThreadPools.Tests.ThreadPoolTests.SetMinMaxThreadsTest",
-                    "reason": "https://github.com/dotnet/corefx/issues/36885"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Memory.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Buffers.Text.Tests.FormatterTests.TestFormatterDecimal",
-                    "reason": "https://github.com/dotnet/coreclr/pull/19775"
-                },
-                {
-                    "name": "System.SpanTests.MemoryMarshalTests.CreateFromPinnedArrayIntSliceRemainsPinned",
-                    "reason": "https://github.com/dotnet/corefx/pull/32994"
-                },
-                {
-                    "name": "System.SpanTests.MemoryMarshalTests.CreateFromPinnedArrayIntReadOnlyMemorySliceRemainsPinned",
-                    "reason": "https://github.com/dotnet/corefx/pull/32994"
-                },
-                {
-                    "name": "System.Buffers.Text.Tests.ParserTests.TestParserSingle",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.Buffers.Text.Tests.ParserTests.TestParserDouble",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.Buffers.Text.Tests.FormatterTests.TestGFormatWithPrecisionNotSupported",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22434"
-                },
-                {
-                    "name": "System.Buffers.Text.Tests.FormatterTests.TestBadFormat",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22434"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Tests.TimeSpanTests.FromMilliseconds",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.FromMilliseconds_Invalid",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.NamedMultiplication",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Multiplication",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Division",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.NamedDivision",
-                    "reason": "The test will be enabled after https://github.com/dotnet/corefx/pull/37235"
-                },
-                {
-                    "name": "System.Text.Tests.StringBuilderTests.Equals",
-                    "reason": "Because of a change in StringBuilder, this test is outdated."
-                },
-                {
-                    "name": "System.Tests.DecimalTests.Remainder",
-                    "reason": "https://github.com/dotnet/coreclr/issues/12605"
-                },
-                {
-                    "name": "System.Tests.DecimalTests.Remainder_Invalid",
-                    "reason": "https://github.com/dotnet/coreclr/issues/12605"
-                },
-                {
-                    "name": "System.Tests.DecimalTests+BigIntegerMod.Test",
-                    "reason": "https://github.com/dotnet/coreclr/issues/12605"
-                },
-                {
-                    "name": "System.Tests.DecimalTests.Round_InvalidMidpointRounding_ThrowsArgumentException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Tests.ArrayTests.Copy",
-                    "reason": "Needs updates for XUnit 2.4"
-                },
-                {
-                    "name": "System.Tests.ArraySegment_Tests.CopyTo_Invalid",
-                    "reason": "Needs parameter name updated to 'destination'."
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Parse_Invalid",
-                    "reason": "Temporary disabling till merging the PR https://github.com/dotnet/corefx/pull/34561"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Parse_Span",
-                    "reason": "Temporary disabling till merging the PR https://github.com/dotnet/corefx/pull/34561"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Parse_Span_Invalid",
-                    "reason": "Temporary disabling till merging the PR https://github.com/dotnet/corefx/pull/34561"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Parse",
-                    "reason": "Temporary disabling till merging the PR https://github.com/dotnet/corefx/pull/34561"
-                },
-                {
-                    "name": "System.Tests.SingleTests.Test_ToString",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "System.Tests.SingleTests.TryFormat",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "System.Tests.DoubleTests.Test_ToString",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "System.Tests.DoubleTests.TryFormat",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "System.Tests.TimeSpanTests.Total_Days_Hours_Minutes_Seconds_Milliseconds",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "System.Tests.BufferTests.BlockCopy_Invalid",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23636"
-                },
-                {
-                    "name": "System.Tests.VersionTests.Comparisons_NullArgument_ThrowsArgumentNullException",
-                    "reason":  "Version was improved to no longer throw from comparison operators"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Extensions.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Tests.ConvertToStringTests.FromBoxedObject",
-                    "reason": "https://github.com/dotnet/coreclr/pull/19775"
-                },
-                {
-                    "name": "System.Tests.ConvertToDoubleTests.FromString",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.Tests.ConvertToSingleTests.FromString",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.Tests.MathTests.Max_Double",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.MathTests.Max_Single",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.MathTests.Min_Double",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.MathTests.Min_Single",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.MathFTests.Max",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.MathFTests.Min",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20912"
-                },
-                {
-                    "name": "System.Tests.EnvironmentTests.Version_MatchesFixedVersion",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Tests.AppDomainTests.ApplyPolicy",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Tests.AppDomainTests.GetAssemblies",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.InteropServices.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Runtime.InteropServices.HandleCollectorTests.Ctor_InitialThresholdGreaterThanMaximumThreshold_ThrowsArgumentException ",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.GCHandleTests.Alloc_InvalidPinnedObject_ThrowsArgumentException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.GetHINSTANCETests.GetHINSTANCE_NonRuntimeModule_ThrowsArgumentNullException",
-                    "reason": "https://github.com/dotnet/coreclr/pull/30925"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.SafeBufferTests.Initialize_NumBytesTimesSizeOfEachElement_ThrowsOverflowException",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20132"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.GetFunctionPointerForDelegateTests.GetFunctionPointerForDelegate_DelegateCollectible_ThrowsNotSupportedException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.GetComInterfaceForObjectTests.GetComInterfaceForObject_ObjectNotCollectible_ThrowsNotSupportedException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.ChangeWrapperHandleStrengthTests.ChangeWrapperHandleStrength_ObjectNotCollectible_ThrowsNotSupportedException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.CreateAggregatedObjectTests.CreateAggregatedObject_ObjectNotCollectible_ReturnsExpected",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.GetNativeVariantForObjectTests.GetNativeVariantForObject_ObjectNotCollectible_ThrowsNotSupportedException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.InteropServices.Tests.GetIUnknownForObjectTests.GetIUnknownForObject_ObjectNotCollectible_ThrowsNotSupportedException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.DispatchWrapperTests.Ctor_NullUnix_ThrowsPlatformNotSupportedException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.ArrayWithOffsetTests.Ctor_Array_Offset",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.StringToCoTaskMemAutoTests.StringToCoTaskMemAuto_NonNullString_Roundtrips",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.StringToHGlobalAutoTests.StringToHGlobalAuto_NonNullString_Roundtrips",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23664"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.PtrToStringUTF8.PtrToStringUTF8_NegativeLength_ThrowsArgumentOutOfRangeExeption",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23731"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.PtrToStringUTF8.PtrToStringUTF8_ZeroPointer_ReturnsNull",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23731"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.PtrToStringUTF8.PtrToStringUTF8_Win32AtomPointer_ReturnsNull",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23731"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.PtrToStringAnsiTests.PtrToStringAnsi_NegativeLength_ThrowsArgumentExeption",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23731"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.PtrToStringUniTests.PtrToStringUni_NegativeLength_ThrowsArgumentExeption",
-                    "reason": "https://github.com/dotnet/coreclr/pull/23731"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.ThrowExceptionForHRTests.ThrowExceptionForHR_NoErrorInfo_ReturnsValidException",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.Runtime.InteropServices.Tests.ThrowExceptionForHRTests.ThrowExceptionForHR_ErrorInfo_ReturnsValidException",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Loader.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name" : "System.Runtime.Loader.Tests.AssemblyLoadContextTest.Unsupported_DelegateMarshalling",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Runtime.Loader.Tests.AssemblyLoadContextTest.Unsupported_ThreadStaticAndFixedAddressValueType",
-                    "reason" : "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Security.Cryptography.Pkcs.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    },
-    {
-        "name": "Microsoft.VisualBasic.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToChar_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToSingle_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToBoolean_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToSByte_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToDouble_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToDecimal_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToByte_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToLong_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToUShort_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToUInteger_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToInteger_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToShort_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToULong_InvalidObject_ThrowsInvalidCastException",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToSingle_String_ReturnsExpected",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToDouble_String_ReturnsExpected",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToSingle_Object_ReturnsExpected",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name" : "Microsoft.VisualBasic.Tests.ConversionsTests.ToDouble_Object_ReturnsExpected",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Numerics.Vectors.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name" : "System.Numerics.Tests.Matrix4x4Tests.Matrix4x4LerpTest",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20994"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Matrix4x4Tests.Matrix4x4MultiplyTest5",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20994"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Matrix4x4Tests.Matrix4x4MultiplyTest6",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20994"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Matrix4x4Tests.Matrix4x4NegateTest",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20994"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Matrix4x4Tests.Matrix4x4UnaryNegationTest",
-                    "reason" : "https://github.com/dotnet/coreclr/pull/20994"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Vector2Tests.Vector2ClampTest",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Vector3Tests.Vector3ClampTest",
-                    "reason" : "outdated"
-                },
-                {
-                    "name" : "System.Numerics.Tests.Vector4Tests.Vector4ClampTest",
-                    "reason" : "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Diagnostics.Debug.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": [
-                {
-                    "name" : "System.Diagnostics.Tests.DebugTests",
-                    "reason" : "refactoring Debug"
-                }
-            ],
-            "methods": null
-        }
-    },
-    {
-        "name": "System.Xml.Linq.SDMSample.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "XDocumentTests.SDMSample.SDM_Attribute.AttributeExplicitToDouble",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "XDocumentTests.SDMSample.SDM_Attribute.AttributeExplicitToFloat",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "XDocumentTests.SDMSample.SDM_Element.ElementExplicitToFloat",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "XDocumentTests.SDMSample.SDM_Element.ElementExplicitToDouble",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Json.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Json.Tests.JsonValueTests.Parse_DoubleTooLarge_ThrowsOverflowException",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.Json.Tests.JsonPrimitiveTests.ToString_DateTimeOffset",
-                    "reason": "waiting on corefx test update"
-                },
-                {
-                    "name": "System.Json.Tests.JsonValueTests.Parse_IntegralBoundaries_LessThanMaxDouble_Works",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Xml.RW.XmlWriterApi.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Xml.Tests.TCFullEndElement+TCWriteValue.writeValue_27",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.ComponentModel.Annotations.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.ComponentModel.DataAnnotations.Tests.RangeAttributeTests.Validate_DoubleConversionOverflows_ThrowsOverflowException",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20707"
-                },
-                {
-                    "name": "System.ComponentModel.DataAnnotations.Tests.AssociationAttributeTests.Constructor",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22595"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Linq.Expressions.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Linq.Expressions.Tests.BindTests.StaticReadonlyField",
-                    "reason": "https://github.com/dotnet/coreclr/pull/20886 and https://github.com/dotnet/corefx/pull/33413"
-                },
-                {
-                    "name": "System.Linq.Expressions.Tests.StackSpillerTests.Spill_Optimizations_LiteralField",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Xml.XmlSerializer.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "XmlSerializerTests.Xml_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Xml.XmlSerializer.ReflectionOnly.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "XmlSerializerTests.Xml_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Serialization.Xml.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "DataContractSerializerTests.DCS_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "DataContractSerializerTests.DCS_BasicPerSerializerRoundTripAndCompare_EnumStruct",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "DataContractSerializerTests.DCS_BasicRoundTripResolvePrimitiveTypes",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Serialization.Xml.ReflectionOnly.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "DataContractSerializerTests.DCS_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "DataContractSerializerTests.DCS_BasicPerSerializerRoundTripAndCompare_EnumStruct",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-                {
-                    "name": "DataContractSerializerTests.DCS_BasicRoundTripResolvePrimitiveTypes",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Serialization.Json.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "DataContractJsonSerializerTests.DCJS_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.Serialization.Json.ReflectionOnly.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "DataContractJsonSerializerTests.DCJS_FloatAsRoot",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22040"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.ObjectModel.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTest.StringComparer",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.AddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.ChangeItemDoesNotExistThrows",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.ChangeItemKeyKeyAlreadyChanged",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.ChangeItemKeyKeyAlreadyChangedNewKeyIsDifferent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.ChangeItemKeyKeyAlreadyChangedNewKeyIsOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.ChangeItemKeyThrowsPreexistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.Insert",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntInt.NonGenericAddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.AddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.ChangeItemDoesNotExistThrows",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.ChangeItemKeyKeyAlreadyChanged",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.ChangeItemKeyKeyAlreadyChangedNewKeyIsDifferent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.ChangeItemKeyKeyAlreadyChangedNewKeyIsOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.ChangeItemKeyThrowsPreexistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.Insert",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsIntString.NonGenericAddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.AddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemDoesNotExistThrows",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyKeyAlreadyChanged",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyKeyAlreadyChangedNewKeyIsDifferent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyKeyAlreadyChangedNewKeyIsOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyNullItemNotPresent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyNullToNewKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyNullToOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyNullToOtherKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.ChangeItemKeyThrowsPreexistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.Insert",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringInt.NonGenericAddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.AddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemDoesNotExistThrows",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyKeyAlreadyChanged",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyKeyAlreadyChangedNewKeyIsDifferent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyKeyAlreadyChangedNewKeyIsOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyNullItemNotPresent",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyNullToNewKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyNullToOldKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyNullToOtherKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.ChangeItemKeyThrowsPreexistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.Insert",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-                {
-                    "name": "System.Collections.ObjectModel.Tests.KeyedCollectionTestsStringString.NonGenericAddExistingKey",
-                    "reason": "https://github.com/dotnet/coreclr/pull/22455"
-                },
-            ]
-        }
-    },
-    {
-        "name": "System.Net.Ping.Functional.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Net.NetworkInformation.Tests.PingTest.SendPingAsyncWithIPAddress",
-                    "reason": "https://github.com/dotnet/corefx/issues/35351"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.CodeDom.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.CodeDom.Compiler.Tests.CSharpCodeGenerationTests.ProviderSupports",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.CodeDom.Compiler.Tests.CSharpCodeGenerationTests.MetadataAttributes",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.CodeDom.Compiler.Tests.CSharpCodeGenerationTests.RegionsSnippetsAndLinePragmas",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.CodeDom.Compiler.Tests.VBCodeGenerationTests.RegionsSnippetsAndLinePragmas",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.CodeDom.Compiler.Tests.VBCodeGenerationTests.MetadataAttributes",
-                    "reason": "outdated"
-                },
-                {
-                    "name": "System.CodeDom.Compiler.Tests.VBCodeGenerationTests.ProviderSupports",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.Runtime.InteropServices.RuntimeInformation.Tests",
-        "enabled": true,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": [
-                {
-                    "name": "System.Runtime.InteropServices.RuntimeInformationTests.DescriptionNameTests.VerifyRuntimeDebugNameOnNetCoreApp",
-                    "reason": "outdated"
-                }
-            ]
-        }
-    },
-    {
-        "name": "System.IO.Compression.Brotli.Tests",
-        "enabled": false,
-        "exclusions": {
-            "namespaces": null,
-            "classes": null,
-            "methods": null
-        }
-    }
-]
diff --git a/src/coreclr/tests/CoreFX/CoreFXTestListURL.txt b/src/coreclr/tests/CoreFX/CoreFXTestListURL.txt
deleted file mode 100644 (file)
index 926cf3c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-https://cloudcijobs.blob.core.windows.net/coreclrci/CoreFXArchives/TestList.json
\ No newline at end of file
diff --git a/src/coreclr/tests/CoreFX/CoreFXTestListURL_Linux.txt b/src/coreclr/tests/CoreFX/CoreFXTestListURL_Linux.txt
deleted file mode 100644 (file)
index 29b8c26..0000000
+++ /dev/null
@@ -1 +0,0 @@
-https://cloudcijobs.blob.core.windows.net/coreclrci/CoreFXArchives_Linux/TestList.json
\ No newline at end of file
diff --git a/src/coreclr/tests/CoreFX/CoreFXTestListURL_OSX.txt b/src/coreclr/tests/CoreFX/CoreFXTestListURL_OSX.txt
deleted file mode 100644 (file)
index bb4b850..0000000
+++ /dev/null
@@ -1 +0,0 @@
-https://cloudcijobs.blob.core.windows.net/coreclrci/CoreFXArchives_OSX/TestList.json
\ No newline at end of file
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/CoreFX.TestUtils.TestFileSetup.csproj b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/CoreFX.TestUtils.TestFileSetup.csproj
deleted file mode 100644 (file)
index 751b3ab..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-  <Import Project="..\..\..\..\..\dependencies.props" />
-  <PropertyGroup>
-    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
-    <SystemCommandLineVersion>0.1.0-e160909-1</SystemCommandLineVersion>
-    <NewtonsoftJsonVersion>11.0.2</NewtonsoftJsonVersion>
-    <NewtonsoftJsonSchemaVersion>3.0.10</NewtonsoftJsonSchemaVersion>
-    <XunitPackageVersion>2.3.0-beta1-build3642</XunitPackageVersion>
-    <!-- Due to an API surface mismatch, if the xunit.netcore executable attempts to run the wrong version of the
-        runner utility, running the tests wil break, so separate both into different version definitions  -->
-    <XunitRunnerUtilityVersion>2.2.0-beta2-build3300</XunitRunnerUtilityVersion>
-    <XunitAbstractionsVersion>2.0.1</XunitAbstractionsVersion>
-    <XunitNetcoreExtensionsVersion>2.1.0-preview2-02516-02</XunitNetcoreExtensionsVersion>
-    <CoreFxTestUtilitiesVersion>4.5.0-preview2-26219-0</CoreFxTestUtilitiesVersion>
-    <RestoreSources>$(RestoreSources);https://dotnet.myget.org/F/dotnet-corefxlab/api/v3/index.json</RestoreSources>
-  </PropertyGroup>
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <OutputType>Exe</OutputType>
-    <NETCoreAppMaximumVersion>99.9</NETCoreAppMaximumVersion>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json">
-      <Version>$(NewtonsoftJsonVersion)</Version>
-    </PackageReference>
-    <PackageReference Include="Newtonsoft.Json.Schema">
-      <Version>$(NewtonsoftJsonSchemaVersion)</Version>
-    </PackageReference>
-    <!-- TODO Remove this reference - System.CommandLine is now archived and not under active development -->
-    <PackageReference Include="System.CommandLine">
-      <Version>$(SystemCommandLineVersion)</Version>
-    </PackageReference>
-  </ItemGroup>
-</Project>
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestFileHelper.cs b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestFileHelper.cs
deleted file mode 100644 (file)
index e6e2c4e..0000000
+++ /dev/null
@@ -1,326 +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;
-using System.Collections.Generic;
-using System.CommandLine;
-using System.Diagnostics;
-using System.IO;
-using System.IO.Compression;
-using System.Net.Http;
-using System.Text;
-using System.Threading.Tasks;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Schema;
-using Newtonsoft.Json.Schema.Generation;
-
-namespace CoreFX.TestUtils.TestFileSetup.Helpers
-{
-    /// <summary>
-    /// Defines the set of flags that represent exit codes
-    /// </summary>
-    [Flags]
-    public enum ExitCode : int
-    {
-        Success = 0,
-        TestFailure = 1,
-        HttpError = 2,
-        IOError = 3,
-        JsonSchemaValidationError = 4,
-        UnknownError = 10
-
-    }
-
-    /// <summary>
-    /// This helper class is used to fetch CoreFX tests from a specified URL, unarchive them and create a flat directory structure
-    /// through which to iterate.
-    /// </summary>
-    public class TestFileHelper
-    {
-        private HttpClient httpClient;
-        public HttpClient HttpClient
-        {
-            get
-            {
-                if (httpClient == null)
-                {
-                    httpClient = new HttpClient();
-                }
-                return httpClient;
-            }
-            set{ httpClient = value; }
-        }
-
-        private HashSet<string> disabledTests;
-        
-        /// <summary>
-        /// Default constructor - initialize list of disabled tests
-        /// </summary>
-        public TestFileHelper() {
-            disabledTests = new HashSet<string>();
-        }
-
-        /// <summary>
-        /// Deserialize a list of JSON objects defining test assemblies
-        /// </summary>
-        /// <param name="testDefinitionFilePath">The path on disk to the test list. The test list must conform to a schema generated from XUnitTestAssembly</param>
-        /// <returns></returns>
-        public Dictionary<string, XUnitTestAssembly> DeserializeTestJson(string testDefinitionFilePath)
-        {
-            JSchemaGenerator jsonGenerator = new JSchemaGenerator();
-
-            // Generate a JSON schema from the XUnitTestAssembly class against which to validate the test list
-            JSchema testDefinitionSchema = jsonGenerator.Generate(typeof(IList<XUnitTestAssembly>));
-            IList<XUnitTestAssembly> testAssemblies = new List<XUnitTestAssembly>();
-
-            IList<string> validationMessages = new List<string>();
-
-            using (var sr = new StreamReader(testDefinitionFilePath))
-            using (var jsonReader = new JsonTextReader(sr))
-            using (var jsonValidationReader = new JSchemaValidatingReader(jsonReader))
-            {
-                // Create schema validator
-                jsonValidationReader.Schema = testDefinitionSchema;
-                jsonValidationReader.ValidationEventHandler += (o, a) => validationMessages.Add(a.Message);
-
-                // Deserialize json test assembly definitions
-                JsonSerializer serializer = new JsonSerializer();
-                try
-                {
-                    testAssemblies = serializer.Deserialize<List<XUnitTestAssembly>>(jsonValidationReader);
-                }
-                catch (JsonSerializationException ex)
-                {
-                    // Invalid definition
-                    throw new AggregateException(ex);
-                }
-            }
-
-            if (validationMessages.Count != 0)
-            {
-                StringBuilder aggregateExceptionMessage = new StringBuilder();
-                foreach (string validationMessage in validationMessages)
-                {
-                    aggregateExceptionMessage.Append("JSON Validation Error: ");
-                    aggregateExceptionMessage.Append(validationMessage);
-                    aggregateExceptionMessage.AppendLine();
-                }
-
-                throw new AggregateException(new JSchemaValidationException(aggregateExceptionMessage.ToString()));
-
-            }
-            // Generate a map of test assembly names to their object representations - this is used to download and match them to their on-disk representations
-            var nameToTestAssemblyDef = new Dictionary<string, XUnitTestAssembly>();
-
-            // Map test names to their definitions
-            foreach (XUnitTestAssembly assembly in testAssemblies)
-            {
-                // Filter disabled tests
-                if(assembly.IsEnabled)
-                    nameToTestAssemblyDef.Add(assembly.Name, assembly);
-                else
-                    disabledTests.Add(assembly.Name);
-            }
-
-            return nameToTestAssemblyDef;
-        }
-
-        /// <summary>
-        /// Layout tests on disk. This method sets up every downloaded test as it would appear after running build-test.[cmd/sh] in CoreFX
-        /// </summary>
-        /// <param name="jsonUrl">URL to a test list - we expect a test list, which conforms to the Helix layout</param>
-        /// <param name="destinationDirectory">Directory to which the tests are downloaded</param>
-        /// <param name="testDefinitions">The mapping of tests parsed from a test definition list to their names</param>
-        /// <param name="runAllTests">Optional argument, which denotes whether all tests available in the test list downloaded from jsonUrl should be run</param>
-        /// <returns></returns>
-        public async Task SetupTests(string jsonUrl, string destinationDirectory, Dictionary<string, XUnitTestAssembly> testDefinitions = null, bool runAllTests = false)
-        {
-            Debug.Assert(Directory.Exists(destinationDirectory));
-            // testDefinitions should not be empty unless we're running all tests with no exclusions
-            Debug.Assert(runAllTests || testDefinitions != null);
-
-            // Download archives to a temporary directory
-            string tempDirPath = Path.Combine(destinationDirectory, "temp");
-            if (!Directory.Exists(tempDirPath))
-            {
-                Directory.CreateDirectory(tempDirPath);
-            }
-            // Map test names to their URLs, specified by the test list found at jsonUrl
-            Dictionary<string, XUnitTestAssembly> testPayloads = await GetTestUrls(jsonUrl, testDefinitions, runAllTests);
-
-            // If none were found or the testList did not have the expected format - return
-            if (testPayloads == null)
-            {
-                return;
-            }
-
-            // Download and unzip tests
-            await GetTestArchives(testPayloads, tempDirPath);
-            ExpandArchivesInDirectory(tempDirPath, destinationDirectory);
-
-            // Generate response file for each tests
-            RSPGenerator rspGenerator = new RSPGenerator();
-            foreach (XUnitTestAssembly assembly in testDefinitions.Values)
-            {
-                rspGenerator.GenerateRSPFile(assembly, Path.Combine(destinationDirectory, assembly.Name));
-            }
-
-            Directory.Delete(tempDirPath);
-        }
-
-        /// <summary>
-        /// Maps test names to their respective URLs as found in the test list found at the specified URL
-        /// </summary>
-        /// <param name="jsonUrl">URL to a test list - we expect a test list, which conforms to the Helix layout</param>
-        /// <param name="testDefinitions">The mapping of tests parsed from a test definition list to their names</param>
-        /// <param name="runAllTests">Optional argument, which denotes whether all tests available in the test list downloaded from jsonUrl should be run</param>
-        /// <returns></returns>
-        public async Task<Dictionary<string, XUnitTestAssembly>> GetTestUrls(string jsonUrl, Dictionary<string, XUnitTestAssembly> testDefinitions = null, bool runAllTests = false)
-        {
-            // testDefinitions should not be empty unless we're running all tests with no exclusions
-            Debug.Assert(runAllTests || testDefinitions != null);
-            // Set up the json stream reader
-            using (var responseStream = await HttpClient.GetStreamAsync(jsonUrl))
-            using (var streamReader = new StreamReader(responseStream))
-            using (var jsonReader = new JsonTextReader(streamReader))
-            {
-                // Manual parsing - we only need to key-value pairs from each object and this avoids deserializing all of the work items into objects
-                string markedTestName = string.Empty;
-                string currentPropertyName = string.Empty;
-
-                // The expected layout is produced by regular Helix runs - this allows us to parse and run tests from any Helix test list without special considerations
-                // The expected fields are
-                // { "WorkItemId": "<Fully Qualified Test Name>" ,  "PayloadUri":"<Url Of Test>" }
-
-                while (jsonReader.Read())
-                {
-                    if (jsonReader.Value != null)
-                    {
-                        switch (jsonReader.TokenType)
-                        {
-                            case JsonToken.PropertyName:
-                                currentPropertyName = jsonReader.Value.ToString();
-                                break;
-                            case JsonToken.String:
-                                // Test Name Value
-                                if (currentPropertyName.Equals("WorkItemId"))
-                                {
-                                    string currentTestName = jsonReader.Value.ToString();
-                                    
-                                    // If the test has been marked as disabled in the test list - ignore it 
-                                    if ((runAllTests || testDefinitions.ContainsKey(currentTestName)) && !disabledTests.Contains(currentTestName))
-                                    {
-                                        markedTestName = currentTestName;
-                                    }
-                                }
-                                // Test URL value
-                                else if (currentPropertyName.Equals("PayloadUri") && markedTestName != string.Empty)
-                                {
-                                    if (!testDefinitions.ContainsKey(markedTestName))
-                                    {
-                                        testDefinitions[markedTestName] = new XUnitTestAssembly() { Name = markedTestName };
-                                    }
-                                    testDefinitions[markedTestName].Url = jsonReader.Value.ToString();
-                                    markedTestName = string.Empty;
-                                }
-                                break;
-                        }
-                    }
-                }
-
-            }
-            return testDefinitions;
-        }
-
-        /// <summary>
-        /// Download each test from its specified URL
-        /// </summary>
-        /// <param name="testPayloads">The mapping of tests parsed from a test definition list to their names. The test definitions are populated with test URLs</param>
-        /// <param name="downloadDir">Directory to which to download tests</param>
-        /// <returns></returns>
-        public async Task GetTestArchives(Dictionary<string, XUnitTestAssembly> testPayloads, string downloadDir)
-        {
-            foreach (string testName in testPayloads.Keys)
-            {
-                string payloadUri = testPayloads[testName].Url;
-
-                // Check URL for validity
-                if (!Uri.IsWellFormedUriString(payloadUri, UriKind.Absolute))
-                    continue;
-                Console.WriteLine("Downloading " + testName + " from " + payloadUri);
-                // Download tests from specified URL
-                using (var response = await HttpClient.GetStreamAsync(payloadUri))
-                {
-                    if (response.CanRead)
-                    {
-                        // Create the test setup directory if it doesn't exist
-                        if (!Directory.Exists(downloadDir))
-                        {
-                            Directory.CreateDirectory(downloadDir);
-                        }
-
-                        // CoreFX test archives are output as .zip regardless of platform
-                        string archivePath = Path.Combine(downloadDir, testName + ".zip");
-
-                        // Copy to a temp folder 
-                        using (FileStream file = new FileStream(archivePath, FileMode.Create))
-                        {
-                            await response.CopyToAsync(file);
-                        }
-
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Expand Archives
-        /// </summary>
-        /// <param name="archiveDirectory">Directory containing archives</param>
-        /// <param name="destinationDirectory">Directory to which to unpack archives</param>
-        /// <param name="cleanup">Optional parameter stating, whether archives should be deleted once downloaded</param>
-        public void ExpandArchivesInDirectory(string archiveDirectory, string destinationDirectory, bool cleanup = true)
-        {
-            Debug.Assert(Directory.Exists(archiveDirectory));
-            Debug.Assert(Directory.Exists(destinationDirectory));
-
-            // Get all archives in the directory
-            string[] archives = Directory.GetFiles(archiveDirectory, "*.zip", SearchOption.TopDirectoryOnly);
-
-            foreach (string archivePath in archives)
-            {
-                string destinationDirName = Path.Combine(destinationDirectory, Path.GetFileNameWithoutExtension(archivePath));
-
-                ZipFile.ExtractToDirectory(archivePath, destinationDirName);
-
-                // Delete archives if cleanup was 
-                if (cleanup)
-                {
-                    File.Delete(archivePath);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Cleans build directory
-        /// </summary>
-        /// <param name="directoryToClean">Directory the contents of which to delete.</param>
-        public void CleanBuild(string directoryToClean)
-        {
-            Debug.Assert(Directory.Exists(directoryToClean));
-            DirectoryInfo dirInfo = new DirectoryInfo(directoryToClean);
-
-            foreach (FileInfo file in dirInfo.EnumerateFiles())
-            {
-                file.Delete();
-            }
-
-            foreach (DirectoryInfo dir in dirInfo.EnumerateDirectories())
-            {
-                dir.Delete(true);
-            }
-        }
-
-    }
-}
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestRunHelper.cs b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Helpers/TestRunHelper.cs
deleted file mode 100644 (file)
index a8a9791..0000000
+++ /dev/null
@@ -1,158 +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;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace CoreFX.TestUtils.TestFileSetup.Helpers
-{
-    /// <summary>
-    /// A class which runs all tests conforming to the current format of CoreFX tests - 
-    /// Each folder:
-    ///     is named for the test it contains - e.g. System.Collections.Tests
-    ///     contains a test assembly named for the library it tests - e.g. System.Collections.Tests.dll
-    ///     contains a test executable with the specified name - e.g. xunit.console.netcore.exe
-    /// </summary>
-    public class NetCoreTestRunHelper
-    {
-  
-        public string DotnetExecutablePath { get; set; }
-
-        public string logRootOutputPath { get; set; }
-
-        /// <summary>
-        /// Default Constructor
-        /// </summary>
-        /// <param name="DotnetExecutablePath"> Path to the dotnet executable, which is used to run the test executable In CoreFX tests this will be the built test host</param>
-        /// <param name="logRootOutputPath">Path to which to output test run logs</param>
-        public NetCoreTestRunHelper(string DotnetExecutablePath, string logRootOutputPath)
-        {
-            this.DotnetExecutablePath = DotnetExecutablePath;
-            this.logRootOutputPath = logRootOutputPath;
-        }
-
-        /// <summary>
-        /// Run a single test executabke
-        /// </summary>
-        /// <param name="workingDirectory">Directory from which to start the test executable</param>
-        /// <param name="executableName">Name of the test executable</param>
-        /// <param name="xunitTestTraits">Test trait exclusions to pass to the runner.</param>
-        /// <param name="logOutputPath">Path to which to output the single test run's results</param>
-        /// <returns>0 if single test run is succesful; 1 if not</returns>
-        public int RunExecutable(string workingDirectory, string executableName, IReadOnlyList<string> xunitTestTraits, string logOutputPath)
-        {
-            // Calculate and create the path to the test log
-            string logPath = Path.Combine(logOutputPath, Path.GetFileName(workingDirectory));
-            if (!Directory.Exists(logPath))
-                Directory.CreateDirectory(logPath);
-            
-            // Calculate the arguments to pass to the test runner
-            string arguments = CalculateCommandLineArguments(workingDirectory, executableName, xunitTestTraits, Path.Combine(logPath,"testResults.xml"));
-
-            // Create and initialize the test executable process
-            ProcessStartInfo startInfo = new ProcessStartInfo(DotnetExecutablePath, arguments)
-            {
-                Arguments = arguments,
-                WorkingDirectory = workingDirectory
-            };
-
-
-            Process executableProcess = new Process();
-            executableProcess.StartInfo = startInfo;
-            executableProcess.EnableRaisingEvents = true;
-            executableProcess.Start();
-            executableProcess.WaitForExit();
-
-            return executableProcess.ExitCode;
-        }
-        /// <summary>
-        /// Run all test executables conforming to the specified pattern in a directory
-        /// </summary>
-        /// <param name="rootDirectory">Directory containing tests to run</param>
-        /// <param name="executableName">Name of the test executable contained in folders</param>
-        /// <param name="xunitTestTraits">Test trait exclusions to pass to the runner.</param>
-        /// <param name="processLimit">Maximum number of tests to run in parallel</param>
-        /// <param name="logRootOutputPath">Root path to which to output the all test runs' results</param>
-        /// <returns>0 if entire test run is succesful; 1 if not</returns>
-        public int RunAllExecutablesInDirectory(string rootDirectory, string executableName, IReadOnlyList<string> xunitTestTraits, int processLimit, string logRootOutputPath = null)
-        {
-            int result = 0;
-            // Do a Depth-First Search to find and run executables with the same name 
-            Stack<string> directories = new Stack<string>();
-            List<string> testDirectories = new List<string>();
-            // Push rootdir
-            directories.Push(rootDirectory);
-
-            while (directories.Count > 0)
-            {
-                string currentDirectory = directories.Pop();
-                
-                // If a directory contains an executable with the specified name - add it  
-                if (File.Exists(Path.Combine(currentDirectory, executableName)))
-                    testDirectories.Add(currentDirectory);
-
-                foreach (string subDir in Directory.GetDirectories(currentDirectory))
-                    directories.Push(subDir);
-            }
-
-            // Initialize max degree of parallelism
-            ParallelOptions parallelOptions = new ParallelOptions();
-            parallelOptions.MaxDegreeOfParallelism = processLimit;
-
-            Parallel.ForEach(testDirectories, parallelOptions,
-                (testDirectory) =>
-                {
-                    if (RunExecutable(testDirectory, executableName, xunitTestTraits, logRootOutputPath) != 0)
-                    {
-                        // If any tests fail mark the whole run as failed
-                        Console.WriteLine("Test Run Failed " + testDirectory);
-                        result = 1;
-                    }
-                }
-                );
-            return result;
-        }
-
-        /// <summary>
-        /// Calculate the commandline arguments to pass to the test executable
-        /// </summary>
-        /// <param name="testDirectory">Current test directory name - assumed to have the same name as the test</param>
-        /// <param name="executableName">>Name of the test executable contained in the folder</param>
-        /// <param name="xunitTestTraits">Test trait exclusions to pass to the runner.</param>
-        /// <param name="logPath">Path to which to output the single test run's results</param>
-        /// <returns>A string representing command line arguments to be passed to the console test runner</returns>
-        private string CalculateCommandLineArguments(string testDirectory, string executableName, IReadOnlyList<string> xunitTestTraits, string logPath)
-        {
-            StringBuilder arguments = new StringBuilder();
-
-            // Append test executable name
-            arguments.Append($"\"{Path.Combine(testDirectory, Path.GetFileName(executableName))}\" ");
-
-            // Append test name dll\
-            arguments.Append($"\"{Path.Combine(testDirectory, Path.GetFileName(testDirectory))}.dll\" ");
-
-            // Append RSP file
-            arguments.Append($"@\"{Path.Combine(testDirectory, Path.GetFileName(testDirectory))}.rsp\" ");
-
-            if (!String.IsNullOrEmpty(logPath))
-            {
-                // Add logging information
-                arguments.Append($"-xml {logPath} ");
-            }
-
-            // Append all additional arguments
-            foreach (string traitToExclude in xunitTestTraits)
-            {
-                arguments.Append($"-notrait {traitToExclude} ");
-            }
-
-            return arguments.ToString();
-        }
-    }
-}
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Program.cs b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/Program.cs
deleted file mode 100644 (file)
index 599dd6d..0000000
+++ /dev/null
@@ -1,174 +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;
-using System.Collections.Generic;
-using System.CommandLine;
-using System.IO;
-using System.Net.Http;
-using System.Text;
-using CoreFX.TestUtils.TestFileSetup.Helpers;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Schema;
-
-namespace CoreFX.TestUtils.TestFileSetup
-{
-    /// <summary>
-    /// This is a driver class, which downloads archived CoreFX test assemblies from a specified URL, lays out their contents
-    /// and subsequently runs them in parallel. 
-    /// This is invoked from .tests/runtests.[cmd|sh] and depends on a test host (CoreCLR components with a dotnet executable) being present
-    /// </summary>
-    public class Program
-    {
-        // Helper class to lay out files on disk
-        private static TestFileHelper testFileHelper;
-        // Helper class to run tests in parallel
-        private static NetCoreTestRunHelper testRunHelper;
-
-        // Test Set-up Options
-        private static string outputDir;
-        private static string testUrl;
-        private static string testListPath;
-        private static bool cleanTestBuild;
-
-        // Test Run Options
-        private static string dotnetPath;
-        private static bool runSpecifiedTests;
-        private static bool runAllTests;
-        private static int maximumDegreeOfParalellization;
-        private static string logRootOutputPath;
-
-        private static ExitCode exitCode;
-        private static string executableName;
-        private static IReadOnlyList<string> traitExclusions = Array.Empty<string>();
-
-        public static void Main(string[] args)
-        {
-            // Initialize default options
-            exitCode = ExitCode.Success;
-            maximumDegreeOfParalellization = Environment.ProcessorCount;
-            runSpecifiedTests = false;
-            runAllTests = false;
-            cleanTestBuild = false;
-
-            ArgumentSyntax argSyntax = ParseCommandLine(args);
-            try
-            {
-                // Download and lay out files on disk
-                SetupTests(runAllTests);
-                
-                // Only run tests if the relevant commandline switch is passed
-                if (runSpecifiedTests || runAllTests)
-                    exitCode = RunTests();
-            }
-            catch (AggregateException e)
-            {
-                // Handle failure cases and exit gracefully
-                e.Handle(innerExc =>
-                {
-
-                    if (innerExc is HttpRequestException)
-                    {
-                        exitCode = ExitCode.HttpError;
-                        Console.WriteLine("Error downloading tests from: " + testUrl);
-                        Console.WriteLine(innerExc.Message);
-                        return true;
-                    }
-                    else if (innerExc is IOException)
-                    {
-                        exitCode = ExitCode.IOError;
-                        Console.WriteLine(innerExc.Message);
-                        return true;
-                    }
-                    else if (innerExc is JSchemaValidationException || innerExc is JsonSerializationException)
-                    {
-                        exitCode = ExitCode.JsonSchemaValidationError;
-                        Console.WriteLine("Error validating test list: ");
-                        Console.WriteLine(innerExc.Message);
-                        return true;
-                    }
-                    else
-                    {
-                        exitCode = ExitCode.UnknownError;
-                    }
-                    
-                    return false;
-                });
-            }
-
-            Environment.Exit((int)exitCode);
-        }
-
-        /// <summary>
-        /// Parse passed Command Line arguments
-        /// </summary>
-        /// <param name="args"></param>
-        /// <returns></returns>
-        private static ArgumentSyntax ParseCommandLine(string[] args)
-        {
-            ArgumentSyntax argSyntax = ArgumentSyntax.Parse(args, syntax =>
-            {
-                syntax.DefineOption("out|outDir|outputDirectory", ref outputDir, "Directory where tests are downloaded");
-                syntax.DefineOption("testUrl", ref testUrl, "URL, pointing to the list of tests");
-                syntax.DefineOption("testListJsonPath", ref testListPath, "JSON-formatted list of test assembly names to download");
-                syntax.DefineOption("clean|cleanOutputDir", ref cleanTestBuild, "Clean test assembly output directory");
-                syntax.DefineOption("runSpecified|runSpecifiedTests", ref runSpecifiedTests, "Run specified Tests after setup");
-                syntax.DefineOption("runAll|runAllTests", ref runAllTests, "Run All available Tests in the specified TestList");
-                syntax.DefineOption("dotnet|dotnetPath", ref dotnetPath, "Path to dotnet executable used to run tests.");
-                syntax.DefineOption("executable|executableName", ref executableName, "Name of the test executable to start");
-                syntax.DefineOption("log|logPath|logRootOutputPath", ref logRootOutputPath, "Run Tests after setup");
-                syntax.DefineOption("maxProcessCount|numberOfParallelTests|maximumDegreeOfParalellization", ref maximumDegreeOfParalellization, "Maximum number of concurrently executing processes");
-                syntax.DefineOptionList("notrait", ref traitExclusions, "Traits to be excluded from test runs");
-
-            });
-
-            if (runSpecifiedTests || runAllTests)
-            {
-                if (String.IsNullOrEmpty(dotnetPath))
-                    throw new ArgumentException("Please supply a test host location to run tests.");
-
-                if (!File.Exists(dotnetPath))
-                    throw new ArgumentException("Invalid testhost path. Please supply a test host location to run tests.");
-            }
-
-            return argSyntax;
-        }
-
-        /// <summary>
-        /// Method, which calls into the Test File Setup helper class to download and layout test assemblies on disk
-        /// </summary>
-        /// <param name="runAll">Specifies whether all tests available in the test list should be run</param>
-        private static void SetupTests(bool runAll = false)
-        {
-            testFileHelper = new TestFileHelper();
-
-            if (!Directory.Exists(outputDir))
-                Directory.CreateDirectory(outputDir);
-
-            // If the --clean switch has been specified delete existing assemblies
-            if (cleanTestBuild)
-            {
-                testFileHelper.CleanBuild(outputDir);
-            }
-
-            // Map test names to their definitions
-            Dictionary<string, XUnitTestAssembly> testAssemblyDefinitions = testFileHelper.DeserializeTestJson(testListPath);
-
-            testFileHelper.SetupTests(testUrl, outputDir, testAssemblyDefinitions, runAll).Wait();
-        }
-
-        /// <summary>
-        /// Runs all tests in a directory
-        /// Only tests, the executable driver of which has the same name as the passed argument are executed - e.g. xunit.console.netcore.exe
-        /// </summary>
-        /// <returns></returns>
-        private static ExitCode RunTests()
-        {
-            testRunHelper = new NetCoreTestRunHelper(dotnetPath, logRootOutputPath);
-            int result = testRunHelper.RunAllExecutablesInDirectory(outputDir, executableName, traitExclusions, maximumDegreeOfParalellization, logRootOutputPath);
-
-            return result == 0 ? ExitCode.Success : ExitCode.TestFailure;
-        }
-    }
-}
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/RSPGenerator.cs b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/RSPGenerator.cs
deleted file mode 100644 (file)
index ae32302..0000000
+++ /dev/null
@@ -1,83 +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;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-
-namespace CoreFX.TestUtils.TestFileSetup
-{
-    /// <summary>
-    /// A class which generates .rsp files to be passed to the test executable
-    /// The file contains a list of methods, classes and namespaces to be excluded from running.
-    /// </summary>
-    public class RSPGenerator
-    {
-        /// <summary>
-        /// Generate an rsp file from an XUnitTestAssembly class
-        /// </summary>
-        /// <param name="testDefinition">The XUnitTestAssembly object parsed from a specified test list</param>
-        /// <param name="outputPath">Path to which to output a .rsp file</param>
-        public void GenerateRSPFile(XUnitTestAssembly testDefinition, string outputPath)
-        {
-            if (!Directory.Exists(outputPath))
-            {
-                Directory.CreateDirectory(outputPath);
-            }
-            string rspFilePath = Path.Combine(outputPath, testDefinition.Name + ".rsp");
-
-            if (File.Exists(rspFilePath))
-                File.Delete(rspFilePath);
-
-            // Write RSP file to disk
-            using (StreamWriter sr = File.CreateText(rspFilePath))
-            {
-                // If no exclusions are defined, we don't need to generate an .rsp file
-                if (testDefinition.Exclusions == null)
-                    return;
-
-                // Method exclusions
-                if (testDefinition.Exclusions.Methods != null)
-                {
-                    foreach (Exclusion exclusion in testDefinition.Exclusions.Methods)
-                    {
-                        if (String.IsNullOrWhiteSpace(exclusion.Name))
-                            continue;
-                        sr.Write("-skipmethod ");
-                        sr.Write(exclusion.Name);
-                        sr.WriteLine();
-                    }
-                }
-
-                // Class exclusions
-                if (testDefinition.Exclusions.Classes != null)
-                {
-                    foreach (Exclusion exclusion in testDefinition.Exclusions.Classes)
-                    {
-                        if (String.IsNullOrWhiteSpace(exclusion.Name))
-                            continue;
-                        sr.Write("-skipclass ");
-                        sr.Write(exclusion.Name);
-                        sr.WriteLine();
-                    }
-
-                }
-
-                // Namespace exclusions
-                if (testDefinition.Exclusions.Namespaces != null)
-                {
-                    foreach (Exclusion exclusion in testDefinition.Exclusions.Namespaces)
-                    {
-                        if (String.IsNullOrWhiteSpace(exclusion.Name))
-                            continue;
-                        sr.Write("-skipnamespace ");
-                        sr.Write(exclusion.Name);
-                        sr.WriteLine();
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/XUnit/XUnitTestAssembly.cs b/src/coreclr/tests/src/Common/CoreFX/TestFileSetup/XUnit/XUnitTestAssembly.cs
deleted file mode 100644 (file)
index efe7885..0000000
+++ /dev/null
@@ -1,63 +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;
-using System.Collections.Generic;
-using System.Text;
-using Newtonsoft.Json;
-
-namespace CoreFX.TestUtils.TestFileSetup
-{
-    /// <summary>
-    /// A class representing a CoreFX test assembly to be run
-    /// </summary>
-    public class XUnitTestAssembly
-    {
-        [JsonRequired]
-        [JsonProperty("name")]
-        public string Name;
-
-        [JsonRequired]
-        [JsonProperty("enabled")]
-        public bool IsEnabled;
-
-        [JsonRequired]
-        [JsonProperty("exclusions")]
-        public Exclusions Exclusions;
-
-        // Used to assign a test url or to override it via the json file definition - mark it as optional in the test definition
-        [JsonIgnore]
-        [JsonProperty(Required = Required.Default)]
-        public string Url;
-
-    }
-    /// <summary>
-    /// Class representing a collection of test exclusions
-    /// </summary>
-    public class Exclusions
-    {
-        [JsonProperty("namespaces")]
-        public Exclusion[] Namespaces;
-
-        [JsonProperty("classes")]
-        public Exclusion[] Classes;
-
-        [JsonProperty("methods")]
-        public Exclusion[] Methods;
-    }
-
-    /// <summary>
-    /// Class representing a single test exclusion
-    /// </summary>
-    public class Exclusion
-    {
-        [JsonRequired]
-        [JsonProperty("name", Required = Required.DisallowNull)]
-        public string Name;
-
-        [JsonRequired]
-        [JsonProperty("reason", Required = Required.DisallowNull)]
-        public string Reason;
-    }
-}