eventmachine 0.12.0-i386-mswin32
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/COPYING +60 -0
- data/DEFERRABLES +138 -0
- data/EPOLL +141 -0
- data/GNU +281 -0
- data/KEYBOARD +38 -0
- data/LEGAL +25 -0
- data/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/PURE_RUBY +77 -0
- data/README +74 -0
- data/RELEASE_NOTES +96 -0
- data/SMTP +9 -0
- data/SPAWNED_PROCESSES +93 -0
- data/TODO +10 -0
- data/ext/Makefile +180 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +527 -0
- data/ext/cplusplus.cpp +172 -0
- data/ext/ed.cpp +1442 -0
- data/ext/ed.h +351 -0
- data/ext/em.cpp +1781 -0
- data/ext/em.h +167 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +83 -0
- data/ext/eventmachine_cpp.h +94 -0
- data/ext/extconf.rb +203 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +368 -0
- data/ext/mkmf.log +129 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +327 -0
- data/ext/project.h +119 -0
- data/ext/rubyeventmachine-i386-mswin32.def +2 -0
- data/ext/rubyeventmachine-i386-mswin32.exp +0 -0
- data/ext/rubyeventmachine-i386-mswin32.lib +0 -0
- data/ext/rubyeventmachine-i386-mswin32.pdb +0 -0
- data/ext/rubyeventmachine.so +0 -0
- data/ext/rubymain.cpp +630 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +408 -0
- data/ext/ssl.h +86 -0
- data/ext/vc60.pdb +0 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +68 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1621 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma.rb +32 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/jeventmachine.rb +106 -0
- data/lib/pr_eventmachine.rb +1011 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +123 -0
- data/lib/protocols/httpcli2.rb +784 -0
- data/lib/protocols/httpclient.rb +253 -0
- data/lib/protocols/line_and_text.rb +122 -0
- data/lib/protocols/linetext2.rb +145 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +543 -0
- data/lib/protocols/stomp.rb +127 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/lib/rubyeventmachine.so +0 -0
- data/tests/test_basic.rb +142 -0
- data/tests/test_defer.rb +63 -0
- data/tests/test_epoll.rb +168 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +78 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_hc.rb +221 -0
- data/tests/test_httpclient.rb +194 -0
- data/tests/test_httpclient2.rb +133 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +190 -0
- data/tests/test_ltp2.rb +261 -0
- data/tests/test_next_tick.rb +58 -0
- data/tests/test_processes.rb +56 -0
- data/tests/test_pure.rb +128 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +73 -0
- data/tests/test_send_file.rb +238 -0
- data/tests/test_servers.rb +90 -0
- data/tests/test_smtpclient.rb +81 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_timers.rb +138 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +5 -0
- metadata +170 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
# $Id: stomp.rb 668 2008-01-04 23:00:34Z blackhedd $
|
2
|
+
#
|
3
|
+
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
|
+
# Homepage:: http://rubyeventmachine.com
|
5
|
+
# Date:: 15 November 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
|
+
|
29
|
+
module EventMachine
|
30
|
+
module Protocols
|
31
|
+
|
32
|
+
# Implements Stomp (http://docs.codehaus.org/display/STOMP/Protocol).
|
33
|
+
#
|
34
|
+
module Stomp
|
35
|
+
include LineText2
|
36
|
+
|
37
|
+
class Message
|
38
|
+
attr_accessor :command, :header, :body
|
39
|
+
def initialize
|
40
|
+
@header = {}
|
41
|
+
@state = :precommand
|
42
|
+
@content_length = nil
|
43
|
+
end
|
44
|
+
def consume_line line
|
45
|
+
if @state == :precommand
|
46
|
+
unless line =~ /\A\s*\Z/
|
47
|
+
@command = line
|
48
|
+
@state = :headers
|
49
|
+
end
|
50
|
+
elsif @state == :headers
|
51
|
+
if line == ""
|
52
|
+
if @content_length
|
53
|
+
yield( [:sized_text, @content_length+1] )
|
54
|
+
else
|
55
|
+
@state = :body
|
56
|
+
yield( [:unsized_text] )
|
57
|
+
end
|
58
|
+
elsif line =~ /\A([^:]+):(.+)\Z/
|
59
|
+
k = $1.dup.strip
|
60
|
+
v = $2.dup.strip
|
61
|
+
@header[k] = v
|
62
|
+
if k == "content-length"
|
63
|
+
@content_length = v.to_i
|
64
|
+
end
|
65
|
+
else
|
66
|
+
# This is a protocol error. How to signal it?
|
67
|
+
end
|
68
|
+
elsif @state == :body
|
69
|
+
@body = line
|
70
|
+
yield( [:dispatch] )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def send_frame verb, headers={}, body=""
|
76
|
+
ary = [verb, "\n"]
|
77
|
+
headers.each {|k,v| ary << "#{k}:#{v}\n" }
|
78
|
+
ary << "content-length: #{body.to_s.length}\n"
|
79
|
+
ary << "content-type: text/plain; charset=UTF-8\n"
|
80
|
+
ary << "\n"
|
81
|
+
ary << body.to_s
|
82
|
+
ary << "\0"
|
83
|
+
send_data ary.join
|
84
|
+
end
|
85
|
+
|
86
|
+
def receive_line line
|
87
|
+
@stomp_initialized || init_message_reader
|
88
|
+
@stomp_message.consume_line(line) {|outcome|
|
89
|
+
if outcome.first == :sized_text
|
90
|
+
set_text_mode outcome[1]
|
91
|
+
elsif outcome.first == :unsized_text
|
92
|
+
set_delimiter "\0"
|
93
|
+
elsif outcome.first == :dispatch
|
94
|
+
receive_msg(@stomp_message) if respond_to?(:receive_msg)
|
95
|
+
init_message_reader
|
96
|
+
end
|
97
|
+
}
|
98
|
+
end
|
99
|
+
def receive_binary_data data
|
100
|
+
@stomp_message.body = data[0..-2]
|
101
|
+
receive_msg(@stomp_message) if respond_to?(:receive_msg)
|
102
|
+
init_message_reader
|
103
|
+
end
|
104
|
+
|
105
|
+
def init_message_reader
|
106
|
+
@stomp_initialized = true
|
107
|
+
set_delimiter "\n"
|
108
|
+
set_line_mode
|
109
|
+
@stomp_message = Message.new
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
# STOMP verbs
|
114
|
+
def connect parms={}
|
115
|
+
send_frame "CONNECT", parms
|
116
|
+
end
|
117
|
+
def send destination, body, parms={}
|
118
|
+
send_frame "SEND", parms.merge( :destination=>destination ), body.to_s
|
119
|
+
end
|
120
|
+
def subscribe dest, ack=false
|
121
|
+
send_frame "SUBSCRIBE", {:destination=>dest, :ack=>(ack ? "client" : "auto")}
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# $Id: tcptest.rb 668 2008-01-04 23:00:34Z blackhedd $
|
2
|
+
#
|
3
|
+
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
|
+
# Homepage:: http://rubyeventmachine.com
|
5
|
+
# Date:: 16 July 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
|
+
|
29
|
+
module EventMachine
|
30
|
+
module Protocols
|
31
|
+
|
32
|
+
class TcpConnectTester < Connection
|
33
|
+
include EventMachine::Deferrable
|
34
|
+
|
35
|
+
def self.test( host, port )
|
36
|
+
EventMachine.connect( host, port, self )
|
37
|
+
end
|
38
|
+
|
39
|
+
def post_init
|
40
|
+
@start_time = Time.now
|
41
|
+
end
|
42
|
+
|
43
|
+
def connection_completed
|
44
|
+
@completed = true
|
45
|
+
set_deferred_status :succeeded, (Time.now - @start_time)
|
46
|
+
close_connection
|
47
|
+
end
|
48
|
+
|
49
|
+
def unbind
|
50
|
+
set_deferred_status :failed, (Time.now - @start_time) unless @completed
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
Binary file
|
data/tests/test_basic.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
# $Id: test_basic.rb 668 2008-01-04 23:00:34Z blackhedd $
|
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 TestBasic < Test::Unit::TestCase
|
32
|
+
|
33
|
+
def setup
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
end
|
38
|
+
|
39
|
+
#-------------------------------------
|
40
|
+
|
41
|
+
def test_libtype
|
42
|
+
lt = EventMachine.library_type
|
43
|
+
case (ENV["EVENTMACHINE_LIBRARY"] || $eventmachine_library || :xxx).to_sym
|
44
|
+
when :pure_ruby
|
45
|
+
assert_equal( :pure_ruby, lt )
|
46
|
+
when :extension
|
47
|
+
assert_equal( :extension, lt )
|
48
|
+
when :java
|
49
|
+
assert_equal( :java, lt )
|
50
|
+
else
|
51
|
+
assert_equal( :extension, lt )
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#-------------------------------------
|
56
|
+
|
57
|
+
|
58
|
+
def test_em
|
59
|
+
EventMachine.run {
|
60
|
+
EventMachine.add_timer 0 do
|
61
|
+
EventMachine.stop
|
62
|
+
end
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
#-------------------------------------
|
67
|
+
|
68
|
+
def test_timer
|
69
|
+
n = 0
|
70
|
+
EventMachine.run {
|
71
|
+
EventMachine.add_periodic_timer(1) {
|
72
|
+
n += 1
|
73
|
+
EventMachine.stop if n == 2
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
#-------------------------------------
|
79
|
+
|
80
|
+
# This test once threw an already-running exception.
|
81
|
+
module Trivial
|
82
|
+
def post_init
|
83
|
+
EventMachine.stop
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_server
|
88
|
+
EventMachine.run {
|
89
|
+
EventMachine.start_server "localhost", 9000, Trivial
|
90
|
+
EventMachine.connect "localhost", 9000
|
91
|
+
}
|
92
|
+
assert( true ) # make sure it halts
|
93
|
+
end
|
94
|
+
|
95
|
+
#--------------------------------------
|
96
|
+
|
97
|
+
# EventMachine#run_block starts the reactor loop, runs the supplied block, and then STOPS
|
98
|
+
# the loop automatically. Contrast with EventMachine#run, which keeps running the reactor
|
99
|
+
# even after the supplied block completes.
|
100
|
+
def test_run_block
|
101
|
+
a = nil
|
102
|
+
EM.run_block { a = "Worked" }
|
103
|
+
assert a
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
#--------------------------------------
|
108
|
+
|
109
|
+
# TODO! This is an unfinished edge case.
|
110
|
+
# EM mishandles uncaught Ruby exceptions that fire from within #unbind handlers.
|
111
|
+
# A uncaught Ruby exception results in a call to EM::release_machine (which is in an ensure
|
112
|
+
# block in EM::run). But if EM is processing an unbind request, the release_machine call
|
113
|
+
# will cause a segmentation fault.
|
114
|
+
#
|
115
|
+
|
116
|
+
TestHost = "127.0.0.1"
|
117
|
+
TestPort = 9070
|
118
|
+
|
119
|
+
class UnbindError < EM::Connection
|
120
|
+
def initialize *args
|
121
|
+
super
|
122
|
+
end
|
123
|
+
def connection_completed
|
124
|
+
close_connection_after_writing
|
125
|
+
end
|
126
|
+
def unbind
|
127
|
+
raise "Blooey"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def xxx_test_unbind_error
|
132
|
+
assert_raise( RuntimeError ) {
|
133
|
+
EM.run {
|
134
|
+
EM.start_server TestHost, TestPort
|
135
|
+
EM.connect TestHost, TestPort, UnbindError
|
136
|
+
}
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
|
data/tests/test_defer.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# $Id: test_defer.rb 668 2008-01-04 23:00:34Z blackhedd $
|
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 TestDeferUsage < Test::Unit::TestCase
|
32
|
+
|
33
|
+
def setup
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
end
|
38
|
+
|
39
|
+
def run_em_with_defers
|
40
|
+
n = 0
|
41
|
+
n_times = 20
|
42
|
+
EM.run {
|
43
|
+
n_times.times {
|
44
|
+
EM.defer proc {
|
45
|
+
sleep 0.1
|
46
|
+
}, proc {
|
47
|
+
n += 1
|
48
|
+
EM.stop if n == n_times
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
assert_equal( n, n_times )
|
53
|
+
end
|
54
|
+
def test_defers
|
55
|
+
10.times {
|
56
|
+
run_em_with_defers {|n,ntimes|
|
57
|
+
assert_equal( n, ntimes )
|
58
|
+
}
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
data/tests/test_epoll.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
# $Id: test_epoll.rb 668 2008-01-04 23:00:34Z blackhedd $
|
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
|
+
# TODO, and I know this doesn't belong here, but if a datagram calls
|
27
|
+
# send_data outside of a receive_data, there is no return address, and
|
28
|
+
# the result is a very confusing error message.
|
29
|
+
#
|
30
|
+
|
31
|
+
$:.unshift "../lib"
|
32
|
+
require 'eventmachine'
|
33
|
+
require 'test/unit'
|
34
|
+
|
35
|
+
|
36
|
+
class TestEpoll < Test::Unit::TestCase
|
37
|
+
|
38
|
+
def setup
|
39
|
+
end
|
40
|
+
|
41
|
+
def teardown
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
module TestEchoServer
|
46
|
+
def receive_data data
|
47
|
+
send_data data
|
48
|
+
close_connection_after_writing
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module TestEchoClient
|
53
|
+
def connection_completed
|
54
|
+
send_data "ABCDE"
|
55
|
+
$max += 1
|
56
|
+
end
|
57
|
+
def receive_data data
|
58
|
+
raise "bad response" unless data == "ABCDE"
|
59
|
+
end
|
60
|
+
def unbind
|
61
|
+
$n -= 1
|
62
|
+
EM.stop if $n == 0
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
# We can set the rlimit/nofile of a process but we can only set it
|
68
|
+
# higher if we're running as root.
|
69
|
+
# On most systems, the default value is 1024.
|
70
|
+
# Java doesn't (currently) implement this.
|
71
|
+
def test_rlimit
|
72
|
+
unless RUBY_PLATFORM =~ /java/
|
73
|
+
a = EM.set_descriptor_table_size
|
74
|
+
assert( a <= 1024 )
|
75
|
+
a = EM.set_descriptor_table_size( 1024 )
|
76
|
+
assert( a == 1024 )
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Run a high-volume version of this test by kicking the number of connections
|
81
|
+
# up past 512. (Each connection uses two sockets, a client and a server.)
|
82
|
+
# (Will require running the test as root)
|
83
|
+
# This test exercises TCP clients and servers.
|
84
|
+
#
|
85
|
+
def test_descriptors
|
86
|
+
EM.epoll
|
87
|
+
s = EM.set_descriptor_table_size 60000
|
88
|
+
EM.run {
|
89
|
+
EM.start_server "127.0.0.1", 9800, TestEchoServer
|
90
|
+
$n = 0
|
91
|
+
$max = 0
|
92
|
+
100.times {
|
93
|
+
EM.connect("127.0.0.1", 9800, TestEchoClient) {$n += 1}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
assert_equal(0, $n)
|
97
|
+
assert_equal(100, $max)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_defer
|
101
|
+
$n = 0
|
102
|
+
EM.epoll
|
103
|
+
EM.run {
|
104
|
+
sleep_proc = proc {sleep 1}
|
105
|
+
return_proc = proc {$n += 1; EM.stop}
|
106
|
+
EM.defer sleep_proc, return_proc
|
107
|
+
}
|
108
|
+
assert_equal( 1, $n )
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
module TestDatagramServer
|
113
|
+
def receive_data dgm
|
114
|
+
$in = dgm
|
115
|
+
send_data "abcdefghij"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
module TestDatagramClient
|
119
|
+
def post_init
|
120
|
+
send_datagram "1234567890", "127.0.0.1", 9500
|
121
|
+
end
|
122
|
+
def receive_data dgm
|
123
|
+
$out = dgm
|
124
|
+
EM.stop
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_datagrams
|
129
|
+
$in = $out = ""
|
130
|
+
EM.epoll
|
131
|
+
EM.run {
|
132
|
+
EM.open_datagram_socket "127.0.0.1", 9500, TestDatagramServer
|
133
|
+
EM.open_datagram_socket "127.0.0.1", 0, TestDatagramClient
|
134
|
+
}
|
135
|
+
assert_equal( "1234567890", $in )
|
136
|
+
assert_equal( "abcdefghij", $out )
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
def test_unix_domain
|
143
|
+
EM.epoll
|
144
|
+
s = EM.set_descriptor_table_size 60000
|
145
|
+
EM.run {
|
146
|
+
# The pure-Ruby version won't let us open the socket if the node already exists.
|
147
|
+
# Not sure, that actually may be correct and the compiled version is wrong.
|
148
|
+
# Pure Ruby also oddly won't let us make that many connections. This test used
|
149
|
+
# to run 100 times. Not sure where that lower connection-limit is coming from in
|
150
|
+
# pure Ruby.
|
151
|
+
# Let's not sweat the Unix-ness of the filename, since this test can't possibly
|
152
|
+
# work on Windows anyway.
|
153
|
+
#
|
154
|
+
fn = "/tmp/xxx.chain"
|
155
|
+
File.unlink(fn) if File.exist?(fn)
|
156
|
+
EM.start_unix_domain_server fn, TestEchoServer
|
157
|
+
$n = 0
|
158
|
+
$max = 0
|
159
|
+
50.times {
|
160
|
+
EM.connect_unix_domain(fn, TestEchoClient) {$n += 1}
|
161
|
+
}
|
162
|
+
}
|
163
|
+
assert_equal(0, $n)
|
164
|
+
assert_equal(50, $max)
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|