sonixlabs-eventmachine-java 1.0.0.rc.4-java
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/.gitignore +22 -0
- data/.yardopts +7 -0
- data/GNU +281 -0
- data/Gemfile +3 -0
- data/LICENSE +60 -0
- data/README.md +109 -0
- data/Rakefile +20 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/eventmachine.gemspec +34 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +876 -0
- data/ext/ed.cpp +1973 -0
- data/ext/ed.h +422 -0
- data/ext/em.cpp +2353 -0
- data/ext/em.h +239 -0
- data/ext/eventmachine.h +127 -0
- data/ext/extconf.rb +176 -0
- data/ext/fastfilereader/extconf.rb +103 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +347 -0
- data/ext/project.h +156 -0
- data/ext/rubymain.cpp +1297 -0
- data/ext/ssl.cpp +468 -0
- data/ext/ssl.h +94 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +588 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +70 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +195 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
- data/lib/em/buftok.rb +110 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +64 -0
- data/lib/em/completion.rb +304 -0
- data/lib/em/connection.rb +712 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/iterator.rb +270 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols.rb +36 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +279 -0
- data/lib/em/protocols/httpclient2.rb +600 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/linetext2.rb +161 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +365 -0
- data/lib/em/protocols/smtpserver.rb +640 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +202 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/pure_ruby.rb +1017 -0
- data/lib/em/queue.rb +71 -0
- data/lib/em/resolver.rb +192 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1532 -0
- data/lib/jeventmachine.rb +284 -0
- data/lib/sonixlabs-eventmachine-java.rb +1 -0
- data/rakelib/cpp.rake_example +77 -0
- data/rakelib/package.rake +98 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/em_test_helper.rb +64 -0
- data/tests/test_attach.rb +126 -0
- data/tests/test_basic.rb +294 -0
- data/tests/test_channel.rb +62 -0
- data/tests/test_completion.rb +177 -0
- data/tests/test_connection_count.rb +33 -0
- data/tests/test_defer.rb +18 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +130 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +65 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_get_sock_opt.rb +37 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +190 -0
- data/tests/test_httpclient2.rb +128 -0
- data/tests/test_idle_connection.rb +23 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_kb.rb +34 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +288 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +78 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +194 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -0
- data/tests/test_pure.rb +88 -0
- data/tests/test_queue.rb +50 -0
- data/tests/test_resolver.rb +55 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +47 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +33 -0
- data/tests/test_set_sock_opt.rb +37 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +55 -0
- data/tests/test_smtpserver.rb +57 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_methods.rb +48 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_threaded_resource.rb +53 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +123 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +48 -0
- metadata +301 -0
data/tests/test_pure.rb
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestPure < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@port = next_port
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# These tests are intended to exercise problems that come up in the
|
|
10
|
+
# pure-Ruby implementation. However, we DON'T constrain them such that
|
|
11
|
+
# they only run in pure-Ruby. These tests need to work identically in
|
|
12
|
+
# any implementation.
|
|
13
|
+
|
|
14
|
+
#-------------------------------------
|
|
15
|
+
|
|
16
|
+
# The EM reactor needs to run down open connections and release other resources
|
|
17
|
+
# when it stops running. Make sure this happens even if user code throws a Ruby
|
|
18
|
+
# exception.
|
|
19
|
+
# If exception handling is incorrect, the second test will fail with a no-bind error
|
|
20
|
+
# because the TCP server opened in the first test will not have been closed.
|
|
21
|
+
|
|
22
|
+
def test_exception_handling_releases_resources
|
|
23
|
+
exception = Class.new(StandardError)
|
|
24
|
+
|
|
25
|
+
2.times do
|
|
26
|
+
assert_raises(exception) do
|
|
27
|
+
EM.run do
|
|
28
|
+
EM.start_server "127.0.0.1", @port
|
|
29
|
+
raise exception
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
|
|
36
|
+
# exception on certain kinds of TCP connect-errors.
|
|
37
|
+
# It's always been something of an open question whether EM should throw an exception
|
|
38
|
+
# in these cases but the defined answer has always been to catch it the unbind method.
|
|
39
|
+
# With a connect failure, the latter will always fire, but connection_completed will
|
|
40
|
+
# never fire. So even though the point is arguable, it's incorrect for the pure Ruby
|
|
41
|
+
# version to throw an exception.
|
|
42
|
+
module TestConnrefused
|
|
43
|
+
def unbind
|
|
44
|
+
EM.stop
|
|
45
|
+
end
|
|
46
|
+
def connection_completed
|
|
47
|
+
raise "should never get here"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_connrefused
|
|
52
|
+
assert_nothing_raised do
|
|
53
|
+
EM.run {
|
|
54
|
+
setup_timeout(2)
|
|
55
|
+
EM.connect "127.0.0.1", @port, TestConnrefused
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Make sure connection_completed gets called as expected with TCP clients. This is the
|
|
61
|
+
# opposite of test_connrefused.
|
|
62
|
+
# If the test fails, it will hang because EM.stop never gets called.
|
|
63
|
+
#
|
|
64
|
+
module TestConnaccepted
|
|
65
|
+
def connection_completed
|
|
66
|
+
EM.stop
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
def test_connaccepted
|
|
70
|
+
assert_nothing_raised do
|
|
71
|
+
EM.run {
|
|
72
|
+
EM.start_server "127.0.0.1", @port
|
|
73
|
+
EM.connect "127.0.0.1", @port, TestConnaccepted
|
|
74
|
+
setup_timeout(1)
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_reactor_running
|
|
80
|
+
a = false
|
|
81
|
+
EM.run {
|
|
82
|
+
a = EM.reactor_running?
|
|
83
|
+
EM.next_tick {EM.stop}
|
|
84
|
+
}
|
|
85
|
+
assert a
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
data/tests/test_queue.rb
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestEMQueue < Test::Unit::TestCase
|
|
4
|
+
def test_queue_push
|
|
5
|
+
s = 0
|
|
6
|
+
EM.run do
|
|
7
|
+
q = EM::Queue.new
|
|
8
|
+
q.push(1)
|
|
9
|
+
EM.next_tick { s = q.size; EM.stop }
|
|
10
|
+
end
|
|
11
|
+
assert_equal 1, s
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_queue_pop
|
|
15
|
+
x,y,z = nil
|
|
16
|
+
EM.run do
|
|
17
|
+
q = EM::Queue.new
|
|
18
|
+
q.push(1,2,3)
|
|
19
|
+
q.pop { |v| x = v }
|
|
20
|
+
q.pop { |v| y = v }
|
|
21
|
+
q.pop { |v| z = v; EM.stop }
|
|
22
|
+
end
|
|
23
|
+
assert_equal 1, x
|
|
24
|
+
assert_equal 2, y
|
|
25
|
+
assert_equal 3, z
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_queue_reactor_thread
|
|
29
|
+
q = EM::Queue.new
|
|
30
|
+
|
|
31
|
+
Thread.new { q.push(1,2,3) }.join
|
|
32
|
+
assert q.empty?
|
|
33
|
+
EM.run { EM.next_tick { EM.stop } }
|
|
34
|
+
assert_equal 3, q.size
|
|
35
|
+
|
|
36
|
+
x = nil
|
|
37
|
+
Thread.new { q.pop { |v| x = v } }.join
|
|
38
|
+
assert_equal nil, x
|
|
39
|
+
EM.run { EM.next_tick { EM.stop } }
|
|
40
|
+
assert_equal 1, x
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_num_waiting
|
|
44
|
+
q = EM::Queue.new
|
|
45
|
+
many = 3
|
|
46
|
+
many.times { q.pop {} }
|
|
47
|
+
EM.run { EM.next_tick { EM.stop } }
|
|
48
|
+
assert_equal many, q.num_waiting
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestResolver < Test::Unit::TestCase
|
|
4
|
+
def test_a
|
|
5
|
+
EM.run {
|
|
6
|
+
d = EM::DNS::Resolver.resolve "google.com"
|
|
7
|
+
d.errback { assert false }
|
|
8
|
+
d.callback { |r|
|
|
9
|
+
assert r
|
|
10
|
+
EM.stop
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_bad_host
|
|
16
|
+
EM.run {
|
|
17
|
+
d = EM::DNS::Resolver.resolve "asdfasasdf"
|
|
18
|
+
d.callback { assert false }
|
|
19
|
+
d.errback { assert true; EM.stop }
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_garbage
|
|
24
|
+
assert_raises( ArgumentError ) {
|
|
25
|
+
EM.run {
|
|
26
|
+
EM::DNS::Resolver.resolve 123
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_a_pair
|
|
32
|
+
EM.run {
|
|
33
|
+
d = EM::DNS::Resolver.resolve "google.com"
|
|
34
|
+
d.errback { assert false }
|
|
35
|
+
d.callback { |r|
|
|
36
|
+
assert_equal(Array, r.class)
|
|
37
|
+
assert r.size > 1
|
|
38
|
+
EM.stop
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_localhost
|
|
44
|
+
EM.run {
|
|
45
|
+
d = EM::DNS::Resolver.resolve "localhost"
|
|
46
|
+
d.errback { assert false }
|
|
47
|
+
d.callback { |r|
|
|
48
|
+
assert_equal("127.0.0.1", r.first)
|
|
49
|
+
assert_equal(Array, r.class)
|
|
50
|
+
|
|
51
|
+
EM.stop
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
end
|
data/tests/test_sasl.rb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestSASL < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
# SASL authentication is usually done with UNIX-domain sockets, but
|
|
7
|
+
# we'll use TCP so this test will work on Windows. As far as the
|
|
8
|
+
# protocol handlers are concerned, there's no difference.
|
|
9
|
+
|
|
10
|
+
TestUser,TestPsw = "someone", "password"
|
|
11
|
+
|
|
12
|
+
class SaslServer < EM::Connection
|
|
13
|
+
include EM::Protocols::SASLauth
|
|
14
|
+
def validate usr, psw, sys, realm
|
|
15
|
+
usr == TestUser and psw == TestPsw
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class SaslClient < EM::Connection
|
|
20
|
+
include EM::Protocols::SASLauthclient
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def setup
|
|
24
|
+
@port = next_port
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_sasl
|
|
28
|
+
resp = nil
|
|
29
|
+
EM.run {
|
|
30
|
+
EM.start_server( "127.0.0.1", @port, SaslServer )
|
|
31
|
+
|
|
32
|
+
c = EM.connect( "127.0.0.1", @port, SaslClient )
|
|
33
|
+
d = c.validate?( TestUser, TestPsw )
|
|
34
|
+
d.timeout 1
|
|
35
|
+
d.callback {
|
|
36
|
+
resp = true
|
|
37
|
+
EM.stop
|
|
38
|
+
}
|
|
39
|
+
d.errback {
|
|
40
|
+
resp = false
|
|
41
|
+
EM.stop
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
assert_equal( true, resp )
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
|
|
4
|
+
class TestSendFile < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
if EM.respond_to?(:send_file_data)
|
|
7
|
+
module TestModule
|
|
8
|
+
def initialize filename
|
|
9
|
+
@filename = filename
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def post_init
|
|
13
|
+
send_file_data @filename
|
|
14
|
+
close_connection_after_writing
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module TestClient
|
|
19
|
+
def data_to(&blk)
|
|
20
|
+
@data_to = blk
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def receive_data(data)
|
|
24
|
+
@data_to.call(data) if @data_to
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def unbind
|
|
28
|
+
EM.stop
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def setup
|
|
33
|
+
@file = Tempfile.new("em_test_file")
|
|
34
|
+
@filename = @file.path
|
|
35
|
+
@port = next_port
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_send_file
|
|
39
|
+
File.open( @filename, "w" ) {|f|
|
|
40
|
+
f << ("A" * 5000)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
data = ''
|
|
44
|
+
|
|
45
|
+
EM.run {
|
|
46
|
+
EM.start_server "127.0.0.1", @port, TestModule, @filename
|
|
47
|
+
setup_timeout
|
|
48
|
+
|
|
49
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
50
|
+
c.data_to { |d| data << d }
|
|
51
|
+
end
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
assert_equal( "A" * 5000, data )
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# EM::Connection#send_file_data has a strict upper limit on the filesize it will work with.
|
|
58
|
+
def test_send_large_file
|
|
59
|
+
File.open( @filename, "w" ) {|f|
|
|
60
|
+
f << ("A" * 1000000)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
data = ''
|
|
64
|
+
|
|
65
|
+
assert_raises(RuntimeError) {
|
|
66
|
+
EM.run {
|
|
67
|
+
EM.start_server "127.0.0.1", @port, TestModule, @filename
|
|
68
|
+
setup_timeout
|
|
69
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
70
|
+
c.data_to { |d| data << d }
|
|
71
|
+
end
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
module StreamTestModule
|
|
77
|
+
def initialize filename
|
|
78
|
+
@filename = filename
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def post_init
|
|
82
|
+
EM::Deferrable.future( stream_file_data(@filename)) {
|
|
83
|
+
close_connection_after_writing
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
module ChunkStreamTestModule
|
|
89
|
+
def initialize filename
|
|
90
|
+
@filename = filename
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def post_init
|
|
94
|
+
EM::Deferrable.future( stream_file_data(@filename, :http_chunks=>true)) {
|
|
95
|
+
close_connection_after_writing
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_stream_file_data
|
|
101
|
+
File.open( @filename, "w" ) {|f|
|
|
102
|
+
f << ("A" * 1000)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
data = ''
|
|
106
|
+
|
|
107
|
+
EM.run {
|
|
108
|
+
EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
|
|
109
|
+
setup_timeout
|
|
110
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
111
|
+
c.data_to { |d| data << d }
|
|
112
|
+
end
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
assert_equal( "A" * 1000, data )
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_stream_chunked_file_data
|
|
119
|
+
File.open( @filename, "w" ) {|f|
|
|
120
|
+
f << ("A" * 1000)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
data = ''
|
|
124
|
+
|
|
125
|
+
EM.run {
|
|
126
|
+
EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
|
|
127
|
+
setup_timeout
|
|
128
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
129
|
+
c.data_to { |d| data << d }
|
|
130
|
+
end
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
module BadFileTestModule
|
|
137
|
+
def initialize filename
|
|
138
|
+
@filename = filename
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def post_init
|
|
142
|
+
de = stream_file_data( @filename+".wrong" )
|
|
143
|
+
de.errback {|msg|
|
|
144
|
+
send_data msg
|
|
145
|
+
close_connection_after_writing
|
|
146
|
+
}
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
def test_stream_bad_file
|
|
150
|
+
data = ''
|
|
151
|
+
EM.run {
|
|
152
|
+
EM.start_server "127.0.0.1", @port, BadFileTestModule, @filename
|
|
153
|
+
setup_timeout(5)
|
|
154
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
155
|
+
c.data_to { |d| data << d }
|
|
156
|
+
end
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
assert_equal( "file not found", data )
|
|
160
|
+
end
|
|
161
|
+
else
|
|
162
|
+
warn "EM.send_file_data not implemented, skipping tests in #{__FILE__}"
|
|
163
|
+
|
|
164
|
+
# Because some rubies will complain if a TestCase class has no tests
|
|
165
|
+
def test_em_send_file_data_not_implemented
|
|
166
|
+
assert !EM.respond_to?(:send_file_data)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
begin
|
|
171
|
+
require 'fastfilereaderext'
|
|
172
|
+
|
|
173
|
+
def test_stream_large_file_data
|
|
174
|
+
File.open( @filename, "w" ) {|f|
|
|
175
|
+
f << ("A" * 10000)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
data = ''
|
|
179
|
+
|
|
180
|
+
EM.run {
|
|
181
|
+
EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
|
|
182
|
+
setup_timeout
|
|
183
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
184
|
+
c.data_to { |d| data << d }
|
|
185
|
+
end
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
assert_equal( "A" * 10000, data )
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def test_stream_large_chunked_file_data
|
|
192
|
+
File.open( @filename, "w" ) {|f|
|
|
193
|
+
f << ("A" * 100000)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
data = ''
|
|
197
|
+
|
|
198
|
+
EM.run {
|
|
199
|
+
EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
|
|
200
|
+
setup_timeout
|
|
201
|
+
EM.connect "127.0.0.1", @port, TestClient do |c|
|
|
202
|
+
c.data_to { |d| data << d }
|
|
203
|
+
end
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
expected = [
|
|
207
|
+
"4000\r\n#{"A" * 16384}\r\n" * 6,
|
|
208
|
+
"6a0\r\n#{"A" * 0x6a0}\r\n",
|
|
209
|
+
"0\r\n\r\n"
|
|
210
|
+
].join
|
|
211
|
+
assert_equal( expected, data )
|
|
212
|
+
end
|
|
213
|
+
rescue LoadError
|
|
214
|
+
warn "require 'fastfilereaderext' failed, skipping tests in #{__FILE__}"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|