name: Pipeline Segment - Electron Test on: workflow_call: inputs: target-platform: type: string description: 'Platform to run on, can be macos, win or linux' required: true target-arch: type: string description: 'Arch to build for, can be x64, arm64 or arm' required: true test-runs-on: type: string description: 'What host to run the tests on' required: true test-container: type: string description: 'JSON container information for aks runs-on' required: false default: '{"image":null}' is-asan: description: 'Building the Address Sanitizer (ASan) Linux build' required: false type: boolean default: false concurrency: group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }} permissions: contents: read issues: read pull-requests: read env: ELECTRON_OUT_DIR: Default ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }} jobs: test: defaults: run: shell: bash runs-on: ${{ inputs.test-runs-on }} container: ${{ fromJSON(inputs.test-container) }} strategy: fail-fast: false matrix: build-type: ${{ inputs.target-platform == 'macos' && fromJSON('["darwin","mas"]') || (inputs.target-platform == 'win' && fromJSON('["win"]') || fromJSON('["linux"]')) }} shard: ${{ inputs.target-platform == 'linux' && fromJSON('[1, 2, 3]') || fromJSON('[1, 2]') }} env: BUILD_TYPE: ${{ matrix.build-type }} TARGET_ARCH: ${{ inputs.target-arch }} ARTIFACT_KEY: ${{ matrix.build-type }}_${{ inputs.target-arch }} steps: - name: Fix node20 on arm32 runners if: ${{ inputs.target-arch == 'arm' && inputs.target-platform == 'linux' }} run: | cp $(which node) /mnt/runner-externals/node20/bin/ - name: Install Git on Windows arm64 runners if: ${{ inputs.target-arch == 'arm64' && inputs.target-platform == 'win' }} shell: powershell run: | Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) choco install -y --no-progress git.install --params "'/GitAndUnixToolsOnPath'" choco install -y --no-progress git choco install -y --no-progress python --version 3.11.9 choco install -y --no-progress visualstudio2022-workload-vctools --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.ARM64" echo "C:\Program Files\Git\cmd" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append echo "C:\Program Files\Git\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append echo "C:\Python311" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Setup Node.js/npm if: ${{ inputs.target-platform == 'win' }} uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 with: node-version: 20.11.x - name: Add TCC permissions on macOS if: ${{ inputs.target-platform == 'macos' }} run: | configure_user_tccdb () { local values=$1 local dbPath="$HOME/Library/Application Support/com.apple.TCC/TCC.db" local sqlQuery="INSERT OR REPLACE INTO access VALUES($values);" sqlite3 "$dbPath" "$sqlQuery" } configure_sys_tccdb () { local values=$1 local dbPath="/Library/Application Support/com.apple.TCC/TCC.db" local sqlQuery="INSERT OR REPLACE INTO access VALUES($values);" sudo sqlite3 "$dbPath" "$sqlQuery" } userValuesArray=( "'kTCCServiceMicrophone','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159" "'kTCCServiceCamera','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159" "'kTCCServiceBluetoothAlways','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159" ) for values in "${userValuesArray[@]}"; do # Sonoma and higher have a few extra values # Ref: https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-tccdb-macos.sh if [ "$OSTYPE" = "darwin23" ]; then configure_user_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}" configure_sys_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}" else configure_user_tccdb "$values" configure_sys_tccdb "$values" fi done - name: Checkout Electron uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 with: path: src/electron fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - name: Install Dependencies uses: ./src/electron/.github/actions/install-dependencies - name: Get Depot Tools timeout-minutes: 5 run: | git config --global core.filemode false git config --global core.autocrlf false git config --global branch.autosetuprebase always git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git # Ensure depot_tools does not update. test -d depot_tools && cd depot_tools touch .disable_auto_update - name: Add Depot Tools to PATH run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH - name: Load ASan specific environment variables if: ${{ inputs.is-asan == true }} run: | echo "ARTIFACT_KEY=${{ matrix.build-type }}_${{ inputs.target-arch }}_asan" >> $GITHUB_ENV echo "DISABLE_CRASH_REPORTER_TESTS=true" >> $GITHUB_ENV echo "IS_ASAN=true" >> $GITHUB_ENV - name: Download Generated Artifacts uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 with: name: generated_artifacts_${{ env.ARTIFACT_KEY }} path: ./generated_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }} - name: Download Src Artifacts uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 with: name: src_artifacts_${{ env.ARTIFACT_KEY }} path: ./src_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }} - name: Restore Generated Artifacts run: ./src/electron/script/actions/restore-artifacts.sh - name: Unzip Dist, Mksnapshot & Chromedriver (win) if: ${{ inputs.target-platform == 'win' }} shell: powershell run: | Set-ExecutionPolicy Bypass -Scope Process -Force cd src/out/Default Expand-Archive -Force dist.zip -DestinationPath ./ Expand-Archive -Force chromedriver.zip -DestinationPath ./ Expand-Archive -Force mksnapshot.zip -DestinationPath ./ - name: Unzip Dist, Mksnapshot & Chromedriver (unix) if: ${{ inputs.target-platform != 'win' }} run: | cd src/out/Default unzip -:o dist.zip unzip -:o chromedriver.zip unzip -:o mksnapshot.zip - name: Import & Trust Self-Signed Codesigning Cert on MacOS if: ${{ inputs.target-platform == 'macos' && inputs.target-arch == 'x64' }} run: | sudo security authorizationdb write com.apple.trust-settings.admin allow cd src/electron ./script/codesign/generate-identity.sh - name: Install Datadog CLI run: | cd src/electron node script/yarn global add @datadog/datadog-ci - name: Run Electron Tests shell: bash env: MOCHA_REPORTER: mocha-multi-reporters MOCHA_MULTI_REPORTERS: mocha-junit-reporter, tap ELECTRON_DISABLE_SECURITY_WARNINGS: 1 ELECTRON_SKIP_NATIVE_MODULE_TESTS: true DISPLAY: ':99.0' NPM_CONFIG_MSVS_VERSION: '2022' run: | cd src/electron export ELECTRON_TEST_RESULTS_DIR=`pwd`/junit # Get which tests are on this shard tests_files=$(node script/split-tests ${{ matrix.shard }} ${{ inputs.target-platform == 'linux' && 3 || 2 }}) # Run tests if [ "${{ inputs.target-platform }}" != "linux" ]; then echo "About to start tests" if [ "${{ inputs.target-platform }}" = "win" ]; then if [ "${{ inputs.target-arch }}" = "x86" ]; then export npm_config_arch="ia32" fi if [ "${{ inputs.target-arch }}" = "arm64" ]; then export ELECTRON_FORCE_TEST_SUITE_EXIT="true" fi fi node script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files else chown :builduser .. && chmod g+w .. chown -R :builduser . && chmod -R g+w . chmod 4755 ../out/Default/chrome-sandbox runuser -u builduser -- git config --global --add safe.directory $(pwd) if [ "${{ inputs.is-asan }}" == "true" ]; then cd .. ASAN_SYMBOLIZE="$PWD/tools/valgrind/asan/asan_symbolize.py --executable-path=$PWD/out/Default/electron" export ASAN_OPTIONS="symbolize=0 handle_abort=1" export G_SLICE=always-malloc export NSS_DISABLE_ARENA_FREE_LIST=1 export NSS_DISABLE_UNLOAD=1 export LLVM_SYMBOLIZER_PATH=$PWD/third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer export MOCHA_TIMEOUT=180000 echo "Piping output to ASAN_SYMBOLIZE ($ASAN_SYMBOLIZE)" cd electron runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files | $ASAN_SYMBOLIZE else runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files fi fi - name: Upload Test results to Datadog env: DD_ENV: ci DD_SERVICE: electron DD_API_KEY: ${{ secrets.DD_API_KEY }} DD_CIVISIBILITY_LOGS_ENABLED: true DD_TAGS: "os.architecture:${{ inputs.target-arch }},os.family:${{ inputs.target-platform }},os.platform:${{ inputs.target-platform }},asan:${{ inputs.is-asan }}" run: | if ! [ -z $DD_API_KEY ] && [ -f src/electron/junit/test-results-main.xml ]; then export DATADOG_PATH=`node src/electron/script/yarn global bin` $DATADOG_PATH/datadog-ci junit upload src/electron/junit/test-results-main.xml fi if: always() && !cancelled() - name: Wait for active SSH sessions if: always() && !cancelled() shell: bash run: | while [ -f /var/.ssh-lock ] do sleep 60 done