2
2
3
3
require "net/imap"
4
4
require "test/unit"
5
- require_relative "fake_server"
6
5
7
6
class IMAPResponseHandlersTest < Test ::Unit ::TestCase
8
- include Net ::IMAP ::FakeServer ::TestHelper
9
7
10
8
def setup
11
- Net ::IMAP . config . reset
12
9
@do_not_reverse_lookup = Socket . do_not_reverse_lookup
13
10
Socket . do_not_reverse_lookup = true
14
11
@threads = [ ]
@@ -23,17 +20,32 @@ def teardown
23
20
end
24
21
25
22
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
31
40
end
32
-
41
+ end
42
+ begin
43
+ responses = [ ]
44
+ imap = Net ::IMAP . new ( server_addr , port : port )
33
45
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
35
47
assert_equal 1 , imap . response_handlers . length
36
- imap . add_response_handler ( -> { responses << [ :proc , _1 ] } )
48
+ imap . add_response_handler ( -> ( r ) { responses << [ :proc , r ] } )
37
49
assert_equal 2 , imap . response_handlers . length
38
50
39
51
imap . noop
@@ -48,6 +60,9 @@ def teardown
48
60
[ :block , Net ::IMAP ::UntaggedResponse , "EXPUNGE" , 3 ] ,
49
61
[ :proc , Net ::IMAP ::UntaggedResponse , "EXPUNGE" , 3 ] ,
50
62
] , responses
63
+ ensure
64
+ imap &.logout
65
+ imap &.disconnect
51
66
end
52
67
end
53
68
@@ -56,14 +71,32 @@ def teardown
56
71
expunges = [ ]
57
72
alerts = [ ]
58
73
untagged = 0
59
- handler0 = -> { greeting ||= _1 }
74
+ handler0 = -> ( r ) { greeting ||= r }
60
75
handler1 = -> ( r ) { alerts << r . data . text if r . data . code . name == "ALERT" rescue nil }
61
76
handler2 = -> ( r ) { expunges << r . data if r . name == "EXPUNGE" }
62
77
handler3 = -> ( r ) { untagged += 1 if r . is_a? ( Net ::IMAP ::UntaggedResponse ) }
63
78
response_handlers = [ handler0 , handler1 , handler2 , handler3 ]
64
79
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
67
100
imap = Net ::IMAP . new ( "localhost" , port : port ,
68
101
response_handlers : response_handlers )
69
102
assert_equal response_handlers , imap . response_handlers
@@ -73,20 +106,29 @@ def teardown
73
106
assert_equal imap . greeting , greeting
74
107
assert_equal 1 , untagged
75
108
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
-
83
109
imap . noop
84
110
assert_equal 4 , untagged
85
111
assert_equal [ 1 , 1 ] , expunges # from handler2
86
112
assert_equal [ "The first alert." , "Did you see the alert?" ] , alerts
87
113
ensure
88
- imap &.logout! unless imap &.disconnected?
114
+ imap &.logout
115
+ imap &.disconnect
89
116
end
90
117
end
91
118
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
92
134
end
0 commit comments