Project

General

Profile

Bug #3318

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

Added by usa (Usaku NAKAMURA) over 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
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
#1

Updated by shugo (Shugo Maeda) over 10 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

#2

Updated by shugo (Shugo Maeda) over 10 years ago

=begin
前田です。

2010年5月19日18:22 Usaku NAKAMURA redmine@ruby-lang.org:

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

#3

Updated by usa (Usaku NAKAMURA) over 10 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, shugo@ruby-lang.org wrote:

2010年5月19日18:22 Usaku NAKAMURA redmine@ruby-lang.org:

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
で # が発生しています。
(で311行目を通っています)
なぜにRuntimeErrorなんでしょう...

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#4

Updated by shugo (Shugo Maeda) over 10 years ago

=begin
前田です。

2010年5月20日15:41 U.Nakamura usa@garbagecollect.jp:

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

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

した方がよいのかも。

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

了解です。

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

311行目の

@receiver_thread.raise(e)

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

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

test_exception_during_shutdownで

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

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

--
Shugo Maeda

=end

#5

Updated by usa (Usaku NAKAMURA) over 10 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, shugo@ruby-lang.org wrote:

311行目の

@receiver_thread.raise(e)

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

まだあんまり真面目に追ってないんですが、306行目の
@sock.shutdown
で # が発生しています。
(で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
で起きてます。

#

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

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

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

Also available in: Atom PDF