eventmachine 0.12.2 → 0.12.4

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 (125) hide show
  1. data/Rakefile +191 -0
  2. data/{COPYING → docs/COPYING} +0 -0
  3. data/docs/ChangeLog +183 -0
  4. data/{DEFERRABLES → docs/DEFERRABLES} +1 -1
  5. data/{EPOLL → docs/EPOLL} +0 -0
  6. data/{GNU → docs/GNU} +0 -0
  7. data/docs/INSTALL +15 -0
  8. data/{KEYBOARD → docs/KEYBOARD} +0 -0
  9. data/{LEGAL → docs/LEGAL} +0 -0
  10. data/{LIGHTWEIGHT_CONCURRENCY → docs/LIGHTWEIGHT_CONCURRENCY} +1 -1
  11. data/{PURE_RUBY → docs/PURE_RUBY} +1 -1
  12. data/{README → docs/README} +1 -1
  13. data/{RELEASE_NOTES → docs/RELEASE_NOTES} +1 -1
  14. data/{SMTP → docs/SMTP} +1 -1
  15. data/{SPAWNED_PROCESSES → docs/SPAWNED_PROCESSES} +1 -1
  16. data/{TODO → docs/TODO} +1 -1
  17. data/ext/binder.cpp +1 -1
  18. data/ext/binder.h +1 -1
  19. data/ext/cmain.cpp +65 -74
  20. data/ext/cplusplus.cpp +1 -1
  21. data/ext/ed.cpp +41 -25
  22. data/ext/ed.h +10 -3
  23. data/ext/em.cpp +39 -12
  24. data/ext/em.h +13 -1
  25. data/ext/emwin.cpp +1 -1
  26. data/ext/emwin.h +1 -1
  27. data/ext/epoll.cpp +1 -1
  28. data/ext/epoll.h +1 -1
  29. data/ext/eventmachine.h +1 -1
  30. data/ext/eventmachine_cpp.h +1 -1
  31. data/ext/extconf.rb +86 -139
  32. data/ext/fastfilereader/extconf.rb +161 -0
  33. data/ext/fastfilereader/mapper.cpp +202 -0
  34. data/ext/fastfilereader/mapper.h +59 -0
  35. data/ext/fastfilereader/rubymain.cpp +127 -0
  36. data/ext/files.cpp +1 -1
  37. data/ext/files.h +1 -1
  38. data/ext/kb.cpp +1 -1
  39. data/ext/page.cpp +1 -1
  40. data/ext/page.h +1 -1
  41. data/ext/pipe.cpp +14 -7
  42. data/ext/project.h +1 -1
  43. data/ext/rubymain.cpp +56 -2
  44. data/ext/sigs.cpp +1 -1
  45. data/ext/sigs.h +1 -1
  46. data/ext/ssl.cpp +1 -1
  47. data/ext/ssl.h +1 -1
  48. data/java/src/com/rubyeventmachine/Application.java +196 -0
  49. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  50. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  51. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  52. data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
  53. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  54. data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
  55. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
  56. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
  57. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  58. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  59. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  60. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
  61. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  62. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  63. data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
  64. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
  65. data/lib/em/deferrable.rb +1 -1
  66. data/lib/em/eventable.rb +1 -1
  67. data/lib/em/future.rb +1 -1
  68. data/lib/em/messages.rb +1 -1
  69. data/lib/em/processes.rb +1 -1
  70. data/lib/em/spawnable.rb +1 -1
  71. data/lib/em/streamer.rb +1 -1
  72. data/lib/eventmachine.rb +138 -116
  73. data/lib/eventmachine_version.rb +2 -2
  74. data/lib/evma.rb +1 -1
  75. data/lib/evma/callback.rb +1 -1
  76. data/lib/evma/container.rb +1 -1
  77. data/lib/evma/factory.rb +1 -1
  78. data/lib/evma/protocol.rb +1 -1
  79. data/lib/evma/reactor.rb +1 -1
  80. data/lib/jeventmachine.rb +7 -2
  81. data/lib/pr_eventmachine.rb +2 -2
  82. data/lib/protocols/buftok.rb +1 -1
  83. data/lib/protocols/header_and_content.rb +1 -1
  84. data/lib/protocols/httpcli2.rb +16 -6
  85. data/lib/protocols/httpclient.rb +7 -1
  86. data/lib/protocols/line_and_text.rb +6 -2
  87. data/lib/protocols/linetext2.rb +12 -14
  88. data/lib/protocols/postgres.rb +1 -1
  89. data/lib/protocols/saslauth.rb +1 -1
  90. data/lib/protocols/smtpclient.rb +1 -1
  91. data/lib/protocols/smtpserver.rb +36 -23
  92. data/lib/protocols/stomp.rb +24 -1
  93. data/lib/protocols/tcptest.rb +1 -1
  94. data/tasks/cpp.rake +77 -0
  95. data/tasks/project.rake +78 -0
  96. data/tasks/tests.rake +192 -0
  97. data/tests/test_attach.rb +1 -1
  98. data/tests/test_basic.rb +65 -12
  99. data/tests/test_defer.rb +13 -29
  100. data/tests/test_epoll.rb +16 -21
  101. data/tests/test_errors.rb +1 -1
  102. data/tests/test_eventables.rb +4 -5
  103. data/tests/test_exc.rb +1 -1
  104. data/tests/test_futures.rb +1 -1
  105. data/tests/test_hc.rb +185 -236
  106. data/tests/test_httpclient.rb +1 -1
  107. data/tests/test_httpclient2.rb +28 -6
  108. data/tests/test_kb.rb +2 -2
  109. data/tests/test_ltp.rb +139 -141
  110. data/tests/test_ltp2.rb +1 -1
  111. data/tests/test_next_tick.rb +1 -1
  112. data/tests/test_processes.rb +1 -1
  113. data/tests/test_pure.rb +3 -2
  114. data/tests/test_running.rb +1 -1
  115. data/tests/test_sasl.rb +1 -1
  116. data/tests/test_send_file.rb +56 -51
  117. data/tests/test_servers.rb +26 -36
  118. data/tests/test_smtpclient.rb +46 -44
  119. data/tests/test_smtpserver.rb +1 -1
  120. data/tests/test_spawn.rb +1 -1
  121. data/tests/test_ssl_args.rb +68 -0
  122. data/tests/test_timers.rb +15 -9
  123. data/tests/test_ud.rb +1 -1
  124. data/tests/testem.rb +30 -4
  125. metadata +69 -34
