From 1f20828b7342baa3239899aa73660e80f6ffdb47 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 27 Jan 2021 16:06:10 -0800 Subject: [PATCH 1/8] Replace PackageES with ESRP template This isn't done, but I need to start a pipeline run to see where it's at. --- .vsts-ci/azure-pipelines-release.yml | 11 +++++++- .vsts-ci/templates/release-general.yml | 37 +++++++++++++++----------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/.vsts-ci/azure-pipelines-release.yml b/.vsts-ci/azure-pipelines-release.yml index 93ebf460a..ab587195f 100644 --- a/.vsts-ci/azure-pipelines-release.yml +++ b/.vsts-ci/azure-pipelines-release.yml @@ -32,6 +32,13 @@ trigger: - /LICENSE - /CODE_OF_CONDUCT.md +resources: + repositories: + - repository: ComplianceRepo + type: github + endpoint: ComplianceGHRepo + name: PowerShell/compliance + jobs: - job: 'ReleaseBuild' @@ -45,7 +52,9 @@ jobs: displayName: Signing Build dependsOn: 'ReleaseBuild' pool: - name: 'Package ES CodeHub Lab E' + name: 'Package ES Standard Build' demands: DotNetFramework + variables: + - group: ESRP steps: - template: templates/release-general.yml diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index 7f0e0780e..562e3e0f3 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -1,4 +1,6 @@ steps: +- checkout: self + - powershell: | Write-Host "Installing pwsh..." if (Get-Command pwsh -ErrorAction Ignore) @@ -19,12 +21,6 @@ steps: displayName: Capture environment condition: succeededOrFailed() -- task: PkgESSetupBuild@10 - displayName: 'Package ES - Setup Build' - inputs: - productName: PowerShellEditorServices - useDfs: false - - task: DownloadBuildArtifacts@0 displayName: 'Download Build Artifacts' inputs: @@ -40,14 +36,25 @@ steps: $psesZip | Expand-Archive -DestinationPath $dest -Force -Verbose $psesZip | Remove-Item -Recurse -Force -- task: PkgESCodeSign@10 - displayName: 'CodeSign tools/releaseBuild/signing.xml' - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - inputs: - signConfigXml: tools/releaseBuild/signing.xml - inPathRoot: '$(Build.ArtifactStagingDirectory)' - outPathRoot: '$(Build.ArtifactStagingDirectory)\Signed' +- checkout: ComplianceRepo + +- template: EsrpSign.yml@ComplianceRepo + displayName: 'Sign the scripts and libraries' + parameters: + buildOutputPath: '$(Build.ArtifactStagingDirectory)' + signOutputPath: '$(Build.ArtifactStagingDirectory)/Signed' + certificateId: 'CP-230012' # Authenticode certificate. + useMinimatch: true + pattern: | + # PowerShellEditorServices Script + release/out/PowerShellEditorServices/PowerShellEditorServices/*.{psd1,psm1,ps1xml} + release/out/PowerShellEditorServices/PowerShellEditorServices/Commands/**/*.{psd1,psm1,ps1xml} + # PowerShellEditorServices Binaries + release/out/**/Microsoft.PowerShell.EditorServices*.dll + # PowerShellEditorServices.VSCode Script + release/out/**/PowerShellEditorServices.VSCode.psd1 + # PowerShellEditorServices.VSCode Binary + release/out/**/Microsoft.PowerShell.EditorServices.VSCode.dll - task: PowerShell@1 displayName: 'Copy signed items into output' @@ -100,7 +107,7 @@ steps: optionsXS: 0 optionsPE: '1|2|3|4' optionsHMENABLE: 0 - optionsFTPATH: '$(Build.SourcesDirectory)\tools\terms\FileTypeSet.xml' + optionsFTPATH: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/FileTypeSet.xml' # toolVersion: 5.8.2.1 - task: CredScan@2 From 8e77a9ea490767d08e5d483893ecfb94b9b46535 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Mon, 1 Feb 2021 10:36:19 -0800 Subject: [PATCH 2/8] Start simplifying release build This includes removing the file catalog steps entirely, as we presumably do not need it. --- .vsts-ci/templates/release-general.yml | 49 ++++++-------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index 562e3e0f3..d98c9583f 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -26,12 +26,13 @@ steps: inputs: downloadType: specific +# TODO: Use `ExtractFiles` task instead of script - task: PowerShell@1 displayName: 'Extract build zip' inputs: scriptType: inlineScript inlineScript: | - $dest = New-Item -ItemType Directory $env:BUILD_ARTIFACTSTAGINGDIRECTORY/release/out/PowerShellEditorServices + $dest = New-Item -ItemType Directory $env:BUILD_ARTIFACTSTAGINGDIRECTORY/PowerShellEditorServices $psesZip = Get-ChildItem $env:BUILD_ARTIFACTSTAGINGDIRECTORY/PowerShellEditorServices-CI/PowerShellEditorServices*.zip -ErrorAction Stop $psesZip | Expand-Archive -DestinationPath $dest -Force -Verbose $psesZip | Remove-Item -Recurse -Force @@ -39,52 +40,23 @@ steps: - checkout: ComplianceRepo - template: EsrpSign.yml@ComplianceRepo - displayName: 'Sign the scripts and libraries' parameters: - buildOutputPath: '$(Build.ArtifactStagingDirectory)' + buildOutputPath: '$(Build.ArtifactStagingDirectory)/PowerShellEditorServices' signOutputPath: '$(Build.ArtifactStagingDirectory)/Signed' certificateId: 'CP-230012' # Authenticode certificate. useMinimatch: true pattern: | # PowerShellEditorServices Script - release/out/PowerShellEditorServices/PowerShellEditorServices/*.{psd1,psm1,ps1xml} - release/out/PowerShellEditorServices/PowerShellEditorServices/Commands/**/*.{psd1,psm1,ps1xml} + PowerShellEditorServices/*.{ps1,psd1,psm1,ps1xml} + PowerShellEditorServices/Commands/**/*.{ps1,psd1,psm1,ps1xml} # PowerShellEditorServices Binaries - release/out/**/Microsoft.PowerShell.EditorServices*.dll + PowerShellEditorServices/**/Microsoft.PowerShell.EditorServices*.dll # PowerShellEditorServices.VSCode Script - release/out/**/PowerShellEditorServices.VSCode.psd1 + PowerShellEditorServices.VSCode/PowerShellEditorServices.VSCode.psd1 # PowerShellEditorServices.VSCode Binary - release/out/**/Microsoft.PowerShell.EditorServices.VSCode.dll - -- task: PowerShell@1 - displayName: 'Copy signed items into output' - inputs: - scriptType: inlineScript - inlineScript: | - $signed="$(Build.ArtifactStagingDirectory)\Signed\PowerShellEditorServices\*" - $notSigned="$(Build.ArtifactStagingDirectory)\release\out\PowerShellEditorServices" - Copy-Item $signed $notSigned -Recurse -Force - -- task: PowerShell@1 - displayName: 'Create catalog files' - inputs: - scriptType: inlineScript - inlineScript: | - $dir = "$(Build.ArtifactStagingDirectory)\release\out\PowerShellEditorServices\PowerShellEditorServices" - New-FileCatalog -CatalogFilePath "$(Build.ArtifactStagingDirectory)\PowerShellEditorServices.cat" -Path $dir - - $dir = "$(Build.ArtifactStagingDirectory)\release\out\PowerShellEditorServices\PowerShellEditorServices.VSCode" - New-FileCatalog -CatalogFilePath "$(Build.ArtifactStagingDirectory)\PowerShellEditorServices.VSCode.cat" -Path $dir - -- task: PkgESCodeSign@10 - displayName: 'CodeSign tools/releaseBuild/FileCatalogSigning.xml' - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - inputs: - signConfigXml: tools/releaseBuild/FileCatalogSigning.xml - inPathRoot: '$(Build.ArtifactStagingDirectory)' - outPathRoot: '$(Build.ArtifactStagingDirectory)' + PowerShellEditorServices.VSCode/bin/Microsoft.PowerShell.EditorServices.VSCode.dll +# TODO: Use templates for compliance checks - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' @@ -149,8 +121,9 @@ steps: uploadTSLint: false uploadAsync: true +# TODO: Use `publish` task instead of script - task: PowerShell@1 displayName: 'Upload artifacts' inputs: scriptType: inlineScript - inlineScript: 'Write-Host "##vso[artifact.upload containerfolder=PowerShellEditorServices;artifactname=PowerShellEditorServices]$(Build.ArtifactStagingDirectory)\release\out\PowerShellEditorServices"' + inlineScript: 'Write-Host "##vso[artifact.upload containerfolder=PowerShellEditorServices;artifactname=PowerShellEditorServices]$(Build.ArtifactStagingDirectory)/Signed/PowerShellEditorServices"' From 32aeed661aab5aeb59140187c7a5dc4a286a6967 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Mon, 1 Feb 2021 13:26:04 -0800 Subject: [PATCH 3/8] Use ADO tasks instead of pwsh inline scripts Also fix upload of artifacts to include everything. --- .vsts-ci/templates/release-general.yml | 48 ++++++-------------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index d98c9583f..e443f5834 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -1,46 +1,23 @@ steps: -- checkout: self - -- powershell: | - Write-Host "Installing pwsh..." - if (Get-Command pwsh -ErrorAction Ignore) - { - Write-Host "pwsh already installed, skipping" - return - } - $powerShellPath = Join-Path -Path $env:AGENT_TEMPDIRECTORY -ChildPath 'powershell' - Invoke-WebRequest -Uri https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/install-powershell.ps1 -outfile ./install-powershell.ps1 - ./install-powershell.ps1 -Destination $powerShellPath - $vstsCommandString = "vso[task.setvariable variable=PATH]$powerShellPath;$env:PATH" - Write-Host "sending " + $vstsCommandString - Write-Host "##$vstsCommandString" - displayName: Install PowerShell Core - -- pwsh: | - Get-ChildItem -Path env: - displayName: Capture environment - condition: succeededOrFailed() - task: DownloadBuildArtifacts@0 displayName: 'Download Build Artifacts' inputs: downloadType: specific -# TODO: Use `ExtractFiles` task instead of script -- task: PowerShell@1 - displayName: 'Extract build zip' +- task: ExtractFiles@1 + displayName: 'Extract Build Zip' inputs: - scriptType: inlineScript - inlineScript: | - $dest = New-Item -ItemType Directory $env:BUILD_ARTIFACTSTAGINGDIRECTORY/PowerShellEditorServices - $psesZip = Get-ChildItem $env:BUILD_ARTIFACTSTAGINGDIRECTORY/PowerShellEditorServices-CI/PowerShellEditorServices*.zip -ErrorAction Stop - $psesZip | Expand-Archive -DestinationPath $dest -Force -Verbose - $psesZip | Remove-Item -Recurse -Force + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/PowerShellEditorServices-CI/PowerShellEditorServices*.zip' + destinationFolder: '$(Build.ArtifactStagingDirectory)/PowerShellEditorServices' - checkout: ComplianceRepo + displayName: 'Checkout the ComplianceRepo' - template: EsrpSign.yml@ComplianceRepo parameters: + # NOTE: All artifacts are copied to "Signed" even though only some are + # actually signed. We then publish this folder below. buildOutputPath: '$(Build.ArtifactStagingDirectory)/PowerShellEditorServices' signOutputPath: '$(Build.ArtifactStagingDirectory)/Signed' certificateId: 'CP-230012' # Authenticode certificate. @@ -56,6 +33,10 @@ steps: # PowerShellEditorServices.VSCode Binary PowerShellEditorServices.VSCode/bin/Microsoft.PowerShell.EditorServices.VSCode.dll +- publish: $(Build.ArtifactStagingDirectory)/Signed + artifact: PowerShellEditorServices + displayName: 'Publish signed (and unsigned) artifacts' + # TODO: Use templates for compliance checks - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' @@ -120,10 +101,3 @@ steps: uploadRoslyn: false uploadTSLint: false uploadAsync: true - -# TODO: Use `publish` task instead of script -- task: PowerShell@1 - displayName: 'Upload artifacts' - inputs: - scriptType: inlineScript - inlineScript: 'Write-Host "##vso[artifact.upload containerfolder=PowerShellEditorServices;artifactname=PowerShellEditorServices]$(Build.ArtifactStagingDirectory)/Signed/PowerShellEditorServices"' From 93fdbb5f325d9a4472bc72719eb1841726c0c9c0 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Mon, 1 Feb 2021 13:36:15 -0800 Subject: [PATCH 4/8] Delete deprecated signing.xml --- tools/releaseBuild/signing.xml | 62 ---------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 tools/releaseBuild/signing.xml diff --git a/tools/releaseBuild/signing.xml b/tools/releaseBuild/signing.xml deleted file mode 100644 index 50e61a869..000000000 --- a/tools/releaseBuild/signing.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 17fb65ce1c26de91657e2e7e2b7f04bffff51db3 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Mon, 1 Feb 2021 15:33:19 -0800 Subject: [PATCH 5/8] Replace compliance tasks with template And sign third-party libraries, which negates the need to setup malware scanning (since signed binaries are scanned automatically). --- .vsts-ci/templates/release-general.yml | 104 +++++++++---------------- 1 file changed, 35 insertions(+), 69 deletions(-) diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index e443f5834..e4b5077bf 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -16,12 +16,10 @@ steps: - template: EsrpSign.yml@ComplianceRepo parameters: - # NOTE: All artifacts are copied to "Signed" even though only some are - # actually signed. We then publish this folder below. buildOutputPath: '$(Build.ArtifactStagingDirectory)/PowerShellEditorServices' - signOutputPath: '$(Build.ArtifactStagingDirectory)/Signed' - certificateId: 'CP-230012' # Authenticode certificate. - useMinimatch: true + signOutputPath: '$(Build.ArtifactStagingDirectory)/FirstPartySigned' + certificateId: 'CP-230012' # Authenticode certificate + useMinimatch: true # This enables the use of globbing pattern: | # PowerShellEditorServices Script PowerShellEditorServices/*.{ps1,psd1,psm1,ps1xml} @@ -33,71 +31,39 @@ steps: # PowerShellEditorServices.VSCode Binary PowerShellEditorServices.VSCode/bin/Microsoft.PowerShell.EditorServices.VSCode.dll -- publish: $(Build.ArtifactStagingDirectory)/Signed +- template: EsrpSign.yml@ComplianceRepo + parameters: + buildOutputPath: '$(Build.ArtifactStagingDirectory)/FirstPartySigned' + signOutputPath: '$(Build.ArtifactStagingDirectory)/ThirdPartySigned' + certificateId: 'CP-231522' # Third-party certificate + useMinimatch: true # This enables the use of globbing + pattern: | + **/MediatR.dll + **/Nerdbank.Streams.dll + **/Newtonsoft.Json.dll + **/OmniSharp*.dll + **/Serilog*.dll + **/UnixConsoleEcho.dll + +- publish: $(Build.ArtifactStagingDirectory)/ThirdPartySigned artifact: PowerShellEditorServices displayName: 'Publish signed (and unsigned) artifacts' -# TODO: Use templates for compliance checks -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - -- task: AntiMalware@3 - inputs: - InputType: 'Basic' - ScanType: 'CustomScan' - FileDirPath: '$(Build.ArtifactStagingDirectory)' - EnableServices: false - SupportLogOnError: false - TreatSignatureUpdateFailureAs: 'Warning' - SignatureFreshness: 'UpToDate' - TreatStaleSignatureAs: 'Error' - -- task: PoliCheck@1 - condition: succeededOrFailed() - inputs: - targetType: F - optionsFC: 0 - optionsXS: 0 - optionsPE: '1|2|3|4' - optionsHMENABLE: 0 - optionsFTPATH: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/FileTypeSet.xml' - # toolVersion: 5.8.2.1 - -- task: CredScan@2 - condition: succeededOrFailed() +- checkout: self -# - task: BinSkim@3 -# condition: succeededOrFailed() -# inputs: -# InputType: 'Basic' -# Function: 'analyze' -# AnalyzeRecurse: true -# AnalyzeTarget: '$(Build.ArtifactStagingDirectory)\release;$(Build.ArtifactStagingDirectory)\OutGridView*.dll' - -# Publish results as artifacts -- task: PublishSecurityAnalysisLogs@3 - condition: succeededOrFailed() - inputs: - ArtifactName: 'CodeAnalysisLogs' - ArtifactType: 'Container' - -# Publish to TSA server -- task: TSAUpload@1 - condition: succeededOrFailed() - continueOnError: true - inputs: - tsaVersion: 'TsaV2' - codebase: 'Existing' - tsaEnvironment: 'PROD' - codeBaseName: 'PowerShell_PowerShellEditorServices_20190917' - uploadAPIScan: false - uploadBinSkim: false - uploadCredScan: true - uploadFortifySCA: false - uploadFxCop: false - uploadModernCop: false - uploadPoliCheck: true - uploadPREfast: false - uploadRoslyn: false - uploadTSLint: false - uploadAsync: true +- template: assembly-module-compliance.yml@ComplianceRepo + parameters: + # binskim + AnalyzeTarget: '$(Build.ArtifactStagingDirectory)/*.dll' + AnalyzeSymPath: 'SRV*' + # component-governance + sourceScanPath: '$(Build.SourcesDirectory)/PowerShellEditorServices' + # credscan + suppressionsFile: '' + # TermCheck AKA PoliCheck + optionsRulesDBPath: '' + optionsFTPath: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/FileTypeSet.xml' + # tsa-upload + codeBaseName: 'PowerShell_PowerShellEditorServices_20210201' + # selections + APIScan: false From 7d8349486d955bab572c0636fa19bace99a7aa29 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 3 Feb 2021 10:13:23 -0800 Subject: [PATCH 6/8] Point PoliCheck to source subfolder --- .vsts-ci/templates/release-general.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index e4b5077bf..527e00e33 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -61,6 +61,7 @@ steps: # credscan suppressionsFile: '' # TermCheck AKA PoliCheck + targetArgument: '$(Build.SourcesDirectory)/PowerShellEditorServices' optionsRulesDBPath: '' optionsFTPath: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/FileTypeSet.xml' # tsa-upload From 2a7de01b7d48d9a0704fe412a189afadc205695e Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 3 Feb 2021 12:25:48 -0800 Subject: [PATCH 7/8] Exclude .git folder from PoliCheck --- .vsts-ci/templates/release-general.yml | 1 + tools/terms/UserExclusions.xml | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 tools/terms/UserExclusions.xml diff --git a/.vsts-ci/templates/release-general.yml b/.vsts-ci/templates/release-general.yml index 527e00e33..9333e130e 100644 --- a/.vsts-ci/templates/release-general.yml +++ b/.vsts-ci/templates/release-general.yml @@ -62,6 +62,7 @@ steps: suppressionsFile: '' # TermCheck AKA PoliCheck targetArgument: '$(Build.SourcesDirectory)/PowerShellEditorServices' + optionsUEPATH: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/UserExclusions.xml' optionsRulesDBPath: '' optionsFTPath: '$(Build.SourcesDirectory)/PowerShellEditorServices/tools/terms/FileTypeSet.xml' # tsa-upload diff --git a/tools/terms/UserExclusions.xml b/tools/terms/UserExclusions.xml new file mode 100644 index 000000000..f7ff9f7b9 --- /dev/null +++ b/tools/terms/UserExclusions.xml @@ -0,0 +1,12 @@ + + + + + .GIT + + + + + + + From dd839211f0864e44de5d1c09e7d41251b143bcf4 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 3 Feb 2021 13:26:09 -0800 Subject: [PATCH 8/8] Fix issues caught by PoliCheck --- .../Services/PowerShellContext/PowerShellContextService.cs | 4 ++-- .../Debugging/DebugServiceTests.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PowerShellEditorServices/Services/PowerShellContext/PowerShellContextService.cs b/src/PowerShellEditorServices/Services/PowerShellContext/PowerShellContextService.cs index 556d86a6c..eabf76b97 100644 --- a/src/PowerShellEditorServices/Services/PowerShellContext/PowerShellContextService.cs +++ b/src/PowerShellEditorServices/Services/PowerShellContext/PowerShellContextService.cs @@ -635,7 +635,7 @@ public Task GetRunspaceHandleAsync(CancellationToken cancellatio if (shouldCancelReadLine && PromptNest.IsReadLineBusy()) { - // If a ReadLine pipeline is running in the debugger then we'll hang here + // If a ReadLine pipeline is running in the debugger then we'll stop responding here // if we don't cancel it. Typically we can rely on OnExecutionStatusChanged but // the pipeline request won't even start without clearing the current task. this.ConsoleReader?.StopCommandLoop(); @@ -1895,7 +1895,7 @@ private void PowerShellContext_RunspaceChangedAsync(object sender, RunspaceChang // TODO: Refactor this, RunspaceDetails, PowerShellVersion, and PowerShellVersionDetails - // It's crazy that this is 4 different types. + // It's odd that this is 4 different types. // P.S. MinifiedRunspaceDetails use to be called RunspaceDetails... as in, there were 2 DIFFERENT // RunspaceDetails types in this codebase but I've changed it to be minified since the type is // slightly simpler than the other RunspaceDetails. diff --git a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs index c6915186f..fbf70b5f3 100644 --- a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs @@ -1,4 +1,4 @@ -// TODO: Fix these tests which cause the test runner to hang... +// TODO: Fix these tests which cause the test runner to stop responding... // // // // Copyright (c) Microsoft. All rights reserved.