MattHulse-eventmachine 0.0.1

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 (156) hide show
  1. data/.gitignore +14 -0
  2. data/README +82 -0
  3. data/Rakefile +279 -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 +41 -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 +821 -0
  25. data/ext/cplusplus.cpp +202 -0
  26. data/ext/ed.cpp +1868 -0
  27. data/ext/ed.h +416 -0
  28. data/ext/em.cpp +2270 -0
  29. data/ext/em.h +228 -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 +138 -0
  37. data/ext/fastfilereader/extconf.rb +84 -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 +147 -0
  48. data/ext/rubymain.cpp +1152 -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/Application.java +192 -0
  56. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  57. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  58. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  59. data/java/src/com/rubyeventmachine/EmReactor.java +557 -0
  60. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  61. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  62. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  63. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  64. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  65. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  66. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  67. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +146 -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 +74 -0
  71. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -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 +187 -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.rb +35 -0
  83. data/lib/em/protocols/header_and_content.rb +138 -0
  84. data/lib/em/protocols/httpclient.rb +263 -0
  85. data/lib/em/protocols/httpclient2.rb +582 -0
  86. data/lib/em/protocols/line_and_text.rb +126 -0
  87. data/lib/em/protocols/linetext2.rb +160 -0
  88. data/lib/em/protocols/memcache.rb +323 -0
  89. data/lib/em/protocols/object_protocol.rb +45 -0
  90. data/lib/em/protocols/postgres3.rb +247 -0
  91. data/lib/em/protocols/saslauth.rb +175 -0
  92. data/lib/em/protocols/smtpclient.rb +350 -0
  93. data/lib/em/protocols/smtpserver.rb +547 -0
  94. data/lib/em/protocols/stomp.rb +200 -0
  95. data/lib/em/protocols/tcptest.rb +53 -0
  96. data/lib/em/queue.rb +61 -0
  97. data/lib/em/spawnable.rb +85 -0
  98. data/lib/em/streamer.rb +130 -0
  99. data/lib/em/timers.rb +55 -0
  100. data/lib/em/version.rb +3 -0
  101. data/lib/eventmachine.rb +1698 -0
  102. data/lib/evma.rb +32 -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/jeventmachine.rb +246 -0
  109. data/lib/pr_eventmachine.rb +1022 -0
  110. data/setup.rb +1585 -0
  111. data/tasks/cpp.rake +77 -0
  112. data/tasks/project.rake +79 -0
  113. data/tasks/tests.rake +193 -0
  114. data/tests/client.crt +31 -0
  115. data/tests/client.key +51 -0
  116. data/tests/test_attach.rb +126 -0
  117. data/tests/test_basic.rb +284 -0
  118. data/tests/test_channel.rb +63 -0
  119. data/tests/test_connection_count.rb +35 -0
  120. data/tests/test_defer.rb +47 -0
  121. data/tests/test_epoll.rb +160 -0
  122. data/tests/test_error_handler.rb +35 -0
  123. data/tests/test_errors.rb +82 -0
  124. data/tests/test_exc.rb +55 -0
  125. data/tests/test_file_watch.rb +49 -0
  126. data/tests/test_futures.rb +198 -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_process_watch.rb +48 -0
  138. data/tests/test_processes.rb +128 -0
  139. data/tests/test_proxy_connection.rb +92 -0
  140. data/tests/test_pure.rb +125 -0
  141. data/tests/test_queue.rb +44 -0
  142. data/tests/test_running.rb +42 -0
  143. data/tests/test_sasl.rb +72 -0
  144. data/tests/test_send_file.rb +242 -0
  145. data/tests/test_servers.rb +76 -0
  146. data/tests/test_smtpclient.rb +83 -0
  147. data/tests/test_smtpserver.rb +85 -0
  148. data/tests/test_spawn.rb +322 -0
  149. data/tests/test_ssl_args.rb +68 -0
  150. data/tests/test_ssl_methods.rb +50 -0
  151. data/tests/test_ssl_verify.rb +82 -0
  152. data/tests/test_timers.rb +162 -0
  153. data/tests/test_ud.rb +36 -0
  154. data/tests/testem.rb +31 -0
  155. data/web/whatis +7 -0
  156. metadata +223 -0
