diff --git a/tools/smokes/v2/profiles/integration/apps/phase100_string_accumulator_llvm_exe.sh b/tools/smokes/v2/profiles/integration/apps/phase100_string_accumulator_llvm_exe.sh index 12aa5328..35d3a4c6 100644 --- a/tools/smokes/v2/profiles/integration/apps/phase100_string_accumulator_llvm_exe.sh +++ b/tools/smokes/v2/profiles/integration/apps/phase100_string_accumulator_llvm_exe.sh @@ -1,49 +1,120 @@ #!/bin/bash # Phase 100 P3 - String Accumulator (LLVM EXE backend) +source "$(dirname "$0")/../../../lib/test_runner.sh" +export SMOKES_USE_PYVM=0 +require_env || exit 2 + +# LLVM availability checks (graceful SKIP) +if ! command -v llvm-config-18 &> /dev/null; then + test_skip "llvm-config-18 not found"; exit 0 +fi + +if ! "$NYASH_BIN" --help 2>&1 | grep -q "llvm"; then + test_skip "hakorune --backend llvm not available"; exit 0 +fi + +if ! python3 -c "import llvmlite" 2>/dev/null; then + test_skip "Python llvmlite not found"; exit 0 +fi + +# Phase 97/98 SSOT: plugin dlopen check → build only if needed → dlopen recheck. +FILEBOX_SO="$NYASH_ROOT/plugins/nyash-filebox-plugin/libnyash_filebox_plugin.so" +MAPBOX_SO="$NYASH_ROOT/plugins/nyash-map-plugin/libnyash_map_plugin.so" +STRINGBOX_SO="$NYASH_ROOT/plugins/nyash-string-plugin/libnyash_string_plugin.so" +CONSOLEBOX_SO="$NYASH_ROOT/plugins/nyash-console-plugin/libnyash_console_plugin.so" +INTEGERBOX_SO="$NYASH_ROOT/plugins/nyash-integer-plugin/libnyash_integer_plugin.so" + +check_plugins() { + python3 - "$FILEBOX_SO" "$MAPBOX_SO" "$STRINGBOX_SO" "$CONSOLEBOX_SO" "$INTEGERBOX_SO" <<'PY' +import ctypes +import os +import sys +names = ["FileBox", "MapBox", "StringBox", "ConsoleBox", "IntegerBox"] +paths = sys.argv[1:] +failures = [] +for name, path in zip(names, paths): + if not os.path.isfile(path): + failures.append(f"[plugin/missing] {name}: {path}") + continue + try: + ctypes.CDLL(path) + except Exception as e: # noqa: BLE001 + failures.append(f"[plugin/dlopen] {name}: {path} ({e})") +if failures: + print("\n".join(failures)) + sys.exit(1) +print("OK") +PY +} + +echo "[INFO] Checking plugin artifacts (FileBox/MapBox/StringBox/ConsoleBox/IntegerBox)" +if ! CHECK_OUTPUT=$(check_plugins 2>&1); then + echo "$CHECK_OUTPUT" + echo "[INFO] Missing/broken plugin detected, running build-all (core plugins)" + BUILD_LOG="/tmp/phase100_string_accumulator_plugin_build.log" + if ! bash "$NYASH_ROOT/tools/plugins/build-all.sh" \ + nyash-filebox-plugin nyash-map-plugin nyash-string-plugin nyash-console-plugin nyash-integer-plugin \ + >"$BUILD_LOG" 2>&1; then + echo "[FAIL] tools/plugins/build-all.sh failed for core plugins" + tail -n 80 "$BUILD_LOG" + exit 1 + fi + if ! CHECK_OUTPUT=$(check_plugins 2>&1); then + echo "$CHECK_OUTPUT" + echo "[FAIL] Plugin artifacts still missing or unloadable after build-all" + tail -n 80 "$BUILD_LOG" + exit 1 + fi +fi + +mkdir -p "$NYASH_ROOT/tmp" + +INPUT_HAKO="$NYASH_ROOT/apps/tests/phase100_string_accumulator_min.hako" +OUTPUT_EXE="$NYASH_ROOT/tmp/phase100_string_accumulator_min" + +echo "[INFO] Building: $INPUT_HAKO → $OUTPUT_EXE" + +BUILD_LOG="/tmp/phase100_string_accumulator_build.log" +if ! env NYASH_DISABLE_PLUGINS=0 "$NYASH_ROOT/tools/build_llvm.sh" "$INPUT_HAKO" -o "$OUTPUT_EXE" 2>&1 | tee "$BUILD_LOG"; then + echo "[FAIL] build_llvm.sh failed" + tail -n 80 "$BUILD_LOG" + exit 1 +fi + +if [ ! -x "$OUTPUT_EXE" ]; then + echo "[FAIL] Executable not created or not executable: $OUTPUT_EXE" + ls -la "$OUTPUT_EXE" 2>/dev/null || echo "File does not exist" + exit 1 +fi + +echo "[INFO] Executing: $OUTPUT_EXE" + +set +e +OUTPUT=$(timeout "${RUN_TIMEOUT_SECS:-10}" env NYASH_DISABLE_PLUGINS=0 "$OUTPUT_EXE" 2>&1) +EXIT_CODE=$? set -e -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../../../../.." && pwd)" - -cd "$REPO_ROOT" - -HAKO_FILE="apps/tests/phase100_string_accumulator_min.hako" -EXPECTED_OUTPUT="3" - -# Phase 97 plugin gating pattern -if [ ! -f "target/release/plugins/.dlopen_cache" ]; then - echo "⏭️ SKIP: phase100_string_accumulator_llvm_exe (plugins not built)" - exit 0 -fi - -# Build LLVM exe -if ! tools/build_llvm.sh "$HAKO_FILE" > /tmp/phase100_string_acc_build.log 2>&1; then - echo "⚠️ SKIP: phase100_string_accumulator_llvm_exe (LLVM build failed)" - cat /tmp/phase100_string_acc_build.log | tail -n 20 - exit 0 -fi - -EXE_PATH="/tmp/phase100_string_accumulator_min" - -if [ ! -f "$EXE_PATH" ]; then - echo "❌ FAIL: phase100_string_accumulator_llvm_exe (exe not found)" +if [ "$EXIT_CODE" -ne 0 ]; then + echo "[FAIL] Execution failed with exit code $EXIT_CODE" + echo "$OUTPUT" | tail -n 80 exit 1 fi -# Run exe and extract numeric output -ACTUAL_OUTPUT=$("$EXE_PATH" 2>&1 | grep -v '^\[' | grep -v 'Net plugin' | grep -v 'RC:' | grep -E '^[0-9]+$') +# Extract numeric output only (consistent with other Phase100 LLVM EXE smokes) +CLEAN=$(printf "%s\n" "$OUTPUT" | grep -E '^[0-9]+$' | head -n 1 | tr -d '\r') +EXPECTED="3" -if [ "$ACTUAL_OUTPUT" = "$EXPECTED_OUTPUT" ]; then - echo "✅ PASS: phase100_string_accumulator_llvm_exe" - exit 0 +echo "[INFO] CLEAN output:" +echo "$CLEAN" + +if [ "$CLEAN" = "$EXPECTED" ]; then + test_pass "phase100_string_accumulator_llvm_exe: output matches expected (3)" else - echo "❌ FAIL: phase100_string_accumulator_llvm_exe" - echo "Expected:" - echo "$EXPECTED_OUTPUT" - echo "Got:" - echo "$ACTUAL_OUTPUT" - echo "---Full output (last 80 lines):---" - "$EXE_PATH" 2>&1 | tail -n 80 + echo "[FAIL] Output mismatch" + echo "[INFO] Raw output (tail):" + echo "$OUTPUT" | tail -n 80 + echo "[INFO] Expected:" + printf "%s\n" "$EXPECTED" exit 1 fi