sensu-em 2.0.0-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.
Files changed (177) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +12 -0
  4. data/.yardopts +7 -0
  5. data/CHANGELOG.md +33 -0
  6. data/GNU +281 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE +60 -0
  9. data/README.md +109 -0
  10. data/Rakefile +20 -0
  11. data/docs/DocumentationGuidesIndex.md +27 -0
  12. data/docs/GettingStarted.md +521 -0
  13. data/docs/old/ChangeLog +211 -0
  14. data/docs/old/DEFERRABLES +246 -0
  15. data/docs/old/EPOLL +141 -0
  16. data/docs/old/INSTALL +13 -0
  17. data/docs/old/KEYBOARD +42 -0
  18. data/docs/old/LEGAL +25 -0
  19. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  20. data/docs/old/PURE_RUBY +75 -0
  21. data/docs/old/RELEASE_NOTES +94 -0
  22. data/docs/old/SMTP +4 -0
  23. data/docs/old/SPAWNED_PROCESSES +148 -0
  24. data/docs/old/TODO +8 -0
  25. data/eventmachine.gemspec +38 -0
  26. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  27. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  28. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  29. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  30. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  31. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  32. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  33. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  34. data/examples/old/ex_channel.rb +43 -0
  35. data/examples/old/ex_queue.rb +2 -0
  36. data/examples/old/ex_tick_loop_array.rb +15 -0
  37. data/examples/old/ex_tick_loop_counter.rb +32 -0
  38. data/examples/old/helper.rb +2 -0
  39. data/ext/binder.cpp +124 -0
  40. data/ext/binder.h +46 -0
  41. data/ext/cmain.cpp +887 -0
  42. data/ext/ed.cpp +1988 -0
  43. data/ext/ed.h +422 -0
  44. data/ext/em.cpp +2352 -0
  45. data/ext/em.h +253 -0
  46. data/ext/eventmachine.h +128 -0
  47. data/ext/extconf.rb +179 -0
  48. data/ext/fastfilereader/extconf.rb +103 -0
  49. data/ext/fastfilereader/mapper.cpp +214 -0
  50. data/ext/fastfilereader/mapper.h +59 -0
  51. data/ext/fastfilereader/rubymain.cpp +127 -0
  52. data/ext/kb.cpp +79 -0
  53. data/ext/page.cpp +107 -0
  54. data/ext/page.h +51 -0
  55. data/ext/pipe.cpp +347 -0
  56. data/ext/project.h +161 -0
  57. data/ext/rubymain.cpp +1318 -0
  58. data/ext/ssl.cpp +468 -0
  59. data/ext/ssl.h +94 -0
  60. data/java/.classpath +6 -0
  61. data/java/.gitignore +1 -0
  62. data/java/.project +17 -0
  63. data/java/src/com/rubyeventmachine/DatagramPacket.java +13 -0
  64. data/java/src/com/rubyeventmachine/EmReactor.java +529 -0
  65. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  66. data/java/src/com/rubyeventmachine/EventCallback.java +7 -0
  67. data/java/src/com/rubyeventmachine/EventCode.java +26 -0
  68. data/java/src/com/rubyeventmachine/EventableChannel.java +130 -0
  69. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +180 -0
  70. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +405 -0
  71. data/java/src/com/rubyeventmachine/SslBox.java +310 -0
  72. data/lib/em/buftok.rb +110 -0
  73. data/lib/em/callback.rb +58 -0
  74. data/lib/em/channel.rb +64 -0
  75. data/lib/em/completion.rb +304 -0
  76. data/lib/em/connection.rb +712 -0
  77. data/lib/em/deferrable/pool.rb +2 -0
  78. data/lib/em/deferrable.rb +210 -0
  79. data/lib/em/file_watch.rb +73 -0
  80. data/lib/em/future.rb +61 -0
  81. data/lib/em/iterator.rb +231 -0
  82. data/lib/em/messages.rb +66 -0
  83. data/lib/em/pool.rb +151 -0
  84. data/lib/em/process_watch.rb +45 -0
  85. data/lib/em/processes.rb +123 -0
  86. data/lib/em/protocols/header_and_content.rb +138 -0
  87. data/lib/em/protocols/httpclient.rb +279 -0
  88. data/lib/em/protocols/httpclient2.rb +600 -0
  89. data/lib/em/protocols/line_and_text.rb +125 -0
  90. data/lib/em/protocols/line_protocol.rb +29 -0
  91. data/lib/em/protocols/linetext2.rb +161 -0
  92. data/lib/em/protocols/memcache.rb +331 -0
  93. data/lib/em/protocols/object_protocol.rb +46 -0
  94. data/lib/em/protocols/postgres3.rb +246 -0
  95. data/lib/em/protocols/saslauth.rb +175 -0
  96. data/lib/em/protocols/smtpclient.rb +365 -0
  97. data/lib/em/protocols/smtpserver.rb +643 -0
  98. data/lib/em/protocols/socks4.rb +66 -0
  99. data/lib/em/protocols/stomp.rb +205 -0
  100. data/lib/em/protocols/tcptest.rb +54 -0
  101. data/lib/em/protocols.rb +37 -0
  102. data/lib/em/pure_ruby.rb +1017 -0
  103. data/lib/em/queue.rb +71 -0
  104. data/lib/em/resolver.rb +209 -0
  105. data/lib/em/spawnable.rb +84 -0
  106. data/lib/em/streamer.rb +118 -0
  107. data/lib/em/threaded_resource.rb +90 -0
  108. data/lib/em/tick_loop.rb +85 -0
  109. data/lib/em/timers.rb +61 -0
  110. data/lib/em/version.rb +3 -0
  111. data/lib/eventmachine.rb +1553 -0
  112. data/lib/jeventmachine.rb +321 -0
  113. data/lib/rubyeventmachine.jar +0 -0
  114. data/rakelib/cpp.rake_example +77 -0
  115. data/rakelib/package.rake +98 -0
  116. data/rakelib/test.rake +8 -0
  117. data/tests/client.crt +31 -0
  118. data/tests/client.key +51 -0
  119. data/tests/em_test_helper.rb +64 -0
  120. data/tests/server.crt +36 -0
  121. data/tests/server.key +51 -0
  122. data/tests/test_attach.rb +150 -0
  123. data/tests/test_basic.rb +294 -0
  124. data/tests/test_channel.rb +62 -0
  125. data/tests/test_completion.rb +177 -0
  126. data/tests/test_connection_count.rb +53 -0
  127. data/tests/test_defer.rb +18 -0
  128. data/tests/test_deferrable.rb +35 -0
  129. data/tests/test_epoll.rb +145 -0
  130. data/tests/test_error_handler.rb +38 -0
  131. data/tests/test_exc.rb +28 -0
  132. data/tests/test_file_watch.rb +65 -0
  133. data/tests/test_futures.rb +170 -0
  134. data/tests/test_get_sock_opt.rb +37 -0
  135. data/tests/test_handler_check.rb +35 -0
  136. data/tests/test_hc.rb +155 -0
  137. data/tests/test_httpclient.rb +190 -0
  138. data/tests/test_httpclient2.rb +133 -0
  139. data/tests/test_idle_connection.rb +25 -0
  140. data/tests/test_inactivity_timeout.rb +54 -0
  141. data/tests/test_iterator.rb +97 -0
  142. data/tests/test_kb.rb +34 -0
  143. data/tests/test_line_protocol.rb +33 -0
  144. data/tests/test_ltp.rb +138 -0
  145. data/tests/test_ltp2.rb +288 -0
  146. data/tests/test_next_tick.rb +104 -0
  147. data/tests/test_object_protocol.rb +36 -0
  148. data/tests/test_pause.rb +102 -0
  149. data/tests/test_pending_connect_timeout.rb +52 -0
  150. data/tests/test_pool.rb +194 -0
  151. data/tests/test_process_watch.rb +48 -0
  152. data/tests/test_processes.rb +128 -0
  153. data/tests/test_proxy_connection.rb +180 -0
  154. data/tests/test_pure.rb +88 -0
  155. data/tests/test_queue.rb +50 -0
  156. data/tests/test_resolver.rb +55 -0
  157. data/tests/test_running.rb +14 -0
  158. data/tests/test_sasl.rb +47 -0
  159. data/tests/test_send_file.rb +217 -0
  160. data/tests/test_servers.rb +33 -0
  161. data/tests/test_set_sock_opt.rb +37 -0
  162. data/tests/test_shutdown_hooks.rb +23 -0
  163. data/tests/test_smtpclient.rb +55 -0
  164. data/tests/test_smtpserver.rb +57 -0
  165. data/tests/test_spawn.rb +293 -0
  166. data/tests/test_ssl_args.rb +78 -0
  167. data/tests/test_ssl_echo_data.rb +60 -0
  168. data/tests/test_ssl_methods.rb +56 -0
  169. data/tests/test_ssl_verify.rb +82 -0
  170. data/tests/test_stomp.rb +37 -0
  171. data/tests/test_system.rb +42 -0
  172. data/tests/test_threaded_resource.rb +53 -0
  173. data/tests/test_tick_loop.rb +59 -0
  174. data/tests/test_timers.rb +123 -0
  175. data/tests/test_ud.rb +8 -0
  176. data/tests/test_unbind_reason.rb +48 -0
  177. metadata +297 -0
