Ruby-1.8.7_p160 test_system編

現在の状況

  • test_gdbm(test_s_open_create_new)

Windowsでは対応していないファイルモードがあるので放置中

  • test_ssl(test_client_auth)

特定の環境によってECONNRESETが出たりでなかったりなので放置中

上記を除くと通っていないテストは現状1つとなった。

Setting environment for using Microsoft Visual Studio 2005 x86 tools.
E:\ruby-1.8.7-p160\test\ruby>ruby test_system.rb
Loaded suite test_system
Started
.F
Finished in 3.173 seconds.

  1) Failure:
test_system(TestSystem) [test_system.rb:15]:
<"foobar\n"> expected but was
<"Setting environment for using Microsoft Visual Studio 2005 x86 tools.\nfoobar\n">.

2 tests, 2 assertions, 1 failures, 0 errors

見ただけだととんでもない結果になっている。

"Setting environment〜は、以前のエントリで紹介したが、コマンドプロンプトにスタートアップとして登録しているバッチファイルのエコー出力だ。
コマンドプロンプト開始時に実行するコマンドを設定する

どうしてコマンドプロンプトのエコーがパラメタに入り込むのか? 最初はメモリのある領域を壊していると思ったのだが(笑 そうでは無い。

このときのテストコードを見てみよう。

  • test_system.rb
13  def test_system
14    ruby = EnvUtil.rubybin
15    assert_equal("foobar\n", `echo foobar`)

`echo foobar`を囲んでいる文字はシングルクォートではなくバッククォートである。

コマンド出力

例:

`date`
%x{ date }
バッククォート(`)で囲まれた文字列は、ダブルクォートで囲まれた文字列と同様にバックスラッシュ記法 の解釈と式展開 が行なわれた後、コマンドとして実行され、その標準出力が文字列として与えられます。コマンドは評価されるたびに実行されます。コマンドの終了ステータスを得るには、$? を参照します。
リテラル - Rubyリファレンスマニュアル

という訳で、Rubyでは`echo foobar`はコマンドとして評価されるのだ。

Windowsの場合コマンドはcmd.exeになるのでバッククォートで囲まれた文字列が登場する度にcmd.exeが動いて私が登録したvsvars32.batが実行されてコマンドが評価される前に標準出力に出力されたエコーが付加されてしまう。

予想される結果が
"foobar\n"
に対して
"Setting environment for using Microsoft Visual Studio 2005 x86 tools.\nfoobar\n"

となるのも当たり前という訳だ。

当然このままじゃまずいので修正しなくてはならない。いろいろ方法はあると思うが、面倒なので"Setting environment〜をコメントアウトすることにする(コメントでは無いので@echo offでは止められない)

E:\ruby-1.8.7-p160\test\ruby>ruby test_system.rb
Loaded suite test_system
Started
..
Finished in 1.063106 seconds.

2 tests, 13 assertions, 0 failures, 0 errors

おっしゃー。これで最低限必要な拡張ライブラリィを組み込んだ状態で通せる全てのテストが通ったことになるーーと思い最初からテストをやり直したが...

  1) Error:
test_02_collect(TestDRbSSLAry):
DRb::DRbConnError: drbssl://kazzz-pc:52747 - #
    e:/ruby/lib/ruby/1.8/drb/drb.rb:736:in `open'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:729:in `each'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:729:in `open'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1196:in `initialize'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1176:in `new'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1176:in `open'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1092:in `method_missing'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1110:in `with_friend'
    e:/ruby/lib/ruby/1.8/drb/drb.rb:1091:in `method_missing'
    e:/ruby/lib/ruby/1.8/drb/extservm.rb:40:in `service'
    e:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
    e:/ruby/lib/ruby/1.8/drb/extservm.rb:37:in `service'
    E:/ruby-1.8.7-p160/test/drb/drbtest.rb:35:in `ext_service'
    E:/ruby-1.8.7-p160/test/drb/drbtest.rb:34:in `ext_service'
    ./drb/test_drbssl.rb:56:in `setup'

OpenSSLを入れ直したことにより、新たにエラーが発生したらしい。