Phase 15.5 Core Box削除後の新テストシステム構築: ## 実装内容 - スモークテストv2システム完全実装(3段階プロファイル) - 共通ライブラリ(test_runner/plugin_manager/result_checker/preflight) - インタープリター層完全削除(約350行) - PyVM重要インフラ特化保持戦略(JSON v0ブリッジ専用) - nyash.tomlパス修正(13箇所、プラグイン正常ロード確認) ## 動作確認済み - 基本算術演算(+, -, *, /) - 制御構文(if, loop, break, continue) - 変数代入とスコープ - プラグインロード(20個の.soファイル) ## 既知の問題 - StringBox/IntegerBoxメソッドが動作しない - オブジェクト生成は成功するがメソッド呼び出しでエラー - Phase 15.5影響でプラグイン実装が不完全な可能性 ## ドキュメント - docs/development/testing/smoke-tests-v2.md 作成 - docs/reference/pyvm-usage-guidelines.md 作成 - CODEX_QUESTION.md(Codex相談用)作成 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
278 lines
8.2 KiB
Bash
278 lines
8.2 KiB
Bash
#!/bin/bash
|
||
# preflight.sh - 前処理・環境チェック
|
||
# テスト実行前の統一前処理システム
|
||
|
||
# set -eは使わない(個々のテストが失敗しても全体を続行するため)
|
||
set -uo pipefail
|
||
|
||
# プリフライトチェック実行
|
||
preflight_all() {
|
||
echo "[INFO] Starting preflight checks..." >&2
|
||
|
||
# 基本環境チェック
|
||
if ! preflight_basic_env; then
|
||
echo "[ERROR] Basic environment check failed" >&2
|
||
return 1
|
||
fi
|
||
|
||
# Nyashビルド確認
|
||
if ! preflight_nyash_build; then
|
||
echo "[ERROR] Nyash build check failed" >&2
|
||
return 1
|
||
fi
|
||
|
||
# プラグイン整合性チェック
|
||
if ! preflight_plugins; then
|
||
echo "[ERROR] Plugin integrity check failed" >&2
|
||
return 1
|
||
fi
|
||
|
||
# 依存関係チェック
|
||
if ! preflight_dependencies; then
|
||
echo "[ERROR] Dependency check failed" >&2
|
||
return 1
|
||
fi
|
||
|
||
echo "[INFO] All preflight checks passed ✓" >&2
|
||
return 0
|
||
}
|
||
|
||
# 基本環境チェック
|
||
preflight_basic_env() {
|
||
local required_commands=("cargo" "grep" "jq" "bc" "timeout")
|
||
local missing_commands=()
|
||
|
||
for cmd in "${required_commands[@]}"; do
|
||
if ! command -v "$cmd" &> /dev/null; then
|
||
missing_commands+=("$cmd")
|
||
fi
|
||
done
|
||
|
||
if [ ${#missing_commands[@]} -ne 0 ]; then
|
||
echo "[ERROR] Missing required commands: ${missing_commands[*]}" >&2
|
||
echo "[INFO] Please install missing commands and try again" >&2
|
||
return 1
|
||
fi
|
||
|
||
# ディスク容量チェック(最低1GB)
|
||
local available_mb
|
||
available_mb=$(df . | tail -n1 | awk '{print int($4/1024)}')
|
||
if [ "$available_mb" -lt 1024 ]; then
|
||
echo "[WARN] Low disk space: ${available_mb}MB available" >&2
|
||
echo "[INFO] Recommend at least 1GB for safe operation" >&2
|
||
fi
|
||
|
||
echo "[INFO] Basic environment: OK" >&2
|
||
return 0
|
||
}
|
||
|
||
# Nyashビルド確認
|
||
preflight_nyash_build() {
|
||
local nyash_exe="./target/release/nyash"
|
||
|
||
# バイナリ存在確認
|
||
if [ ! -f "$nyash_exe" ]; then
|
||
echo "[ERROR] Nyash executable not found: $nyash_exe" >&2
|
||
echo "[INFO] Run 'cargo build --release' to build Nyash" >&2
|
||
return 1
|
||
fi
|
||
|
||
# バイナリ実行可能性確認
|
||
if [ ! -x "$nyash_exe" ]; then
|
||
echo "[ERROR] Nyash executable is not executable: $nyash_exe" >&2
|
||
chmod +x "$nyash_exe" 2>/dev/null || true
|
||
if [ ! -x "$nyash_exe" ]; then
|
||
echo "[ERROR] Failed to make executable" >&2
|
||
return 1
|
||
fi
|
||
echo "[INFO] Made Nyash executable" >&2
|
||
fi
|
||
|
||
# 基本動作確認
|
||
if ! "$nyash_exe" --version >/dev/null 2>&1; then
|
||
echo "[ERROR] Nyash version check failed" >&2
|
||
echo "[INFO] Binary may be corrupted, try rebuilding" >&2
|
||
return 1
|
||
fi
|
||
|
||
# バックエンド対応状況確認
|
||
local version_output
|
||
version_output=$("$nyash_exe" --version 2>&1)
|
||
|
||
if echo "$version_output" | grep -q "features.*llvm"; then
|
||
echo "[INFO] LLVM backend: Available" >&2
|
||
else
|
||
echo "[WARN] LLVM backend: Not available in this build" >&2
|
||
fi
|
||
|
||
if echo "$version_output" | grep -q "features.*cranelift"; then
|
||
echo "[INFO] Cranelift JIT: Available" >&2
|
||
else
|
||
echo "[WARN] Cranelift JIT: Not available in this build" >&2
|
||
fi
|
||
|
||
echo "[INFO] Nyash build: OK" >&2
|
||
return 0
|
||
}
|
||
|
||
# プラグイン整合性チェック
|
||
preflight_plugins() {
|
||
# plugin_manager.shから関数をインポート
|
||
local plugin_manager_path
|
||
plugin_manager_path="$(dirname "${BASH_SOURCE[0]}")/plugin_manager.sh"
|
||
|
||
if [ ! -f "$plugin_manager_path" ]; then
|
||
echo "[ERROR] Plugin manager not found: $plugin_manager_path" >&2
|
||
return 1
|
||
fi
|
||
|
||
source "$plugin_manager_path"
|
||
|
||
# プラグイン整合性チェック実行
|
||
if ! check_plugin_integrity; then
|
||
echo "[ERROR] Plugin integrity check failed" >&2
|
||
echo "[INFO] Try rebuilding plugins with: tools/plugin-tester/target/release/plugin-tester build-all" >&2
|
||
return 1
|
||
fi
|
||
|
||
echo "[INFO] Plugin integrity: OK" >&2
|
||
return 0
|
||
}
|
||
|
||
# 依存関係チェック
|
||
preflight_dependencies() {
|
||
# Python LLVM関連チェック(オプション)
|
||
if [ -f "src/llvm_py/llvm_builder.py" ]; then
|
||
if command -v python3 &> /dev/null; then
|
||
if python3 -c "import llvmlite" 2>/dev/null; then
|
||
echo "[INFO] Python LLVM: Available" >&2
|
||
else
|
||
echo "[WARN] Python LLVM: llvmlite not installed" >&2
|
||
echo "[INFO] Install with: pip install llvmlite" >&2
|
||
fi
|
||
else
|
||
echo "[WARN] Python LLVM: python3 not available" >&2
|
||
fi
|
||
fi
|
||
|
||
# プラグインテスター確認(オプション)
|
||
local plugin_tester="tools/plugin-tester/target/release/plugin-tester"
|
||
if [ -f "$plugin_tester" ]; then
|
||
echo "[INFO] Plugin tester: Available" >&2
|
||
else
|
||
echo "[WARN] Plugin tester: Not built" >&2
|
||
echo "[INFO] Build with: cd tools/plugin-tester && cargo build --release" >&2
|
||
fi
|
||
|
||
# Git確認(オプション)
|
||
if command -v git &> /dev/null && [ -d ".git" ]; then
|
||
local git_status
|
||
if git_status=$(git status --porcelain 2>/dev/null) && [ -n "$git_status" ]; then
|
||
echo "[WARN] Git: Working directory has uncommitted changes" >&2
|
||
echo "[INFO] Consider committing changes before running tests" >&2
|
||
else
|
||
echo "[INFO] Git: Working directory clean" >&2
|
||
fi
|
||
fi
|
||
|
||
echo "[INFO] Dependencies: OK" >&2
|
||
return 0
|
||
}
|
||
|
||
# 環境情報出力
|
||
show_environment_info() {
|
||
cat << 'EOF'
|
||
===============================================
|
||
Environment Information
|
||
===============================================
|
||
EOF
|
||
|
||
echo "System: $(uname -a)"
|
||
echo "Working Directory: $(pwd)"
|
||
echo "Date: $(date)"
|
||
echo ""
|
||
|
||
# Cargo情報
|
||
if command -v cargo &> /dev/null; then
|
||
echo "Cargo: $(cargo --version)"
|
||
fi
|
||
|
||
# Rust情報
|
||
if command -v rustc &> /dev/null; then
|
||
echo "Rust: $(rustc --version)"
|
||
fi
|
||
|
||
# Python情報
|
||
if command -v python3 &> /dev/null; then
|
||
echo "Python: $(python3 --version)"
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# Nyash情報
|
||
if [ -f "./target/release/nyash" ]; then
|
||
echo "Nyash: $(./target/release/nyash --version 2>&1 | head -n1)"
|
||
echo "Features: $(./target/release/nyash --version 2>&1 | grep features || echo 'default')"
|
||
fi
|
||
|
||
echo ""
|
||
echo "==============================================="
|
||
}
|
||
|
||
# プリフライト修復
|
||
preflight_repair() {
|
||
echo "[INFO] Attempting automatic repairs..." >&2
|
||
|
||
# Nyashバイナリの実行権限修復
|
||
if [ -f "./target/release/nyash" ] && [ ! -x "./target/release/nyash" ]; then
|
||
chmod +x "./target/release/nyash" 2>/dev/null || true
|
||
echo "[INFO] Fixed Nyash executable permissions" >&2
|
||
fi
|
||
|
||
# プラグイン再ビルド(オプション)
|
||
if [ "${PREFLIGHT_REBUILD_PLUGINS:-0}" = "1" ]; then
|
||
local plugin_tester="tools/plugin-tester/target/release/plugin-tester"
|
||
if [ -f "$plugin_tester" ]; then
|
||
echo "[INFO] Rebuilding plugins..." >&2
|
||
if "$plugin_tester" build-all 2>/dev/null; then
|
||
echo "[INFO] Plugin rebuild completed" >&2
|
||
else
|
||
echo "[WARN] Plugin rebuild failed" >&2
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
echo "[INFO] Repair attempts completed" >&2
|
||
}
|
||
|
||
# 使用例とヘルプ
|
||
show_preflight_help() {
|
||
cat << 'EOF'
|
||
Preflight Checker for Smoke Tests v2
|
||
|
||
Usage:
|
||
source lib/preflight.sh
|
||
|
||
Functions:
|
||
preflight_all - Run all preflight checks
|
||
preflight_basic_env - Check basic environment
|
||
preflight_nyash_build - Check Nyash build
|
||
preflight_plugins - Check plugin integrity
|
||
preflight_dependencies - Check optional dependencies
|
||
show_environment_info - Display environment info
|
||
preflight_repair - Attempt automatic repairs
|
||
|
||
Environment Variables:
|
||
PREFLIGHT_REBUILD_PLUGINS=1 - Auto-rebuild plugins during repair
|
||
|
||
Examples:
|
||
# Full preflight check
|
||
source lib/preflight.sh && preflight_all
|
||
|
||
# Show environment info
|
||
source lib/preflight.sh && show_environment_info
|
||
|
||
# Repair with plugin rebuild
|
||
PREFLIGHT_REBUILD_PLUGINS=1 source lib/preflight.sh && preflight_repair
|
||
EOF
|
||
} |