eventmachine 1.0.0.beta.2-x86-mingw32

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.
Files changed (141) hide show
  1. data/.gitignore +16 -0
  2. data/Gemfile +1 -0
  3. data/README +81 -0
  4. data/Rakefile +11 -0
  5. data/docs/COPYING +60 -0
  6. data/docs/ChangeLog +211 -0
  7. data/docs/DEFERRABLES +246 -0
  8. data/docs/EPOLL +141 -0
  9. data/docs/GNU +281 -0
  10. data/docs/INSTALL +13 -0
  11. data/docs/KEYBOARD +42 -0
  12. data/docs/LEGAL +25 -0
  13. data/docs/LIGHTWEIGHT_CONCURRENCY +130 -0
  14. data/docs/PURE_RUBY +75 -0
  15. data/docs/RELEASE_NOTES +94 -0
  16. data/docs/SMTP +4 -0
  17. data/docs/SPAWNED_PROCESSES +148 -0
  18. data/docs/TODO +8 -0
  19. data/eventmachine.gemspec +33 -0
  20. data/examples/ex_channel.rb +43 -0
  21. data/examples/ex_queue.rb +2 -0
  22. data/examples/ex_tick_loop_array.rb +15 -0
  23. data/examples/ex_tick_loop_counter.rb +32 -0
  24. data/examples/helper.rb +2 -0
  25. data/ext/binder.cpp +124 -0
  26. data/ext/binder.h +46 -0
  27. data/ext/cmain.cpp +838 -0
  28. data/ext/ed.cpp +1884 -0
  29. data/ext/ed.h +418 -0
  30. data/ext/em.cpp +2348 -0
  31. data/ext/em.h +228 -0
  32. data/ext/eventmachine.h +123 -0
  33. data/ext/extconf.rb +157 -0
  34. data/ext/fastfilereader/extconf.rb +85 -0
  35. data/ext/fastfilereader/mapper.cpp +214 -0
  36. data/ext/fastfilereader/mapper.h +59 -0
  37. data/ext/fastfilereader/rubymain.cpp +127 -0
  38. data/ext/kb.cpp +79 -0
  39. data/ext/page.cpp +107 -0
  40. data/ext/page.h +51 -0
  41. data/ext/pipe.cpp +347 -0
  42. data/ext/project.h +155 -0
  43. data/ext/rubymain.cpp +1200 -0
  44. data/ext/ssl.cpp +460 -0
  45. data/ext/ssl.h +94 -0
  46. data/java/.classpath +8 -0
  47. data/java/.project +17 -0
  48. data/java/src/com/rubyeventmachine/EmReactor.java +571 -0
  49. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  50. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  51. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  52. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  53. data/lib/em/buftok.rb +138 -0
  54. data/lib/em/callback.rb +26 -0
  55. data/lib/em/channel.rb +57 -0
  56. data/lib/em/connection.rb +569 -0
  57. data/lib/em/deferrable.rb +206 -0
  58. data/lib/em/file_watch.rb +54 -0
  59. data/lib/em/future.rb +61 -0
  60. data/lib/em/iterator.rb +270 -0
  61. data/lib/em/messages.rb +66 -0
  62. data/lib/em/process_watch.rb +44 -0
  63. data/lib/em/processes.rb +119 -0
  64. data/lib/em/protocols.rb +36 -0
  65. data/lib/em/protocols/header_and_content.rb +138 -0
  66. data/lib/em/protocols/httpclient.rb +268 -0
  67. data/lib/em/protocols/httpclient2.rb +590 -0
  68. data/lib/em/protocols/line_and_text.rb +125 -0
  69. data/lib/em/protocols/line_protocol.rb +28 -0
  70. data/lib/em/protocols/linetext2.rb +161 -0
  71. data/lib/em/protocols/memcache.rb +323 -0
  72. data/lib/em/protocols/object_protocol.rb +45 -0
  73. data/lib/em/protocols/postgres3.rb +247 -0
  74. data/lib/em/protocols/saslauth.rb +175 -0
  75. data/lib/em/protocols/smtpclient.rb +357 -0
  76. data/lib/em/protocols/smtpserver.rb +640 -0
  77. data/lib/em/protocols/socks4.rb +66 -0
  78. data/lib/em/protocols/stomp.rb +200 -0
  79. data/lib/em/protocols/tcptest.rb +53 -0
  80. data/lib/em/pure_ruby.rb +1013 -0
  81. data/lib/em/queue.rb +62 -0
  82. data/lib/em/spawnable.rb +85 -0
  83. data/lib/em/streamer.rb +130 -0
  84. data/lib/em/tick_loop.rb +85 -0
  85. data/lib/em/timers.rb +57 -0
  86. data/lib/em/version.rb +3 -0
  87. data/lib/eventmachine.rb +1548 -0
  88. data/lib/jeventmachine.rb +258 -0
  89. data/lib/rubyeventmachine.rb +2 -0
  90. data/setup.rb +1585 -0
  91. data/tasks/cpp.rake_example +77 -0
  92. data/tasks/doc.rake +30 -0
  93. data/tasks/package.rake +85 -0
  94. data/tasks/test.rake +6 -0
  95. data/tests/client.crt +31 -0
  96. data/tests/client.key +51 -0
  97. data/tests/test_attach.rb +136 -0
  98. data/tests/test_basic.rb +249 -0
  99. data/tests/test_channel.rb +64 -0
  100. data/tests/test_connection_count.rb +35 -0
  101. data/tests/test_defer.rb +49 -0
  102. data/tests/test_deferrable.rb +35 -0
  103. data/tests/test_epoll.rb +160 -0
  104. data/tests/test_error_handler.rb +35 -0
  105. data/tests/test_errors.rb +82 -0
  106. data/tests/test_exc.rb +55 -0
  107. data/tests/test_file_watch.rb +49 -0
  108. data/tests/test_futures.rb +198 -0
  109. data/tests/test_get_sock_opt.rb +30 -0
  110. data/tests/test_handler_check.rb +37 -0
  111. data/tests/test_hc.rb +190 -0
  112. data/tests/test_httpclient.rb +227 -0
  113. data/tests/test_httpclient2.rb +154 -0
  114. data/tests/test_inactivity_timeout.rb +50 -0
  115. data/tests/test_kb.rb +60 -0
  116. data/tests/test_ltp.rb +190 -0
  117. data/tests/test_ltp2.rb +317 -0
  118. data/tests/test_next_tick.rb +133 -0
  119. data/tests/test_object_protocol.rb +37 -0
  120. data/tests/test_pause.rb +70 -0
  121. data/tests/test_pending_connect_timeout.rb +48 -0
  122. data/tests/test_process_watch.rb +50 -0
  123. data/tests/test_processes.rb +128 -0
  124. data/tests/test_proxy_connection.rb +144 -0
  125. data/tests/test_pure.rb +134 -0
  126. data/tests/test_queue.rb +44 -0
  127. data/tests/test_running.rb +42 -0
  128. data/tests/test_sasl.rb +72 -0
  129. data/tests/test_send_file.rb +251 -0
  130. data/tests/test_servers.rb +76 -0
  131. data/tests/test_smtpclient.rb +83 -0
  132. data/tests/test_smtpserver.rb +85 -0
  133. data/tests/test_spawn.rb +322 -0
  134. data/tests/test_ssl_args.rb +79 -0
  135. data/tests/test_ssl_methods.rb +50 -0
  136. data/tests/test_ssl_verify.rb +82 -0
  137. data/tests/test_tick_loop.rb +59 -0
  138. data/tests/test_timers.rb +160 -0
  139. data/tests/test_ud.rb +36 -0
  140. data/tests/testem.rb +31 -0
  141. metadata +240 -0