@@ -0,0 +1,35 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestErrorHandler < Test::Unit::TestCase
6
+ def test_error_handler
7
+ error = nil
8
+ EM.error_handler{ |e|
9
+ error = e
10
+ EM.error_handler(nil)
11
+ EM.stop
12
+ }
13
+
14
+ assert_nothing_raised do
15
+ EM.run{
16
+ EM.add_timer(0){
17
+ raise 'test'
18
+ }
19
+ }
20
+ end
21
+
22
+ assert_equal error.class, RuntimeError
23
+ assert_equal error.message, 'test'
24
+ end
25
+
26
+ def test_without_error_handler
27
+ assert_raise RuntimeError do
28
+ EM.run{
29
+ EM.add_timer(0){
30
+ raise 'test'
31
+ }
32
+ }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,82 @@
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
+
28
+ ###### THIS TEST IS NOW OBSOLETE.
29
+ ###### As of 27Dec07, the hookable error handling is obsolete because
30
+ ###### of its performance impact.
31
+
32
+
33
+ $:.unshift "../lib"
34
+ require 'eventmachine'
35
+ require 'test/unit'
36
+
37
+ class TestErrors < Test::Unit::TestCase
38
+
39
+ Localhost = "127.0.0.1"
40
+ Localport = 9801
41
+
42
+ def setup
43
+ end
44
+
45
+ def obsolete_teardown
46
+ # Calling #set_runtime_error_hook with no block restores the
47
+ # default handling of runtime_errors.
48
+ #
49
+ EM.set_runtime_error_hook
50
+ end
51
+
52
+ def test_no_tests_stub
53
+ end
54
+
55
+ # EM has a default handler for RuntimeErrors that are emitted from
56
+ # user written code. You can override the handler if you wish, but it's
57
+ # easier to call #set_runtime_error_hook.
58
+ # Ordinarily, an error in user code invoked by the reactor aborts the
59
+ # run.
60
+ #
61
+ def obsolete_test_unhandled_error
62
+ assert_raises( RuntimeError ) {
63
+ EM.run {
64
+ EM.add_timer(0) {raise "AAA"}
65
+ }
66
+ }
67
+
68
+ end
69
+
70
+ def obsolete_test_handled_error
71
+ err = nil
72
+ EM.run {
73
+ EM.set_runtime_error_hook {
74
+ err = true
75
+ EM.stop
76
+ }
77
+ EM.add_timer(0) {raise "AAA"}
78
+ }
79
+ assert err
80
+ end
81
+ end
82
+
data/tests/test_exc.rb ADDED
@@ -0,0 +1,55 @@
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
+ $:.unshift "../lib"
27
+ require 'eventmachine'
28
+ require 'test/unit'
29
+
30
+ class TestSomeExceptions < Test::Unit::TestCase
31
+
32
+ # Read the commentary in EventMachine#run.
33
+ # This test exercises the ensure block in #run that makes sure
34
+ # EventMachine#release_machine gets called even if an exception is
35
+ # thrown within the user code. Without the ensured call to release_machine,
36
+ # the second call to EventMachine#run will fail with a C++ exception
37
+ # because the machine wasn't cleaned up properly.
38
+
39
+ def test_a
40
+ assert_raises(RuntimeError) {
41
+ EventMachine.run {
42
+ raise "some exception"
43
+ }
44
+ }
45
+ end
46
+
47
+ def test_b
48
+ assert_raises(RuntimeError) {
49
+ EventMachine.run {
50
+ raise "some exception"
51
+ }
52
+ }
53
+ end
54
+
55
+ end
@@ -0,0 +1,49 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestFileWatch < Test::Unit::TestCase
6
+ module FileWatcher
7
+ def file_modified
8
+ $modified = true
9
+ end
10
+ def file_deleted
11
+ $deleted = true
12
+ end
13
+ def unbind
14
+ $unbind = true
15
+ EM.stop
16
+ end
17
+ end
18
+
19
+ def setup
20
+ EM.kqueue = true if EM.kqueue?
21
+ end
22
+
23
+ def teardown
24
+ EM.kqueue = false if EM.kqueue?
25
+ end
26
+
27
+ def test_events
28
+ EM.run{
29
+ require 'tempfile'
30
+ file = Tempfile.new('em-watch')
31
+ $tmp_path = file.path
32
+
33
+ # watch it
34
+ watch = EM.watch_file(file.path, FileWatcher)
35
+ $path = watch.path
36
+
37
+ # modify it
38
+ File.open(file.path, 'w'){ |f| f.puts 'hi' }
39
+
40
+ # delete it
41
+ EM.add_timer(0.25){ file.close; file.delete }
42
+ }
43
+
44
+ assert_equal($path, $tmp_path)
45
+ assert($modified)
46
+ assert($deleted)
47
+ assert($unbind)
48
+ end
49
+ end
@@ -0,0 +1,198 @@
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 TestFutures < Test::Unit::TestCase
32
+
33
+ def setup
34
+ end
35
+
36
+ def teardown
37
+ end
38
+
39
+ def test_future
40
+ assert_equal(100, EventMachine::Deferrable.future(100) )
41
+
42
+ p1 = proc { 100 + 1 }
43
+ assert_equal(101, EventMachine::Deferrable.future(p1) )
44
+ end
45
+
46
+ class MyFuture
47
+ include EventMachine::Deferrable
48
+ def initialize *args
49
+ super
50
+ set_deferred_status :succeeded, 40
51
+ end
52
+ end
53
+
54
+ class MyErrorFuture
55
+ include EventMachine::Deferrable
56
+ def initialize *args
57
+ super
58
+ set_deferred_status :failed, 41
59
+ end
60
+ end
61
+
62
+
63
+ def test_future_1
64
+ # Call future with one additional argument and it will be treated as a callback.
65
+ def my_future
66
+ MyFuture.new
67
+ end
68
+
69
+ value = nil
70
+ EventMachine::Deferrable.future my_future, proc {|v| value=v}
71
+ assert_equal( 40, value )
72
+ end
73
+
74
+
75
+ def test_future_2
76
+ # Call future with two additional arguments and they will be treated as a callback
77
+ # and an errback.
78
+ value = nil
79
+ EventMachine::Deferrable.future MyErrorFuture.new, nil, proc {|v| value=v}
80
+ assert_equal( 41, value )
81
+ end
82
+
83
+
84
+ def test_future_3
85
+ # Call future with no additional arguments but with a block, and the block will be
86
+ # treated as a callback.
87
+ value = nil
88
+ EventMachine::Deferrable.future MyFuture.new do |v|
89
+ value=v
90
+ end
91
+ assert_equal( 40, value )
92
+ end
93
+
94
+
95
+ class RecursiveCallback
96
+ include EventMachine::Deferrable
97
+ end
98
+
99
+ # A Deferrable callback can call #set_deferred_status to change the values
100
+ # passed to subsequent callbacks.
101
+ #
102
+ def test_recursive_callbacks
103
+ n = 0 # counter assures that all the tests actually run.
104
+ rc = RecursiveCallback.new
105
+ rc.callback {|a|
106
+ assert_equal(100, a)
107
+ n += 1
108
+ rc.set_deferred_status :succeeded, 101, 101
109
+ }
110
+ rc.callback {|a,b|
111
+ assert_equal(101, a)
112
+ assert_equal(101, b)
113
+ n += 1
114
+ rc.set_deferred_status :succeeded, 102, 102, 102
115
+ }
116
+ rc.callback {|a,b,c|
117
+ assert_equal(102, a)
118
+ assert_equal(102, b)
119
+ assert_equal(102, c)
120
+ n += 1
121
+ }
122
+ rc.set_deferred_status :succeeded, 100
123
+ assert_equal(3, n)
124
+ end
125
+
126
+ def test_syntactic_sugar
127
+ rc = RecursiveCallback.new
128
+ rc.set_deferred_success 100
129
+ rc.set_deferred_failure 200
130
+ end
131
+
132
+ # It doesn't raise an error to set deferred status more than once.
133
+ # In fact, this is a desired and useful idiom when it happens INSIDE
134
+ # a callback or errback.
135
+ # However, it's less useful otherwise, and in fact would generally be
136
+ # indicative of a programming error. However, we would like to be resistant
137
+ # to such errors. So whenever we set deferred status, we also clear BOTH
138
+ # stacks of handlers.
139
+ #
140
+ def test_double_calls
141
+ s = 0
142
+ e = 0
143
+
144
+ d = EM::DefaultDeferrable.new
145
+ d.callback {s += 1}
146
+ d.errback {e += 1}
147
+
148
+ d.succeed # We expect the callback to be called, and the errback to be DISCARDED.
149
+ d.fail # Presumably an error. We expect the errback NOT to be called.
150
+ d.succeed # We expect the callback to have been discarded and NOT to be called again.
151
+
152
+ assert_equal(1, s)
153
+ assert_equal(0, e)
154
+ end
155
+
156
+ # Adding a callback to a Deferrable that is already in a success state executes the callback
157
+ # immediately. The same applies to a an errback added to an already-failed Deferrable.
158
+ # HOWEVER, we expect NOT to be able to add errbacks to succeeded Deferrables, or callbacks
159
+ # to failed ones.
160
+ #
161
+ # We illustrate this with a rather contrived test. The test calls #fail after #succeed,
162
+ # which ordinarily would not happen in a real program.
163
+ #
164
+ # What we're NOT attempting to specify is what happens if a Deferrable is succeeded and then
165
+ # failed (or vice-versa). Should we then be able to add callbacks/errbacks of the appropriate
166
+ # type for immediate execution? For now at least, the official answer is "don't do that."
167
+ #
168
+ def test_delayed_callbacks
169
+ s1 = 0
170
+ s2 = 0
171
+ e = 0
172
+
173
+ d = EM::DefaultDeferrable.new
174
+ d.callback {s1 += 1}
175
+
176
+ d.succeed # Triggers and discards the callback.
177
+
178
+ d.callback {s2 += 1} # This callback is executed immediately and discarded.
179
+
180
+ d.errback {e += 1} # This errback should be DISCARDED and never execute.
181
+ d.fail # To prove it, fail and assert e is 0
182
+
183
+ assert_equal( [1,1], [s1,s2] )
184
+ assert_equal( 0, e )
185
+ end
186
+
187
+ def test_timeout
188
+ n = 0
189
+ EM.run {
190
+ d = EM::DefaultDeferrable.new
191
+ d.callback {n = 1; EM.stop}
192
+ d.errback {n = 2; EM.stop}
193
+ d.timeout(1)
194
+ }
195
+ assert_equal( 2, n )
196
+ end
197
+
198
+ end
@@ -0,0 +1,37 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestHandlerCheck < Test::Unit::TestCase
6
+
7
+ class Foo < EM::Connection; end;
8
+ module TestModule; end;
9
+
10
+ def test_with_correct_class
11
+ assert_nothing_raised do
12
+ EM.run {
13
+ EM.connect("127.0.0.1", 80, Foo)
14
+ EM.stop_event_loop
15
+ }
16
+ end
17
+ end
18
+
19
+ def test_with_incorrect_class
20
+ assert_raise(ArgumentError) do
21
+ EM.run {
22
+ EM.connect("127.0.0.1", 80, String)
23
+ EM.stop_event_loop
24
+ }
25
+ end
26
+ end
27
+
28
+ def test_with_module
29
+ assert_nothing_raised do
30
+ EM.run {
31
+ EM.connect("127.0.0.1", 80, TestModule)
32
+ EM.stop_event_loop
33
+ }
34
+ end
35
+ end
36
+
37
+ end