Skip to content

Give the socket tests a thread pool that can answer them (#740) #81

Give the socket tests a thread pool that can answer them (#740)

Give the socket tests a thread pool that can answer them (#740) #81

Workflow file for this run

name: Test
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
# Cancel in-progress runs if a new push lands on the same branch.
concurrency:
group: test-${{ github.ref }}
cancel-in-progress: true
env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_NOLOGO: true
jobs:
windows:
name: windows
runs-on: windows-latest
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
# A plain build is also the pack step: ProjectDefaults sets GeneratePackageOnBuild for every
# Release package project, so this produces ./nugets as a side effect.
- name: Build
run: dotnet build src --configuration Release
- name: Test
run: dotnet test --solution src/DiffEngine.slnx --configuration Release --no-build --no-restore
- name: AOT publish
run: dotnet publish src/DiffEngine.AotTests/DiffEngine.AotTests.csproj --configuration Release
- name: Upload received on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: received-windows
path: '**/*.received.*'
if-no-files-found: ignore
retention-days: 14
- name: Upload packages
if: success()
uses: actions/upload-artifact@v4
with:
name: nupkgs
path: nugets/*.nupkg
if-no-files-found: warn
retention-days: 30
unix:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
# macOS is pinned rather than latest, because it carries committed pixel baselines and
# Core Text rasterisation moves between OS versions. Same image build-native uses.
os: [ubuntu-latest, macos-14]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
# raylib links against X11, GL and friends. xvfb plus the Mesa software rasteriser are what
# the pixel snapshots run against.
- name: Install native dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
cmake ninja-build \
libx11-dev libxrandr-dev libxi-dev libxcursor-dev libxinerama-dev \
libgl1-mesa-dev libglu1-mesa-dev libwayland-dev libxkbcommon-dev \
xvfb libgl1-mesa-dri
# CMake fetches raylib and imgui, so without this every PR re-clones and recompiles them.
# Keyed on the shim's own sources, which is what actually changes.
- name: Cache native build
if: runner.os == 'Linux'
uses: actions/cache@v4
with:
path: native/build
key: native-linux-x64-${{ hashFiles('native/CMakeLists.txt', 'native/src/**', 'native/include/**') }}
# Built here rather than taken from the committed binaries, so the Linux job tests the
# current native source and the pixel baselines track it.
- name: Build native renderer
if: runner.os == 'Linux'
run: |
cmake -S native -B native/build/linux-x64 -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build native/build/linux-x64
mkdir -p src/DiffEngineViewer.Linux/runtimes/linux-x64/native
cp native/build/linux-x64/libdiffengine_viewer.so src/DiffEngineViewer.Linux/runtimes/linux-x64/native/
# Release-NotWindows drops the WinForms tray and its tests from the solution.
- name: Build
run: dotnet build src --configuration Release-NotWindows
- name: Test
run: dotnet test --solution src/DiffEngine.slnx --configuration Release-NotWindows --no-build --no-restore
# Pinned to one rasteriser rather than one platform: llvmpipe is pure software and so more
# reproducible than any GPU driver, and ImGui rasterises glyphs itself.
- name: Pixel snapshots
if: runner.os == 'Linux'
env:
DIFFENGINE_VIEWER_PIXEL_TESTS: 'true'
LIBGL_ALWAYS_SOFTWARE: '1'
GALLIUM_DRIVER: llvmpipe
# Release, not Release-NotWindows: that is a solution level configuration which the slnx
# maps to a project configuration of Release, so the output lives in bin/Release. Naming
# the solution configuration here points at a directory that never exists.
run: >
xvfb-run -a --server-args="-screen 0 1920x1080x24"
dotnet test src/DiffEngineViewer.Tests/DiffEngineViewer.Tests.csproj
--configuration Release --no-build --no-restore
# No xvfb and no GL flags: deview_capture on this platform draws into a bitmap context of its
# own making, so it needs neither a window nor a window server. Determinism is pinned inside
# that call rather than by the environment.
- name: Pixel snapshots
if: runner.os == 'macOS'
env:
DIFFENGINE_VIEWER_PIXEL_TESTS: 'true'
run: >
dotnet test src/DiffEngineViewer.Tests/DiffEngineViewer.Tests.csproj
--configuration Release --no-build --no-restore
- name: Upload received on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: received-${{ matrix.os }}
path: '**/*.received.*'
if-no-files-found: ignore
retention-days: 14
# The jobs above only ever load the x64 natives, and the Linux one rebuilds its own from source.
# This job exists so the arm64 binaries are actually loaded somewhere, which is what catches a
# wrong architecture, a file corrupted by a text mode checkout, or an unsatisfied runtime
# dependency.
#
# It runs DiffEngineViewer.Tests rather than the whole suite: that is where the native smoke test
# lives, it takes seconds, and it gives the screen and IPC tests some cross architecture coverage
# for free.
native:
name: native ${{ matrix.rid }}
runs-on: ${{ matrix.os }}
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
include:
# osx-x64 has no entry: GitHub's Intel macOS runners are being retired and a job
# targeting one now sits queued indefinitely. Both macOS RIDs ship the same universal
# dylib, so loading it here covers the arm64 slice and the step below checks that the
# x86_64 slice is present.
#
# No Windows entry either, since that head renders with WinForms and loads nothing.
- rid: osx-arm64
os: macos-14
- rid: linux-arm64
os: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
# Runtime libraries only, not the -dev packages: the shim links X11 and GL, so loading it
# needs them present even though nothing here opens a window.
- name: Install runtime dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libx11-6 libxrandr2 libxi6 libxcursor1 libxinerama1 libgl1 libglx-mesa0
# The runtime load above only exercises the arm64 slice. Assert the x86_64 one is there too,
# since osx-x64 ships this identical file and cannot be loaded anywhere in CI.
- name: Check the macOS dylib is universal
if: matrix.rid == 'osx-arm64'
run: |
for rid in osx-arm64 osx-x64; do
dylib="src/DiffEngineViewer.Mac/runtimes/$rid/native/libdiffengine_viewer.dylib"
archs=$(lipo -archs "$dylib")
echo "$rid: $archs"
for arch in x86_64 arm64; do
case " $archs " in
*" $arch "*) ;;
*) echo "::error::$dylib is missing the $arch slice"; exit 1 ;;
esac
done
done
- name: Test
run: dotnet test src/DiffEngineViewer.Tests/DiffEngineViewer.Tests.csproj --configuration Release
- name: Upload received on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: received-${{ matrix.rid }}
path: '**/*.received.*'
if-no-files-found: ignore
retention-days: 14