@@ -1,4 +1,4 @@
1
- # $Id: test_epoll.rb 668 2008-01-04 23:00:34Z blackhedd $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -28,20 +28,12 @@
28
28
  # the result is a very confusing error message.
29
29
  #
30
30
 
31
- $:.unshift "../lib"
32
31
  require 'eventmachine'
33
32
  require 'test/unit'
34
33
 
35
34
 
36
35
  class TestEpoll < Test::Unit::TestCase
37
36
 
38
- def setup
39
- end
40
-
41
- def teardown
42
- end
43
-
44
-
45
37
  module TestEchoServer
46
38
  def receive_data data
47
39
  send_data data
@@ -69,7 +61,7 @@ class TestEpoll < Test::Unit::TestCase
69
61
  # On most systems, the default value is 1024.
70
62
  # Java doesn't (currently) implement this.
71
63
  def test_rlimit
72
- unless RUBY_PLATFORM =~ /java/
64
+ unless RUBY_PLATFORM =~ /java/ or EM.set_descriptor_table_size >= 1024
73
65
  a = EM.set_descriptor_table_size
74
66
  assert( a <= 1024 )
75
67
  a = EM.set_descriptor_table_size( 1024 )
@@ -97,16 +89,16 @@ class TestEpoll < Test::Unit::TestCase
97
89
  assert_equal(100, $max)
98
90
  end
99
91
 