@@ -0,0 +1,170 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestFutures < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def teardown
9
+ end
10
+
11
+ def test_future
12
+ assert_equal(100, EM::Deferrable.future(100) )
13
+
14
+ p1 = proc { 100 + 1 }
15
+ assert_equal(101, EM::Deferrable.future(p1) )
16
+ end
17
+
18
+ class MyFuture
19
+ include EM::Deferrable
20
+ def initialize *args
21
+ super
22
+ set_deferred_status :succeeded, 40
23
+ end
24
+ end
25
+
26
+ class MyErrorFuture
27
+ include EM::Deferrable
28
+ def initialize *args
29
+ super
30
+ set_deferred_status :failed, 41
31
+ end
32
+ end
33
+
34
+
35
+ def test_future_1
36
+ # Call future with one additional argument and it will be treated as a callback.
37
+ def my_future
38
+ MyFuture.new
39
+ end
40
+
41
+ value = nil
42
+ EM::Deferrable.future my_future, proc {|v| value=v}
43
+ assert_equal( 40, value )
44
+ end
45
+
46
+
47
+ def test_future_2
48
+ # Call future with two additional arguments and they will be treated as a callback
49
+ # and an errback.
50
+ value = nil
51
+ EM::Deferrable.future MyErrorFuture.new, nil, proc {|v| value=v}
52
+ assert_equal( 41, value )
53
+ end
54
+
55
+
56
+ def test_future_3
57
+ # Call future with no additional arguments but with a block, and the block will be
58
+ # treated as a callback.
59
+ value = nil
60
+ EM::Deferrable.future MyFuture.new do |v|
61
+ value=v
62
+ end
63
+ assert_equal( 40, value )
64
+ end
65
+
66
+
67
+ class RecursiveCallback
68
+ include EM::Deferrable
69
+ end
70
+
71
+ # A Deferrable callback can call #set_deferred_status to change the values
72
+ # passed to subsequent callbacks.
73
+ #
74
+ def test_recursive_callbacks
75
+ n = 0 # counter assures that all the tests actually run.
76
+ rc = RecursiveCallback.new
77
+ rc.callback {|a|
78
+ assert_equal(100, a)
79
+ n += 1
80
+ rc.set_deferred_status :succeeded, 101, 101
81
+ }
82
+ rc.callback {|a,b|
83
+ assert_equal(101, a)
84
+ assert_equal(101, b)
85
+ n += 1
86
+ rc.set_deferred_status :succeeded, 102, 102, 102
87
+ }
88
+ rc.callback {|a,b,c|
89
+ assert_equal(102, a)
90
+ assert_equal(102, b)
91
+ assert_equal(102, c)
92
+ n += 1
93
+ }
94
+ rc.set_deferred_status :succeeded, 100
95
+ assert_equal(3, n)
96
+ end
97
+
98
+ def test_syntactic_sugar
99
+ rc = RecursiveCallback.new
100
+ rc.set_deferred_success 100
101
+ rc.set_deferred_failure 200
102
+ end
103
+
104
+ # It doesn't raise an error to set deferred status more than once.
105
+ # In fact, this is a desired and useful idiom when it happens INSIDE
106
+ # a callback or errback.
107
+ # However, it's less useful otherwise, and in fact would generally be
108
+ # indicative of a programming error. However, we would like to be resistant
109
+ # to such errors. So whenever we set deferred status, we also clear BOTH
110
+ # stacks of handlers.
111
+ #
112
+ def test_double_calls
113
+ s = 0
114
+ e = 0
115
+
116
+ d = EM::DefaultDeferrable.new
117
+ d.callback {s += 1}
118
+ d.errback {e += 1}
119
+
120
+ d.succeed # We expect the callback to be called, and the errback to be DISCARDED.
121
+ d.fail # Presumably an error. We expect the errback NOT to be called.
122
+ d.succeed # We expect the callback to have been discarded and NOT to be called again.
123
+
124
+ assert_equal(1, s)
125
+ assert_equal(0, e)
126
+ end
127
+
128
+ # Adding a callback to a Deferrable that is already in a success state executes the callback
129
+ # immediately. The same applies to a an errback added to an already-failed Deferrable.
130
+ # HOWEVER, we expect NOT to be able to add errbacks to succeeded Deferrables, or callbacks
131
+ # to failed ones.
132
+ #
133
+ # We illustrate this with a rather contrived test. The test calls #fail after #succeed,
134
+ # which ordinarily would not happen in a real program.
135
+ #
136
+ # What we're NOT attempting to specify is what happens if a Deferrable is succeeded and then
137
+ # failed (or vice-versa). Should we then be able to add callbacks/errbacks of the appropriate
138
+ # type for immediate execution? For now at least, the official answer is "don't do that."
139
+ #
140
+ def test_delayed_callbacks
141
+ s1 = 0
142
+ s2 = 0
143
+ e = 0
144
+
145
+ d = EM::DefaultDeferrable.new
146
+ d.callback {s1 += 1}
147
+
148
+ d.succeed # Triggers and discards the callback.
149
+
150
+ d.callback {s2 += 1} # This callback is executed immediately and discarded.
151
+
152
+ d.errback {e += 1} # This errback should be DISCARDED and never execute.
153
+ d.fail # To prove it, fail and assert e is 0
154
+
155
+ assert_equal( [1,1], [s1,s2] )
156
+ assert_equal( 0, e )
157
+ end
158
+
159
+ def test_timeout
160
+ n = 0
161
+ EM.run {
162
+ d = EM::DefaultDeferrable.new
163
+ d.callback {n = 1; EM.stop}
164
+ d.errback {n = 2; EM.stop}
165
+ d.timeout(0.01)
166
+ }
167
+ assert_equal( 2, n )
168
+ end
169
+
170
+ end
@@ -0,0 +1,37 @@
1
+ require 'em_test_helper'
2
+ require 'socket'
3
+
4
+ class TestGetSockOpt < Test::Unit::TestCase
5
+
6
+ if EM.respond_to? :get_sock_opt
7
+ def setup
8
+ assert(!EM.reactor_running?)
9
+ end
10
+
11
+ def teardown
12
+ assert(!EM.reactor_running?)
13
+ end
14
+
15
+ #-------------------------------------
16
+
17
+ def test_get_sock_opt
18
+ test = self
19
+ EM.run do
20
+ EM.connect 'google.com', 80, Module.new {
21
+ define_method :connection_completed do
22
+ val = get_sock_opt Socket::SOL_SOCKET, Socket::SO_ERROR
23
+ test.assert_equal "\0\0\0\0", val
24
+ EM.stop
25
+ end
26
+ }
27
+ end
28
+ end
29
+ else
30
+ warn "EM.get_sock_opt not implemented, skipping tests in #{__FILE__}"
31
+
32
+ # Because some rubies will complain if a TestCase class has no tests
33
+ def test_em_get_sock_opt_unsupported
34
+ assert true
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHandlerCheck < Test::Unit::TestCase
4
+
5
+ class Foo < EM::Connection; end;
6
+ module TestModule; end;
7
+
8
+ def test_with_correct_class
9
+ assert_nothing_raised do
10
+ EM.run {
11
+ EM.connect("127.0.0.1", 80, Foo)
12
+ EM.stop_event_loop
13
+ }
14
+ end
15
+ end
16
+
17
+ def test_with_incorrect_class
18
+ assert_raise(ArgumentError) do
19
+ EM.run {
20
+ EM.connect("127.0.0.1", 80, String)
21
+ EM.stop_event_loop
22
+ }
23
+ end
24
+ end
25
+
26
+ def test_with_module
27
+ assert_nothing_raised do
28
+ EM.run {
29
+ EM.connect("127.0.0.1", 80, TestModule)
30
+ EM.stop_event_loop
31
+ }
32
+ end
33
+ end
34
+
35
+ end
data/tests/test_hc.rb ADDED
@@ -0,0 +1,155 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHeaderAndContentProtocol < Test::Unit::TestCase
4
+
5
+ class SimpleTest < EM::P::HeaderAndContentProtocol
6
+ attr_reader :first_header, :my_headers, :request
7
+
8
+ def receive_first_header_line hdr
9
+ @first_header ||= []
10
+ @first_header << hdr
11
+ end
12
+ def receive_headers hdrs
13
+ @my_headers ||= []
14
+ @my_headers << hdrs
15
+ end
16
+ def receive_request hdrs, content
17
+ @request ||= []
18
+ @request << [hdrs, content]
19
+ end
20
+ end
21
+
22
+ class StopOnUnbind < EM::Connection
23
+ def unbind
24
+ EM.add_timer(0.01) { EM.stop }
25
+ end
26
+ end
27
+
28
+ def setup
29
+ @port = next_port
30
+ end
31
+
32
+ def test_no_content
33
+ the_connection = nil
34
+ EM.run {
35
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
36
+ the_connection = conn
37
+ end
38
+ setup_timeout
39
+
40
+ EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
41
+ c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
42
+ c.close_connection_after_writing
43
+ end
44
+ }
45
+ assert_equal( ["aaa"], the_connection.first_header )
46
+ assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
47
+ assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
48
+ end
49
+
50
+ def test_content
51
+ the_connection = nil
52
+ content = "A" * 50
53
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
54
+ EM.run {
55
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
56
+ the_connection = conn
57
+ end
58
+ setup_timeout
59
+
60
+ EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
61
+ headers.each { |h| c.send_data "#{h}\r\n" }
62
+ c.send_data "\n"
63
+ c.send_data content
64
+ c.close_connection_after_writing
65
+ end
66
+ }
67
+ assert_equal( ["aaa"], the_connection.first_header )
68
+ assert_equal( [headers], the_connection.my_headers )
69
+ assert_equal( [[headers, content]], the_connection.request )
70
+ end
71
+
72
+ def test_several_requests
73
+ the_connection = nil
74
+ content = "A" * 50
75
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
76
+ EM.run {
77
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
78
+ the_connection = conn
79
+ end
80
+ setup_timeout
81
+
82
+ EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
83
+ 5.times do
84
+ headers.each { |h| c.send_data "#{h}\r\n" }
85
+ c.send_data "\n"
86
+ c.send_data content
87
+ end
88
+ c.close_connection_after_writing
89
+ end
90
+ }
91
+ assert_equal( ["aaa"] * 5, the_connection.first_header )
92
+ assert_equal( [headers] * 5, the_connection.my_headers )
93
+ assert_equal( [[headers, content]] * 5, the_connection.request )
94
+ end
95
+
96
+
97
+ # def x_test_multiple_content_length_headers
98
+ # # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
99
+ # the_connection = nil
100
+ # content = "A" * 50
101
+ # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
102
+ # EM.run {
103
+ # EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
104
+ # the_connection = conn
105
+ # end
106
+ # EM.add_timer(4) {raise "test timed out"}
107
+ # test_proc = proc {
108
+ # t = TCPSocket.new "127.0.0.1", @port
109
+ # headers.each {|h| t.write "#{h}\r\n" }
110
+ # t.write "\n"
111
+ # t.write content
112
+ # t.close
113
+ # }
114
+ # EM.defer test_proc, proc {
115
+ # EM.stop
116
+ # }
117
+ # }
118
+ # end
119
+
120
+ def test_interpret_headers
121
+ the_connection = nil
122
+ content = "A" * 50
123
+ headers = [
124
+ "GET / HTTP/1.0",
125
+ "Accept: aaa",
126
+ "User-Agent: bbb",
127
+ "Host: ccc",
128
+ "x-tempest-header:ddd"
129
+ ]
130
+
131
+ EM.run {
132
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
133
+ the_connection = conn
134
+ end
135
+ setup_timeout
136
+
137
+ EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
138
+ headers.each { |h| c.send_data "#{h}\r\n" }
139
+ c.send_data "\n"
140
+ c.send_data content
141
+ c.close_connection_after_writing
142
+ end
143
+ }
144
+
145
+ hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
146
+ expect = {
147
+ :accept => "aaa",
148
+ :user_agent => "bbb",
149
+ :host => "ccc",
150
+ :x_tempest_header => "ddd"
151
+ }
152
+ assert_equal(expect, hsh)
153
+ end
154
+
155
+ end
@@ -0,0 +1,190 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHttpClient < Test::Unit::TestCase
4
+
5
+ Localhost = "127.0.0.1"
6
+ Localport = 9801
7
+
8
+ def setup
9
+ end
10
+
11
+ def teardown
12
+ end
13
+
14
+ #-------------------------------------
15
+
16
+ def test_http_client
17
+ ok = false
18
+ EM.run {
19
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
20
+ c.callback {
21
+ ok = true
22
+ EM.stop
23
+ }
24
+ c.errback {EM.stop} # necessary, otherwise a failure blocks the test suite forever.
25
+ }
26
+ assert ok
27
+ end
28
+
29
+ #-------------------------------------
30
+
31
+ def test_http_client_1
32
+ ok = false
33
+ EM.run {
34
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
35
+ c.callback {ok = true; EM.stop}
36
+ c.errback {EM.stop}
37
+ }
38
+ assert ok
39
+ end
40
+
41
+ #-------------------------------------
42
+
43
+ def test_http_client_2
44
+ ok = false
45
+ EM.run {
46
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
47
+ c.callback {|result|
48
+ ok = true;
49
+ EM.stop
50
+ }
51
+ c.errback {EM.stop}
52
+ }
53
+ assert ok
54
+ end
55
+
56
+
57
+ #-----------------------------------------
58
+
59
+ # Test a server that returns a page with a zero content-length.
60
+ # This caused an early version of the HTTP client not to generate a response,
61
+ # causing this test to hang. Observe, there was no problem with responses
62
+ # lacking a content-length, just when the content-length was zero.
63
+ #
64
+ class EmptyContent < EM::Connection
65
+ def initialize *args
66
+ super
67
+ end
68
+ def receive_data data
69
+ send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n"
70
+ close_connection_after_writing
71
+ end
72
+ end
73
+
74
+ def test_http_empty_content
75
+ ok = false
76
+ EM.run {
77
+ EM.start_server "127.0.0.1", 9701, EmptyContent
78
+ c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => 9701 }
79
+ c.callback {|result|
80
+ ok = true
81
+ EM.stop
82
+ }
83
+ }
84
+ assert ok
85
+ end
86
+
87
+
88
+ #---------------------------------------
89
+
90
+ class PostContent < EM::P::LineAndTextProtocol
91
+ def initialize *args
92
+ super
93
+ @lines = []
94
+ end
95
+ def receive_line line
96
+ if line.length > 0
97
+ @lines << line
98
+ else
99
+ process_headers
100
+ end
101
+ end
102
+ def receive_binary_data data
103
+ @post_content = data
104
+ send_response
105
+ end
106
+ def process_headers
107
+ if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/
108
+ @uri = $1.dup
109
+ else
110
+ raise "bad request"
111
+ end
112
+
113
+ @lines.each {|line|
114
+ if line =~ /\AContent-length:\s*(\d+)\Z/i
115
+ @content_length = $1.dup.to_i
116
+ elsif line =~ /\AContent-type:\s*(\d+)\Z/i
117
+ @content_type = $1.dup
118
+ end
119
+ }
120
+
121
+ raise "invalid content length" unless @content_length
122
+ set_binary_mode @content_length
123
+ end
124
+ def send_response
125
+ send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789"
126
+ close_connection_after_writing
127
+ end
128
+ end
129
+
130
+ # TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client
131
+ # is sending a 1.0 request. Gotta fix the client
132
+ def test_post
133
+ response = nil
134
+ EM.run {
135
+ EM.start_server Localhost, Localport, PostContent
136
+ setup_timeout(2)
137
+ c = silent { EM::P::HttpClient.request(
138
+ :host=>Localhost,
139
+ :port=>Localport,
140
+ :method=>:post,
141
+ :request=>"/aaa",
142
+ :content=>"XYZ",
143
+ :content_type=>"text/plain"
144
+ )}
145
+ c.callback {|r|
146
+ response = r
147
+ EM.stop
148
+ }
149
+ }
150
+
151
+ assert_equal( 200, response[:status] )
152
+ assert_equal( "0123456789", response[:content] )
153
+ end
154
+
155
+
156
+ # TODO, need a more intelligent cookie tester.
157
+ # In fact, this whole test-harness needs a beefier server implementation.
158
+ def test_cookie
159
+ ok = false
160
+ EM.run {
161
+ c = silent { EM::Protocols::HttpClient.send :request, :host => "www.google.com", :port => 80, :cookie=>"aaa=bbb" }
162
+ c.callback {|result|
163
+ ok = true;
164
+ EM.stop
165
+ }
166
+ c.errback {EM.stop}
167
+ }
168
+ assert ok
169
+ end
170
+
171
+ # We can tell the client to send an HTTP/1.0 request (default is 1.1).
172
+ # This is useful for suppressing chunked responses until those are working.
173
+ def test_version_1_0
174
+ ok = false
175
+ EM.run {
176
+ c = silent { EM::P::HttpClient.request(
177
+ :host => "www.google.com",
178
+ :port => 80,
179
+ :version => "1.0"
180
+ )}
181
+ c.callback {|result|
182
+ ok = true;
183
+ EM.stop
184
+ }
185
+ c.errback {EM.stop}
186
+ }
187
+ assert ok
188
+ end
189
+
190
+ end
@@ -0,0 +1,133 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHttpClient2 < Test::Unit::TestCase
4
+ Localhost = "127.0.0.1"
5
+ Localport = 9801
6
+
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+
14
+ class TestServer < EM::Connection
15
+ end
16
+
17
+ # #connect returns an object which has made a connection to an HTTP server
18
+ # and exposes methods for making HTTP requests on that connection.
19
+ # #connect can take either a pair of parameters (a host and a port),
20
+ # or a single parameter which is a Hash.
21
+ #
22
+ def test_connect
23
+ EM.run {
24
+ EM.start_server Localhost, Localport, TestServer
25
+ silent do
26
+ EM::P::HttpClient2.connect Localhost, Localport
27
+ EM::P::HttpClient2.connect( :host=>Localhost, :port=>Localport )
28
+ end
29
+ EM.stop
30
+ }
31
+ end
32
+
33
+
34
+ def test_bad_port
35
+ EM.run {
36
+ EM.start_server Localhost, Localport, TestServer
37
+ assert_raises( ArgumentError ) {
38
+ silent { EM::P::HttpClient2.connect Localhost, "xxx" }
39
+ }
40
+ EM.stop
41
+ }
42
+ end
43
+
44
+ def test_bad_server
45
+ err = nil
46
+ EM.run {
47
+ http = silent { EM::P::HttpClient2.connect Localhost, 9999 }
48
+ d = http.get "/"
49
+ d.errback { err = true; d.internal_error; EM.stop }
50
+ }
51
+ assert(err)
52
+ end
53
+
54
+ def test_get
55
+ content = nil
56
+ EM.run {
57
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
58
+ d = http.get "/"
59
+ d.callback {
60
+ content = d.content
61
+ EM.stop
62
+ }
63
+ }
64
+ assert(content)
65
+ end
66
+
67
+ # Not a pipelined request because we wait for one response before we request the next.
68
+ # XXX this test is broken because it sends the second request to the first connection
69
+ # XXX right before the connection closes
70
+ def _test_get_multiple
71
+ content = nil
72
+ EM.run {
73
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
74
+ d = http.get "/"
75
+ d.callback {
76
+ e = http.get "/"
77
+ e.callback {
78
+ content = e.content
79
+ EM.stop
80
+ }
81
+ }
82
+ }
83
+ assert(content)
84
+ end
85
+
86
+ def test_get_pipeline
87
+ headers, headers2 = nil, nil
88
+ EM.run {
89
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
90
+ d = http.get("/")
91
+ d.callback {
92
+ headers = d.headers
93
+ }
94
+ e = http.get("/")
95
+ e.callback {
96
+ headers2 = e.headers
97
+ }
98
+ EM.tick_loop { EM.stop if headers && headers2 }
99
+ EM.add_timer(1) { EM.stop }
100
+ }
101
+ assert(headers)
102
+ assert(headers2)
103
+ end
104
+
105
+
106
+ def test_authheader
107
+ EM.run {
108
+ EM.start_server Localhost, Localport, TestServer
109
+ http = silent { EM::P::HttpClient2.connect Localhost, 18842 }
110
+ d = http.get :url=>"/", :authorization=>"Basic xxx"
111
+ d.callback {EM.stop}
112
+ d.errback {EM.stop}
113
+ }
114
+ end
115
+
116
+ # This test fails under JRuby - but not if you use google.com instead of apple.com
117
+ # Since this client is deprecated, it's probably not worth investigating further
118
+ def test_https_get
119
+ d = nil
120
+ EM.run {
121
+ http = silent { EM::P::HttpClient2.connect :host => 'www.apple.com', :port => 443, :ssl => true }
122
+ d = http.get "/"
123
+ d.errback {
124
+ fail "Request failed"
125
+ }
126
+ d.callback {
127
+ EM.stop
128
+ }
129
+ }
130
+ assert_equal(200, d.status)
131
+ end if EM.ssl?
132
+
133
+ end