diff --git a/.github/actions/spelling/allow/allow.txt b/.github/actions/spelling/allow/allow.txt index fcaaf797a..2efecfc42 100644 --- a/.github/actions/spelling/allow/allow.txt +++ b/.github/actions/spelling/allow/allow.txt @@ -25,6 +25,7 @@ hyperlinks img It'd kje +libfuzzer lje maxed mru @@ -32,6 +33,7 @@ nje ogonek ok'd overlined +pipeline postmodern ptys qof diff --git a/.github/actions/spelling/allow/microsoft.txt b/.github/actions/spelling/allow/microsoft.txt index e6572d671..f65fbe55b 100644 --- a/.github/actions/spelling/allow/microsoft.txt +++ b/.github/actions/spelling/allow/microsoft.txt @@ -33,6 +33,7 @@ MSVC muxc netcore osgvsowi +Onefuzz PFILETIME pgc pgo diff --git a/.github/actions/spelling/expect/web.txt b/.github/actions/spelling/expect/web.txt index f50d31a6e..2bff75ed8 100644 --- a/.github/actions/spelling/expect/web.txt +++ b/.github/actions/spelling/expect/web.txt @@ -14,3 +14,4 @@ appshellintegration cppreference gfycat Guake +azurewebsites diff --git a/.vsconfig b/.vsconfig index 94372a82e..7de08802d 100644 --- a/.vsconfig +++ b/.vsconfig @@ -25,6 +25,7 @@ "Microsoft.VisualStudio.Component.VC.Redist.14.Latest", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", "Microsoft.VisualStudio.Component.VC.Tools.ARM64", + "Microsoft.VisualStudio.Component.VC.ASAN", "Microsoft.VisualStudio.Component.VC.v142.x86.x64", "Microsoft.VisualStudio.Component.VC.v142.ARM64", "Microsoft.VisualStudio.ComponentGroup.UWP.VC", diff --git a/build/pipelines/fuzz.yml b/build/pipelines/fuzz.yml index 61c743acf..6c3a78dcc 100644 --- a/build/pipelines/fuzz.yml +++ b/build/pipelines/fuzz.yml @@ -25,24 +25,21 @@ stages: parameters: platform: x64 - stage: OneFuzz - displayName: OneFuzz + displayName: Submit OneFuzz Job dependsOn: ['Build_Fuzz_Config'] condition: succeeded() pool: vmImage: 'ubuntu-latest' variables: - publishedArtifactsPath: drop - artifactsPath: $(Build.SourcesDirectory)Artifacts - commitSHA1: $(Build.SourceVersion) + artifactName: drop jobs: - job: steps: - task: DownloadBuildArtifacts@0 inputs: - artifactName: $(publishedArtifactsPath) - downloadPath: $(artifactsPath) + artifactName: $(artifactName) + downloadPath: $(Build.ArtifactStagingDirectory) - task: UsePythonVersion@0 - displayName: Setup Python Env inputs: versionSpec: '3.x' addToPath: true @@ -51,8 +48,10 @@ stages: set -ex pip -q install onefuzz onefuzz config --endpoint $(endpoint) --client_id $(client_id) --client_secret $(client_secret) - onefuzz template libfuzzer basic OpenConsole WriteCharsLegacy $(commitSHA1) windows --target_exe $(artifactsPath)/$(publishedArtifactsPath)/Fuzzing/x64/test/OpenConsoleFuzzer.exe + displayName: Configure OneFuzz + - bash: | + onefuzz template libfuzzer basic OpenConsole $(test_name) $(Build.SourceVersion) windows --target_exe $(target_exe_path) displayName: Submit OneFuzz Job env: - client_id: client_id - client_secret: client_secret + target_exe_path: $(Build.ArtifactStagingDirectory)/$(artifactName)/Fuzzing/x64/test/OpenConsoleFuzzer.exe + test_name: WriteCharsLegacy diff --git a/build/pipelines/templates/build-console-fuzzing.yml b/build/pipelines/templates/build-console-fuzzing.yml index 9698ca701..cf26eab89 100644 --- a/build/pipelines/templates/build-console-fuzzing.yml +++ b/build/pipelines/templates/build-console-fuzzing.yml @@ -2,8 +2,6 @@ parameters: configuration: 'Fuzzing' platform: '' additionalBuildArguments: '' - minimumExpectedTestsExecutedCount: 1 # Sanity check for minimum expected tests to be reported - rerunPassesRequiredToAvoidFailure: 0 jobs: - job: Build${{ parameters.platform }}${{ parameters.configuration }} @@ -16,6 +14,90 @@ jobs: # pool: { vmImage: windows-2019 } steps: - - template: build-console-steps.yml - parameters: - additionalBuildArguments: ${{ parameters.additionalBuildArguments }} + - task: PowerShell@2 + displayName: 'Rationalize build platform' + inputs: + targetType: inline + script: | + $Arch = "$(BuildPlatform)" + If ($Arch -Eq "x86") { $Arch = "Win32" } + Write-Host "##vso[task.setvariable variable=RationalizedBuildPlatform]${Arch}" + + - task: PowerShell@2 + displayName: 'Validate binaries are optimized' + condition: eq(variables['pgoBuildMode'], 'Optimize') + inputs: + targetType: inline + script: | + $Binaries = 'OpenConsole.exe', 'WindowsTerminal.exe', 'TerminalApp.dll', 'TerminalConnection.dll', 'Microsoft.Terminal.Control.dll', 'Microsoft.Terminal.Remoting.dll', 'Microsoft.Terminal.Settings.Editor.dll', 'Microsoft.Terminal.Settings.Model.dll' + foreach ($BinFile in $Binaries) + { + & "$(Build.SourcesDirectory)\tools\PGODatabase\verify-pgo.ps1" "$(Build.SourcesDirectory)/bin/$(RationalizedBuildPlatform)/$(BuildConfiguration)/$BinFile" + } + + - task: CopyFiles@2 + displayName: 'Copy result logs to Artifacts' + inputs: + Contents: | + **/*.wtl + **/*onBuildMachineResults.xml + ${{ parameters.testLogPath }} + TargetFolder: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/test' + OverWrite: true + flattenFolders: true + + - task: CopyFiles@2 + displayName: 'Copy *.appx/*.msix to Artifacts (Non-PR builds only)' + inputs: + Contents: | + **/*.appx + **/*.msix + **/*.appxsym + !**/Microsoft.VCLibs*.appx + TargetFolder: '$(Build.ArtifactStagingDirectory)/appx' + OverWrite: true + flattenFolders: true + condition: succeeded() + + - task: CopyFiles@2 + displayName: 'Copy outputs needed for test runs to Artifacts' + inputs: + Contents: | + $(Build.SourcesDirectory)/bin/$(RationalizedBuildPlatform)/$(BuildConfiguration)/*.exe + $(Build.SourcesDirectory)/bin/$(RationalizedBuildPlatform)/$(BuildConfiguration)/*.dll + $(Build.SourcesDirectory)/bin/$(RationalizedBuildPlatform)/$(BuildConfiguration)/*.xml + **/Microsoft.VCLibs.*.appx + **/TestHostApp/*.exe + **/TestHostApp/*.dll + **/TestHostApp/*.xml + !**/*.pdb + !**/*.ipdb + !**/*.obj + !**/*.pch + TargetFolder: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/test' + OverWrite: true + flattenFolders: true + condition: succeeded() + + - task: PublishBuildArtifacts@1 + displayName: 'Publish All Build Artifacts' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'drop' + + - task: CopyFiles@2 + displayName: 'Copy PGO databases needed for PGO instrumentation run' + inputs: + Contents: | + **/*.pgd + TargetFolder: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/PGO/$(BuildPlatform)' + OverWrite: true + flattenFolders: true + condition: and(succeeded(), eq(variables['PGOBuildMode'], 'Instrument')) + + - task: PublishBuildArtifacts@1 + displayName: 'Publish All PGO Artifacts' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/PGO' + ArtifactName: 'PGO' + condition: and(succeeded(), eq(variables['PGOBuildMode'], 'Instrument')) diff --git a/build/pipelines/templates/build-console-steps.yml b/build/pipelines/templates/build-console-steps.yml index a340cc748..d3051ecfc 100644 --- a/build/pipelines/templates/build-console-steps.yml +++ b/build/pipelines/templates/build-console-steps.yml @@ -70,7 +70,7 @@ steps: displayName: 'Check MSIX for common regressions' # PGO runtime needs its own CRT and it's in the package for convenience. # That will make this script mad so skip since we're not shipping the PGO Instrumentation one anyway. - condition: and(ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing')) + condition: ne(variables['PGOBuildMode'], 'Instrument') inputs: targetType: inline script: | @@ -79,7 +79,7 @@ steps: - task: powershell@2 displayName: 'Source Index PDBs' - condition: and(ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing')) + condition: ne(variables['PGOBuildMode'], 'Instrument') inputs: targetType: filePath filePath: build\scripts\Index-Pdbs.ps1 @@ -113,7 +113,7 @@ steps: targetType: filePath filePath: build\scripts\Run-Tests.ps1 arguments: -MatchPattern '*unit.test*.dll' -Platform '$(RationalizedBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}' - condition: and(succeeded(), ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing'), or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86'))) + condition: and(succeeded(), ne(variables['PGOBuildMode'], 'Instrument'), or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86'))) - task: PowerShell@2 displayName: 'Run Feature Tests (x64 only)' @@ -121,7 +121,7 @@ steps: targetType: filePath filePath: build\scripts\Run-Tests.ps1 arguments: -MatchPattern '*feature.test*.dll' -Platform '$(RationalizedBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}' - condition: and(succeeded(), ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing'), eq(variables['BuildPlatform'], 'x64')) + condition: and(succeeded(), ne(variables['PGOBuildMode'], 'Instrument'), eq(variables['BuildPlatform'], 'x64')) - task: PowerShell@2 displayName: 'Convert Test Logs from WTL to xUnit format' @@ -129,11 +129,11 @@ steps: targetType: filePath filePath: build\Helix\ConvertWttLogToXUnit.ps1 arguments: -WttInputPath '${{ parameters.testLogPath }}' -WttSingleRerunInputPath 'unused.wtl' -WttMultipleRerunInputPath 'unused2.wtl' -XUnitOutputPath 'onBuildMachineResults.xml' -TestNamePrefix '$(BuildConfiguration).$(BuildPlatform)' - condition: and(ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing'), or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86'))) + condition: and(ne(variables['PGOBuildMode'], 'Instrument'), or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86'))) - task: PublishTestResults@2 displayName: 'Upload converted test logs' - condition: and(ne(variables['PGOBuildMode'], 'Instrument'), ne(variables['BuildConfiguration'], 'Fuzzing')) + condition: ne(variables['PGOBuildMode'], 'Instrument') inputs: testResultsFormat: 'xUnit' # Options: JUnit, NUnit, VSTest, xUnit, cTest testResultsFiles: '**/onBuildMachineResults.xml' diff --git a/doc/fuzzing.md b/doc/fuzzing.md index 35b5a6daa..883ea51a1 100644 --- a/doc/fuzzing.md +++ b/doc/fuzzing.md @@ -8,8 +8,6 @@ To set up a fuzzer, you'll need an `LLVMFuzzerTestOneInput` function. This serve To build the fuzzer locally, build the OpenConsole solution in the `Fuzzing` configuration. This should output an executable that runs the fuzzer on the provided test case. In the case of PR \#9604, the desired executable is located at `bin\x64\Fuzzing\OpenConsoleFuzzer.exe`. -**NOTE**: If you get an error like `cannot open input file libsancov.lib and clang-rt.fuzzer-x86_64.lib`, install the "C++ AddressSanitizer" via the Visual Studio Installer. - ### Resources - [LibFuzzer Docs](https://www.llvm.org/docs/LibFuzzer.html) - [#9604](https://github.com/microsoft/terminal/pull/9604) @@ -48,7 +46,7 @@ This should also output more information (i.e. job ID) about the newly created j **NOTE**: Our pipeline is already set up with this functionality. However, here is a quick guide on how to get it set up and modify it to our liking. -OneFuzz supports multiple notification systems at once including MS Teams and Azure DevOps. See the resources below to learn more abotu setting these up. +OneFuzz supports multiple notification systems at once including MS Teams and Azure DevOps. See the resources below to learn more about setting these up. ### Resources - [OneFuzz GitHub](https://github.com/microsoft/onefuzz)