22
33require "net/imap"
44require "test/unit"
5- require_relative "fake_server"
65
76class IMAPResponseHandlersTest < Test ::Unit ::TestCase
8- include Net ::IMAP ::FakeServer ::TestHelper
97
108 def setup
11- Net ::IMAP . config . reset
129 @do_not_reverse_lookup = Socket . do_not_reverse_lookup
1310 Socket . do_not_reverse_lookup = true
1411 @threads = [ ]
@@ -23,17 +20,32 @@ def teardown
2320 end
2421
2522 test "#add_response_handlers" do
26- responses = [ ]
27- with_fake_server do |server , imap |
28- server . on ( "NOOP" ) do |resp |
29- 3 . times do resp . untagged ( "#{ _1 + 1 } EXPUNGE" ) end
30- resp . done_ok
23+ server = create_tcp_server
24+ port = server . addr [ 1 ]
25+ start_server do
26+ sock = server . accept
27+ Timeout . timeout ( 5 ) do
28+ sock . print ( "* OK connection established\r \n " )
29+ sock . gets # => NOOP
30+ sock . print ( "* 1 EXPUNGE\r \n " )
31+ sock . print ( "* 2 EXPUNGE\r \n " )
32+ sock . print ( "* 3 EXPUNGE\r \n " )
33+ sock . print ( "RUBY0001 OK NOOP completed\r \n " )
34+ sock . gets # => LOGOUT
35+ sock . print ( "* BYE terminating connection\r \n " )
36+ sock . print ( "RUBY0002 OK LOGOUT completed\r \n " )
37+ ensure
38+ sock . close
39+ server . close
3140 end
32-
41+ end
42+ begin
43+ responses = [ ]
44+ imap = Net ::IMAP . new ( server_addr , port : port )
3345 assert_equal 0 , imap . response_handlers . length
34- imap . add_response_handler do responses << [ :block , _1 ] end
46+ imap . add_response_handler do | r | responses << [ :block , r ] end
3547 assert_equal 1 , imap . response_handlers . length
36- imap . add_response_handler ( -> { responses << [ :proc , _1 ] } )
48+ imap . add_response_handler ( -> ( r ) { responses << [ :proc , r ] } )
3749 assert_equal 2 , imap . response_handlers . length
3850
3951 imap . noop
@@ -48,6 +60,9 @@ def teardown
4860 [ :block , Net ::IMAP ::UntaggedResponse , "EXPUNGE" , 3 ] ,
4961 [ :proc , Net ::IMAP ::UntaggedResponse , "EXPUNGE" , 3 ] ,
5062 ] , responses
63+ ensure
64+ imap &.logout
65+ imap &.disconnect
5166 end
5267 end
5368
@@ -56,14 +71,32 @@ def teardown
5671 expunges = [ ]
5772 alerts = [ ]
5873 untagged = 0
59- handler0 = -> { greeting ||= _1 }
74+ handler0 = -> ( r ) { greeting ||= r }
6075 handler1 = -> ( r ) { alerts << r . data . text if r . data . code . name == "ALERT" rescue nil }
6176 handler2 = -> ( r ) { expunges << r . data if r . name == "EXPUNGE" }
6277 handler3 = -> ( r ) { untagged += 1 if r . is_a? ( Net ::IMAP ::UntaggedResponse ) }
6378 response_handlers = [ handler0 , handler1 , handler2 , handler3 ]
6479
65- run_fake_server_in_thread do |server |
66- port = server . port
80+ server = create_tcp_server
81+ port = server . addr [ 1 ]
82+ start_server do
83+ sock = server . accept
84+ Timeout . timeout ( 5 ) do
85+ sock . print ( "* OK connection established\r \n " )
86+ sock . gets # => NOOP
87+ sock . print ( "* 1 EXPUNGE\r \n " )
88+ sock . print ( "* 1 EXPUNGE\r \n " )
89+ sock . print ( "* OK [ALERT] The first alert.\r \n " )
90+ sock . print ( "RUBY0001 OK [ALERT] Did you see the alert?\r \n " )
91+ sock . gets # => LOGOUT
92+ sock . print ( "* BYE terminating connection\r \n " )
93+ sock . print ( "RUBY0002 OK LOGOUT completed\r \n " )
94+ ensure
95+ sock . close
96+ server . close
97+ end
98+ end
99+ begin
67100 imap = Net ::IMAP . new ( "localhost" , port : port ,
68101 response_handlers : response_handlers )
69102 assert_equal response_handlers , imap . response_handlers
@@ -73,20 +106,29 @@ def teardown
73106 assert_equal imap . greeting , greeting
74107 assert_equal 1 , untagged
75108
76- server . on ( "NOOP" ) do |resp |
77- resp . untagged "1 EXPUNGE"
78- resp . untagged "1 EXPUNGE"
79- resp . untagged "OK [ALERT] The first alert."
80- resp . done_ok "[ALERT] Did you see the alert?"
81- end
82-
83109 imap . noop
84110 assert_equal 4 , untagged
85111 assert_equal [ 1 , 1 ] , expunges # from handler2
86112 assert_equal [ "The first alert." , "Did you see the alert?" ] , alerts
87113 ensure
88- imap &.logout! unless imap &.disconnected?
114+ imap &.logout
115+ imap &.disconnect
89116 end
90117 end
91118
119+ def start_server
120+ th = Thread . new do
121+ yield
122+ end
123+ @threads << th
124+ sleep 0.1 until th . stop?
125+ end
126+
127+ def create_tcp_server
128+ return TCPServer . new ( server_addr , 0 )
129+ end
130+
131+ def server_addr
132+ Addrinfo . tcp ( "localhost" , 0 ) . ip_address
133+ end
92134end
0 commit comments