100
- def test_defer
101
- $n = 0
102
- EM.epoll
103
- EM.run {
104
- sleep_proc = proc {sleep 1}
105
- return_proc = proc {$n += 1; EM.stop}
106
- EM.defer sleep_proc, return_proc
107
- }
108
- assert_equal( 1, $n )
109
- end
92
+ def test_defer
93
+ n = 0
94
+ work_proc = proc {n += 1}
95
+ callback_proc = proc {EM.stop}
96
+ EM.epoll
97
+ EM.run {
98
+ EM.defer work_proc, callback_proc
99
+ }
100
+ assert_equal( 1, n )
101
+ end unless RUBY_VERSION >= '1.9.0'
110
102
 
111
103
 
112
104
  module TestDatagramServer
@@ -140,6 +132,7 @@ class TestEpoll < Test::Unit::TestCase
140
132
 
141
133
 
142
134
  def test_unix_domain
135
+ fn = "/tmp/xxx.chain"
143
136
  EM.epoll
144
137
  s = EM.set_descriptor_table_size 60000
145
138
  EM.run {
@@ -151,7 +144,6 @@ class TestEpoll < Test::Unit::TestCase
151
144
  # Let's not sweat the Unix-ness of the filename, since this test can't possibly
152
145
  # work on Windows anyway.
153
146
  #
154
- fn = "/tmp/xxx.chain"
155
147
  File.unlink(fn) if File.exist?(fn)
156
148
  EM.start_unix_domain_server fn, TestEchoServer
157
149
  $n = 0
@@ -159,9 +151,12 @@ class TestEpoll < Test::Unit::TestCase
159
151
  50.times {
160
152
  EM.connect_unix_domain(fn, TestEchoClient) {$n += 1}
161
153
  }
154
+ EM::add_timer(1) { $stderr.puts("test_unix_domain timed out!"); EM::stop }
162
155
  }
163
156
  assert_equal(0, $n)
164
157
  assert_equal(50, $max)
158
+ ensure
159
+ File.unlink(fn) if File.exist?(fn)
165
160
  end
166
161
 
167
162
  end
@@ -1,4 +1,4 @@
1
- # $Id: test_errors.rb 668 2008-01-04 23:00:34Z blackhedd $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -1,4 +1,4 @@
1
- # $Id: test_eventables.rb 668 2008-01-04 23:00:34Z blackhedd $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -27,10 +27,6 @@
27
27
  $:.unshift "../lib"
28
28
  require 'eventmachine'
29
29
 
30
- require 'test/unit/testsuite'
31
- require 'test/unit/ui/console/testrunner'
32
-
33
-
34
30
  class TestEventables < Test::Unit::TestCase
35
31
 
36
32
  class EvTest
@@ -68,6 +64,9 @@ end
68
64
  #--------------------------------------
69
65
 
70
66
  if __FILE__ == $0
67
+ require 'test/unit/testsuite'
68
+ require 'test/unit/ui/console/testrunner'
69
+
71
70
  runner = Test::Unit::UI::Console::TestRunner
72
71
  suite = Test::Unit::TestSuite.new("name")
73
72
  ObjectSpace.each_object(Class) do |testcase|
@@ -1,4 +1,4 @@
1
- # $Id: test_exc.rb 668 2008-01-04 23:00:34Z blackhedd $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -1,4 +1,4 @@
1
- # $Id: test_futures.rb 668 2008-01-04 23:00:34Z blackhedd $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -1,4 +1,4 @@
1
- # $Id: test_hc.rb 721 2008-06-21 00:45:57Z francis $
1
+ # $Id$
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -24,246 +24,195 @@
24
24
  #
25
25
  #
26
26
 
27
- $:.unshift "../lib"
27
+ # $:.unshift "../lib"
28
28
  require 'eventmachine'
29
- require 'socket'
30
29
  require 'test/unit'
31
30
 
