#!/usr/bin/env bash # Diagnostic only. The published xUnit apphost and observer are self-contained .NET 10.0.14. set -euo pipefail mkdir -p /task/tmp /task/data /task/results /task/control export TMPDIR=/task/tmp XDG_DATA_HOME=/task/data export OTOPCUA_SDK2_SOAK=1 OTOPCUA_SDK2_SOAK_MODE=saturation OTOPCUA_SDK2_SOAK_SECONDS=1800 export OTOPCUA_SDK2_SOAK_OUTPUT=/task/resources.jsonl export OTOPCUA_SDK2_SATURATION_CONTROL=/task/control export OPCUA_CERTIFICATE_LEAK_TRACKING=1 export DOTNET_CLI_TELEMETRY_OPTOUT=1 DOTNET_NOLOGO=1 [[ $(uname -s) == Linux && $(uname -m) == aarch64 && -d /proc/self/fd ]] dotnet --info > /task/controller-runtime.txt vstest_pid= observer_pid= cleanup() { for child in "$vstest_pid" "$observer_pid"; do if [[ -n "$child" ]] && kill -0 "$child" 2>/dev/null; then kill "$child" 2>/dev/null || true; fi done } trap cleanup EXIT dotnet vstest /app/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.dll \ --TestCaseFilter:'FullyQualifiedName~Sdk2LifecycleSoakTests.Descriptor_probe_' \ --ResultsDirectory:/task/results '--Logger:trx;LogFileName=descriptor-controls.trx' > /task/descriptor-controls.log 2>&1 /observer/observer /task/control "$OTOPCUA_SDK2_SATURATION_RUN_ID" > /task/observer.log 2>&1 & observer_pid=$! dotnet vstest /app/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.dll \ --TestCaseFilter:'FullyQualifiedName=ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Repeated_lifecycles_return_resources_to_a_steady_baseline' \ --ResultsDirectory:/task/results '--Logger:trx;LogFileName=saturation.trx' > /task/test.log 2>&1 & vstest_pid=$! observed=0 for attempt in $(seq 1 1200); do if [[ -s /task/resources.jsonl ]]; then target_pid=$(head -n 1 /task/resources.jsonl | sed -n 's/.*"processId":\([0-9]*\),.*/\1/p') [[ -n "$target_pid" ]] target_exe=$(readlink "/proc/$target_pid/exe") [[ "$target_exe" == /app/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests ]] printf 'targetPid=%s\nactualExecutable=%s\n' "$target_pid" "$target_exe" > /task/target-runtime.txt awk '$6 ~ /\/(libcoreclr.so|libhostfxr.so|libhostpolicy.so|System.Private.CoreLib.dll)$/ {print $6}' "/proc/$target_pid/maps" | sort -u >> /task/target-runtime.txt grep -Fx /app/libcoreclr.so /task/target-runtime.txt > /dev/null [[ $(readlink "/proc/$observer_pid/exe") == /observer/observer ]] awk '$6 ~ /\/libcoreclr.so$/ {print $6}' "/proc/$observer_pid/maps" | sort -u > /task/observer-runtime.txt grep -Fx /observer/libcoreclr.so /task/observer-runtime.txt > /dev/null observed=1 break fi kill -0 "$vstest_pid" 2>/dev/null || break sleep 0.1 done [[ "$observed" == 1 ]] set +e wait "$vstest_pid" test_status=$? printf '%s\n' "$test_status" > /task/test-exit-status.txt for attempt in $(seq 1 400); do kill -0 "$observer_pid" 2>/dev/null || break sleep 0.1 done if kill -0 "$observer_pid" 2>/dev/null; then kill "$observer_pid"; fi wait "$observer_pid" observer_status=$? printf '%s\n' "$observer_status" > /task/observer-exit-status.txt # Preserve a cold-cap failure even when diagnostic readiness succeeds. if [[ "$test_status" != 0 ]]; then exit "$test_status"; fi exit "$observer_status"