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.
- data/.gitignore +14 -0
- data/README +82 -0
- data/Rakefile +279 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +133 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +13 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
- data/docs/PURE_RUBY +75 -0
- data/docs/RELEASE_NOTES +94 -0
- data/docs/SMTP +2 -0
- data/docs/SPAWNED_PROCESSES +89 -0
- data/docs/TODO +8 -0
- data/eventmachine.gemspec +41 -0
- data/examples/ex_channel.rb +43 -0
- data/examples/ex_queue.rb +2 -0
- data/examples/helper.rb +2 -0
- data/ext/binder.cpp +125 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +821 -0
- data/ext/cplusplus.cpp +202 -0
- data/ext/ed.cpp +1868 -0
- data/ext/ed.h +416 -0
- data/ext/em.cpp +2270 -0
- data/ext/em.h +228 -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 +122 -0
- data/ext/eventmachine_cpp.h +96 -0
- data/ext/extconf.rb +138 -0
- data/ext/fastfilereader/extconf.rb +84 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +81 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +349 -0
- data/ext/project.h +147 -0
- data/ext/rubymain.cpp +1152 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +460 -0
- data/ext/ssl.h +94 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/Application.java +192 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +557 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +146 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/buftok.rb +138 -0
- data/lib/em/callback.rb +26 -0
- data/lib/em/channel.rb +57 -0
- data/lib/em/connection.rb +564 -0
- data/lib/em/deferrable.rb +187 -0
- data/lib/em/file_watch.rb +54 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/process_watch.rb +44 -0
- data/lib/em/processes.rb +119 -0
- data/lib/em/protocols.rb +35 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +263 -0
- data/lib/em/protocols/httpclient2.rb +582 -0
- data/lib/em/protocols/line_and_text.rb +126 -0
- data/lib/em/protocols/linetext2.rb +160 -0
- data/lib/em/protocols/memcache.rb +323 -0
- data/lib/em/protocols/object_protocol.rb +45 -0
- data/lib/em/protocols/postgres3.rb +247 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +350 -0
- data/lib/em/protocols/smtpserver.rb +547 -0
- data/lib/em/protocols/stomp.rb +200 -0
- data/lib/em/protocols/tcptest.rb +53 -0
- data/lib/em/queue.rb +61 -0
- data/lib/em/spawnable.rb +85 -0
- data/lib/em/streamer.rb +130 -0
- data/lib/em/timers.rb +55 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1698 -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 +246 -0
- data/lib/pr_eventmachine.rb +1022 -0
- data/setup.rb +1585 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +79 -0
- data/tasks/tests.rake +193 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/test_attach.rb +126 -0
- data/tests/test_basic.rb +284 -0
- data/tests/test_channel.rb +63 -0
- data/tests/test_connection_count.rb +35 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +160 -0
- data/tests/test_error_handler.rb +35 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_exc.rb +55 -0
- data/tests/test_file_watch.rb +49 -0
- data/tests/test_futures.rb +198 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +218 -0
- data/tests/test_httpclient2.rb +153 -0
- data/tests/test_inactivity_timeout.rb +50 -0
- data/tests/test_kb.rb +60 -0
- data/tests/test_ltp.rb +182 -0
- data/tests/test_ltp2.rb +317 -0
- data/tests/test_next_tick.rb +133 -0
- data/tests/test_object_protocol.rb +37 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +92 -0
- data/tests/test_pure.rb +125 -0
- data/tests/test_queue.rb +44 -0
- data/tests/test_running.rb +42 -0
- data/tests/test_sasl.rb +72 -0
- data/tests/test_send_file.rb +242 -0
- data/tests/test_servers.rb +76 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +85 -0
- data/tests/test_spawn.rb +322 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_timers.rb +162 -0
- data/tests/test_ud.rb +36 -0
- data/tests/testem.rb +31 -0
- data/web/whatis +7 -0
- metadata +223 -0
data/tasks/cpp.rake
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# EventMachine C++ Rakefile Stab Case
|
2
|
+
# TODO : track header files as a build dependency...
|
3
|
+
# TODO : cross platform support
|
4
|
+
# TODO : configure style functionality
|
5
|
+
namespace :cpp do
|
6
|
+
|
7
|
+
require 'rake/clean'
|
8
|
+
|
9
|
+
# *nix only atm...
|
10
|
+
module Cpp
|
11
|
+
class <<self
|
12
|
+
def cpp; "g++"; end
|
13
|
+
def archive; "ar"; end
|
14
|
+
def compile file, output, includes=nil, flags=nil
|
15
|
+
sh %{#{cpp} #{file} #{includes} #{flags} -c -o #{output}}
|
16
|
+
end
|
17
|
+
def link file, output, libs=nil, flags=nil
|
18
|
+
sh %{#{cpp} #{file} #{libs} #{flags} -o #{output}}
|
19
|
+
end
|
20
|
+
def static output, files
|
21
|
+
sh %{#{archive} cr #{output} #{files}}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module EmConfig
|
27
|
+
Path = ENV['EVENTMACHINE_SOURCE'] || 'ext'
|
28
|
+
Sources = FileList["#{Path}/*.cpp"]
|
29
|
+
Sources.delete_if { |s| /ruby/ =~ s }
|
30
|
+
Compiled = Sources.sub(%r{^#{Path}/(.*)\.cpp}, "#{Path}/\\1.o")
|
31
|
+
|
32
|
+
Flags = "-O2 -pipe -fno-common -DOS_UNIX -DWITHOUT_SSL"
|
33
|
+
Includes = ""
|
34
|
+
Libs = ''
|
35
|
+
end
|
36
|
+
CLEAN.include(EmConfig::Compiled)
|
37
|
+
|
38
|
+
rule %r{^#{EmConfig::Path}/.*\.o$} => [proc { |targ|
|
39
|
+
targ.sub(%r{^#{EmConfig::Path}/(.*)\.o$}, "#{EmConfig::Path}/\\1.cpp")
|
40
|
+
}] do |t|
|
41
|
+
Cpp.compile t.source, t.name, EmConfig::Includes, EmConfig::Flags
|
42
|
+
end
|
43
|
+
|
44
|
+
file "#{EmConfig::Path}/libeventmachine.a" => EmConfig::Compiled do |t|
|
45
|
+
Cpp.static t.name, EmConfig::Compiled
|
46
|
+
end
|
47
|
+
CLEAN.include("#{EmConfig::Path}/libeventmachine.a")
|
48
|
+
|
49
|
+
module AppConfig
|
50
|
+
Appname = 'echo_em'
|
51
|
+
Sources = FileList['*.cpp']
|
52
|
+
Compiled = Sources.sub(%r{^(.*)\.cpp}, '\\1.o')
|
53
|
+
|
54
|
+
Flags = ["", EmConfig::Flags].join(' ')
|
55
|
+
Includes = ["-I. -I#{EmConfig::Path}", EmConfig::Includes].join(' ')
|
56
|
+
Libs = ["-L#{EmConfig::Path} -leventmachine", EmConfig::Libs].join(' ')
|
57
|
+
end
|
58
|
+
CLEAN.include(AppConfig::Compiled)
|
59
|
+
CLEAN.include(AppConfig::Appname)
|
60
|
+
|
61
|
+
rule %r{^.*\.o$} => [proc { |targ|
|
62
|
+
targ.sub(%r{^(.*)\.o$}, '\\1.cpp')
|
63
|
+
}] do |t|
|
64
|
+
Cpp.compile t.source, t.name, AppConfig::Includes, AppConfig::Flags
|
65
|
+
end
|
66
|
+
|
67
|
+
file AppConfig::Appname => ["#{EmConfig::Path}/libeventmachine.a", AppConfig::Compiled] do |t|
|
68
|
+
Cpp.link AppConfig::Compiled, t.name, AppConfig::Libs, AppConfig::Flags
|
69
|
+
end
|
70
|
+
|
71
|
+
task :build => AppConfig::Appname
|
72
|
+
|
73
|
+
task :run => AppConfig::Appname do
|
74
|
+
sh "./#{AppConfig::Appname}"
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
data/tasks/project.rake
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'rake/clean'
|
4
|
+
|
5
|
+
# monkey bitchin' for windows stuffs...
|
6
|
+
module FileUtils
|
7
|
+
# If any of these methods ever clobber, try removing them.
|
8
|
+
# Hopefully they'll do something semantically similar.
|
9
|
+
abort "Err: #{__FILE__}:#{__LINE__} monkey patch windows? clobbers!" unless instance_methods.grep(/windows\?/).empty?
|
10
|
+
abort "Err: #{__FILE__}:#{__LINE__} monkey patch sudo clobbers!" unless instance_methods.grep(/sudo/).empty?
|
11
|
+
abort "Err: #{__FILE__}:#{__LINE__} monkey patch gem_cmd clobbers!" unless instance_methods.grep(/gem_cmd/).empty?
|
12
|
+
def windows?; RUBY_PLATFORM =~ /mswin|mingw/; end
|
13
|
+
def sudo(cmd)
|
14
|
+
if windows? || (require 'etc'; Etc.getpwuid.uid == 0)
|
15
|
+
sh cmd
|
16
|
+
else
|
17
|
+
sh "sudo #{cmd}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
def gem_cmd(action, name, *args)
|
21
|
+
rb = Gem.ruby rescue nil
|
22
|
+
rb ||= (require 'rbconfig'; File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']))
|
23
|
+
sudo "#{rb} -r rubygems -e 'require %{rubygems/gem_runner}; Gem::GemRunner.new.run(%w{#{action} #{name} #{args.join(' ')}})'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
# Setup our packaging tasks, we're just jacking the builtins.
|
29
|
+
Rake::GemPackageTask.new(Spec) do |pkg|
|
30
|
+
pkg.need_tar, pkg.need_tar_gz, pkg.need_zip = true, true, true if Package
|
31
|
+
pkg.gem_spec = Spec
|
32
|
+
end
|
33
|
+
Rake::Task[:clean].enhance [:clobber_package]
|
34
|
+
|
35
|
+
# Only generate rdoc if the spec says so, again, jack the builtins.
|
36
|
+
if Spec.has_rdoc
|
37
|
+
Rake::RDocTask.new do |rd|
|
38
|
+
rd.title = Spec.name
|
39
|
+
rd.rdoc_dir = 'rdoc'
|
40
|
+
rd.main = "README"
|
41
|
+
rd.rdoc_files.include("lib/**/*.rb", *Spec.extra_rdoc_files)
|
42
|
+
rd.rdoc_files.exclude(*%w(lib/em/version lib/emva lib/evma/ lib/pr_eventmachine lib/jeventmachine))
|
43
|
+
end
|
44
|
+
Rake::Task[:clean].enhance [:clobber_rdoc]
|
45
|
+
|
46
|
+
desc 'Generate and open documentation'
|
47
|
+
task :docs => :rdoc do
|
48
|
+
case RUBY_PLATFORM
|
49
|
+
when /darwin/ ; sh 'open rdoc/index.html'
|
50
|
+
when /mswin|mingw/ ; sh 'start rdoc\index.html'
|
51
|
+
else
|
52
|
+
sh 'firefox rdoc/index.html'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if Spec.default_executable
|
58
|
+
desc "Run #{Spec.default_executable}"
|
59
|
+
task :run do ruby File.join(Spec.bindir, Spec.default_executable) end
|
60
|
+
end
|
61
|
+
|
62
|
+
require 'rubygems'
|
63
|
+
|
64
|
+
desc 'Install gem (and sudo if required)'
|
65
|
+
task :install => :package do
|
66
|
+
gem_cmd(:install, "pkg/#{Spec.name}-#{Spec.version}.gem")
|
67
|
+
end
|
68
|
+
|
69
|
+
desc 'Uninstall gem (and sudo if required)'
|
70
|
+
task :uninstall do
|
71
|
+
gem_cmd(:uninstall, "#{Spec.name}", "-v=#{Spec.version}")
|
72
|
+
end
|
73
|
+
|
74
|
+
# Find an scm's store directory, if we do, make a task to commit to it only
|
75
|
+
# after running all the tests (successfully).
|
76
|
+
if scm = %w(git svn bzr hg).find { |d| File.directory? ".#{d}" }
|
77
|
+
desc "Run tests then commit to #{scm}"
|
78
|
+
task :commit => :test do sh "#{scm} commit" end
|
79
|
+
end
|
data/tasks/tests.rake
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
# This is used by several rake tasks, that parameterize the
|
2
|
+
# behavior so we can use the same tests to test both the
|
3
|
+
# extension and non-extension versions.
|
4
|
+
def run_tests t, libr = :cascade, test_files="test_*.rb"
|
5
|
+
require 'test/unit/testsuite'
|
6
|
+
require 'test/unit/ui/console/testrunner'
|
7
|
+
require 'tests/testem'
|
8
|
+
|
9
|
+
base_dir = File.expand_path(File.dirname(__FILE__) + '/../') + '/'
|
10
|
+
|
11
|
+
runner = Test::Unit::UI::Console::TestRunner
|
12
|
+
|
13
|
+
$eventmachine_library = libr
|
14
|
+
EmTestRunner.run(test_files)
|
15
|
+
|
16
|
+
suite = Test::Unit::TestSuite.new($name)
|
17
|
+
|
18
|
+
ObjectSpace.each_object(Class) do |testcase|
|
19
|
+
suite << testcase.suite if testcase < Test::Unit::TestCase
|
20
|
+
end
|
21
|
+
|
22
|
+
runner.run(suite)
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Run tests for #{Spec.name}."
|
26
|
+
task :test do |t|
|
27
|
+
# run_tests t
|
28
|
+
# Rake +/ friends leave threads, etc, less stable test runs.
|
29
|
+
ruby "-Ilib -Iext -Iext/fastfilereader -Ijava tests/testem.rb #{'-v' if ENV['VERBOSE']}"
|
30
|
+
end
|
31
|
+
|
32
|
+
namespace :test do
|
33
|
+
desc "Run tests for #{Spec.name}."
|
34
|
+
task :partial do |t|
|
35
|
+
lib = RUBY_PLATFORM =~ /java/ ? :java : :extension
|
36
|
+
run_tests t, lib, [
|
37
|
+
"test_basic.rb",
|
38
|
+
"test_epoll.rb",
|
39
|
+
"test_errors.rb",
|
40
|
+
"test_error_handler.rb",
|
41
|
+
"test_eventables.rb",
|
42
|
+
"test_exc.rb",
|
43
|
+
"test_futures.rb",
|
44
|
+
"test_hc.rb",
|
45
|
+
"test_httpclient2.rb",
|
46
|
+
"test_httpclient.rb",
|
47
|
+
"test_kb.rb",
|
48
|
+
"test_ltp2.rb",
|
49
|
+
"test_ltp.rb",
|
50
|
+
"test_next_tick.rb",
|
51
|
+
"test_processes.rb",
|
52
|
+
"test_pure.rb",
|
53
|
+
"test_running.rb",
|
54
|
+
"test_sasl.rb",
|
55
|
+
"test_send_file.rb",
|
56
|
+
"test_servers.rb",
|
57
|
+
"test_smtpclient.rb",
|
58
|
+
"test_smtpserver.rb",
|
59
|
+
"test_spawn.rb",
|
60
|
+
"test_timers.rb",
|
61
|
+
"test_ud.rb",
|
62
|
+
].map { |tf| "tests/#{tf}" }
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Run java tests for #$name."
|
66
|
+
task :testjava do |t|
|
67
|
+
run_tests t, :java
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Run pure-ruby tests for #$name."
|
71
|
+
task :testpr do |t|
|
72
|
+
run_tests t, :pure_ruby
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Run extension tests for #$name."
|
76
|
+
task :testext do |t|
|
77
|
+
run_tests t, :extension
|
78
|
+
end
|
79
|
+
|
80
|
+
desc "PROVISIONAL: run tests for user-defined events"
|
81
|
+
task :ud do |t|
|
82
|
+
run_tests t, :extension, "test_ud.rb"
|
83
|
+
end
|
84
|
+
|
85
|
+
desc "PROVISIONAL: run tests for line/text protocol handler"
|
86
|
+
task :ltp do |t|
|
87
|
+
run_tests t, :extension, "test_ltp*.rb"
|
88
|
+
end
|
89
|
+
|
90
|
+
desc "PROVISIONAL: run tests for header/content protocol handler"
|
91
|
+
task :hc do |t|
|
92
|
+
run_tests t, :extension, "test_hc.rb"
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "PROVISIONAL: run tests for exceptions"
|
96
|
+
task :exc do |t|
|
97
|
+
run_tests t, :extension, "test_exc.rb"
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "Test protocol handlers"
|
101
|
+
task :protocols => [ :hc, :ltp ]
|
102
|
+
|
103
|
+
|
104
|
+
desc "Test HTTP client"
|
105
|
+
task :httpclient do |t|
|
106
|
+
run_tests t, :extension, "test_httpclient.rb"
|
107
|
+
end
|
108
|
+
|
109
|
+
desc "Test HTTP client2"
|
110
|
+
task :httpclient2 do |t|
|
111
|
+
run_tests t, :extension, "test_httpclient2.rb"
|
112
|
+
end
|
113
|
+
|
114
|
+
desc "Test futures"
|
115
|
+
task :futures do |t|
|
116
|
+
run_tests t, :extension, "test_future*.rb"
|
117
|
+
end
|
118
|
+
|
119
|
+
desc "Test Timers"
|
120
|
+
task :timers do |t|
|
121
|
+
run_tests t, :extension, "test_timer*.rb"
|
122
|
+
end
|
123
|
+
|
124
|
+
desc "Test Next Tick"
|
125
|
+
task :next_tick do |t|
|
126
|
+
run_tests t, :extension, "test_next_tick*.rb"
|
127
|
+
end
|
128
|
+
|
129
|
+
desc "Test Epoll"
|
130
|
+
task :epoll do |t|
|
131
|
+
run_tests t, :extension, "test_epoll*.rb"
|
132
|
+
end
|
133
|
+
|
134
|
+
desc "Test Servers"
|
135
|
+
task :servers do |t|
|
136
|
+
run_tests t, :extension, "test_servers*.rb"
|
137
|
+
end
|
138
|
+
|
139
|
+
desc "Test Basic"
|
140
|
+
task :basic do |t|
|
141
|
+
run_tests t, :extension, "test_basic*.rb"
|
142
|
+
end
|
143
|
+
|
144
|
+
desc "Test Send File"
|
145
|
+
task :send_file do |t|
|
146
|
+
run_tests t, :extension, "test_send_file*.rb"
|
147
|
+
end
|
148
|
+
|
149
|
+
desc "Test Running"
|
150
|
+
task :running do |t|
|
151
|
+
run_tests t, :extension, "test_running*.rb"
|
152
|
+
end
|
153
|
+
|
154
|
+
desc "Test Keyboard Events"
|
155
|
+
task :keyboard do |t|
|
156
|
+
run_tests t, :extension, "test_kb*.rb"
|
157
|
+
end
|
158
|
+
|
159
|
+
desc "Test Spawn"
|
160
|
+
task :spawn do |t|
|
161
|
+
run_tests t, :extension, "test_spawn*.rb"
|
162
|
+
end
|
163
|
+
|
164
|
+
desc "Test SMTP"
|
165
|
+
task :smtp do |t|
|
166
|
+
run_tests t, :extension, "test_smtp*.rb"
|
167
|
+
end
|
168
|
+
|
169
|
+
desc "Test Errors"
|
170
|
+
task :errors do |t|
|
171
|
+
run_tests t, :extension, "test_errors*.rb"
|
172
|
+
end
|
173
|
+
|
174
|
+
desc "Test Pure Ruby"
|
175
|
+
task :pure do |t|
|
176
|
+
run_tests t, :extension, "test_pure*.rb"
|
177
|
+
end
|
178
|
+
|
179
|
+
desc "Test Processes"
|
180
|
+
task :processes do |t|
|
181
|
+
run_tests t, :extension, "test_process*.rb"
|
182
|
+
end
|
183
|
+
|
184
|
+
desc "Test SASL"
|
185
|
+
task :sasl do |t|
|
186
|
+
run_tests t, :java, "test_sasl*.rb"
|
187
|
+
end
|
188
|
+
|
189
|
+
desc "Test Attach"
|
190
|
+
task :attach do |t|
|
191
|
+
run_tests t, :extension, "test_attach*.rb"
|
192
|
+
end
|
193
|
+
end
|
data/tests/client.crt
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV
|
3
|
+
BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL
|
4
|
+
EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy
|
5
|
+
MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2
|
6
|
+
ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl
|
7
|
+
bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF
|
8
|
+
AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b
|
9
|
+
+hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK
|
10
|
+
OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l
|
11
|
+
S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p
|
12
|
+
67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg
|
13
|
+
C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N
|
14
|
+
uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy
|
15
|
+
XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+
|
16
|
+
B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD
|
17
|
+
ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK
|
18
|
+
iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC
|
19
|
+
AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU
|
20
|
+
6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV
|
21
|
+
MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0
|
22
|
+
4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ
|
23
|
+
43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ
|
24
|
+
i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w
|
25
|
+
mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM
|
26
|
+
aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c
|
27
|
+
544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2
|
28
|
+
gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6
|
29
|
+
0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR
|
30
|
+
8bs/XQVNE/s=
|
31
|
+
-----END CERTIFICATE-----
|
data/tests/client.key
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
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
|
51
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# $Id$
|
2
|
+
#
|
3
|
+
#----------------------------------------------------------------------------
|
4
|
+
#
|
5
|
+
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
6
|
+
# Gmail: blackhedd
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of either: 1) the GNU General Public License
|
10
|
+
# as published by the Free Software Foundation; either version 2 of the
|
11
|
+
# License, or (at your option) any later version; or 2) Ruby's License.
|
12
|
+
#
|
13
|
+
# See the file COPYING for complete licensing information.
|
14
|
+
#
|
15
|
+
#---------------------------------------------------------------------------
|
16
|
+
#
|
17
|
+
|
18
|
+
$:.unshift "../lib"
|
19
|
+
require 'eventmachine'
|
20
|
+
require 'socket'
|
21
|
+
require 'test/unit'
|
22
|
+
|
23
|
+
|
24
|
+
class TestAttach < Test::Unit::TestCase
|
25
|
+
|
26
|
+
Host = "127.0.0.1"
|
27
|
+
Port = 9550
|
28
|
+
|
29
|
+
class EchoServer < EM::Connection
|
30
|
+
def receive_data data
|
31
|
+
send_data data
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class EchoClient < EM::Connection
|
36
|
+
def initialize
|
37
|
+
self.notify_readable = true
|
38
|
+
$sock.write("abc\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def notify_readable
|
42
|
+
$read = $sock.readline
|
43
|
+
$fd = detach
|
44
|
+
end
|
45
|
+
|
46
|
+
def unbind
|
47
|
+
EM.next_tick do
|
48
|
+
$sock.write("def\n")
|
49
|
+
EM.add_timer(0.5){ EM.stop }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_attach
|
55
|
+
EM.run{
|
56
|
+
EM.start_server Host, Port, EchoServer
|
57
|
+
$sock = TCPSocket.new Host, Port
|
58
|
+
EM.watch $sock, EchoClient
|
59
|
+
}
|
60
|
+
|
61
|
+
assert_equal $read, "abc\n"
|
62
|
+
unless defined? JRuby # jruby filenos are not real
|
63
|
+
assert_equal $fd, $sock.fileno
|
64
|
+
end
|
65
|
+
assert_equal false, $sock.closed?
|
66
|
+
assert_equal $sock.readline, "def\n"
|
67
|
+
end
|
68
|
+
|
69
|
+
module PipeWatch
|
70
|
+
def notify_readable
|
71
|
+
$read = $r.readline
|
72
|
+
EM.stop
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_attach_pipe
|
77
|
+
EM.run{
|
78
|
+
$r, $w = IO.pipe
|
79
|
+
EM.watch $r, PipeWatch do |c|
|
80
|
+
c.notify_readable = true
|
81
|
+
end
|
82
|
+
$w.write("ghi\n")
|
83
|
+
}
|
84
|
+
|
85
|
+
assert_equal $read, "ghi\n"
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_set_readable
|
89
|
+
EM.run{
|
90
|
+
$r, $w = IO.pipe
|
91
|
+
c = EM.watch $r, PipeWatch do |c|
|
92
|
+
c.notify_readable = false
|
93
|
+
end
|
94
|
+
|
95
|
+
EM.next_tick{
|
96
|
+
$before = c.notify_readable?
|
97
|
+
c.notify_readable = true
|
98
|
+
$after = c.notify_readable?
|
99
|
+
}
|
100
|
+
|
101
|
+
$w.write("jkl\n")
|
102
|
+
}
|
103
|
+
|
104
|
+
assert !$before
|
105
|
+
assert $after
|
106
|
+
assert_equal $read, "jkl\n"
|
107
|
+
end
|
108
|
+
|
109
|
+
module PipeReader
|
110
|
+
def receive_data data
|
111
|
+
$read = data
|
112
|
+
EM.stop
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_read_write_pipe
|
117
|
+
EM.run{
|
118
|
+
$r, $w = IO.pipe
|
119
|
+
EM.attach $r, PipeReader
|
120
|
+
writer = EM.attach($w)
|
121
|
+
writer.send_data 'ghi'
|
122
|
+
}
|
123
|
+
|
124
|
+
assert_equal $read, "ghi"
|
125
|
+
end
|
126
|
+
end
|