Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
677a454
Fix backend Note steps truncated by YAML comments and add workflow lint
yohannmarguier Jul 16, 2026
bb5050a
Build the MDSplus DD model before running contract_tests
yohannmarguier Jul 16, 2026
b3b67e6
Fail the dedicated UDA tier when the reference server does not start
yohannmarguier Jul 16, 2026
8c06ee4
Restore unit/integration CTest labels on supported CMake versions
yohannmarguier Jul 16, 2026
eb6aebe
Cover unknown backend IDs at the C-ABI factory boundary
yohannmarguier Jul 16, 2026
af30516
Make the dlopen-failure pin safe in assert-enabled builds
yohannmarguier Jul 16, 2026
0a085ab
Parse CTest's real JUnit shape in the dedicated UDA check
yohannmarguier Jul 16, 2026
840dfe2
Add a stored-backend-version drift fixture for HDF5
yohannmarguier Jul 16, 2026
74860e2
Make the UDA version-drift tripwire use a mismatched stored fixture
yohannmarguier Jul 16, 2026
8dbab10
Accept the legitimately empty ids_model.datafile in the model verify …
yohannmarguier Jul 16, 2026
ab6ce4a
Keep the MDSplus version-drift contract test on the public C ABI
yohannmarguier Jul 16, 2026
c677caf
Share the MDSplus/UDA real-DD path catalog (#46)
yohannmarguier Jul 16, 2026
6695ecd
Make UDA AOS traversal detect cursor no-ops
yohannmarguier Jul 16, 2026
d1f6083
Document UDA cache invalidation terminal gap
yohannmarguier Jul 16, 2026
e8056a2
Strengthen UDA timerange capability assertion
yohannmarguier Jul 16, 2026
8edf1d3
Characterize MDSplus real-path delete semantics (#34)
yohannmarguier Jul 17, 2026
df71bb8
Make the equilibrium seed DD-valid and hash structural metadata (#33)
yohannmarguier Jul 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions .github/workflows/contract-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,16 @@ on:

jobs:
contract-functional:
name: Contract tests (Linux, blocking)
name: Contract tests (Linux, ${{ matrix.build_type }}, blocking)
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Both build modes (issue #32): the dlopen-failure plugin pin is
# build-mode dependent — assert-abort death test in Debug, swallowed
# assert tripwire under NDEBUG (RelWithDebInfo) — so each branch needs
# its own leg or one of them never runs anywhere.
build_type: [RelWithDebInfo, Debug]

steps:
- name: Checkout code
Expand All @@ -34,11 +42,16 @@ jobs:
cmake -S . -B build -G Ninja
-DAL_BUILD_TESTS=ON
-DAL_PYTHON_BINDINGS=OFF
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}

- name: Build
run: cmake --build build

# Issue #31: an empty `ctest -L unit` exits 0, so a broken label
# partition is invisible to the test run below — check it explicitly.
- name: Verify unit/integration label partition
run: bash tests/contract/check_label_partition.sh build/tests/contract

- name: Run the whole test suite
working-directory: build
run: ctest --output-on-failure
24 changes: 23 additions & 1 deletion .github/workflows/mdsplus-contract.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,24 @@ jobs:
cmake --build build-mdsplus --target contract_tests -j\$(nproc)
"

- name: Verify baked DD model tree is present (cache-hit and cache-miss paths)
run: |
set -euo pipefail
# ids_model.datafile is legitimately 0 bytes for a model tree (all
# structure lives in .tree/.characteristics; a model carries no
# data), so it is checked for existence only.
for f in ids_model.tree ids_model.characteristics; do
if [ ! -s "build-mdsplus/models/mdsplus/${f}" ]; then
echo "FATAL: missing/empty model file build-mdsplus/models/mdsplus/${f} — the MDSplus tier would fail with %TREE-E-FOPENR (issue #42)"
exit 1
fi
done
if [ ! -e "build-mdsplus/models/mdsplus/ids_model.datafile" ]; then
echo "FATAL: missing model file build-mdsplus/models/mdsplus/ids_model.datafile (issue #42)"
exit 1
fi
echo "Baked DD model tree complete under build-mdsplus/models/mdsplus."

- name: Run MDSplus contract suite
run: >
docker run --rm --platform linux/arm64
Expand All @@ -100,4 +118,8 @@ jobs:

- name: Note
if: always()
run: echo "MDSplus leg is informational (issue #12/#18). Red-by-design until the characterization baseline is triaged; promotion to a blocking gate is Task 3."
# Block scalar, not a plain scalar: in a plain scalar ` #` starts a YAML
# comment even inside shell-looking quotes, truncating the command into
# an unterminated string (issue #43).
run: |
echo "MDSplus leg is informational (issue #12/#18). Red-by-design until the characterization baseline is triaged; promotion to a blocking gate is Task 3."
12 changes: 11 additions & 1 deletion .github/workflows/uda-contract.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,22 @@ jobs:
grep -q "\*\*${dd_version}\*\*" "${header}"
echo "Image stack identifiers match ${header}'s Part 5 pinned-reference-stack table."

# AL_UDA_DEDICATED_CI=1: inside the dedicated reference-stack job a
# server bootstrap failure must fail the job, not skip every test —
# uda-run.sh makes the listener wait and the uda_cli ping fatal, and
# fails unless a nonzero number of UDA tests actually executed
# (issue #41). Developer builds without the flag keep skip semantics.
- name: Run the UDA contract tier
run: >
docker run --rm --platform linux/arm64
-v "$PWD":/workspace -w /workspace
-e AL_UDA_DEDICATED_CI=1
"${IMAGE_TAG}" uda-run.sh

- name: Note
if: always()
run: echo "UDA leg is informational (issue #21/#29). Red-by-design only for un-pinned defects; TRACEABILITY.md Part 5 (issue #28) records the pinned baseline this leg should stay green against."
# Block scalar, not a plain scalar: in a plain scalar ` #` starts a YAML
# comment even inside shell-looking quotes, truncating the command into
# an unterminated string (issue #43).
run: |
echo "UDA leg is informational (issue #21/#29). Red-by-design only for un-pinned defects; TRACEABILITY.md Part 5 (issue #28) records the pinned baseline this leg should stay green against."
27 changes: 27 additions & 0 deletions .github/workflows/workflow-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Workflow lint

# Issue #43: a plain YAML scalar in a `run:` line silently turns ` #` into a
# YAML comment, truncating the shell command (both backend Note steps shipped
# that way). actionlint runs shellcheck over every run: script, so this class
# of truncation fails before push lands instead of turning jobs red at runtime.

on:
push:
paths:
- ".github/workflows/**"
pull_request:
paths:
- ".github/workflows/**"

jobs:
actionlint:
name: actionlint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v7

- name: Run actionlint
run: |
bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -color
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -337,4 +337,14 @@ endif()

if(AL_BUILD_MDSPLUS_MODELS)
add_subdirectory(models/mdsplus)

# The MDSplus contract tier opens pulses against the baked model tree, so
# `cmake --build . --target contract_tests` must build the model too — a
# workflow that builds only contract_tests otherwise runs against an absent
# model and fails with %TREE-E-FOPENR (issue #42). Wired here, after both
# targets exist: tests/ is added before models/mdsplus/, so the dependency
# cannot be declared from tests/contract/CMakeLists.txt.
if(AL_BACKEND_MDSPLUS AND TARGET contract_tests)
add_dependencies(contract_tests al-mdsplus-model)
endif()
endif()
45 changes: 41 additions & 4 deletions docker/uda/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,25 +89,62 @@ fi
sed -i 's/^\( *user *= *\)$/\1root/' "${PREFIX}/etc/xinetd.conf"
xinetd -dontfork -f "${PREFIX}/etc/xinetd.conf" &
XINETD_PID=$!
# Wait for the listener before running the client.
# Wait for the listener before running the client; a server that never comes
# up is a bootstrap failure, not something to paper over — the contract tier
# would GTEST_SKIP() every case and CTest would exit 0 having tested nothing
# (issue #41).
listening=0
for _ in $(seq 1 30); do
if bash -c "exec 3<>/dev/tcp/localhost/56565" 2>/dev/null; then
exec 3>&- 2>/dev/null || true
listening=1
break
fi
sleep 0.5
done
if [ "${listening}" != 1 ]; then
echo "FATAL: UDA server never started listening on localhost:56565 (xinetd pid ${XINETD_PID})"
exit 1
fi
echo "UDA server listening on localhost:56565 (xinetd pid ${XINETD_PID})"
# Sanity ping through UDA's own CLI (independent of IMAS-Core) so a server-side
# failure is distinguishable from a client-side one.
# failure is distinguishable from a client-side one. Fatal: a stack whose own
# CLI cannot talk to the server must not proceed to a CTest run whose UDA cases
# would all skip-and-pass (issue #41).
UDA_HOST=localhost UDA_PORT=56565 "${PREFIX}/bin/uda_cli" \
--host localhost --port 56565 --request "help::help()" >/dev/null 2>&1 \
&& echo "uda_cli help::help() OK" || echo "WARN: uda_cli ping failed (continuing)"
|| { echo "FATAL: uda_cli help::help() ping failed — server unusable"; exit 1; }
echo "uda_cli help::help() OK"

echo "==> [4/4] Running the UDA contract tier"
export UDA_HOST=localhost UDA_PORT=56565
if [ "$#" -gt 0 ]; then
exec "$@"
fi
cd "${BUILD_DIR}/tests/contract"
ctest -L uda --output-on-failure

# Dedicated-CI mode (AL_UDA_DEDICATED_CI=1, set by uda-contract.yml): inside
# the reference-stack job, "server unreachable -> skip" is not a valid green.
# Parse CTest's machine-readable JUnit output and fail unless a nonzero number
# of UDA tests actually executed (issue #41). Ordinary developer builds keep
# the compile-gate/runtime-skip behavior: without the flag nothing changes.
if [ "${AL_UDA_DEDICATED_CI:-0}" = "1" ]; then
results="${BUILD_DIR}/uda-ctest-results.xml"
ctest -L uda --output-on-failure --output-junit "${results}"
# CTest writes the <testsuite> attributes one per line — flatten the file
# before extracting them, and take only the suite header (the <testcase>
# elements carry no tests=/skipped= attributes).
suite_header=$(tr '\n\t' ' ' < "${results}" | grep -o '<testsuite [^>]*>' | head -1)
total=$(printf '%s' "${suite_header}" | grep -o 'tests="[0-9]*"' | head -1 | grep -o '[0-9]*')
skipped=$(printf '%s' "${suite_header}" | grep -o 'skipped="[0-9]*"' | head -1 | grep -o '[0-9]*')
total=${total:-0}
skipped=${skipped:-0}
executed=$((total - skipped))
echo "Dedicated-CI check: ${total} UDA tests selected, ${skipped} skipped, ${executed} executed."
if [ "${executed}" -le 0 ]; then
echo "FATAL: dedicated UDA tier executed zero tests (all skipped or none selected) — the reference stack verified nothing (issue #41)."
exit 1
fi
else
ctest -L uda --output-on-failure
fi
Loading
Loading