|
Samba 国際化プロジェクト > ビルドファームの詳細
ビルドファームの詳細ビルドファームとは、build.samba.org で管理されている自動テスト実行環境です。 最新のSambaのコードは毎日ビルドファームによって機能のリグレッションがないか 確認されています。 目次自動テストプログラムの必要性今までSamba日本語版での問題点は、バージョンアップでコードに変更が加わったとき、その変更部分が他の機能に与える影響、つまりリグレッションの確認でした。コードの一部分が変わってしまったため、それまで動いていた機能が動かなくなるなど、その確認にかかる負担もSambaの機能拡大に伴って増えていきました。 Samba 3.0からは全ての文字コード変換はiconvで行われるようになったため、オリジナルのSamba 3.0さえ正確に文字コード変換を行っていればどの言語でも動くようになりました。 ところが、Sambaの開発者の大部分は日本語を含むマルチバイト文字の環境を持っていません。これが意味するところは、そういった環境を持たない開発者にとって国際化のバグ修正は、まず第一にバグ自体が発見できない、また発見されても直し方がわからない、最後に直してもテストする方法がない、という非常に労力を伴う作業になります。 もし国際化を確認するための自動テストを作ることができれば、検証に必要な環境を持ち合わせていない人に対しても、まずバグの存在をわかりやすい形で訴えることができます。また、テストに通ることがバグ修正につながるので、コード修正の確認も容易に行えます。 また、一旦自動テストがSamba開発の枠組みに組み込まれれば、将来的にリリースされるコードもこのテストを通っていることとなり、今後のリリースでは最低限の自動テストを通ったという品質が保証されることになります。 Samba のリグレッションテスト
Sambaのソースコードを展開すると、"testsuite" というディレクトリがあり、
その下にはテストスクリプトが格納された複数のディレクトリが存在します。
ただ、"testsuite/build_farm" 以外のディレクトリは未公開バージョンの DejaGNU
を必要とし、これらのテストを行うことは現実的ではありません。
このドキュメントでは、"testsuite/build_farm" に格納されたテストを実行する 方法を解説します。これらのテストは単体では動作せず、samba.org の CVS から取得できる build_test によって構築されたテスト環境で実行する必要があります。 ビルドファームとは自動テスト実行環境であり、CVSに登録されている最新のSambaのソースコードに対して、毎日自動テストを実行しています。 ビルドファームではCVSからのソースコード取得に始まり、configure、build、install、test という一連の動作をチェックします。 当プロジェクトではこの自動テスト環境とSambaのテストプログラムに国際化の対応度をチェックするためテストを追加するのパッチを作成しました。 ビルドファームを構築する方法このテストを実行するにあたり、以下の条件が満たされている必要があります。
glibc と libiconv については、パッチについての詳しい情報が iconvについて にて公開されていますので、 参照してください。 以上の条件が満たされているの確認し、ビルドファームを構築します。 まず、samba-3.0.2a-testsets.tar.gz をダウンロードし、glibc が導入されて いる場合には build_farm_glibc.patch、libiconv が導入されている場合は build_farm_libiconv.patch をダウンロードしてください。 ダウンロード: 次に、パッチをあてるオリジナルのビルドファーム作成スクリプト郡を、 samba.org の CVS から入手します。プロジェクト名は "build_farm" です。 ファイルを入手するには、カレントディレクトリにて下記のコマンドを 実行してください。 $ cvs -d :pserver:cvs@pserver.samba.org:/cvsroot login Password: cvs $ cvs -z5 -d :pserver:cvs@pserver.samba.org:/cvsroot co build_farm 以上のコマンドを入力すると、カレントディレクトリに build_farm ディレクトリが 作成され、ビルドファームを構築するのに必要なファイルが展開されます。 デフォルトのままだと、build.samba.org のマスターサーバと交信を自動的に 行ってしまいます。そこで先ほどダウンロードしたパッチをあて、 スタンド・アローンのビルドファームとして構築します。 ダウンロードしたパッチを、オリジナルのビルドファームに適用するには、 以下のコマンドを実行してください。 $ patch -p0 < build_farm_glibc.patch (build_farm_libiconv.patch) また、テスト前に build_farm ディレクトリ直下に samba のソースコードを 展開、パッチを当てます。ディレクトリの名前は samba と指定します。 $ tar -jxvf samba-3.0.2a.tar.bz2 $ tar -zxvf samba-3.0.2a-testsets.tar.gz $ patch -p0 < samba-3.0.2a-testsets.patch $ mv samba-3.0.2a ./build_farm/samba 一度の複数のテストを同時に実行するときはエラーログが大変大きくなる恐れが あります。samba/testsuite/build_farm/runlist というファイルの中に $TEST_ALL という環境変数が設定されているので、この変数の値を調整することを お勧めします。 特に初めてテストを実行する場合、大量のエラーログを吐いてしまう可能性が あるので注意してください。
以上の準備ができたら、build_test スクリプトを実行します。 $ cd build_farm $ ./build_test テストが終了したら ./build_farm ディレクトリに作成されたログファイルやエラーファイルを参照し、テストが思惑通り実行できたか、テストが全て成功したかの確認を行ってください。
国際化テストの内訳テストに使用したデータに関しては、こちらの 「テストに使用したデータ」 を参照してください。
ビルドファームの構造構築されたビルドファームは以下のようになります。
それぞれのファイル、ディレクトリの説明は以下になります。
また、変数名は以下のようになります。
Sambaに対する新しいテストを加えたい場合は、$testsuite の中に新しいテストファイル <TEST>.test (<TEST> は任意の名前) を追加し、$testsuite/runlist の中にエントリを追加します。 補足資料: 各ファイルの構造このセクションでは、ビルドファームで行われる処理について説明します。 build_testbuild_test.fns をロードして関数を使用可能にします。 generic.fns を実行します。 : . build_test.fns . generic.fns : generic.fnsbuild_test.fns で定義されている test_tree() 関数に対し、 テストを行うプロジェクトのブランチを指定します。 test_tree() 関数の引数は以下のとおりです。 test_tree <project> <source directory> <compiler> [<actions> ...] Samba 3.0 のテストをする場合は以下のようになっています。 test_tree samba source gcc build_test.fnsテストファームの構築やテスト実行などは、このファイルの中で定義されている関数で呼ばれています。 test_tree() 関数実行ユーザ名とホスト名を取得します。 プロジェクトのテストスクリプトの格納ディレクトリを指定します。($testsuite) 取得したソースに対してチェックサムを実行し、以前のビルド時と diff がない場合には処理を終了します。 test_tree で 4 番目以降のパラメータが指定されていない場合には実行する項目として $actions 変数に "configure build install test" が選択されます。 これ以降は実際にテストが行われ、その内容はログへと出力されます。 標準出力は build.<PROJECT>.<HOST>.<COMPILER>.log ($log)、エラー出力は build.<PROJECT>.<HOST>.<COMPILER>.err ($err) へとリダイレクトされます。 それぞれの実行項目に対してソースディレクトリに移動した後、action_$action() 関数を実行します。 test_tree() { log="build.$tree.$host.$compiler.log" err="build.$tree.$host.$compiler.err" sum="build.$tree.$host.$compiler.sum" lck="$test_root/build.$tree.lck" /* Lock がかかっている場合は終了 */ if ! lock_file "$lck"; then return fi /* ユーザ名の取得 */ if [ ! $USER = "" ]; then whoami=$USER else if [ ! $LOGNAME = "" ]; then whoami=$LOGNAME else whoami=build fi fi /* インストール先を指定 */ prefix="$prefix/$tree" /* テストスクリプトの格納ディレクトリ指定 */ testsuite=testsuite/build_farm /* configure のオプション指定 */ config_and_prefix="$config --prefix=$prefix" /* 実行内容を取得 */ actions="$*" if [ "$actions" = "" ]; then actions="configure build install test" fi ( for action in $actions; do srcdir=$test_root/$tree/$source cd $srcdir export srcdir echo Running action $action ( action_$action ) if [ $? != 0 ]; then echo "ACTION FAILED: $action"; break; fi done ) > "$log" 2> "$err" : } action_configure() 関数configure のオプションの prefix を $prefix に指定する以外は、 デフォルトのオプションで configure が実行されます。 action_build() 関数make を行う target を指定します。 Samba 3.0 の場合は proto, everything, torture が実行されます。 action_install() 関数make を行う target を指定します。 Samba 3.0 の場合は proto, everything, torture が実行されます。 action_test() 関数プロジェクト名が samba を含む場合、action_test_samba() を実行します。 action_test_samba() 関数Sambaのテストを実行する関数です。 action_test_samba() { logfile="$prefix/var/log.smbd" LIBSMB_PROG=$prefix/sbin/smbd export LIBSMB_PROG . $test_root/$tree/$testsuite/runlist testlist=$TEST_ALL for test in $testlist; do each_test $test; if [ $tstatus != 0 ]; then totalfailed=`expr $totalfailed + 1`; loglevel=10 each_test $test loglevel=1 fi done echo "contents of $logfile:" cat $logfile echo "FAILED TESTS: $FAILED_TESTS" echo "TEST STATUS: $totalfailed" : } ビルドした smbd のパスを $LIBSMB_PROG 変数に指定します。 $test_root/$tree/$testsuite/runlist から $TEST_ALL 変数をロードします。 $TEST_ALL にはテスト名のリストが指定されていて、each_test() 関数によってそれぞれのテストが実行されます。具体的には、$test_root/$tree/$testsuite にある、<TEST>.test が実行されます。あるテストが失敗すると、ビルドファームはログレベルを10にあげて再度同じテストを実行します。 each_test() 関数引数を受け取り、$test_root/$tree/$testsuite の中の同名のテストスクリプトを各自実行します。テストに失敗したら FAILED TEST としてカウントされます。 runlist
このファイルには $TEST_ALL という変数が定義されており、この変数にはテスト名のリストが指定されています。具体的には、$test_root/$tree/$testsuite にある、 例えば下記のように記述されてあると、 TEST_ALL="basicsmb-sharelist torture-I18N_FILE" 実行されるテストスクリプトは以下の二つになります。
<TEST>.test$test_root/$tree/$testsuite/<TEST>.test は bash スクリプトです。 それぞれのテストは成功すると 0 を返し、それ以外の場合にはエラーを返します。 デフォルトではテスト前に $prefix/lib/ が毎回削除されるため、そのたびに smb.conf などの必要なファイルを testsuite/build_farm/template 以下からインポートし、LMHOSTS を設定します。この処理は basicsmb.fns の template_conf_setup() 関数で 行われています。また、パスワード認証は smbpasswd が使用されていて、 basicsmb.fns の test_smbpasswd() 関数で設定されます。 これらの関数は必需ではありませんが、ほとんどのテストケースではこれらの関数を呼び出して、サーバ環境のセットアップを行っています。 補足資料: 自動テスト実行下におけるsmbdの呼び出しsmbclient などのSMBクライアントがサーバに接続する際、$LIBSMB_PROG 変数が設定されていると、クライアントは cli_connect() 関数実行時に通常の接続ではなく、smbd をフォークプロセスとして起動させ、標準の入出力をこの接続につなげます。 下のコードを参照すると、環境変数が設定されていると sock_exec() 関数を呼んでいることがわかります。
sock_exec() 関数はfork()して新しいプロセスを起動し、親と子供の入出力をパイプでつなげます。他のプロセスからはこのソケットには接続できません。
ビルドファームの環境では $LIBSMB_PROG が定義されているので、SMBクライアントがサーバに接続しようとするたびにテスト環境でビルドした smbd に対して起動、接続することになります。 CVS で取得した build_farm ディレクトリの中の build_test.fns には、テスト実行時には常に $LIBSMB_PROG が指定されています。
もし外部のWindowsサーバを参照するテストを作成したい場合は、この環境変数をリセットし、適切な smb.conf の設定を行ってからテストを実行してください。 なお、ビルドファームでビルドした smbd が参照する smb.conf のデフォルトの格納先は "$prefix/lib/smb.conf" です。
これで、ビルドファームでビルドしたクライアントでも外部サーバを参照することができます。 |
|