Files
hakorune/tools/smokes/v2/lib/preflight.sh
Selfhosting Dev 73b90a7c28 feat: スモークテストv2実装&Phase 15.5後のプラグイン対応
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>
2025-09-24 09:30:42 +09:00

278 lines
8.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
}