Project

General

Profile

Actions

Bug #3318

closed

net/imap/test_imap.rb reports an error on Windows

Added by usa (Usaku NAKAMURA) over 14 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3dev (2010-05-19 trunk 27889) [i386-mswin32]
Backport:
[ruby-dev:41350]

Description

=begin
imapのテストが以下のようなエラーを出します。

  1. Error:
    test_idle_done_not_during_idle(IMAPTest):
    IOError: closed stream
    C:/ruby/test/net/imap/test_imap.rb:283:in `test_idle_done_not_during_idle'

以下のパッチで問題は出なくなるんですが、これでいいんでしょうか?
実はsocketレベルに問題がありそうだったりしますか?

Index: lib/net/imap.rb

--- lib/net/imap.rb (revision 27889)
+++ lib/net/imap.rb (working copy)
@@ -311,7 +311,7 @@ module Net
@receiver_thread.raise(e)
end
@receiver_thread.join

  •  @sock.close
    
  •  @sock.close unless @sock.closed?
     raise e if e
    
    end
    =end
Actions #1

Updated by shugo (Shugo Maeda) over 14 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r27903.
Usaku, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions #2

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2010年5月19日18:22 Usaku NAKAMURA :

imapのテストが以下のようなエラーを出します。

  1. Error:
    test_idle_done_not_during_idle(IMAPTest):
    IOError: closed stream
    C:/ruby/test/net/imap/test_imap.rb:283:in `test_idle_done_not_during_idle'

以下のパッチで問題は出なくなるんですが、これでいいんでしょうか?

r27903で修正してみましたがどうでしょうか。

synchronizeするようにしましたが、closed?をチェックせずにcloseしてIOErrorをrescue

した方がよいのかも。

実はsocketレベルに問題がありそうだったりしますか?

311行目の

@receiver_thread.raise(e)

あたりを通っている気がするのですが、どんな例外が発生しているか教えて
いただけると何かわかるかもしれません。

--
Shugo Maeda

=end

Actions #3

Updated by usa (Usaku NAKAMURA) over 14 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41360] Re: [Bug #3318] net/imap/test_imap.rb reports an error on Windows"
on May.19,2010 23:27:37, wrote:

2010年5月19日18:22 Usaku NAKAMURA :

imapのテストが以下のようなエラーを出します。

  1. Error:
    test_idle_done_not_during_idle(IMAPTest):
    IOError: closed stream
    C:/ruby/test/net/imap/test_imap.rb:283:in `test_idle_done_not_during_idle'

以下のパッチで問題は出なくなるんですが、これでいいんでしょうか?

r27903で修正してみましたがどうでしょうか。

synchronizeするようにしましたが、closed?をチェックせずにcloseしてIOErrorをrescue

した方がよいのかも。

とりあえず、テストの失敗自体はなくなりました。
ありがとうございます。

実はsocketレベルに問題がありそうだったりしますか?

311行目の

@receiver_thread.raise(e)

あたりを通っている気がするのですが、どんな例外が発生しているか教えて
いただけると何かわかるかもしれません。

まだあんまり真面目に追ってないんですが、306行目の
@sock.shutdown
で #<RuntimeError: error> が発生しています。
(で311行目を通っています)
なぜにRuntimeErrorなんでしょう...

それでは。

U.Nakamura

=end

Actions #4

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2010年5月20日15:41 U.Nakamura :

r27903で修正してみましたがどうでしょうか。

synchronizeするようにしましたが、closed?をチェックせずにcloseしてIOErrorをrescue

した方がよいのかも。

とりあえず、テストの失敗自体はなくなりました。
ありがとうございます。

了解です。

実はsocketレベルに問題がありそうだったりしますか?

311行目の

@receiver_thread.raise(e)

あたりを通っている気がするのですが、どんな例外が発生しているか教えて
いただけると何かわかるかもしれません。

まだあんまり真面目に追ってないんですが、306行目の
@sock.shutdown
で #<RuntimeError: error> が発生しています。
(で311行目を通っています)
なぜにRuntimeErrorなんでしょう...

test_exception_during_shutdownで

       def @sock.shutdown(*args)
         super
         raise "error"
       end

とかしてるんですけど、WindowsだとTCPSocketのインスタンスが使い回され
ていたりとか…ってことはないですよね。
うーん、何でだろう。

--
Shugo Maeda

=end

Actions #5

Updated by usa (Usaku NAKAMURA) over 14 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41371] Re: [Bug #3318] net/imap/test_imap.rb reports an error on Windows"
on May.20,2010 16:50:31, wrote:

311行目の

@receiver_thread.raise(e)

あたりを通っている気がするのですが、どんな例外が発生しているか教えて
いただけると何かわかるかもしれません。

まだあんまり真面目に追ってないんですが、306行目の
@sock.shutdown
で #<RuntimeError: error> が発生しています。
(で311行目を通っています)
なぜにRuntimeErrorなんでしょう...

test_exception_during_shutdownで

      def @sock.shutdown(*args)
        super
        raise "error"
      end

とかしてるんですけど、WindowsだとTCPSocketのインスタンスが使い回され
ていたりとか…ってことはないですよね。
うーん、何でだろう。

うわ、すみません、間違った出力を見てました orz
まさにそのtest_exception_during_shutdownで期待通りの例外が起
きてるところを間違えて追ってました...

で、改めて、test_idle_done_not_during_idleの方ですが、正常に
期待されるパスを通って、問題の @sock.close にまで辿りついてい
ました。
ではどこでcloseされてるかというと、net/imap.rbの1039行目、
receive_responses内のrescueのところです。
で、そのrescueに入る原因となった例外は1110行目、get_response
で起きてます。

#<Errno::ESHUTDOWN: ソケットが以前のシャットダウンの呼び出しでシャットダウンされているため、データの送受信を要求することは禁じられています。>

いやあwinsockの出すメッセージはわかりやすい

というわけで、disconnect内でshutdownを実行した時点では別スレ
ッドのget_responseがまだ実行中であるということになりますが、
このテスト的にそれが正しいかどうかが怪しいということになるん
でしょうかね?

それでは。

U.Nakamura

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0