遠藤です。

make test-all の以下のエラーについてです。

  1) Error:
test_starttls(IMAPTest):
IOError: closed stream
    /home/mame/work/ruby19/ruby/.ext/common/openssl/buffering.rb:240:in `close'
    /home/mame/work/ruby19/ruby/.ext/common/openssl/buffering.rb:240:in
`sysclose'
    /home/mame/work/ruby19/ruby/.ext/common/openssl/buffering.rb:240:in `close'
    /home/mame/work/ruby19/ruby/lib/net/imap.rb:296:in `disconnect'
    /home/mame/work/ruby19/ruby/test/net/imap/test_imap.rb:189:in
`ensure in starttls_test'
    /home/mame/work/ruby19/ruby/test/net/imap/test_imap.rb:189:in
`starttls_test'
    /home/mame/work/ruby19/ruby/test/net/imap/test_imap.rb:72:in `test_starttls'


このエラーの原因は、lib/rdoc/ri/driver.rb が Hash に method_missing を
定義していることです。

  class Hash # HACK don't add stuff to Hash.
    def method_missing method, *args
      self[method.to_s]
    end

このせいで lib/net/imap.rb の starttls の中の

  begin
    # for backward compatibility
    certs = options.to_str
    options = create_ssl_params(certs, verify)
  rescue NoMethodError
  end

というコードが想定外の動作をします (options がハッシュ) 。


net/imap.rb 側で対処するのは簡単ですが、できれば method_missing を
取り除いた方がいいと思います。OpenStruct を使うように書き直すか、
hash.foo を hash["foo"] に書き換えればよいと思いますが、動的型付けの
Ruby ではいかにも修正漏れが出そうです。rdoc に詳しい人に修正して
ほしいです。


Index: lib/net/imap.rb
===================================================================
--- lib/net/imap.rb	(revision 18104)
+++ lib/net/imap.rb	(working copy)
@@ -333,11 +333,10 @@
     def starttls(options = {}, verify = true)
       send_command("STARTTLS") do |resp|
         if resp.kind_of?(TaggedResponse) && resp.name == "OK"
-          begin
+          if options.respond_to?(:to_str)
             # for backward compatibility
             certs = options.to_str
             options = create_ssl_params(certs, verify)
-          rescue NoMethodError
           end
           start_tls_session(options)
         end


# MVM ができて、ライブラリごとに別の VM を立ててテストを走らせれば
# 解決するのかな。

-- 
Yusuke ENDOH <mame / tsg.ne.jp>