smparkes-eventmachine 0.12.10

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 (158) hide show
  1. data/.gitignore +15 -0
  2. data/README +81 -0
  3. data/Rakefile +374 -0
  4. data/docs/COPYING +60 -0
  5. data/docs/ChangeLog +211 -0
  6. data/docs/DEFERRABLES +133 -0
  7. data/docs/EPOLL +141 -0
  8. data/docs/GNU +281 -0
  9. data/docs/INSTALL +13 -0
  10. data/docs/KEYBOARD +38 -0
  11. data/docs/LEGAL +25 -0
  12. data/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
  13. data/docs/PURE_RUBY +75 -0
  14. data/docs/RELEASE_NOTES +94 -0
  15. data/docs/SMTP +2 -0
  16. data/docs/SPAWNED_PROCESSES +89 -0
  17. data/docs/TODO +8 -0
  18. data/eventmachine.gemspec +40 -0
  19. data/examples/ex_channel.rb +43 -0
  20. data/examples/ex_queue.rb +2 -0
  21. data/examples/helper.rb +2 -0
  22. data/ext/binder.cpp +125 -0
  23. data/ext/binder.h +46 -0
  24. data/ext/cmain.cpp +827 -0
  25. data/ext/cplusplus.cpp +202 -0
  26. data/ext/ed.cpp +1901 -0
  27. data/ext/ed.h +424 -0
  28. data/ext/em.cpp +2288 -0
  29. data/ext/em.h +229 -0
  30. data/ext/emwin.cpp +300 -0
  31. data/ext/emwin.h +94 -0
  32. data/ext/epoll.cpp +26 -0
  33. data/ext/epoll.h +25 -0
  34. data/ext/eventmachine.h +122 -0
  35. data/ext/eventmachine_cpp.h +96 -0
  36. data/ext/extconf.rb +150 -0
  37. data/ext/fastfilereader/extconf.rb +85 -0
  38. data/ext/fastfilereader/mapper.cpp +214 -0
  39. data/ext/fastfilereader/mapper.h +59 -0
  40. data/ext/fastfilereader/rubymain.cpp +127 -0
  41. data/ext/files.cpp +94 -0
  42. data/ext/files.h +65 -0
  43. data/ext/kb.cpp +81 -0
  44. data/ext/page.cpp +107 -0
  45. data/ext/page.h +51 -0
  46. data/ext/pipe.cpp +349 -0
  47. data/ext/project.h +156 -0
  48. data/ext/rubymain.cpp +1194 -0
  49. data/ext/sigs.cpp +89 -0
  50. data/ext/sigs.h +32 -0
  51. data/ext/ssl.cpp +460 -0
  52. data/ext/ssl.h +94 -0
  53. data/java/.classpath +8 -0
  54. data/java/.project +17 -0
  55. data/java/src/com/rubyeventmachine/EmReactor.java +570 -0
  56. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  57. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  58. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  59. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  60. data/java/src/com/rubyeventmachine/application/Application.java +194 -0
  61. data/java/src/com/rubyeventmachine/application/Connection.java +74 -0
  62. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
  63. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
  64. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
  65. data/java/src/com/rubyeventmachine/application/Timer.java +54 -0
  66. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
  67. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -0
  68. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  69. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  70. data/java/src/com/rubyeventmachine/tests/TestServers.java +75 -0
  71. data/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
  72. data/lib/em/buftok.rb +138 -0
  73. data/lib/em/callback.rb +26 -0
  74. data/lib/em/channel.rb +57 -0
  75. data/lib/em/connection.rb +564 -0
  76. data/lib/em/deferrable.rb +192 -0
  77. data/lib/em/file_watch.rb +54 -0
  78. data/lib/em/future.rb +61 -0
  79. data/lib/em/messages.rb +66 -0
  80. data/lib/em/process_watch.rb +44 -0
  81. data/lib/em/processes.rb +119 -0
  82. data/lib/em/protocols/header_and_content.rb +138 -0
  83. data/lib/em/protocols/httpclient.rb +263 -0
  84. data/lib/em/protocols/httpclient2.rb +590 -0
  85. data/lib/em/protocols/line_and_text.rb +125 -0
  86. data/lib/em/protocols/linetext2.rb +161 -0
  87. data/lib/em/protocols/memcache.rb +323 -0
  88. data/lib/em/protocols/object_protocol.rb +45 -0
  89. data/lib/em/protocols/postgres3.rb +247 -0
  90. data/lib/em/protocols/saslauth.rb +175 -0
  91. data/lib/em/protocols/smtpclient.rb +357 -0
  92. data/lib/em/protocols/smtpserver.rb +547 -0
  93. data/lib/em/protocols/socks4.rb +66 -0
  94. data/lib/em/protocols/stomp.rb +200 -0
  95. data/lib/em/protocols/tcptest.rb +53 -0
  96. data/lib/em/protocols.rb +36 -0
  97. data/lib/em/queue.rb +61 -0
  98. data/lib/em/spawnable.rb +85 -0
  99. data/lib/em/streamer.rb +130 -0
  100. data/lib/em/timers.rb +56 -0
  101. data/lib/em/version.rb +3 -0
  102. data/lib/eventmachine.rb +1592 -0
  103. data/lib/evma/callback.rb +32 -0
  104. data/lib/evma/container.rb +75 -0
  105. data/lib/evma/factory.rb +77 -0
  106. data/lib/evma/protocol.rb +87 -0
  107. data/lib/evma/reactor.rb +48 -0
  108. data/lib/evma.rb +32 -0
  109. data/lib/jeventmachine.rb +257 -0
  110. data/lib/pr_eventmachine.rb +1022 -0
  111. data/setup.rb +1585 -0
  112. data/tasks/cpp.rake_example +77 -0
  113. data/tests/client.crt +31 -0
  114. data/tests/client.key +51 -0
  115. data/tests/test_attach.rb +126 -0
  116. data/tests/test_basic.rb +284 -0
  117. data/tests/test_channel.rb +63 -0
  118. data/tests/test_connection_count.rb +35 -0
  119. data/tests/test_defer.rb +47 -0
  120. data/tests/test_epoll.rb +160 -0
  121. data/tests/test_error_handler.rb +35 -0
  122. data/tests/test_errors.rb +82 -0
  123. data/tests/test_exc.rb +55 -0
  124. data/tests/test_file_watch.rb +49 -0
  125. data/tests/test_futures.rb +198 -0
  126. data/tests/test_get_sock_opt.rb +30 -0
  127. data/tests/test_handler_check.rb +37 -0
  128. data/tests/test_hc.rb +218 -0
  129. data/tests/test_httpclient.rb +218 -0
  130. data/tests/test_httpclient2.rb +153 -0
  131. data/tests/test_inactivity_timeout.rb +50 -0
  132. data/tests/test_kb.rb +60 -0
  133. data/tests/test_ltp.rb +182 -0
  134. data/tests/test_ltp2.rb +317 -0
  135. data/tests/test_next_tick.rb +133 -0
  136. data/tests/test_object_protocol.rb +37 -0
  137. data/tests/test_pause.rb +70 -0
  138. data/tests/test_pending_connect_timeout.rb +48 -0
  139. data/tests/test_process_watch.rb +48 -0
  140. data/tests/test_processes.rb +128 -0
  141. data/tests/test_proxy_connection.rb +92 -0
  142. data/tests/test_pure.rb +125 -0
  143. data/tests/test_queue.rb +44 -0
  144. data/tests/test_running.rb +42 -0
  145. data/tests/test_sasl.rb +72 -0
  146. data/tests/test_send_file.rb +242 -0
  147. data/tests/test_servers.rb +76 -0
  148. data/tests/test_smtpclient.rb +83 -0
  149. data/tests/test_smtpserver.rb +85 -0
  150. data/tests/test_spawn.rb +322 -0
  151. data/tests/test_ssl_args.rb +79 -0
  152. data/tests/test_ssl_methods.rb +50 -0
  153. data/tests/test_ssl_verify.rb +82 -0
  154. data/tests/test_timers.rb +162 -0
  155. data/tests/test_ud.rb +36 -0
  156. data/tests/testem.rb +31 -0
  157. data/web/whatis +7 -0
  158. metadata +237 -0
