diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2fbe6f63..d5102461 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -122,7 +122,6 @@ jobs: -DMOBILEGL_BUILD_TRACE_REPLAY=OFF \ -DMOBILEGL_BUILD_DISAGGREGATED="${MOBILEGL_CI_DISAGGREGATED}" \ -DMOBILEGL_BUILD_DISAGGREGATED_INPROC="${MOBILEGL_CI_DISAGGREGATED}" \ - -DMOBILEGL_PIPE_PUSH="${MOBILEGL_CI_DISAGGREGATED}" \ -DMOBILEGL_PIPE_VERIFY=OFF \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON \ @@ -198,10 +197,10 @@ jobs: # The pull-library negative control must not consume the primary artifact: # on disaggregation branches that artifact now contains the real transport. build-linux-monolith-control: - name: build monolith controls (pull; push without MG_Remote) + name: build push monolith control (no MG_Remote) runs-on: ubuntu-latest env: - BUILD_DIR: build-monolith-control + BUILD_DIR: build-push-control CCACHE_BASEDIR: ${{ github.workspace }} CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPRESS: "true" @@ -223,7 +222,7 @@ jobs: uses: lukka/get-cmake@v4.3.3 with: cmakeVersion: 3.31.10 - - name: Restore pull compiler cache + - name: Restore compiler cache uses: actions/cache/restore@v5 with: path: .ccache @@ -243,33 +242,14 @@ jobs: run: | sudo apt-get update sudo apt-get install -y ccache clang-20 clang++-20 lld-20 libc++-20-dev libc++abi-20-dev libvulkan-dev libegl1-mesa-dev libgles2-mesa-dev libgl1-mesa-dri mesa-vulkan-drivers ninja-build - - name: Configure explicit pull control - run: | - cmake -S . -B "${BUILD_DIR}" -G Ninja \ - -DCMAKE_C_COMPILER="${MOBILEGL_CI_CC}" -DCMAKE_CXX_COMPILER="${MOBILEGL_CI_CXX}" \ - -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DCMAKE_BUILD_TYPE=Release -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \ - -DMOBILEGL_BUILD_TEST=OFF -DMOBILEGL_BUILD_BENCHMARK=OFF \ - -DMOBILEGL_BUILD_INTEGRATION_TEST=OFF -DMOBILEGL_BUILD_TRACE_REPLAY=OFF \ - -DMOBILEGL_BUILD_DISAGGREGATED=OFF -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=OFF \ - -DMOBILEGL_PIPE_PUSH=OFF -DMOBILEGL_PIPE_VERIFY=OFF \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - - name: Build and identify pull control - run: | - cmake --build "${BUILD_DIR}" --target MobileGL --parallel "$(nproc)" - python3 scripts/ci/runtime_mode_proof.py build --build-dir "${BUILD_DIR}" \ - --mode monolith --output "${BUILD_DIR}/runtime-mode.json" - - name: Prepare packaged test metadata - run: python3 scripts/ci/prepare_test_runtime.py "${BUILD_DIR}" - - # P13 W1: THE PUSH MONOLITH WITHOUT MG_Remote - the shape FCL embeds once the pull build is - # gone (PLAN-P13 §4.1, §4.3; ID-P13-1). Two jobs in one: it is the transport-negative control - # that replaces the pull library in retrace-split (run side by side with it until W2 drops the - # pull build), and its runtime_mode_proof is the zero-MG_Remote-symbol check, one of G1's - # successors (ID-P13-4): a push library that links any MG_Remote symbol is red here. + # THE PUSH MONOLITH WITHOUT MG_Remote - the shape FCL embeds (PLAN-P13 §4.1, §4.3; ID-P13-1). + # Two jobs in one: it is the transport-negative control retrace-split swaps in (P13 W2 retired + # the pull library that used to play that part), and its runtime_mode_proof is the + # zero-MG_Remote-symbol check, one of G1's successors (ID-P13-4): a push library that links + # any MG_Remote symbol is red here. - name: Configure push control without MG_Remote run: | - cmake -S . -B build-push-control -G Ninja \ + cmake -S . -B "${BUILD_DIR}" -G Ninja \ -DCMAKE_C_COMPILER="${MOBILEGL_CI_CC}" -DCMAKE_CXX_COMPILER="${MOBILEGL_CI_CXX}" \ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_BUILD_TYPE=Release -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \ @@ -280,23 +260,24 @@ jobs: -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - name: Build push control and prove it has zero MG_Remote symbols run: | - cmake --build build-push-control --target MobileGL --parallel "$(nproc)" - python3 scripts/ci/runtime_mode_proof.py build --build-dir build-push-control \ - --mode monolith --output build-push-control/runtime-mode.json - python3 - build-push-control/runtime-mode.json <<'PY' + cmake --build "${BUILD_DIR}" --target MobileGL --parallel "$(nproc)" + python3 scripts/ci/runtime_mode_proof.py build --build-dir "${BUILD_DIR}" \ + --mode monolith --output "${BUILD_DIR}/runtime-mode.json" + python3 - "${BUILD_DIR}/runtime-mode.json" <<'PY' import json, sys rows = json.load(open(sys.argv[1]))['production_compilation'] if not rows or any(row['definitions'].get('MOBILEGL_PIPE_PUSH') != '1' for row in rows): sys.exit('::error::the push control was not compiled with MOBILEGL_PIPE_PUSH=1 everywhere') print(f'push control: {len(rows)} production sources compiled with MOBILEGL_PIPE_PUSH=1, zero MG_Remote symbols') PY + - name: Prepare packaged test metadata + run: python3 scripts/ci/prepare_test_runtime.py "${BUILD_DIR}" - - name: Package monolith controls + - name: Package push control run: | tar -czf mobilegl-linux-monolith-control.tgz \ - "${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so" "${BUILD_DIR}/runtime-mode.json" \ - build-push-control/libMobileGL.so build-push-control/runtime-mode.json - - name: Upload pull control + "${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so" "${BUILD_DIR}/runtime-mode.json" + - name: Upload push control uses: actions/upload-artifact@v7 with: name: mobilegl-linux-monolith-control @@ -336,7 +317,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -417,7 +398,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -729,7 +710,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -1004,7 +985,7 @@ jobs: # otherwise also match this label and the monolith one would match both. - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -1479,7 +1460,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -1751,7 +1732,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -2437,7 +2418,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -2538,7 +2519,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -2813,7 +2794,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -3032,7 +3013,7 @@ jobs: - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -3207,22 +3188,22 @@ jobs: name: mobilegl-trace-replay path: . - # The PULL runtime, for the negative control at the end of this job and for nothing else. - - name: Download pull runtime (negative control) + # The push monolith without MG_Remote, for the negative control at the end of this job and for + # nothing else. + - name: Download control runtime (negative control) uses: actions/download-artifact@v8 with: name: mobilegl-linux-monolith-control - path: pull-runtime + path: control-runtime - - name: Unpack the pull runtime (negative control) + - name: Unpack the control runtime (negative control) run: | - tar -xzf pull-runtime/mobilegl-linux-monolith-control.tgz -C pull-runtime - test -f pull-runtime/build-monolith-control/libMobileGL.so - test -f pull-runtime/build-push-control/libMobileGL.so + tar -xzf control-runtime/mobilegl-linux-monolith-control.tgz -C control-runtime + test -f control-runtime/build-push-control/libMobileGL.so - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -3251,7 +3232,7 @@ jobs: # a NAMED failure here rather than a LaunchServer refusal 78 jobs deep. - name: Prepare downloaded test metadata run: | - for root in build-linux build-verify build-split build-verify-split build-retrace pull-runtime/build-monolith-control; do + for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done @@ -3341,7 +3322,7 @@ jobs: # The rerun replays into the same case directory, so the good run's images are put aside and # restored whichever way the control goes; "Upload actual image" below runs `if: always()` # and would otherwise ship the deliberately-wrong run's output under the good run's name. - # THE BODY OF THIS STEP IS scripts/ci/retrace_pull_library_control.sh, for the reason the + # THE BODY OF THIS STEP IS scripts/ci/retrace_transport_control.sh, for the reason the # split lane's control gives: a `run:` block cannot be executed off a runner, so these lines # could not be tested until they ran in CI. scripts/ci/control_smoke_test.sh drives that file. # @@ -3351,34 +3332,21 @@ jobs: # `--no-tests=error` and was read as "the pull library turned it red"; and only "non-zero # ctest" was checked after the nm identity check, so a loader failure, a missing fixture or a # timeout passed it. The red must now carry run_trace_case.cmake's own sentence. - - name: Negative control (pull library) + # P13 W2: THE LIBRARY IS THE PUSH MONOLITH WITHOUT MG_Remote (the shape FCL embeds); until W2 it + # was the pull build, run side by side with this one for a wave (W1) to show both red here for + # the same sentence. What makes the library red is that it has no transport, not that it pulls. + - name: Negative control (library without a transport) working-directory: build-retrace/tools/trace_replay env: CONTROL_TMPDIR: ${{ runner.temp }} - PULL_LIBRARY: ${{ github.workspace }}/pull-runtime/build-monolith-control/libMobileGL.so + CONTROL_LIBRARY: ${{ github.workspace }}/control-runtime/build-push-control/libMobileGL.so FROZEN_LIBRARY: ${{ github.workspace }}/build-linux/libMobileGL.so # The control has to run the arm it is a control FOR. Hard-coded inproc, it would go on # proving something about the other arm while spawn ran unguarded. SPLIT_TRANSPORT: ${{ matrix.transport }} MOBILEGL_IPC_SERVER_PATH: ${{ github.workspace }}/build-linux/libMobileGLServer.so run: >- - bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_pull_library_control.sh" - '${{ matrix.case }}' '${{ matrix.backend }}' - - # P13 W1: THE SAME CONTROL WITH THE PUSH MONOLITH WITHOUT MG_Remote - the library FCL embeds - # after W2, and the successor of the pull library above once W2 drops the pull build. Same - # script and the same evidence sentence: what makes either library red here is that it has no - # transport, not that it pulls. - - name: Negative control (push library without MG_Remote) - working-directory: build-retrace/tools/trace_replay - env: - CONTROL_TMPDIR: ${{ runner.temp }} - PULL_LIBRARY: ${{ github.workspace }}/pull-runtime/build-push-control/libMobileGL.so - FROZEN_LIBRARY: ${{ github.workspace }}/build-linux/libMobileGL.so - SPLIT_TRANSPORT: ${{ matrix.transport }} - MOBILEGL_IPC_SERVER_PATH: ${{ github.workspace }}/build-linux/libMobileGLServer.so - run: >- - bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_pull_library_control.sh" + bash "${GITHUB_WORKSPACE}/scripts/ci/retrace_transport_control.sh" '${{ matrix.case }}' '${{ matrix.backend }}' # EXIT GATE E2's OTHER HALF, and the one BRIEF-P5 §7 E2 actually names: "drop an emission diff --git a/docs/ci/ci-cleanup-log.md b/docs/ci/ci-cleanup-log.md index b357e03d..589c5a0b 100644 --- a/docs/ci/ci-cleanup-log.md +++ b/docs/ci/ci-cleanup-log.md @@ -11,7 +11,8 @@ them wrong. | Date | Check | Workflow / job | Reason | Successor | |---|---|---|---|---| -| — | (none yet) | | | | +| 2026-10-06 | `build explicit pull runtime control` (the pull `libMobileGL.so`, `-DMOBILEGL_PIPE_PUSH=OFF`) | Test / `build-linux-monolith-control` | P13 W2 retires the pull build: CMake defaults to push and nothing ships pull (ID-P13-1) | the same job builds the push monolith without MG_Remote (the FCL shape); its `runtime_mode_proof --mode monolith` is the zero-MG_Remote-symbol check | +| 2026-10-06 | `Negative control (pull library)` | Test / `retrace-split` (every leg) | its library was the pull build above | `Negative control (library without a transport)`: same script (renamed `retrace_transport_control.sh`) and evidence sentence, with the push library without MG_Remote; W1 ran both side by side on every leg | ## Kept after investigation diff --git a/scripts/ci/control_smoke_test.sh b/scripts/ci/control_smoke_test.sh index 379c615b..71063097 100644 --- a/scripts/ci/control_smoke_test.sh +++ b/scripts/ci/control_smoke_test.sh @@ -59,8 +59,8 @@ run_retrace() { # $1 = STUB_MODE local rc=0 env -i PATH="${STUB_DIR}:/usr/bin:/bin" STUB_MODE="$1" \ CTEST=ctest CONTROL_TMPDIR="${WORK}/tmp-$1" \ - PULL_LIBRARY="${WORK}/pull.so" FROZEN_LIBRARY="${WORK}/frozen.so" \ - bash "${HERE}/retrace_pull_library_control.sh" OpenRA DirectGLES || rc=$? + CONTROL_LIBRARY="${WORK}/pull.so" FROZEN_LIBRARY="${WORK}/frozen.so" \ + bash "${HERE}/retrace_transport_control.sh" OpenRA DirectGLES || rc=$? cmp -s "${WORK}/frozen.so" "${WORK}/split.so" || { echo 'F6 FAILED: pull control did not restore the split library'; return 1; } @@ -95,7 +95,7 @@ expect FAILED "E1 observed no real emission" -- run_split e1-no- expect FAILED "E1 incorrectly waits every record" -- run_split e1-waitall echo -echo "=== the retrace lane's pull-library control (scripts/ci/retrace_pull_library_control.sh)" +echo "=== the retrace lane's pull-library control (scripts/ci/retrace_transport_control.sh)" # A pull-shaped library the nm identity check accepts: a real ELF .so defining no MG_Remote symbol. if command -v cc > /dev/null 2>&1; then printf '%s\n' 'int mobilegl_pull_only(void) { return 1; }' > "${WORK}/pull.c" diff --git a/scripts/ci/redcheck_control_smoke_test.sh b/scripts/ci/redcheck_control_smoke_test.sh index 8114e936..eb23282c 100755 --- a/scripts/ci/redcheck_control_smoke_test.sh +++ b/scripts/ci/redcheck_control_smoke_test.sh @@ -14,10 +14,10 @@ HERE="$(cd "$(dirname "$0")" && pwd)" WORK="$(mktemp -d)" || exit 1 HELPER="${HERE}/../../MobileGL/MG_IntegrationTest/Harness/split_log_paths.py" WAIT_HELPER="${HERE}/wait_boundary_negative_control.py" -trap 'cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh"; cp "${WORK}/retrace.orig" "${HERE}/retrace_pull_library_control.sh"; cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh"; cp "${WORK}/helper.orig" "${HELPER}"; cp "${WORK}/wait.orig" "${WAIT_HELPER}"; rm -rf "${WORK}"' EXIT +trap 'cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh"; cp "${WORK}/retrace.orig" "${HERE}/retrace_transport_control.sh"; cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh"; cp "${WORK}/helper.orig" "${HELPER}"; cp "${WORK}/wait.orig" "${WAIT_HELPER}"; rm -rf "${WORK}"' EXIT cp "${HERE}/split_negative_controls.sh" "${WORK}/split.orig" -cp "${HERE}/retrace_pull_library_control.sh" "${WORK}/retrace.orig" +cp "${HERE}/retrace_transport_control.sh" "${WORK}/retrace.orig" cp "${HERE}/retrace_drop_draw_control.sh" "${WORK}/dropdraw.orig" cp "${HELPER}" "${WORK}/helper.orig" cp "${WAIT_HELPER}" "${WORK}/wait.orig" @@ -32,7 +32,7 @@ tail -1 "${WORK}/before.log" echo echo "=== perturbation: remove the evidence check from both controls" -python3 - "${HERE}/split_negative_controls.sh" "${HERE}/retrace_pull_library_control.sh" \ +python3 - "${HERE}/split_negative_controls.sh" "${HERE}/retrace_transport_control.sh" \ "${HERE}/retrace_drop_draw_control.sh" "${WAIT_HELPER}" <<'PY' || exit 1 import sys split, retrace, dropdraw, wait = sys.argv[1:] @@ -135,7 +135,7 @@ fi echo cp "${WORK}/split.orig" "${HERE}/split_negative_controls.sh" -cp "${WORK}/retrace.orig" "${HERE}/retrace_pull_library_control.sh" +cp "${WORK}/retrace.orig" "${HERE}/retrace_transport_control.sh" cp "${WORK}/dropdraw.orig" "${HERE}/retrace_drop_draw_control.sh" cp "${WORK}/wait.orig" "${WAIT_HELPER}" echo "=== ID-62 perturbation: remove only the skip check" diff --git a/scripts/ci/retrace_drop_draw_control.sh b/scripts/ci/retrace_drop_draw_control.sh index cb0c6eca..d749d9eb 100644 --- a/scripts/ci/retrace_drop_draw_control.sh +++ b/scripts/ci/retrace_drop_draw_control.sh @@ -4,7 +4,7 @@ # # WHY THERE IS A SECOND CONTROL ON THIS LANE, and why it is the draws and not the clears. # -# The retrace-split job already carries scripts/ci/retrace_pull_library_control.sh, which swaps a +# The retrace-split job already carries scripts/ci/retrace_transport_control.sh, which swaps a # PULL library in and requires run_trace_case.cmake's transport-resolution assertion to catch it. # That control proves the lane is running a SPLIT library. It does not prove that the PICTURE came # through the wire, and it cannot: OpenRA scores ssim 1.000000 against a monolith library too, so diff --git a/scripts/ci/retrace_pull_library_control.sh b/scripts/ci/retrace_transport_control.sh similarity index 77% rename from scripts/ci/retrace_pull_library_control.sh rename to scripts/ci/retrace_transport_control.sh index 9b55fb1b..9c7d8499 100644 --- a/scripts/ci/retrace_pull_library_control.sh +++ b/scripts/ci/retrace_transport_control.sh @@ -1,7 +1,12 @@ #!/bin/bash -# THE RETRACE-SPLIT LANE'S NEGATIVE CONTROL: a PULL library must red this split retrace. +# THE RETRACE-SPLIT LANE'S NEGATIVE CONTROL: a library WITHOUT A TRANSPORT must red this split retrace. # -# This file is the body of .github/workflows/test.yml's "Negative control (pull library)" step in +# P13 W2: the library is the push monolith without MG_Remote (the shape FCL embeds). Until W2 it was +# the pull build, and this file was retrace_pull_library_control.sh; both libraries were run side by +# side for one wave and both went red here for the same sentence. "pull" below is history: what the +# control needs is a library with no MG_Remote, and the push monolith is one. +# +# This file is the body of .github/workflows/test.yml's "Negative control (library without a transport)" step in # the retrace-split job, extracted for the reason given at the top of # scripts/ci/split_negative_controls.sh: a `run:` block is unreviewable and untestable off a # runner, and scripts/ci/control_smoke_test.sh now runs THIS file rather than a hand-made copy. @@ -33,19 +38,19 @@ # Both are closed below: the selection is counted before the run, and the red must carry # run_trace_case.cmake's own words. # -# Usage: retrace_pull_library_control.sh +# Usage: retrace_transport_control.sh # CTEST ctest binary (default: ctest) # CONTROL_TMPDIR scratch dir (default: ${RUNNER_TEMP:-/tmp}) -# PULL_LIBRARY the pull libMobileGL.so to swap in -# FROZEN_LIBRARY the path every case has baked in, which PULL_LIBRARY is copied over +# CONTROL_LIBRARY the libMobileGL.so without MG_Remote to swap in +# FROZEN_LIBRARY the path every case has baked in, which CONTROL_LIBRARY is copied over set -u -CASE="${1:?usage: retrace_pull_library_control.sh }" -BACKEND="${2:?usage: retrace_pull_library_control.sh }" +CASE="${1:?usage: retrace_transport_control.sh }" +BACKEND="${2:?usage: retrace_transport_control.sh }" CTEST="${CTEST:-ctest}" CONTROL_TMPDIR="${CONTROL_TMPDIR:-${RUNNER_TEMP:-/tmp}}" -PULL_LIBRARY="${PULL_LIBRARY:?PULL_LIBRARY must name the pull build libMobileGL.so}" +CONTROL_LIBRARY="${CONTROL_LIBRARY:?CONTROL_LIBRARY must name a libMobileGL.so built without MG_Remote}" FROZEN_LIBRARY="${FROZEN_LIBRARY:?FROZEN_LIBRARY must name the path the cases have baked in}" mkdir -p "${CONTROL_TMPDIR}" @@ -112,7 +117,7 @@ trap 'exit 130' INT TERM matched=$("${CTEST}" -N -R "${selector}" | grep -cE '^ *Test *#[0-9]+:') if [ "${matched}" -lt 1 ]; then restore_good_output - echo "::error::the control selected ${matched} tests with -R '${selector}', so there is nothing for the pull library to red. --no-tests=error would have exited non-zero on the empty selection and this control used to read that as success (ID-46 finding 8b, measured: ctest exit 8, step green)." + echo "::error::the control selected ${matched} tests with -R '${selector}', so there is nothing for the transport-less library to red. --no-tests=error would have exited non-zero on the empty selection and this control used to read that as success (ID-46 finding 8b, measured: ctest exit 8, step green)." exit 1 fi @@ -120,13 +125,13 @@ fi # in. It defines no MG_Remote symbol, so ConfigLoader has no transport parser and # MOBILEGL_TRANSPORT=inproc is accepted and ignored - the exact shape of "the split lane ran # monolith". -cp "${PULL_LIBRARY}" "${FROZEN_LIBRARY}" || exit 1 +cp "${CONTROL_LIBRARY}" "${FROZEN_LIBRARY}" || exit 1 symbols=$(nm --defined-only "${FROZEN_LIBRARY}") || exit 1 remote_count=$(printf '%s\n' "${symbols}" | grep -ic MG_Remote || true) -echo "pull control library: ${FROZEN_LIBRARY}: MG_Remote=${remote_count}" +echo "transport control library: ${FROZEN_LIBRARY}: MG_Remote=${remote_count}" if [ "${remote_count}" -ne 0 ]; then restore_good_output - echo "::error::the control's own library defines MG_Remote symbols, so it is not a pull build and this control would prove nothing" + echo "::error::the control's own library defines MG_Remote symbols, so it has a transport and this control would prove nothing" exit 1 fi @@ -144,7 +149,7 @@ cat "${out}" restore_good_output if [ "${control_rc}" -eq 0 ]; then - echo "::error::a PULL library passed the split retrace. OpenRA scores ssim 1.000000 under a monolith library too (measured), so the picture is not and cannot be this lane's gate - run_trace_case.cmake's transport-resolution assertion is, and it has stopped working. Every green in this job is then a monolith run under a name that says split." + echo "::error::a library WITHOUT A TRANSPORT passed the split retrace. OpenRA scores ssim 1.000000 under a monolith library too (measured), so the picture is not and cannot be this lane's gate - run_trace_case.cmake's transport-resolution assertion is, and it has stopped working. Every green in this job is then a monolith run under a name that says split." exit 1 fi @@ -159,8 +164,8 @@ fi # so without stripping it first the folded text reads "never 1: reported resolving it" and the # control reds on the very sentence it is looking for (the *-prefixed stub modes). if ! sed -E 's/^[0-9]+: //' "${out}" | tr -s '[:space:]' ' ' | grep -qF "${EVIDENCE}"; then - echo "::error::the split retrace went red (ctest exit ${control_rc}) with the pull library in place, but the failure never says the library did not resolve the transport - neither of run_trace_case.cmake's sentences (\"${EVIDENCE//$'\n'/\" / \"}\") is in the output. A loader failure, a missing fixture, a timeout or an SSIM drop all land here, and none of them establishes that the transport-identity assertion is what caught the pull library. Only 'non-zero ctest' used to be checked (ID-46 finding 8b)." + echo "::error::the split retrace went red (ctest exit ${control_rc}) with the transport-less library in place, but the failure never says the library did not resolve the transport - neither of run_trace_case.cmake's sentences (\"${EVIDENCE//$'\n'/\" / \"}\") is in the output. A loader failure, a missing fixture, a timeout or an SSIM drop all land here, and none of them establishes that the transport-identity assertion is what caught the pull library. Only 'non-zero ctest' used to be checked (ID-46 finding 8b)." exit 1 fi -echo "the pull library turned the split retrace red for its own reason (ctest exit ${control_rc}): ${matched} selected case(s) named the transport, not the picture" +echo "the transport-less library turned the split retrace red for its own reason (ctest exit ${control_rc}): ${matched} selected case(s) named the transport, not the picture"