@@ -0,0 +1,144 @@
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 PartialProxyConnection
33
+ def initialize(client, request, length)
34
+ @client, @request, @length = client, request, length
35
+ end
36
+
37
+ def post_init
38
+ EM::enable_proxy(self, @client, 0, @length)
39
+ end
40
+
41
+ def receive_data(data)
42
+ $unproxied_data = data
43
+ @client.send_data(data)
44
+ end
45
+
46
+ def connection_completed
47
+ EM.next_tick {
48
+ send_data @request
49
+ }
50
+ end
51
+
52
+ def proxy_target_unbound
53
+ $unbound_early = true
54
+ EM.stop
55
+ end
56
+
57
+ def proxy_completed
58
+ $proxy_completed = true
59
+ end
60
+
61
+ def unbind
62
+ @client.close_connection_after_writing
63
+ end
64
+ end
65
+
66
+ module Client
67
+ def connection_completed
68
+ send_data "EventMachine rocks!"
69
+ end
70
+
71
+ def receive_data(data)
72
+ $client_data = data
73
+ end
74
+
75
+ def unbind
76
+ EM.stop
77
+ end
78
+ end
79
+
80
+ module Client2
81
+ include Client
82
+ def unbind; end
83
+ end
84
+
85
+ module Server
86
+ def receive_data(data)
87
+ send_data "I know!" if data == "EventMachine rocks!"
88
+ close_connection_after_writing
89
+ end
90
+ end
91
+
92
+ module ProxyServer
93
+ def receive_data(data)
94
+ EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
95
+ end
96
+ end
97
+
98
+ module PartialProxyServer
99
+ def receive_data(data)
100
+ EM.connect("127.0.0.1", 54321, PartialProxyConnection, self, data, 1)
101
+ end
102
+ end
103
+
104
+ module EarlyClosingProxy
105
+ def receive_data(data)
106
+ EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
107
+ close_connection
108
+ end
109
+ end
110
+
111
+ def test_proxy_connection
112
+ EM.run {
113
+ EM.start_server("127.0.0.1", 54321, Server)
114
+ EM.start_server("127.0.0.1", 12345, ProxyServer)
115
+ EM.connect("127.0.0.1", 12345, Client)
116
+ }
117
+
118
+ assert_equal("I know!", $client_data)
119
+ end
120
+
121
+ def test_partial_proxy_connection
122
+ EM.run {
123
+ EM.start_server("127.0.0.1", 54321, Server)
124
+ EM.start_server("127.0.0.1", 12345, PartialProxyServer)
125
+ EM.connect("127.0.0.1", 12345, Client)
126
+ }
127
+
128
+ assert_equal("I know!", $client_data)
129
+ assert_equal(" know!", $unproxied_data)
130
+ assert($proxy_completed)
131
+ end
132
+
133
+ def test_early_close
134
+ $client_data = nil
135
+ EM.run {
136
+ EM.start_server("127.0.0.1", 54321, Server)
137
+ EM.start_server("127.0.0.1", 12345, EarlyClosingProxy)
138
+ EM.connect("127.0.0.1", 12345, Client2)
139
+ }
140
+
141
+ assert($unbound_early)
142
+ end
143
+
144
+ end
@@ -0,0 +1,134 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift "../lib"
28
+ require 'eventmachine'
29
+ require 'test/unit'
30
+
31
+ class TestPure < Test::Unit::TestCase
32
+
33
+
34
+ Host,Port = "0.0.0.0", 9060
35
+
36
+
37
+ # These tests are intended to exercise problems that come up in the
38
+ # pure-Ruby implementation. However, we DON'T constrain them such that
39
+ # they only run in pure-Ruby. These tests need to work identically in
40
+ # any implementation.
41
+
42
+ def setup
43
+ end
44
+
45
+ def teardown
46
+ end
47
+
48
+ #-------------------------------------
49
+
50
+ # The EM reactor needs to run down open connections and release other resources
51
+ # when it stops running. Make sure this happens even if user code throws a Ruby
52
+ # exception.
53
+ # One way to see this is to run identical tests that open a TCP server and throw
54
+ # an exception. (We do this twice because an exception aborts a test. We make the
55
+ # two tests identical except for the method name because we can't predict the order
56
+ # in which the test harness will run them.)
57
+ # If exception handling is incorrect, the second test will fail with a no-bind error
58
+ # because the TCP server opened in the first test will not have been closed.
59
+ #
60
+ def run_exception
61
+ EM.run {
62
+ EM.start_server Host, Port
63
+ raise "an exception"
64
+ }
65
+ end
66
+ def test_exception_1
67
+ assert_raises( RuntimeError ) { run_exception }
68
+ end
69
+ def test_exception_2
70
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
71
+ assert_raises( ex_class ) { run_exception }
72
+ end
73
+
74
+
75
+ # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
76
+ # exception on certain kinds of TCP connect-errors.
77
+ # It's always been something of an open question whether EM should throw an exception
78
+ # in these cases but the defined answer has always been to catch it the unbind method.
79
+ # With a connect failure, the latter will always fire, but connection_completed will
80
+ # never fire. So even though the point is arguable, it's incorrect for the pure Ruby
81
+ # version to throw an exception.
82
+ module TestConnrefused
83
+ def unbind
84
+ EM.stop
85
+ end
86
+ def connection_completed
87
+ raise "should never get here"
88
+ end
89
+ end
90
+ def test_connrefused
91
+ EM.run {
92
+ EM.connect "0.0.0.0", 60001, TestConnrefused
93
+ }
94
+ end
95
+
96
+
97
+ # Make sure connection_completed gets called as expected with TCP clients. This is the
98
+ # opposite of test_connrefused.
99
+ # If the test fails, it will hang because EM.stop never gets called.
100
+ #
101
+ module TestConnaccepted
102
+ def connection_completed
103
+ EM.stop
104
+ end
105
+ end
106
+ def test_connaccepted
107
+ timeout = false
108
+ EM.run {
109
+ EM.start_server "0.0.0.0", 60002
110
+ EM.connect "0.0.0.0", 60002, TestConnaccepted
111
+ setup_timeout(1)
112
+ }
113
+ assert_equal( false, timeout )
114
+ end
115
+
116
+ def setup_timeout(timeout = 4)
117
+ EM.schedule {
118
+ start_time = EM.current_time
119
+ EM.add_periodic_timer(0.01) {
120
+ raise "timeout" if EM.current_time - start_time >= timeout
121
+ }
122
+ }
123
+ end
124
+
125
+ def test_reactor_running
126
+ a = false
127
+ EM.run {
128
+ a = EM.reactor_running?
129
+ EM.next_tick {EM.stop}
130
+ }
131
+ assert a
132
+ end
133
+
134
+ end
@@ -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
@@ -0,0 +1,42 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift "../lib"
28
+ require 'eventmachine'
29
+ require 'test/unit'
30
+
31
+ class TestRunning < Test::Unit::TestCase
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
41
+ end
42
+
@@ -0,0 +1,72 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift "../lib"
28
+ require 'eventmachine'
29
+ require 'test/unit'
30
+
31
+
32
+ class TestSASL < Test::Unit::TestCase
33
+
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
+
38
+ Host,Port = "127.0.0.1",9560
39
+ TestUser,TestPsw = "someone", "password"
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
47
+
48
+ class SaslClient < EM::Connection
49
+ include EM::Protocols::SASLauthclient
50
+ end
51
+
52
+ def test_sasl
53
+ resp = nil
54
+ EM.run {
55
+ EM.start_server( Host, Port, SaslServer )
56
+
57
+ c = EM.connect( Host, Port, SaslClient )
58
+ d = c.validate?( TestUser, TestPsw )
59
+ d.timeout 1
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
71
+
72
+ end
@@ -0,0 +1,251 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift "../lib"
28
+ require 'eventmachine'
29
+ require 'socket'
30
+ require 'test/unit'
31
+
32
+ class TestSendFile < Test::Unit::TestCase
33
+
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
+ end
45
+
46
+ def receive_data(data)
47
+ @data_to.call(data) if @data_to
48
+ end
49
+
50
+ def unbind
51
+ EM.stop
52
+ end
53
+ end
54
+
55
+ TestHost = "0.0.0.0"
56
+ TestPort = 9055
57
+ TestFilename = "./xxxxxx"
58
+
59
+ def setup
60
+ end
61
+
62
+ def teardown
63
+ File.unlink( TestFilename ) if File.exist?( TestFilename )
64
+ end
65
+
66
+ def setup_timeout(timeout = 4)
67
+ EM.schedule {
68
+ start_time = EM.current_time
69
+ EM.add_periodic_timer(0.01) {
70
+ raise "timeout" if EM.current_time - start_time >= timeout
71
+ }
72
+ }
73
+ end
74
+
75
+ def test_send_file
76
+ File.open( TestFilename, "w" ) {|f|
77
+ f << ("A" * 5000)
78
+ }
79
+
80
+ data = ''
81
+
82
+ EM.run {
83
+ EM.start_server TestHost, TestPort, TestModule
84
+ setup_timeout
85
+
86
+ EM.connect TestHost, TestPort, TestClient do |c|
87
+ c.data_to { |d| data << d }
88
+ end
89
+ }
90
+
91
+ assert_equal( "A" * 5000, data )
92
+ File.unlink TestFilename
93
+ end
94
+
95
+ # EventMachine::Connection#send_file_data has a strict upper limit on the filesize it will work with.
96
+ def test_send_large_file
97
+ File.open( TestFilename, "w" ) {|f|
98
+ f << ("A" * 1000000)
99
+ }
100
+
101
+ data = ''
102
+
103
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
104
+ assert_raises( ex_class ) {
105
+ EM.run {
106
+ EM.start_server TestHost, TestPort, TestModule
107
+ setup_timeout
108
+ EM.connect TestHost, TestPort, TestClient do |c|
109
+ c.data_to { |d| data << d }
110
+ end
111
+ }
112
+ }
113
+
114
+ File.unlink TestFilename
115
+ end
116
+
117
+
118
+ module StreamTestModule
119
+ def post_init
120
+ EM::Deferrable.future( stream_file_data(TestFilename)) {
121
+ close_connection_after_writing
122
+ }
123
+ end
124
+ end
125
+
126
+ module ChunkStreamTestModule
127
+ def post_init
128
+ EM::Deferrable.future( stream_file_data(TestFilename, :http_chunks=>true)) {
129
+ close_connection_after_writing
130
+ }
131
+ end
132
+ end
133
+
134
+ def test_stream_file_data
135
+ File.open( TestFilename, "w" ) {|f|
136
+ f << ("A" * 1000)
137
+ }
138
+
139
+ data = ''
140
+
141
+ EM.run {
142
+ EM.start_server TestHost, TestPort, StreamTestModule
143
+ setup_timeout
144
+ EM.connect TestHost, TestPort, TestClient do |c|
145
+ c.data_to { |d| data << d }
146
+ end
147
+ }
148
+
149
+ assert_equal( "A" * 1000, data )
150
+
151
+ File.unlink TestFilename
152
+ end
153
+
154
+ def test_stream_chunked_file_data
155
+ File.open( TestFilename, "w" ) {|f|
156
+ f << ("A" * 1000)
157
+ }
158
+
159
+ data = ''
160
+
161
+ EM.run {
162
+ EM.start_server TestHost, TestPort, ChunkStreamTestModule
163
+ setup_timeout
164
+ EM.connect TestHost, TestPort, TestClient do |c|
165
+ c.data_to { |d| data << d }
166
+ end
167
+ }
168
+
169
+ assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
170
+
171
+ File.unlink TestFilename
172
+ end
173
+
174
+ module BadFileTestModule
175
+ def post_init
176
+ de = stream_file_data( TestFilename+"..." )
177
+ de.errback {|msg|
178
+ send_data msg
179
+ close_connection_after_writing
180
+ }
181
+ end
182
+ end
183
+ def test_stream_bad_file
184
+ data = ''
185
+ EM.run {
186
+ EM.start_server TestHost, TestPort, BadFileTestModule
187
+ setup_timeout
188
+ EM.connect TestHost, TestPort, TestClient do |c|
189
+ c.data_to { |d| data << d }
190
+ end
191
+ }
192
+
193
+ assert_equal( "file not found", data )
194
+ end
195
+
196
+ def test_stream_large_file_data
197
+ begin
198
+ require 'fastfilereaderext'
199
+ rescue LoadError
200
+ return
201
+ end
202
+ File.open( TestFilename, "w" ) {|f|
203
+ f << ("A" * 10000)
204
+ }
205
+
206
+ data = ''
207
+
208
+ EM.run {
209
+ EM.start_server TestHost, TestPort, StreamTestModule
210
+ setup_timeout
211
+ EM.connect TestHost, TestPort, TestClient do |c|
212
+ c.data_to { |d| data << d }
213
+ end
214
+ }
215
+
216
+ assert_equal( "A" * 10000, data )
217
+
218
+ File.unlink TestFilename
219
+ end
220
+
221
+ def test_stream_large_chunked_file_data
222
+ begin
223
+ require 'fastfilereaderext'
224
+ rescue LoadError
225
+ return
226
+ end
227
+ File.open( TestFilename, "w" ) {|f|
228
+ f << ("A" * 100000)
229
+ }
230
+
231
+ data = ''
232
+
233
+ EM.run {
234
+ EM.start_server TestHost, TestPort, ChunkStreamTestModule
235
+ setup_timeout
236
+ EM.connect TestHost, TestPort, TestClient do |c|
237
+ c.data_to { |d| data << d }
238
+ end
239
+ }
240
+
241
+ expected = [
242
+ "4000\r\n#{"A" * 16384}\r\n" * 6,
243
+ "6a0\r\n#{"A" * 0x6a0}\r\n",
244
+ "0\r\n\r\n"
245
+ ].join
246
+ assert_equal( expected, data )
247
+
248
+ File.unlink TestFilename
249
+ end
250
+
251
+ end