eventmachine 0.12.6-x86-mswin32-60 → 0.12.8-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{docs/README → README} +21 -13
- data/Rakefile +14 -4
- data/docs/DEFERRABLES +0 -5
- data/docs/INSTALL +2 -4
- data/docs/LEGAL +1 -1
- data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
- data/docs/PURE_RUBY +0 -2
- data/docs/RELEASE_NOTES +0 -2
- data/docs/SMTP +0 -7
- data/docs/SPAWNED_PROCESSES +0 -4
- data/docs/TODO +0 -2
- data/eventmachine.gemspec +41 -32
- data/examples/ex_channel.rb +43 -0
- data/examples/ex_queue.rb +2 -0
- data/examples/helper.rb +2 -0
- data/ext/cmain.cpp +685 -586
- data/ext/cplusplus.cpp +15 -6
- data/ext/ed.cpp +1732 -1522
- data/ext/ed.h +407 -380
- data/ext/em.cpp +2263 -1937
- data/ext/em.h +223 -186
- data/ext/eventmachine.h +111 -98
- data/ext/eventmachine_cpp.h +1 -0
- data/ext/extconf.rb +4 -0
- data/ext/kb.cpp +81 -82
- data/ext/pipe.cpp +349 -351
- data/ext/project.h +21 -0
- data/ext/rubymain.cpp +1047 -847
- data/ext/ssl.cpp +38 -1
- data/ext/ssl.h +5 -1
- data/java/src/com/rubyeventmachine/Application.java +7 -3
- data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
- data/lib/{protocols → em}/buftok.rb +16 -5
- data/lib/em/callback.rb +26 -0
- data/lib/em/channel.rb +57 -0
- data/lib/em/connection.rb +505 -0
- data/lib/em/deferrable.rb +144 -165
- data/lib/em/file_watch.rb +54 -0
- data/lib/em/future.rb +24 -25
- data/lib/em/messages.rb +1 -1
- data/lib/em/process_watch.rb +44 -0
- data/lib/em/processes.rb +119 -113
- data/lib/em/protocols.rb +35 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +263 -0
- data/lib/em/protocols/httpclient2.rb +582 -0
- data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
- data/lib/em/protocols/linetext2.rb +160 -0
- data/lib/{protocols → em/protocols}/memcache.rb +37 -7
- data/lib/em/protocols/object_protocol.rb +39 -0
- data/lib/em/protocols/postgres3.rb +247 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +331 -0
- data/lib/em/protocols/smtpserver.rb +547 -0
- data/lib/em/protocols/stomp.rb +200 -0
- data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
- data/lib/em/queue.rb +61 -0
- data/lib/em/spawnable.rb +53 -56
- data/lib/em/streamer.rb +92 -74
- data/lib/em/timers.rb +55 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1636 -1926
- data/lib/evma.rb +1 -1
- data/lib/jeventmachine.rb +106 -101
- data/lib/pr_eventmachine.rb +47 -36
- data/tasks/project.rake +2 -1
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/test_attach.rb +18 -0
- data/tests/test_basic.rb +285 -231
- data/tests/test_channel.rb +63 -0
- data/tests/test_connection_count.rb +2 -2
- data/tests/test_epoll.rb +162 -163
- data/tests/test_errors.rb +36 -36
- data/tests/test_exc.rb +22 -25
- data/tests/test_file_watch.rb +49 -0
- data/tests/test_futures.rb +77 -93
- data/tests/test_hc.rb +2 -2
- data/tests/test_httpclient.rb +55 -52
- data/tests/test_httpclient2.rb +153 -155
- data/tests/test_inactivity_timeout.rb +30 -0
- data/tests/test_kb.rb +8 -9
- data/tests/test_ltp2.rb +274 -277
- data/tests/test_next_tick.rb +135 -109
- data/tests/test_object_protocol.rb +37 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -95
- data/tests/test_proxy_connection.rb +92 -0
- data/tests/test_pure.rb +1 -5
- data/tests/test_queue.rb +44 -0
- data/tests/test_running.rb +9 -14
- data/tests/test_sasl.rb +32 -34
- data/tests/test_send_file.rb +175 -176
- data/tests/test_servers.rb +37 -41
- data/tests/test_smtpserver.rb +47 -55
- data/tests/test_spawn.rb +284 -291
- data/tests/test_ssl_args.rb +1 -1
- data/tests/test_ssl_methods.rb +1 -1
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_timers.rb +81 -88
- data/tests/test_ud.rb +0 -7
- data/tests/testem.rb +1 -1
- metadata +52 -36
- data/lib/em/eventable.rb +0 -39
- data/lib/eventmachine_version.rb +0 -31
- data/lib/protocols/header_and_content.rb +0 -129
- data/lib/protocols/httpcli2.rb +0 -803
- data/lib/protocols/httpclient.rb +0 -270
- data/lib/protocols/linetext2.rb +0 -161
- data/lib/protocols/postgres.rb +0 -261
- data/lib/protocols/saslauth.rb +0 -179
- data/lib/protocols/smtpclient.rb +0 -308
- data/lib/protocols/smtpserver.rb +0 -556
- data/lib/protocols/stomp.rb +0 -153
- data/tests/test_eventables.rb +0 -77
@@ -0,0 +1,92 @@
|
|
1
|
+
$:.unshift "../lib"
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestProxyConnection < Test::Unit::TestCase
|
6
|
+
|
7
|
+
module ProxyConnection
|
8
|
+
def initialize(client, request)
|
9
|
+
@client, @request = client, request
|
10
|
+
end
|
11
|
+
|
12
|
+
def post_init
|
13
|
+
EM::enable_proxy(self, @client)
|
14
|
+
end
|
15
|
+
|
16
|
+
def connection_completed
|
17
|
+
EM.next_tick {
|
18
|
+
send_data @request
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def proxy_target_unbound
|
23
|
+
$unbound_early = true
|
24
|
+
EM.stop
|
25
|
+
end
|
26
|
+
|
27
|
+
def unbind
|
28
|
+
@client.close_connection_after_writing
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module Client
|
33
|
+
def connection_completed
|
34
|
+
send_data "EventMachine rocks!"
|
35
|
+
end
|
36
|
+
|
37
|
+
def receive_data(data)
|
38
|
+
$client_data = data
|
39
|
+
end
|
40
|
+
|
41
|
+
def unbind
|
42
|
+
EM.stop
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
module Client2
|
47
|
+
include Client
|
48
|
+
def unbind; end
|
49
|
+
end
|
50
|
+
|
51
|
+
module Server
|
52
|
+
def receive_data(data)
|
53
|
+
send_data "I know!" if data == "EventMachine rocks!"
|
54
|
+
close_connection_after_writing
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
module ProxyServer
|
59
|
+
def receive_data(data)
|
60
|
+
EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module EarlyClosingProxy
|
65
|
+
def receive_data(data)
|
66
|
+
EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
|
67
|
+
close_connection
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_proxy_connection
|
72
|
+
EM.run {
|
73
|
+
EM.start_server("127.0.0.1", 54321, Server)
|
74
|
+
EM.start_server("127.0.0.1", 12345, ProxyServer)
|
75
|
+
EM.connect("127.0.0.1", 12345, Client)
|
76
|
+
}
|
77
|
+
|
78
|
+
assert_equal("I know!", $client_data)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_early_close
|
82
|
+
$client_data = nil
|
83
|
+
EM.run {
|
84
|
+
EM.start_server("127.0.0.1", 54321, Server)
|
85
|
+
EM.start_server("127.0.0.1", 12345, EarlyClosingProxy)
|
86
|
+
EM.connect("127.0.0.1", 12345, Client2)
|
87
|
+
}
|
88
|
+
|
89
|
+
assert($unbound_early)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
data/tests/test_pure.rb
CHANGED
@@ -67,12 +67,11 @@ class TestPure < Test::Unit::TestCase
|
|
67
67
|
assert_raises( RuntimeError ) { run_exception }
|
68
68
|
end
|
69
69
|
def test_exception_2
|
70
|
-
|
70
|
+
ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
|
71
71
|
assert_raises( ex_class ) { run_exception }
|
72
72
|
end
|
73
73
|
|
74
74
|
|
75
|
-
|
76
75
|
# Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
|
77
76
|
# exception on certain kinds of TCP connect-errors.
|
78
77
|
# It's always been something of an open question whether EM should throw an exception
|
@@ -114,8 +113,6 @@ class TestPure < Test::Unit::TestCase
|
|
114
113
|
assert_equal( false, timeout )
|
115
114
|
end
|
116
115
|
|
117
|
-
|
118
|
-
|
119
116
|
def test_reactor_running
|
120
117
|
a = false
|
121
118
|
EM.run {
|
@@ -125,5 +122,4 @@ class TestPure < Test::Unit::TestCase
|
|
125
122
|
assert a
|
126
123
|
end
|
127
124
|
|
128
|
-
|
129
125
|
end
|
data/tests/test_queue.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
$:.unshift "../lib"
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestEventMachineQueue < Test::Unit::TestCase
|
6
|
+
def test_queue_push
|
7
|
+
s = 0
|
8
|
+
EM.run do
|
9
|
+
q = EM::Queue.new
|
10
|
+
q.push(1)
|
11
|
+
EM.next_tick { s = q.size; EM.stop }
|
12
|
+
end
|
13
|
+
assert_equal 1, s
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_queue_pop
|
17
|
+
x,y,z = nil
|
18
|
+
EM.run do
|
19
|
+
q = EM::Queue.new
|
20
|
+
q.push(1,2,3)
|
21
|
+
q.pop { |v| x = v }
|
22
|
+
q.pop { |v| y = v }
|
23
|
+
q.pop { |v| z = v; EM.stop }
|
24
|
+
end
|
25
|
+
assert_equal 1, x
|
26
|
+
assert_equal 2, y
|
27
|
+
assert_equal 3, z
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_queue_reactor_thread
|
31
|
+
q = EM::Queue.new
|
32
|
+
|
33
|
+
Thread.new { q.push(1,2,3) }.join
|
34
|
+
assert q.empty?
|
35
|
+
EM.run { EM.next_tick { EM.stop } }
|
36
|
+
assert_equal 3, q.size
|
37
|
+
|
38
|
+
x = nil
|
39
|
+
Thread.new { q.pop { |v| x = v } }.join
|
40
|
+
assert_equal nil, x
|
41
|
+
EM.run { EM.next_tick { EM.stop } }
|
42
|
+
assert_equal 1, x
|
43
|
+
end
|
44
|
+
end
|
data/tests/test_running.rb
CHANGED
@@ -29,19 +29,14 @@ require 'eventmachine'
|
|
29
29
|
require 'test/unit'
|
30
30
|
|
31
31
|
class TestRunning < Test::Unit::TestCase
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
r = EM::reactor_running?
|
42
|
-
EM.stop
|
43
|
-
}
|
44
|
-
assert_equal( true, r )
|
45
|
-
end
|
32
|
+
def test_running
|
33
|
+
assert_equal( false, EM::reactor_running? )
|
34
|
+
r = false
|
35
|
+
EM.run {
|
36
|
+
r = EM::reactor_running?
|
37
|
+
EM.stop
|
38
|
+
}
|
39
|
+
assert_equal( true, r )
|
40
|
+
end
|
46
41
|
end
|
47
42
|
|
data/tests/test_sasl.rb
CHANGED
@@ -31,44 +31,42 @@ require 'test/unit'
|
|
31
31
|
|
32
32
|
class TestSASL < Test::Unit::TestCase
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
# SASL authentication is usually done with UNIX-domain sockets, but
|
35
|
+
# we'll use TCP so this test will work on Windows. As far as the
|
36
|
+
# protocol handlers are concerned, there's no difference.
|
37
37
|
|
38
|
+
Host,Port = "127.0.0.1",9560
|
39
|
+
TestUser,TestPsw = "someone", "password"
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
+
class SaslServer < EM::Connection
|
42
|
+
include EM::Protocols::SASLauth
|
43
|
+
def validate usr, psw, sys, realm
|
44
|
+
usr == TestUser and psw == TestPsw
|
45
|
+
end
|
46
|
+
end
|
41
47
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
usr == TestUser and psw == TestPsw
|
46
|
-
end
|
47
|
-
end
|
48
|
+
class SaslClient < EM::Connection
|
49
|
+
include EM::Protocols::SASLauthclient
|
50
|
+
end
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
def test_sasl
|
53
|
+
resp = nil
|
54
|
+
EM.run {
|
55
|
+
EM.start_server( Host, Port, SaslServer )
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
EM.stop
|
68
|
-
}
|
69
|
-
}
|
70
|
-
assert_equal( true, resp )
|
71
|
-
end
|
57
|
+
c = EM.connect( Host, Port, SaslClient )
|
58
|
+
d = c.validate?( TestUser, TestPsw )
|
59
|
+
d.timeout 2
|
60
|
+
d.callback {
|
61
|
+
resp = true
|
62
|
+
EM.stop
|
63
|
+
}
|
64
|
+
d.errback {
|
65
|
+
resp = false
|
66
|
+
EM.stop
|
67
|
+
}
|
68
|
+
}
|
69
|
+
assert_equal( true, resp )
|
70
|
+
end
|
72
71
|
|
73
72
|
end
|
74
|
-
|
data/tests/test_send_file.rb
CHANGED
@@ -31,16 +31,16 @@ require 'test/unit'
|
|
31
31
|
|
32
32
|
class TestSendFile < Test::Unit::TestCase
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
module TestModule
|
35
|
+
def post_init
|
36
|
+
send_file_data TestFilename
|
37
|
+
close_connection_after_writing
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module TestClient
|
42
|
+
def data_to(&blk)
|
43
|
+
@data_to = blk
|
44
44
|
end
|
45
45
|
|
46
46
|
def receive_data(data)
|
@@ -52,192 +52,191 @@ class TestSendFile < Test::Unit::TestCase
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
TestHost = "0.0.0.0"
|
56
|
+
TestPort = 9055
|
57
|
+
TestFilename = "./xxxxxx"
|
58
58
|
|
59
|
-
|
60
|
-
|
59
|
+
def setup
|
60
|
+
end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
def teardown
|
63
|
+
File.unlink( TestFilename ) if File.exist?( TestFilename )
|
64
|
+
end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
def test_send_file
|
67
|
+
File.open( TestFilename, "w" ) {|f|
|
68
|
+
f << ("A" * 5000)
|
69
|
+
}
|
70
70
|
|
71
|
-
|
71
|
+
data = ''
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
EM.connect TestHost, TestPort, TestClient do |c|
|
78
|
-
c.data_to { |d| data << d }
|
79
|
-
end
|
80
|
-
}
|
73
|
+
EM.run {
|
74
|
+
EM.start_server TestHost, TestPort, TestModule
|
75
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
81
76
|
|
82
|
-
|
83
|
-
|
84
|
-
|
77
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
78
|
+
c.data_to { |d| data << d }
|
79
|
+
end
|
80
|
+
}
|
85
81
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
82
|
+
assert_equal( "A" * 5000, data )
|
83
|
+
File.unlink TestFilename
|
84
|
+
end
|
85
|
+
|
86
|
+
# EventMachine::Connection#send_file_data has a strict upper limit on the filesize it will work with.
|
87
|
+
def test_send_large_file
|
88
|
+
File.open( TestFilename, "w" ) {|f|
|
89
|
+
f << ("A" * 1000000)
|
90
|
+
}
|
91
91
|
|
92
|
-
|
92
|
+
data = ''
|
93
93
|
|
94
|
-
|
94
|
+
ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
|
95
95
|
assert_raises( ex_class ) {
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
96
|
+
EM.run {
|
97
|
+
EM.start_server TestHost, TestPort, TestModule
|
98
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
99
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
100
|
+
c.data_to { |d| data << d }
|
101
|
+
end
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
File.unlink TestFilename
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
module StreamTestModule
|
110
|
+
def post_init
|
111
|
+
EM::Deferrable.future( stream_file_data(TestFilename)) {
|
112
|
+
close_connection_after_writing
|
113
|
+
}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module ChunkStreamTestModule
|
118
|
+
def post_init
|
119
|
+
EM::Deferrable.future( stream_file_data(TestFilename, :http_chunks=>true)) {
|
120
|
+
close_connection_after_writing
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_stream_file_data
|
126
|
+
File.open( TestFilename, "w" ) {|f|
|
127
|
+
f << ("A" * 1000)
|
128
|
+
}
|
129
|
+
|
130
|
+
data = ''
|
131
|
+
|
132
|
+
EM.run {
|
133
|
+
EM.start_server TestHost, TestPort, StreamTestModule
|
134
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
135
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
136
|
+
c.data_to { |d| data << d }
|
137
|
+
end
|
138
|
+
}
|
139
|
+
|
140
|
+
assert_equal( "A" * 1000, data )
|
141
|
+
|
142
|
+
File.unlink TestFilename
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_stream_chunked_file_data
|
146
|
+
File.open( TestFilename, "w" ) {|f|
|
147
|
+
f << ("A" * 1000)
|
148
|
+
}
|
149
|
+
|
150
|
+
data = ''
|
151
|
+
|
152
|
+
EM.run {
|
153
|
+
EM.start_server TestHost, TestPort, ChunkStreamTestModule
|
154
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
155
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
156
|
+
c.data_to { |d| data << d }
|
157
|
+
end
|
158
|
+
}
|
159
|
+
|
160
|
+
assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
|
161
|
+
|
162
|
+
File.unlink TestFilename
|
163
|
+
end
|
164
|
+
|
165
|
+
module BadFileTestModule
|
166
|
+
def post_init
|
167
|
+
de = stream_file_data( TestFilename+"..." )
|
168
|
+
de.errback {|msg|
|
169
|
+
send_data msg
|
170
|
+
close_connection_after_writing
|
171
|
+
}
|
172
|
+
end
|
173
|
+
end
|
174
|
+
def test_stream_bad_file
|
175
|
+
data = ''
|
176
|
+
EM.run {
|
177
|
+
EM.start_server TestHost, TestPort, BadFileTestModule
|
178
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
179
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
180
|
+
c.data_to { |d| data << d }
|
181
|
+
end
|
182
|
+
}
|
183
|
+
|
184
|
+
assert_equal( "file not found", data )
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_stream_large_file_data
|
188
|
+
begin
|
189
|
+
require 'fastfilereaderext'
|
190
190
|
rescue LoadError
|
191
191
|
return
|
192
192
|
end
|
193
|
-
|
194
|
-
|
195
|
-
|
193
|
+
File.open( TestFilename, "w" ) {|f|
|
194
|
+
f << ("A" * 10000)
|
195
|
+
}
|
196
196
|
|
197
|
-
|
197
|
+
data = ''
|
198
198
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
199
|
+
EM.run {
|
200
|
+
EM.start_server TestHost, TestPort, StreamTestModule
|
201
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
202
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
203
|
+
c.data_to { |d| data << d }
|
204
|
+
end
|
205
|
+
}
|
206
206
|
|
207
|
-
|
207
|
+
assert_equal( "A" * 10000, data )
|
208
208
|
|
209
|
-
|
210
|
-
|
209
|
+
File.unlink TestFilename
|
210
|
+
end
|
211
211
|
|
212
|
-
|
213
|
-
|
214
|
-
|
212
|
+
def test_stream_large_chunked_file_data
|
213
|
+
begin
|
214
|
+
require 'fastfilereaderext'
|
215
215
|
rescue LoadError
|
216
216
|
return
|
217
217
|
end
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
218
|
+
File.open( TestFilename, "w" ) {|f|
|
219
|
+
f << ("A" * 100000)
|
220
|
+
}
|
221
|
+
|
222
|
+
data = ''
|
223
|
+
|
224
|
+
EM.run {
|
225
|
+
EM.start_server TestHost, TestPort, ChunkStreamTestModule
|
226
|
+
EM.add_timer(2) {EM.stop} # avoid hanging in case of error
|
227
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
228
|
+
c.data_to { |d| data << d }
|
229
|
+
end
|
230
|
+
}
|
231
|
+
|
232
|
+
expected = [
|
233
|
+
"4000\r\n#{"A" * 16384}\r\n" * 6,
|
234
|
+
"6a0\r\n#{"A" * 0x6a0}\r\n",
|
235
|
+
"0\r\n\r\n"
|
236
|
+
].join
|
237
|
+
assert_equal( expected, data )
|
238
|
+
|
239
|
+
File.unlink TestFilename
|
240
|
+
end
|
241
241
|
|
242
242
|
end
|
243
|
-
|