eventmachine 1.2.0.dev.2-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +105 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +108 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +988 -0
- data/ext/ed.cpp +2111 -0
- data/ext/ed.h +442 -0
- data/ext/em.cpp +2379 -0
- data/ext/em.h +308 -0
- data/ext/eventmachine.h +143 -0
- data/ext/extconf.rb +270 -0
- data/ext/fastfilereader/extconf.rb +110 -0
- data/ext/fastfilereader/mapper.cpp +216 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +354 -0
- data/ext/project.h +176 -0
- data/ext/rubymain.cpp +1504 -0
- data/ext/ssl.cpp +615 -0
- data/ext/ssl.h +103 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +591 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +72 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +201 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +415 -0
- data/lib/2.0/fastfilereaderext.so +0 -0
- data/lib/2.0/rubyeventmachine.so +0 -0
- data/lib/2.1/fastfilereaderext.so +0 -0
- data/lib/2.1/rubyeventmachine.so +0 -0
- data/lib/2.2/fastfilereaderext.so +0 -0
- data/lib/2.2/rubyeventmachine.so +0 -0
- data/lib/2.3/fastfilereaderext.so +0 -0
- data/lib/2.3/rubyeventmachine.so +0 -0
- data/lib/em/buftok.rb +59 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +69 -0
- data/lib/em/completion.rb +304 -0
- data/lib/em/connection.rb +770 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/iterator.rb +252 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols.rb +37 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +299 -0
- data/lib/em/protocols/httpclient2.rb +600 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/linetext2.rb +166 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +394 -0
- data/lib/em/protocols/smtpserver.rb +666 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +205 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/pure_ruby.rb +1022 -0
- data/lib/em/queue.rb +80 -0
- data/lib/em/resolver.rb +232 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1584 -0
- data/lib/fastfilereaderext.rb +2 -0
- data/lib/jeventmachine.rb +301 -0
- data/lib/rubyeventmachine.rb +2 -0
- data/rakelib/package.rake +120 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/dhparam.pem +13 -0
- data/tests/em_test_helper.rb +151 -0
- data/tests/test_attach.rb +151 -0
- data/tests/test_basic.rb +283 -0
- data/tests/test_channel.rb +75 -0
- data/tests/test_completion.rb +178 -0
- data/tests/test_connection_count.rb +54 -0
- data/tests/test_connection_write.rb +35 -0
- data/tests/test_defer.rb +35 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +142 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +66 -0
- data/tests/test_fork.rb +75 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_get_sock_opt.rb +37 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +233 -0
- data/tests/test_httpclient2.rb +128 -0
- data/tests/test_idle_connection.rb +25 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_ipv4.rb +125 -0
- data/tests/test_ipv6.rb +131 -0
- data/tests/test_iterator.rb +115 -0
- data/tests/test_kb.rb +28 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +308 -0
- data/tests/test_many_fds.rb +22 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +107 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +196 -0
- data/tests/test_process_watch.rb +50 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -0
- data/tests/test_pure.rb +88 -0
- data/tests/test_queue.rb +64 -0
- data/tests/test_resolver.rb +104 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +47 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +33 -0
- data/tests/test_set_sock_opt.rb +39 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +75 -0
- data/tests/test_smtpserver.rb +57 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_dhparam.rb +83 -0
- data/tests/test_ssl_ecdh_curve.rb +79 -0
- data/tests/test_ssl_extensions.rb +49 -0
- data/tests/test_ssl_methods.rb +65 -0
- data/tests/test_ssl_protocols.rb +246 -0
- data/tests/test_ssl_verify.rb +126 -0
- data/tests/test_stomp.rb +37 -0
- data/tests/test_system.rb +46 -0
- data/tests/test_threaded_resource.rb +61 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +123 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +52 -0
- metadata +381 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestIdleConnection < Test::Unit::TestCase
|
4
|
+
if EM.respond_to?(:get_idle_time)
|
5
|
+
def test_idle_time
|
6
|
+
EM.run{
|
7
|
+
conn = EM.connect 'www.google.com', 80
|
8
|
+
EM.add_timer(3){
|
9
|
+
$idle_time = conn.get_idle_time
|
10
|
+
conn.send_data "GET / HTTP/1.0\r\n\r\n"
|
11
|
+
EM.next_tick{
|
12
|
+
EM.next_tick{
|
13
|
+
$idle_time_after_send = conn.get_idle_time
|
14
|
+
conn.close_connection
|
15
|
+
EM.stop
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
assert_in_delta 3, $idle_time, 0.2
|
22
|
+
assert_in_delta 0, $idle_time_after_send, 0.1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestInactivityTimeout < Test::Unit::TestCase
|
4
|
+
|
5
|
+
if EM.respond_to? :get_comm_inactivity_timeout
|
6
|
+
def test_default
|
7
|
+
EM.run {
|
8
|
+
c = EM.connect("127.0.0.1", 54321)
|
9
|
+
assert_equal 0.0, c.comm_inactivity_timeout
|
10
|
+
EM.stop
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_set_and_get
|
15
|
+
EM.run {
|
16
|
+
c = EM.connect("127.0.0.1", 54321)
|
17
|
+
c.comm_inactivity_timeout = 2.5
|
18
|
+
assert_equal 2.5, c.comm_inactivity_timeout
|
19
|
+
EM.stop
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_for_real
|
24
|
+
start, finish = nil
|
25
|
+
|
26
|
+
timeout_handler = Module.new do
|
27
|
+
define_method :unbind do
|
28
|
+
finish = Time.now
|
29
|
+
EM.stop
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
EM.run {
|
34
|
+
setup_timeout
|
35
|
+
EM.heartbeat_interval = 0.01
|
36
|
+
EM.start_server("127.0.0.1", 12345)
|
37
|
+
EM.add_timer(0.01) {
|
38
|
+
start = Time.now
|
39
|
+
c = EM.connect("127.0.0.1", 12345, timeout_handler)
|
40
|
+
c.comm_inactivity_timeout = 0.02
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
assert_in_delta(0.02, (finish - start), 0.02)
|
45
|
+
end
|
46
|
+
else
|
47
|
+
warn "EM.comm_inactivity_timeout not implemented, skipping tests in #{__FILE__}"
|
48
|
+
|
49
|
+
# Because some rubies will complain if a TestCase class has no tests
|
50
|
+
def test_em_comm_inactivity_timeout_not_implemented
|
51
|
+
assert true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/tests/test_ipv4.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
class TestIPv4 < Test::Unit::TestCase
|
5
|
+
|
6
|
+
if Test::Unit::TestCase.public_ipv4?
|
7
|
+
|
8
|
+
# Tries to connect to www.google.com port 80 via TCP.
|
9
|
+
# Timeout in 2 seconds.
|
10
|
+
def test_ipv4_tcp_client
|
11
|
+
conn = nil
|
12
|
+
setup_timeout(2)
|
13
|
+
|
14
|
+
EM.run do
|
15
|
+
conn = EM::connect("www.google.com", 80) do |c|
|
16
|
+
def c.connected
|
17
|
+
@connected
|
18
|
+
end
|
19
|
+
|
20
|
+
def c.connection_completed
|
21
|
+
@connected = true
|
22
|
+
EM.stop
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
assert conn.connected
|
28
|
+
end
|
29
|
+
|
30
|
+
# Runs a TCP server in the local IPv4 address, connects to it and sends a specific data.
|
31
|
+
# Timeout in 2 seconds.
|
32
|
+
def test_ipv4_tcp_local_server
|
33
|
+
@@received_data = nil
|
34
|
+
@local_port = next_port
|
35
|
+
setup_timeout(2)
|
36
|
+
|
37
|
+
EM.run do
|
38
|
+
EM::start_server(@@public_ipv4, @local_port) do |s|
|
39
|
+
def s.receive_data data
|
40
|
+
@@received_data = data
|
41
|
+
EM.stop
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
EM::connect(@@public_ipv4, @local_port) do |c|
|
46
|
+
c.send_data "ipv4/tcp"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
assert_equal "ipv4/tcp", @@received_data
|
51
|
+
end
|
52
|
+
|
53
|
+
# Runs a UDP server in the local IPv4 address, connects to it and sends a specific data.
|
54
|
+
# Timeout in 2 seconds.
|
55
|
+
def test_ipv4_udp_local_server
|
56
|
+
@@received_data = nil
|
57
|
+
@local_port = next_port
|
58
|
+
setup_timeout(2)
|
59
|
+
|
60
|
+
EM.run do
|
61
|
+
EM::open_datagram_socket(@@public_ipv4, @local_port) do |s|
|
62
|
+
def s.receive_data data
|
63
|
+
@@received_data = data
|
64
|
+
EM.stop
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
EM::open_datagram_socket(@@public_ipv4, next_port) do |c|
|
69
|
+
c.send_datagram "ipv4/udp", @@public_ipv4, @local_port
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal "ipv4/udp", @@received_data
|
74
|
+
end
|
75
|
+
|
76
|
+
# Try to connect via TCP to an invalid IPv4. EM.connect should raise
|
77
|
+
# EM::ConnectionError.
|
78
|
+
def test_tcp_connect_to_invalid_ipv4
|
79
|
+
invalid_ipv4 = "9.9:9"
|
80
|
+
|
81
|
+
EM.run do
|
82
|
+
begin
|
83
|
+
error = nil
|
84
|
+
EM.connect(invalid_ipv4, 1234)
|
85
|
+
rescue => e
|
86
|
+
error = e
|
87
|
+
ensure
|
88
|
+
EM.stop
|
89
|
+
assert_equal EM::ConnectionError, (error && error.class)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Try to send a UDP datagram to an invalid IPv4. EM.send_datagram should raise
|
95
|
+
# EM::ConnectionError.
|
96
|
+
def test_udp_send_datagram_to_invalid_ipv4
|
97
|
+
invalid_ipv4 = "9.9:9"
|
98
|
+
|
99
|
+
EM.run do
|
100
|
+
begin
|
101
|
+
error = nil
|
102
|
+
EM.open_datagram_socket(@@public_ipv4, next_port) do |c|
|
103
|
+
c.send_datagram "hello", invalid_ipv4, 1234
|
104
|
+
end
|
105
|
+
rescue => e
|
106
|
+
error = e
|
107
|
+
ensure
|
108
|
+
EM.stop
|
109
|
+
assert_equal EM::ConnectionError, (error && error.class)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
else
|
116
|
+
warn "no IPv4 in this host, skipping tests in #{__FILE__}"
|
117
|
+
|
118
|
+
# Because some rubies will complain if a TestCase class has no tests
|
119
|
+
def test_ipv4_unavailable
|
120
|
+
assert true
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
data/tests/test_ipv6.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestIPv6 < Test::Unit::TestCase
|
4
|
+
|
5
|
+
if Test::Unit::TestCase.public_ipv6?
|
6
|
+
|
7
|
+
# Tries to connect to ipv6.google.com (2607:f8b0:4010:800::1006) port 80 via TCP.
|
8
|
+
# Timeout in 6 seconds.
|
9
|
+
def test_ipv6_tcp_client_with_ipv6_google_com
|
10
|
+
conn = nil
|
11
|
+
setup_timeout(6)
|
12
|
+
|
13
|
+
EM.run do
|
14
|
+
conn = EM::connect("2607:f8b0:4010:800::1006", 80) do |c|
|
15
|
+
def c.connected
|
16
|
+
@connected
|
17
|
+
end
|
18
|
+
|
19
|
+
def c.unbind(reason)
|
20
|
+
warn "unbind: #{reason.inspect}" if reason # XXX at least find out why it failed
|
21
|
+
end
|
22
|
+
|
23
|
+
def c.connection_completed
|
24
|
+
@connected = true
|
25
|
+
EM.stop
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
assert conn.connected
|
31
|
+
end
|
32
|
+
|
33
|
+
# Runs a TCP server in the local IPv6 address, connects to it and sends a specific data.
|
34
|
+
# Timeout in 2 seconds.
|
35
|
+
def test_ipv6_tcp_local_server
|
36
|
+
@@received_data = nil
|
37
|
+
@local_port = next_port
|
38
|
+
setup_timeout(2)
|
39
|
+
|
40
|
+
EM.run do
|
41
|
+
EM.start_server(@@public_ipv6, @local_port) do |s|
|
42
|
+
def s.receive_data data
|
43
|
+
@@received_data = data
|
44
|
+
EM.stop
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
EM::connect(@@public_ipv6, @local_port) do |c|
|
49
|
+
def c.unbind(reason)
|
50
|
+
warn "unbind: #{reason.inspect}" if reason # XXX at least find out why it failed
|
51
|
+
end
|
52
|
+
c.send_data "ipv6/tcp"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
assert_equal "ipv6/tcp", @@received_data
|
57
|
+
end
|
58
|
+
|
59
|
+
# Runs a UDP server in the local IPv6 address, connects to it and sends a specific data.
|
60
|
+
# Timeout in 2 seconds.
|
61
|
+
def test_ipv6_udp_local_server
|
62
|
+
@@received_data = nil
|
63
|
+
@local_port = next_port
|
64
|
+
setup_timeout(2)
|
65
|
+
|
66
|
+
EM.run do
|
67
|
+
EM.open_datagram_socket(@@public_ipv6, @local_port) do |s|
|
68
|
+
def s.receive_data data
|
69
|
+
@@received_data = data
|
70
|
+
EM.stop
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
EM.open_datagram_socket(@@public_ipv6, next_port) do |c|
|
75
|
+
c.send_datagram "ipv6/udp", @@public_ipv6, @local_port
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
assert_equal "ipv6/udp", @@received_data
|
80
|
+
end
|
81
|
+
|
82
|
+
# Try to connect via TCP to an invalid IPv6. EM.connect should raise
|
83
|
+
# EM::ConnectionError.
|
84
|
+
def test_tcp_connect_to_invalid_ipv6
|
85
|
+
invalid_ipv6 = "1:A"
|
86
|
+
|
87
|
+
EM.run do
|
88
|
+
begin
|
89
|
+
error = nil
|
90
|
+
EM.connect(invalid_ipv6, 1234)
|
91
|
+
rescue => e
|
92
|
+
error = e
|
93
|
+
ensure
|
94
|
+
EM.stop
|
95
|
+
assert_equal EM::ConnectionError, (error && error.class)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Try to send a UDP datagram to an invalid IPv6. EM.send_datagram should raise
|
101
|
+
# EM::ConnectionError.
|
102
|
+
def test_udp_send_datagram_to_invalid_ipv6
|
103
|
+
invalid_ipv6 = "1:A"
|
104
|
+
|
105
|
+
EM.run do
|
106
|
+
begin
|
107
|
+
error = nil
|
108
|
+
EM.open_datagram_socket(@@public_ipv6, next_port) do |c|
|
109
|
+
c.send_datagram "hello", invalid_ipv6, 1234
|
110
|
+
end
|
111
|
+
rescue => e
|
112
|
+
error = e
|
113
|
+
ensure
|
114
|
+
EM.stop
|
115
|
+
assert_equal EM::ConnectionError, (error && error.class)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
else
|
122
|
+
warn "no IPv6 in this host, skipping tests in #{__FILE__}"
|
123
|
+
|
124
|
+
# Because some rubies will complain if a TestCase class has no tests.
|
125
|
+
def test_ipv6_unavailable
|
126
|
+
assert true
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestIterator < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def get_time
|
6
|
+
EM.current_time.strftime('%H:%M:%S')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_default_concurrency
|
10
|
+
items = {}
|
11
|
+
list = 1..10
|
12
|
+
EM.run {
|
13
|
+
EM::Iterator.new(list).each( proc {|num,iter|
|
14
|
+
time = get_time
|
15
|
+
items[time] ||= []
|
16
|
+
items[time] << num
|
17
|
+
EM::Timer.new(1) {iter.next}
|
18
|
+
}, proc {EM.stop})
|
19
|
+
}
|
20
|
+
assert_equal(10, items.keys.size)
|
21
|
+
assert_equal(list.to_a.sort, items.values.flatten.sort)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_default_concurrency_with_a_proc
|
25
|
+
items = {}
|
26
|
+
list = (1..10).to_a
|
27
|
+
original_list = list.dup
|
28
|
+
EM.run {
|
29
|
+
EM::Iterator.new(proc{list.pop || EM::Iterator::Stop}).each( proc {|num,iter|
|
30
|
+
time = get_time
|
31
|
+
items[time] ||= []
|
32
|
+
items[time] << num
|
33
|
+
EM::Timer.new(1) {iter.next}
|
34
|
+
}, proc {EM.stop})
|
35
|
+
}
|
36
|
+
assert_equal(10, items.keys.size)
|
37
|
+
assert_equal(original_list.to_a.sort, items.values.flatten.sort)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_concurrency_bigger_than_list_size
|
41
|
+
items = {}
|
42
|
+
list = [1,2,3]
|
43
|
+
EM.run {
|
44
|
+
EM::Iterator.new(list,10).each(proc {|num,iter|
|
45
|
+
time = get_time
|
46
|
+
items[time] ||= []
|
47
|
+
items[time] << num
|
48
|
+
EM::Timer.new(1) {iter.next}
|
49
|
+
}, proc {EM.stop})
|
50
|
+
}
|
51
|
+
assert_equal(1, items.keys.size)
|
52
|
+
assert_equal(list.to_a.sort, items.values.flatten.sort)
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def test_changing_concurrency_affects_active_iteration
|
57
|
+
items = {}
|
58
|
+
list = 1..25
|
59
|
+
EM.run {
|
60
|
+
i = EM::Iterator.new(list,5)
|
61
|
+
i.each(proc {|num,iter|
|
62
|
+
time = get_time
|
63
|
+
items[time] ||= []
|
64
|
+
items[time] << num
|
65
|
+
EM::Timer.new(1) {iter.next}
|
66
|
+
}, proc {EM.stop})
|
67
|
+
EM.add_timer(1){
|
68
|
+
i.concurrency = 1
|
69
|
+
}
|
70
|
+
EM.add_timer(3){
|
71
|
+
i.concurrency = 3
|
72
|
+
}
|
73
|
+
}
|
74
|
+
assert_equal(9, items.keys.size)
|
75
|
+
assert_equal(list.to_a.sort, items.values.flatten.sort)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_map
|
79
|
+
list = 100..150
|
80
|
+
EM.run {
|
81
|
+
EM::Iterator.new(list).map(proc{ |num,iter|
|
82
|
+
EM.add_timer(0.01){ iter.return(num) }
|
83
|
+
}, proc{ |results|
|
84
|
+
assert_equal(list.to_a.size, results.size)
|
85
|
+
EM.stop
|
86
|
+
})
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_inject
|
91
|
+
omit_if(windows?)
|
92
|
+
|
93
|
+
list = %w[ pwd uptime uname date ]
|
94
|
+
EM.run {
|
95
|
+
EM::Iterator.new(list, 2).inject({}, proc{ |hash,cmd,iter|
|
96
|
+
EM.system(cmd){ |output,status|
|
97
|
+
hash[cmd] = status.exitstatus == 0 ? output.strip : nil
|
98
|
+
iter.return(hash)
|
99
|
+
}
|
100
|
+
}, proc{ |results|
|
101
|
+
assert_equal(results.keys.sort, list.sort)
|
102
|
+
EM.stop
|
103
|
+
})
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_concurrency_is_0
|
108
|
+
EM.run {
|
109
|
+
assert_raise ArgumentError do
|
110
|
+
EM::Iterator.new(1..5,0)
|
111
|
+
end
|
112
|
+
EM.stop
|
113
|
+
}
|
114
|
+
end
|
115
|
+
end
|