32
- # This doesn't completely work under Ruby 1.9.
33
- # Part of it is thread race conditions. I added some sleeps to make these
34
- # tests work. Native threads do strange things when you do I/O on them.
35
- #
36
- # And it's even worse in Java, where I/O on native threads doesn't seem
37
- # to be reliable at all.
38
- #
39
-
40
-
41
31
  class TestHeaderAndContentProtocol < Test::Unit::TestCase
42
32
 
43
- TestHost = "127.0.0.1"
44
- TestPort = 8905
45
-
46
-
47
- #--------------------------------------------------------------------
48
-
49
- class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
50
- attr_reader :first_header, :my_headers, :request
51
-
52
- def receive_first_header_line hdr
53
- @first_header ||= []
54
- @first_header << hdr
55
- end
56
- def receive_headers hdrs
57
- @my_headers ||= []
58
- @my_headers << hdrs
59
- end
60
- def receive_request hdrs, content
61
- @request ||= []
62
- @request << [hdrs, content]
63
- end
64
- end
65
-
66
-
67
- def test_no_content
68
- Thread.abort_on_exception = true
69
- the_connection = nil
70
- EventMachine.run {
71
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
72
- the_connection = conn
73
- end
74
- EventMachine.add_timer(4) {raise "test timed out"}
75
-
76
- pr = proc {
77
- t = TCPSocket.new TestHost, TestPort
78
- t.write [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
79
- t.close
80
- }
81
-
82
- if RUBY_PLATFORM =~ /java/i
83
- pr.call
84
- EM.add_timer(0.5) {EM.stop}
85
- else
86
- EventMachine.defer proc {
87
- pr.call
88
- if RUBY_VERSION =~ /\A1\.9\./
89
- sleep 0.1
90
- STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
91
- end
92
- }, proc {
93
- EventMachine.stop
94
- }
95
- end
96
- }
97
- assert_equal( ["aaa"], the_connection.first_header )
98
- assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
99
- assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
100
- end
101
-
102
-
103
-
104
-
105
- def test_content
106
- Thread.abort_on_exception = true
107
- the_connection = nil
108
- content = "A" * 50
109
- headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
110
- EventMachine.run {
111
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
112
- the_connection = conn
113
- end
114
- EventMachine.add_timer(4) {raise "test timed out"}
115
-
116
- pr = proc {
117
- t = TCPSocket.new TestHost, TestPort
118
- headers.each {|h| t.write "#{h}\r\n" }
119
- t.write "\n"
120
- t.write content
121
- t.close
122
- }
33
+ TestHost = "127.0.0.1"
34
+ TestPort = 8905
123
35
 
124
- if RUBY_PLATFORM =~ /java/i
125
- # I/O on threads seems completely unreliable in Java.
126
- pr.call
127
- EM.add_timer(0.5) {EM.stop}
128
- else
129
- EventMachine.defer proc {
130
- pr.call
131
- if RUBY_VERSION =~ /\A1\.9\./
132
- sleep 0.1
133
- STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
134
- end
135
- }, proc {
136
- EM.stop
137
- }
138
- end
139
- }
140
- assert_equal( ["aaa"], the_connection.first_header )
141
- assert_equal( [headers], the_connection.my_headers )
142
- assert_equal( [[headers, content]], the_connection.request )
143
- end
36
+ class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
37
+ attr_reader :first_header, :my_headers, :request
144
38
 
145
-
146
-
147
- def test_several_requests
148
- Thread.abort_on_exception = true
149
- the_connection = nil
150
- content = "A" * 50
151
- headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
152
- EventMachine.run {
153
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
154
- the_connection = conn
155
- end
156
- EventMachine.add_timer(4) {raise "test timed out"}
157
-
158
- pr = proc {
159
- t = TCPSocket.new TestHost, TestPort
160
- 5.times {
161
- headers.each {|h| t.write "#{h}\r\n" }
162
- t.write "\n"
163
- t.write content
164
- }
165
- t.close
166
- }
167
-
168
- if RUBY_PLATFORM =~ /java/i
169
- pr.call
170
- EM.add_timer(1) {EM.stop}
171
- else
172
- EventMachine.defer proc {
173
- pr.call
174
- if RUBY_VERSION =~ /\A1\.9\./
175
- sleep 0.1
176
- STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
177
- end
178
- }, proc {
179
- EventMachine.stop
180
- }
181
- end
182
- }
183
- assert_equal( ["aaa"] * 5, the_connection.first_header )
184
- assert_equal( [headers] * 5, the_connection.my_headers )
185
- assert_equal( [[headers, content]] * 5, the_connection.request )
186
- end
187
-
188
-
189
- def x_test_multiple_content_length_headers
190
- # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
191
- Thread.abort_on_exception = true
192
- the_connection = nil
193
- content = "A" * 50
194
- headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
195
- EventMachine.run {
196
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
197
- the_connection = conn
198
- end
199
- EventMachine.add_timer(4) {raise "test timed out"}
200
- EventMachine.defer proc {
201
- t = TCPSocket.new TestHost, TestPort
202
- headers.each {|h| t.write "#{h}\r\n" }
203
- t.write "\n"
204
- t.write content
205
- t.close
206
- }, proc {
207
- EventMachine.stop
208
- }
209
- }
39
+ def receive_first_header_line hdr
40
+ @first_header ||= []
41
+ @first_header << hdr
210
42
  end
211
-
212
- def test_interpret_headers
213
- Thread.abort_on_exception = true
214
- the_connection = nil
215
- content = "A" * 50
216
- headers = [
217
- "GET / HTTP/1.0",
218
- "Accept: aaa",
219
- "User-Agent: bbb",
220
- "Host: ccc",
221
- "x-tempest-header:ddd"
222
- ]
223
-
224
- EventMachine.run {
225
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
226
- the_connection = conn
227
- end
228
- EventMachine.add_timer(4) {raise "test timed out"}
229
-
230
- pr = proc {
231
- t = TCPSocket.new TestHost, TestPort
232
- headers.each {|h| t.write "#{h}\r\n" }
233
- t.write "\n"
234
- t.write content
235
- t.close
236
- }
237
-
238
- if RUBY_PLATFORM =~ /java/i
239
- pr.call
240
- EM.add_timer(0.5) {EM.stop}
241
- else
242
- EventMachine.defer proc {
243
- pr.call
244
- if RUBY_VERSION =~ /\A1\.9\./
245
- sleep 0.1
246
- STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
247
- end
248
- }, proc {
249
- EventMachine.stop
250
- }
251
- end
252
- }
253
-
254
- hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
255
- assert_equal(
256
- {
257
- :accept => "aaa",
258
- :user_agent => "bbb",
259
- :host => "ccc",
260
- :x_tempest_header => "ddd"
261
- },
262
- hsh
263
- )
264
- end
265
-
266
-
267
- end
268
-
269
-
43
+ def receive_headers hdrs
44
+ @my_headers ||= []
45
+ @my_headers << hdrs
46
+ end
47
+ def receive_request hdrs, content
48
+ @request ||= []
49
+ @request << [hdrs, content]
50
+ end
51
+ end
52
+
53
+ def test_no_content
54
+ the_connection = nil
55
+ EventMachine.run {
56
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
57
+ the_connection = conn
58
+ end
59
+ EventMachine.add_timer(4) {raise "test timed out"}
60
+
61
+ client = Module.new do
62
+ def unbind
63
+ EM.add_timer(0.1) { EM.stop }
64
+ end
65
+
66
+ def post_init
67
+ send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
68
+ close_connection_after_writing
69
+ end
70
+ end
71
+
72
+ EventMachine.connect( TestHost, TestPort, client )
73
+ }
74
+ assert_equal( ["aaa"], the_connection.first_header )
75
+ assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
76
+ assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
77
+ end
78
+
79
+ def test_content
80
+ the_connection = nil
81
+ content = "A" * 50
82
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
83
+ EventMachine.run {
84
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
85
+ the_connection = conn
86
+ end
87
+ EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
88
+
89
+ client = Module.new do
90
+ define_method(:headers) { headers }
91
+ define_method(:content) { content }
92
+
93
+ def unbind
94
+ EM.add_timer(0.1) { EM.stop }
95
+ end
96
+
97
+ def post_init
98
+ headers.each { |h| send_data "#{h}\r\n" }
99
+ send_data "\n"
100
+ send_data content
101
+ close_connection_after_writing
102
+ end
103
+ end
104
+
105
+ EventMachine.connect( TestHost, TestPort, client )
106
+
107
+ }
108
+ assert_equal( ["aaa"], the_connection.first_header )
109
+ assert_equal( [headers], the_connection.my_headers )
110
+ assert_equal( [[headers, content]], the_connection.request )
111
+ end
112
+
113
+ def test_several_requests
114
+ the_connection = nil
115
+ content = "A" * 50
116
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
117
+ EventMachine.run {
118
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
119
+ the_connection = conn
120
+ end
121
+ EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
122
+
123
+ client = Module.new do
124
+ define_method(:headers) { headers }
125
+ define_method(:content) { content }
126
+
127
+ def unbind
128
+ EM.add_timer(0.1) { EM.stop }
129
+ end
130
+
131
+ def post_init
132
+ 5.times do
133
+ headers.each { |h| send_data "#{h}\r\n" }
134
+ send_data "\n"
135
+ send_data content
136
+ end
137
+ close_connection_after_writing
138
+ end
139
+ end
140
+
141
+ EventMachine.connect( TestHost, TestPort, client )
142
+ }
143
+ assert_equal( ["aaa"] * 5, the_connection.first_header )
144
+ assert_equal( [headers] * 5, the_connection.my_headers )
145
+ assert_equal( [[headers, content]] * 5, the_connection.request )
146
+ end
147
+
148
+
149
+ # def x_test_multiple_content_length_headers
150
+ # # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
151
+ # the_connection = nil
152
+ # content = "A" * 50
153
+ # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
154
+ # EventMachine.run {
155
+ # EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
156
+ # the_connection = conn
157
+ # end
158
+ # EventMachine.add_timer(4) {raise "test timed out"}
159
+ # test_proc = proc {
160
+ # t = TCPSocket.new TestHost, TestPort
161
+ # headers.each {|h| t.write "#{h}\r\n" }
162
+ # t.write "\n"
163
+ # t.write content
164
+ # t.close
165
+ # }
166
+ # EventMachine.defer test_proc, proc {
167
+ # EventMachine.stop
168
+ # }
169
+ # }
170
+ # end
171
+
172
+ def test_interpret_headers
173
+ the_connection = nil
174
+ content = "A" * 50
175
+ headers = [
176
+ "GET / HTTP/1.0",
177
+ "Accept: aaa",
178
+ "User-Agent: bbb",
179
+ "Host: ccc",
180
+ "x-tempest-header:ddd"
181
+ ]
182
+
183
+ EventMachine.run {
184
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
185
+ the_connection = conn
186
+ end
187
+ EventMachine.add_timer(4) {raise "test timed out"}
188
+
189
+ client = Module.new do
190
+ define_method(:headers) { headers }
191
+ define_method(:content) { content }
192
+
193
+ def unbind
194
+ EM.add_timer(0.1) { EM.stop }
195
+ end
196
+
197
+ def post_init
198
+ headers.each { |h| send_data "#{h}\r\n" }
199
+ send_data "\n"
200
+ send_data content
201
+ close_connection_after_writing
202
+ end
203
+ end
204
+
205
+ EventMachine.connect( TestHost, TestPort, client )
206
+ }
207
+
208
+ hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
209
+ expect = {
210
+ :accept => "aaa",
211
+ :user_agent => "bbb",
212
+ :host => "ccc",
213
+ :x_tempest_header => "ddd"
214
+ }
215
+ assert_equal(expect, hsh)
216
+ end
217
+
218
+ end