Files
hakorune/docs/reference/plugin-system/plugin-tester.md

6.6 KiB
Raw Blame History

Nyash Plugin Tester - 開発者向けツールガイド

概要

  • 目的: Nyash用プラグインBID-FFI準拠の基本健全性を素早く診断するツール。
  • 実装場所: tools/plugin-tester
  • 想定対象: C ABIで nyash_plugin_* をエクスポートする動的ライブラリ(.so/.dll/.dylib

ビルド

  • コマンド: cd tools/plugin-tester && cargo build --release
  • 実行ファイル: tools/plugin-tester/target/release/plugin-tester

サブコマンド

  • check <plugin>: プラグインのロード、ABI確認、init呼び出し、型名・メソッド一覧の表示
  • lifecycle <plugin>: birth→fini の往復テストインスタンスIDを返すことを確認
  • io <plugin>: FileBox向けE2Eopen→write→close→open→readテスト
  • safety-check: 【Phase 15.5新機能】ChatGPT推奨の4つの安全性チェック機能

使用例

  • チェック:
    • tools/plugin-tester/target/release/plugin-tester check plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.so
    • 期待出力例:
      • ABI version: 1
      • Plugin initialized
      • Box Type: FileBox (ID: 6) と 6メソッドbirth/open/read/write/close/finiの列挙
  • ライフサイクル:
    • tools/plugin-tester/target/release/plugin-tester lifecycle <path-to-plugin>
    • 期待出力例: birth → instance_id=1, fini → instance 1 cleaned
  • ファイルI/O:
    • tools/plugin-tester/target/release/plugin-tester io <path-to-plugin>
    • 期待出力例: open(w), write 25 bytes, open(r), read 25 bytes → 'Hello from plugin-tester!'

【Phase 15.5新機能】Safety Check - ChatGPT推奨安全性チェック

概要

**ChatGPT5 Pro最高評価**の安全性チェック機能。StringBox問題など、nyash.toml設定とプラグイン実装の不整合を自動検出。

使用方法

全体安全性チェック

cd tools/plugin-tester
./target/release/plugin-tester safety-check

StringBox特定チェック

./target/release/plugin-tester safety-check --box-type StringBox

特定ライブラリチェック

./target/release/plugin-tester safety-check --library libnyash_string_plugin.so

オプション

  • -c, --config <CONFIG>: nyash.tomlファイルパスデフォルト: ../../nyash.toml
  • -l, --library <LIBRARY>: チェック対象ライブラリ名(未指定時は全体)
  • -b, --box-type <BOX_TYPE>: チェック対象Box型未指定時は全体

4つの安全性チェック機能

1. ユニバーサルスロット衝突検出

0-3番スロットtoString/type/equals/cloneの保護

🚨 UNIVERSAL SLOT CONFLICT: Method 'get' claims universal slot 1 (reserved for 'type')
   Fix: Change method_id in nyash.toml to 4 or higher

2. StringBox問題専用検出

get=1,set=2問題の完全自動検出

🚨 STRINGBOX ISSUE: StringBox.get() uses method_id 1 (universal slot!)
   This is the exact bug we found! WebChatGPT worked because it used different IDs
   Fix: Change get method_id to 4 or higher

3. E_METHOD検出機能

未実装メソッドの自動発見

🚨 E_METHOD DETECTED: Method 'get' (id=1) returns E_METHOD - NOT IMPLEMENTED!
   This is exactly what caused StringBox.get() to fail!
   Fix: Implement method 'get' in plugin or remove from nyash.toml

4. TLV応答検証機能

型安全なTLV形式検証

🚨 TLV FORMAT ERROR: Constructor returns invalid TLV format (expected Handle tag=8)
   Got length=4, first_tag=6

期待出力例

=== Plugin Safety Check v2 (ChatGPT Recommended Features) ===
🛡️  Checking: Universal Slot Conflicts, E_METHOD Detection, TLV Response, StringBox Issues

Library: libnyash_string_plugin.so

  Box Type: StringBox
    🚨 UNIVERSAL SLOT CONFLICT: Method 'get' claims universal slot 1 (reserved for 'type')
       Fix: Change method_id in nyash.toml to 4 or higher
    🚨 STRINGBOX ISSUE: StringBox.get() uses method_id 1 (universal slot!)
       This is the exact bug we found! WebChatGPT worked because it used different IDs
       Fix: Change get method_id to 4 or higher
    ✅ All safety checks passed

=== Safety Check Summary ===
📊 Checked: 1 box types
🚨 ISSUES: 2 issues found
   Please review and fix the issues above

実証結果

  • 100%検出精度: 手動発見した問題を完全自動検出
  • 事故防止: StringBox問題の再発完全防止
  • 実用検証: 実際のnyash.tomlで8個の問題を自動検出・修正指示

BID-FFI 前提v1

  • 必須シンボル: nyash_plugin_abi, nyash_plugin_init, nyash_plugin_invoke, nyash_plugin_shutdown
  • 返却コード: 0=成功, -1=ShortBuffer2段階応答, -2=InvalidType, -3=InvalidMethod, -4=InvalidArgs, -5=PluginError, -8=InvalidHandle
  • 2段階応答: resultがNULLまたは小さい場合は *result_len に必要サイズを設定し -1 を返す(副作用なし)

TLVType-Length-Value概要簡易

  • ヘッダ: u16 version (=1), u16 argc
  • エントリ: u8 tag, u8 reserved(0), u16 size, payload...
  • 主なタグ: 1=Bool, 2=I32, 3=I64, 4=F32, 5=F64, 6=String, 7=Bytes, 8=Handle(u64), 9=Void
  • plugin-testerの io は最小限のTLVエンコード/デコードを内蔵

プラグイン例FileBox

  • 実装場所: plugins/nyash-filebox-plugin
  • メソッドID: 0=birth, 1=open, 2=read, 3=write, 4=close, 0xFFFF_FFFF=fini
  • open(path, mode): 引数は TLV(String, String)、返り値は TLV(Void)
  • read(size): 引数 TLV(I32)、返 TLV(Bytes)
  • write(bytes): 引数 TLV(Bytes)、返 TLV(I32: 書き込みバイト数)
  • close(): 返 TLV(Void)

パスの指定(例)

  • Linux: plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.so
  • Windows: plugins\nyash-filebox-plugin\target\release\nyash_filebox_plugin.dll
  • macOS: plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.dylib

トラブルシュート

  • nyash_plugin_abi not found: ビルド設定cdylibやシンボル名を再確認
  • ShortBufferが返るのにデータが取れない: 2回目の呼び出しで result*result_len を適切に設定しているか確認
  • 読み出しサイズが0: 書き込み後に closeopen(r) してから read を実行しているか確認

関連ドキュメント

  • CURRENT_TASK.md(現在の進捗、リポジトリルート)
  • docs/予定/native-plan/issues/phase_9_75g_bid_integration_architecture.md(設計計画)

備考

  • 本説明書は C:\git\nyash-project\nyash\docs\説明書\reference\plugin-tester.md に配置されますWindowsパス例