data/tests/test_hc.rb ADDED
@@ -0,0 +1,218 @@
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 TestHeaderAndContentProtocol < Test::Unit::TestCase
32
+
33
+ TestHost = "127.0.0.1"
34
+ TestPort = 8905
35
+
36
+ class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
37
+ attr_reader :first_header, :my_headers, :request
38
+
39
+ def receive_first_header_line hdr
40
+ @first_header ||= []
41
+ @first_header << hdr
42
+ end
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
@@ -0,0 +1,218 @@
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 TestHttpClient < Test::Unit::TestCase
32
+
33
+ Localhost = "127.0.0.1"
34
+ Localport = 9801
35
+
36
+ def setup
37
+ end
38
+
39
+ def teardown
40
+ end
41
+
42
+ #-------------------------------------
43
+
44
+ def test_http_client
45
+ ok = false
46
+ EventMachine.run {
47
+ c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
48
+ c.callback {
49
+ ok = true
50
+ EventMachine.stop
51
+ }
52
+ c.errback {EventMachine.stop} # necessary, otherwise a failure blocks the test suite forever.
53
+ }
54
+ assert ok
55
+ end
56
+
57
+ #-------------------------------------
58
+
59
+ def test_http_client_1
60
+ ok = false
61
+ EventMachine.run {
62
+ c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
63
+ c.callback {ok = true; EventMachine.stop}
64
+ c.errback {EventMachine.stop}
65
+ }
66
+ assert ok
67
+ end
68
+
69
+ #-------------------------------------
70
+
71
+ def test_http_client_2
72
+ ok = false
73
+ EventMachine.run {
74
+ c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
75
+ c.callback {|result|
76
+ ok = true;
77
+ EventMachine.stop
78
+ }
79
+ c.errback {EventMachine.stop}
80
+ }
81
+ assert ok
82
+ end
83
+
84
+
85
+ #-----------------------------------------
86
+
87
+ # Test a server that returns a page with a zero content-length.
88
+ # This caused an early version of the HTTP client not to generate a response,
89
+ # causing this test to hang. Observe, there was no problem with responses
90
+ # lacking a content-length, just when the content-length was zero.
91
+ #
92
+ class EmptyContent < EventMachine::Connection
93
+ def initialize *args
94
+ super
95
+ end
96
+ def receive_data data
97
+ send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n"
98
+ close_connection_after_writing
99
+ end
100
+ end
101
+
102
+ def test_http_empty_content
103
+ ok = false
104
+ EventMachine.run {
105
+ EventMachine.start_server "127.0.0.1", 9701, EmptyContent
106
+ c = EventMachine::Protocols::HttpClient.send :request, :host => "127.0.0.1", :port => 9701
107
+ c.callback {|result|
108
+ ok = true
109
+ EventMachine.stop
110
+ }
111
+ }
112
+ assert ok
113
+ end
114
+
115
+
116
+ #---------------------------------------
117
+
118
+ class PostContent < EventMachine::Protocols::LineAndTextProtocol
119
+ def initialize *args
120
+ super
121
+ @lines = []
122
+ end
123
+ def receive_line line
124
+ if line.length > 0
125
+ @lines << line
126
+ else
127
+ process_headers
128
+ end
129
+ end
130
+ def receive_binary_data data
131
+ @post_content = data
132
+ send_response
133
+ end
134
+ def process_headers
135
+ if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/
136
+ @uri = $1.dup
137
+ else
138
+ raise "bad request"
139
+ end
140
+
141
+ @lines.each {|line|
142
+ if line =~ /\AContent-length:\s*(\d+)\Z/i
143
+ @content_length = $1.dup.to_i
144
+ elsif line =~ /\AContent-type:\s*(\d+)\Z/i
145
+ @content_type = $1.dup
146
+ end
147
+ }
148
+
149
+ raise "invalid content length" unless @content_length
150
+ set_binary_mode @content_length
151
+ end
152
+ def send_response
153
+ send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789"
154
+ close_connection_after_writing
155
+ end
156
+ end
157
+
158
+ # TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client
159
+ # is sending a 1.0 request. Gotta fix the client
160
+ def test_post
161
+ response = nil
162
+ EventMachine.run {
163
+ EventMachine.start_server Localhost, Localport, PostContent
164
+ EventMachine.add_timer(2) {raise "timed out"}
165
+ c = EventMachine::Protocols::HttpClient.request(
166
+ :host=>Localhost,
167
+ :port=>Localport,
168
+ :method=>:post,
169
+ :request=>"/aaa",
170
+ :content=>"XYZ",
171
+ :content_type=>"text/plain"
172
+ )
173
+ c.callback {|r|
174
+ response = r
175
+ EventMachine.stop
176
+ }
177
+ }
178
+
179
+ assert_equal( 200, response[:status] )
180
+ assert_equal( "0123456789", response[:content] )
181
+ end
182
+
183
+
184
+ # TODO, need a more intelligent cookie tester.
185
+ # In fact, this whole test-harness needs a beefier server implementation.
186
+ def test_cookie
187
+ ok = false
188
+ EM.run {
189
+ c = EM::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80, :cookie=>"aaa=bbb"
190
+ c.callback {|result|
191
+ ok = true;
192
+ EventMachine.stop
193
+ }
194
+ c.errback {EventMachine.stop}
195
+ }
196
+ assert ok
197
+ end
198
+
199
+ # We can tell the client to send an HTTP/1.0 request (default is 1.1).
200
+ # This is useful for suppressing chunked responses until those are working.
201
+ def test_version_1_0
202
+ ok = false
203
+ EM.run {
204
+ c = EM::P::HttpClient.request(
205
+ :host => "www.bayshorenetworks.com",
206
+ :port => 80,
207
+ :version => "1.0"
208
+ )
209
+ c.callback {|result|
210
+ ok = true;
211
+ EventMachine.stop
212
+ }
213
+ c.errback {EventMachine.stop}
214
+ }
215
+ assert ok
216
+ end
217
+
218
+ end
@@ -0,0 +1,153 @@
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 TestHttpClient2 < Test::Unit::TestCase
32
+ Localhost = "127.0.0.1"
33
+ Localport = 9801
34
+
35
+ def setup
36
+ end
37
+
38
+ def teardown
39
+ end
40
+
41
+
42
+ class TestServer < EM::Connection
43
+ end
44
+
45
+ # #connect returns an object which has made a connection to an HTTP server
46
+ # and exposes methods for making HTTP requests on that connection.
47
+ # #connect can take either a pair of parameters (a host and a port),
48
+ # or a single parameter which is a Hash.
49
+ #
50
+ def test_connect
51
+ EM.run {
52
+ EM.start_server Localhost, Localport, TestServer
53
+ http1 = EM::P::HttpClient2.connect Localhost, Localport
54
+ http2 = EM::P::HttpClient2.connect( :host=>Localhost, :port=>Localport )
55
+ EM.stop
56
+ }
57
+ end
58
+
59
+
60
+ def test_bad_port
61
+ EM.run {
62
+ EM.start_server Localhost, Localport, TestServer
63
+ assert_raises( ArgumentError ) {
64
+ EM::P::HttpClient2.connect Localhost, "xxx"
65
+ }
66
+ EM.stop
67
+ }
68
+ end
69
+
70
+ def test_bad_server
71
+ err = nil
72
+ EM.run {
73
+ http = EM::P::HttpClient2.connect Localhost, 9999
74
+ d = http.get "/"
75
+ d.errback { err = true; d.internal_error; EM.stop }
76
+ }
77
+ assert(err)
78
+ end
79
+
80
+ def test_get
81
+ content = nil
82
+ EM.run {
83
+ http = EM::P::HttpClient2.connect "google.com", 80
84
+ d = http.get "/"
85
+ d.callback {
86
+ content = d.content
87
+ EM.stop
88
+ }
89
+ }
90
+ assert(content)
91
+ end
92
+
93
+ # Not a pipelined request because we wait for one response before we request the next.
94
+ # XXX this test is broken because it sends the second request to the first connection
95
+ # XXX right before the connection closes
96
+ def _test_get_multiple
97
+ content = nil
98
+ EM.run {
99
+ http = EM::P::HttpClient2.connect "google.com", 80
100
+ d = http.get "/"
101
+ d.callback {
102
+ e = http.get "/"
103
+ e.callback {
104
+ content = e.content
105
+ EM.stop
106
+ }
107
+ }
108
+ }
109
+ assert(content)
110
+ end
111
+
112
+ def test_get_pipeline
113
+ headers, headers2 = nil, nil
114
+ EM.run {
115
+ http = EM::P::HttpClient2.connect "google.com", 80
116
+ d = http.get("/")
117
+ d.callback {
118
+ headers = d.headers
119
+ }
120
+ e = http.get("/")
121
+ e.callback {
122
+ headers2 = e.headers
123
+ }
124
+ EM::Timer.new(1) {EM.stop}
125
+ }
126
+ assert(headers)
127
+ assert(headers2)
128
+ end
129
+
130
+
131
+ def test_authheader
132
+ EM.run {
133
+ EM.start_server Localhost, Localport, TestServer
134
+ http = EM::P::HttpClient2.connect Localhost, 18842
135
+ d = http.get :url=>"/", :authorization=>"Basic xxx"
136
+ d.callback {EM.stop}
137
+ d.errback {EM.stop}
138
+ }
139
+ end
140
+
141
+ def test_https_get
142
+ d = nil
143
+ EM.run {
144
+ http = EM::P::HttpClient2.connect :host => 'www.amazon.com', :port => 443, :ssl => true
145
+ d = http.get "/"
146
+ d.callback {
147
+ EM.stop
148
+ }
149
+ }
150
+ assert_equal(200, d.status)
151
+ end if EM.ssl?
152
+
153
+ end
@@ -0,0 +1,50 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestInactivityTimeout < Test::Unit::TestCase
6
+
7
+ def test_default
8
+ $timeout = nil
9
+ EM.run {
10
+ c = EM.connect("127.0.0.1", 54321)
11
+ $timeout = c.comm_inactivity_timeout
12
+ EM.stop
13
+ }
14
+
15
+ assert_equal(0.0, $timeout)
16
+ end
17
+
18
+ def test_set_and_get
19
+ $timeout = nil
20
+ EM.run {
21
+ c = EM.connect("127.0.0.1", 54321)
22
+ c.comm_inactivity_timeout = 2.5
23
+ $timeout = c.comm_inactivity_timeout
24
+ EM.stop
25
+ }
26
+
27
+ assert_equal(2.5, $timeout)
28
+ end
29
+
30
+ module TimeoutHandler
31
+ def unbind
32
+ EM.stop
33
+ end
34
+ end
35
+
36
+ def test_for_real
37
+ EM.run {
38
+ EM.heartbeat_interval = 0.1
39
+ EM.start_server("127.0.0.1", 12345)
40
+ EM.add_timer(0.2) {
41
+ $start = Time.now
42
+ c = EM.connect("127.0.0.1", 12345, TimeoutHandler)
43
+ c.comm_inactivity_timeout = 2.5
44
+ }
45
+ }
46
+
47
+ assert_in_delta(2.5, (Time.now - $start), 0.3)
48
+ end
49
+
50
+ end
data/tests/test_kb.rb ADDED
@@ -0,0 +1,60 @@
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 TestKeyboardEvents < Test::Unit::TestCase
32
+
33
+ def setup
34
+ end
35
+
36
+ def teardown
37
+ end
38
+
39
+ module KbHandler
40
+ include EM::Protocols::LineText2
41
+ def receive_line d
42
+ EM::stop if d == "STOP"
43
+ end
44
+ end
45
+
46
+ # This test doesn't actually do anything useful but is here to
47
+ # illustrate the usage. If you removed the timer and ran this test
48
+ # by itself on a console, and then typed into the console, it would
49
+ # work.
50
+ # I don't know how to get the test harness to simulate actual keystrokes.
51
+ # When someone figures that out, then we can make this a real test.
52
+ #
53
+ def test_kb
54
+ EM.run {
55
+ EM.open_keyboard KbHandler
56
+ EM::Timer.new(1) { EM.stop }
57
+ } if $stdout.tty? # don't run the test unless it stands a chance of validity.
58
+ end
59
+
60
+ end