Dynamic Test Runner 0.0.1

http://shinh.skr.jp/binary/dtr-0.0.1.tar.gz

Binary 2.0 時代のテストツールを書きました。

suite.addTest(test1);
suite.addTest(test2);
suite.addTest(test2);
suite.addTest(test4);

こういうミス、よくやりますよね。 DTR によって煩雑なテスト登録作業から解放されます…なんか珍しく本当に使いものになる気が。

./dtr test/add.o test/zlib.o test/*.a -lz

などとすると .o ファイルやらなんやらの中身を見て dtr_test とかいう文字列が混じっている関数をかたっぱしから実行してまわります。

実装紹介

  • .o とか .a を普通に読み込んでメモリ上に書き出す
  • .so は適当に dlopen しておく
  • .o を libbfd で開いてシンボルテーブル作る、その際シンボルは最初に書き出したメモリを参照するように
  • リロケーションテーブル見て再配置。この際、 __assert_fail の参照は内部の dtr_assert_fail に変更、これによって assert にひっかかっても abort させない。また、 assert 数カウント。(assertを通った回数はカウントできない…あれはマクロだから書きかえられない)
  • 関数に mprotect くらわせて実行できるように
  • テスト関数をかたっぱしから実行、その際 setjmp しておいて assert が起きたら dtr_assert_fail 内から longjmp で復帰
  • 実装は C++ で、ひさびさにメモリリークが無い。
  • Linux, FreeBSD, OSX あたりで動作確認済み

あ、あと、アップルのiMac G5欲しい!すごくほしい。もらったあかつきには OSX-10.2 以前には dlopen がないので…とか、悲惨なレビュー書いてさしあげますよ!

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h