eventmachine-le 1.1.0.beta.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.
- data/.gitignore +21 -0
- data/.yardopts +7 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +80 -0
- data/Rakefile +19 -0
- data/eventmachine-le.gemspec +42 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +841 -0
- data/ext/ed.cpp +1995 -0
- data/ext/ed.h +424 -0
- data/ext/em.cpp +2377 -0
- data/ext/em.h +243 -0
- data/ext/eventmachine.h +126 -0
- data/ext/extconf.rb +166 -0
- data/ext/fastfilereader/extconf.rb +94 -0
- data/ext/fastfilereader/mapper.cpp +214 -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 +347 -0
- data/ext/project.h +155 -0
- data/ext/rubymain.cpp +1269 -0
- data/ext/ssl.cpp +468 -0
- data/ext/ssl.h +94 -0
- data/lib/em/buftok.rb +110 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +64 -0
- data/lib/em/completion.rb +304 -0
- data/lib/em/connection.rb +728 -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 +313 -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 +279 -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 +161 -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 +365 -0
- data/lib/em/protocols/smtpserver.rb +663 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +202 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/queue.rb +71 -0
- data/lib/em/resolver.rb +195 -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 +106 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine-le.rb +10 -0
- data/lib/eventmachine.rb +1548 -0
- data/rakelib/cpp.rake_example +77 -0
- data/rakelib/package.rake +98 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/em_test_helper.rb +143 -0
- data/tests/test_attach.rb +148 -0
- data/tests/test_basic.rb +294 -0
- data/tests/test_channel.rb +62 -0
- data/tests/test_completion.rb +177 -0
- data/tests/test_connection_count.rb +33 -0
- data/tests/test_defer.rb +18 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +134 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +65 -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 +190 -0
- data/tests/test_httpclient2.rb +128 -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 +110 -0
- data/tests/test_kb.rb +34 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +288 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +78 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +196 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +133 -0
- data/tests/test_proxy_connection.rb +168 -0
- data/tests/test_pure.rb +88 -0
- data/tests/test_queue.rb +50 -0
- data/tests/test_resolver.rb +55 -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 +41 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +55 -0
- data/tests/test_smtpserver.rb +120 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_methods.rb +48 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_threaded_resource.rb +55 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +180 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_udp46.rb +53 -0
- data/tests/test_unbind_reason.rb +48 -0
- metadata +390 -0
|
@@ -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.es", 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 (2a00:1450:4001:c01::93) 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("2a00:1450:4001:c01::93", 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,110 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestEnumerable
|
|
4
|
+
include Enumerable
|
|
5
|
+
|
|
6
|
+
def each
|
|
7
|
+
while (num = rand(20)) != 10 do
|
|
8
|
+
yield num
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class TestEnumerable2
|
|
14
|
+
include Enumerable
|
|
15
|
+
|
|
16
|
+
def each
|
|
17
|
+
arr = ('a'..'g').to_a
|
|
18
|
+
while it = arr.shift do
|
|
19
|
+
yield it
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class TestEnumerable3
|
|
25
|
+
include Enumerable
|
|
26
|
+
|
|
27
|
+
def each
|
|
28
|
+
('a'..'f').each.with_index do |ltr, index|
|
|
29
|
+
break if ltr == 'e'
|
|
30
|
+
eval("@#{ltr} = #{index}")
|
|
31
|
+
yield ltr
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class TestIterator < Test::Unit::TestCase
|
|
37
|
+
|
|
38
|
+
def test_iterator_with_array
|
|
39
|
+
assert_nothing_raised do
|
|
40
|
+
EM.run {
|
|
41
|
+
after = proc{ EM.stop }
|
|
42
|
+
EM::Iterator.new(0..10, 10).each(nil, after){ |num,iter| iter.next }
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_iterator_with_array_with_result
|
|
48
|
+
nums = []
|
|
49
|
+
EM.run {
|
|
50
|
+
after = proc{ EM.stop }
|
|
51
|
+
EM::Iterator.new((0..10)).each(nil, after){ |num,iter|
|
|
52
|
+
nums << num
|
|
53
|
+
iter.next
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
res = (0..10).to_a
|
|
57
|
+
assert_equal res, nums
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_iterator_with_enumerable
|
|
61
|
+
assert_nothing_raised do
|
|
62
|
+
EM.run {
|
|
63
|
+
en = TestEnumerable.new
|
|
64
|
+
after = proc{ EM.stop }
|
|
65
|
+
EM::Iterator.new(en, 10).each(nil, after){ |num, iter| iter.next }
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_iterator_with_enumerable_with_result
|
|
71
|
+
letters = []
|
|
72
|
+
EM.run {
|
|
73
|
+
en = TestEnumerable2.new
|
|
74
|
+
after = proc{ EM.stop }
|
|
75
|
+
EM::Iterator.new(en, 10).each(nil, after){ |ltr,iter|
|
|
76
|
+
letters << ltr
|
|
77
|
+
iter.next
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
res = ('a'..'g').to_a
|
|
81
|
+
assert_equal res, letters
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_iterator_with_array_with_nils
|
|
85
|
+
nums = []
|
|
86
|
+
EM.run {
|
|
87
|
+
after = proc{ EM.stop }
|
|
88
|
+
EM::Iterator.new(["Hello", nil, "World", nil]).each(nil, after){ |num,iter|
|
|
89
|
+
nums << num
|
|
90
|
+
iter.next
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
res = "Hello World"
|
|
94
|
+
assert_equal res, nums.compact.join(" ")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_iterator_for_lazyness
|
|
98
|
+
enumerable = TestEnumerable3.new
|
|
99
|
+
enumerator = enumerable.to_enum
|
|
100
|
+
EM.run {
|
|
101
|
+
after = proc{ EM.stop }
|
|
102
|
+
EM::Iterator.new(enumerator).each(nil, after){ |num,iter|
|
|
103
|
+
iter.next
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
assert_equal 0, enumerable.instance_variable_get(:@a)
|
|
107
|
+
assert_equal 3, enumerable.instance_variable_get(:@d)
|
|
108
|
+
assert_equal false, enumerable.instance_variable_defined?(:@e)
|
|
109
|
+
end
|
|
110
|
+
end
|
data/tests/test_kb.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestKeyboardEvents < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
if !jruby?
|
|
6
|
+
module KbHandler
|
|
7
|
+
include EM::Protocols::LineText2
|
|
8
|
+
def receive_line d
|
|
9
|
+
EM::stop if d == "STOP"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# This test doesn't actually do anything useful but is here to
|
|
14
|
+
# illustrate the usage. If you removed the timer and ran this test
|
|
15
|
+
# by itself on a console, and then typed into the console, it would
|
|
16
|
+
# work.
|
|
17
|
+
# I don't know how to get the test harness to simulate actual keystrokes.
|
|
18
|
+
# When someone figures that out, then we can make this a real test.
|
|
19
|
+
#
|
|
20
|
+
def test_kb
|
|
21
|
+
EM.run {
|
|
22
|
+
EM.open_keyboard KbHandler
|
|
23
|
+
EM::Timer.new(1) { EM.stop }
|
|
24
|
+
} if $stdout.tty? # don't run the test unless it stands a chance of validity.
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
warn "EM.open_keyboard not implemented, skipping tests in #{__FILE__}"
|
|
28
|
+
|
|
29
|
+
# Because some rubies will complain if a TestCase class has no tests
|
|
30
|
+
def test_em_open_keyboard_unsupported
|
|
31
|
+
assert true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|