cool.io 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +25 -0
  2. data/CHANGES +199 -0
  3. data/LICENSE +20 -0
  4. data/README.markdown +4 -0
  5. data/Rakefile +98 -0
  6. data/VERSION +1 -0
  7. data/examples/echo_client.rb +38 -0
  8. data/examples/echo_server.rb +27 -0
  9. data/examples/google.rb +9 -0
  10. data/examples/httpclient.rb +38 -0
  11. data/ext/cool.io/.gitignore +5 -0
  12. data/ext/cool.io/cool.io.h +58 -0
  13. data/ext/cool.io/cool.io_ext.c +25 -0
  14. data/ext/cool.io/ev_wrap.h +8 -0
  15. data/ext/cool.io/extconf.rb +69 -0
  16. data/ext/cool.io/iowatcher.c +189 -0
  17. data/ext/cool.io/libev.c +8 -0
  18. data/ext/cool.io/loop.c +303 -0
  19. data/ext/cool.io/stat_watcher.c +191 -0
  20. data/ext/cool.io/timer_watcher.c +219 -0
  21. data/ext/cool.io/utils.c +122 -0
  22. data/ext/cool.io/watcher.c +264 -0
  23. data/ext/cool.io/watcher.h +71 -0
  24. data/ext/http11_client/.gitignore +5 -0
  25. data/ext/http11_client/ext_help.h +14 -0
  26. data/ext/http11_client/extconf.rb +6 -0
  27. data/ext/http11_client/http11_client.c +300 -0
  28. data/ext/http11_client/http11_parser.c +403 -0
  29. data/ext/http11_client/http11_parser.h +48 -0
  30. data/ext/http11_client/http11_parser.rl +173 -0
  31. data/ext/libev/Changes +364 -0
  32. data/ext/libev/LICENSE +36 -0
  33. data/ext/libev/README +58 -0
  34. data/ext/libev/README.embed +3 -0
  35. data/ext/libev/ev.c +3867 -0
  36. data/ext/libev/ev.h +826 -0
  37. data/ext/libev/ev_epoll.c +234 -0
  38. data/ext/libev/ev_kqueue.c +198 -0
  39. data/ext/libev/ev_poll.c +148 -0
  40. data/ext/libev/ev_port.c +164 -0
  41. data/ext/libev/ev_select.c +307 -0
  42. data/ext/libev/ev_vars.h +197 -0
  43. data/ext/libev/ev_win32.c +153 -0
  44. data/ext/libev/ev_wrap.h +186 -0
  45. data/ext/libev/test_libev_win32.c +123 -0
  46. data/ext/libev/update_ev_wrap +19 -0
  47. data/lib/.gitignore +2 -0
  48. data/lib/cool.io.rb +30 -0
  49. data/lib/cool.io/async_watcher.rb +43 -0
  50. data/lib/cool.io/dns_resolver.rb +220 -0
  51. data/lib/cool.io/eventmachine.rb +234 -0
  52. data/lib/cool.io/http_client.rb +419 -0
  53. data/lib/cool.io/io.rb +174 -0
  54. data/lib/cool.io/iowatcher.rb +17 -0
  55. data/lib/cool.io/listener.rb +93 -0
  56. data/lib/cool.io/loop.rb +130 -0
  57. data/lib/cool.io/meta.rb +49 -0
  58. data/lib/cool.io/server.rb +74 -0
  59. data/lib/cool.io/socket.rb +224 -0
  60. data/lib/cool.io/timer_watcher.rb +17 -0
  61. data/lib/coolio.rb +2 -0
  62. data/lib/rev.rb +4 -0
  63. data/spec/async_watcher_spec.rb +57 -0
  64. data/spec/possible_tests/schedules_other_threads.rb +48 -0
  65. data/spec/possible_tests/test_on_resolve_failed.rb +9 -0
  66. data/spec/possible_tests/test_resolves.rb +27 -0
  67. data/spec/possible_tests/test_write_during_resolve.rb +27 -0
  68. data/spec/possible_tests/works_straight.rb +71 -0
  69. data/spec/spec_helper.rb +5 -0
  70. data/spec/timer_watcher_spec.rb +55 -0
  71. data/spec/unix_listener_spec.rb +25 -0
  72. data/spec/unix_server_spec.rb +25 -0
  73. metadata +184 -0
@@ -0,0 +1,17 @@
1
+ #--
2
+ # Copyright (C)2007 Tony Arcieri
3
+ # You can redistribute this under the terms of the Ruby license
4
+ # See file LICENSE for details
5
+ #++
6
+
7
+ module Coolio
8
+ class TimerWatcher
9
+ # The actual implementation of this class resides in the C extension
10
+ # Here we metaprogram proper event_callbacks for the callback methods
11
+ # These can take a block and store it to be called when the event
12
+ # is actually fired.
13
+
14
+ extend Meta
15
+ event_callback :on_timer
16
+ end
17
+ end
data/lib/coolio.rb ADDED
@@ -0,0 +1,2 @@
1
+ # For those people who don't like the cool.io styling...
2
+ require 'cool.io'
data/lib/rev.rb ADDED
@@ -0,0 +1,4 @@
1
+ STDERR.puts "*** DEPRECATION WARNING: require 'rev' and the Rev constant are deprecated. Please use require 'cool.io' and the Coolio constant instead"
2
+
3
+ require 'cool.io'
4
+ Rev = Coolio
@@ -0,0 +1,57 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+ require 'fcntl'
4
+
5
+ describe Cool.io::AsyncWatcher do
6
+
7
+ it "does not signal on spurious wakeups" do
8
+ aw = Cool.io::AsyncWatcher.new
9
+ tmp = Tempfile.new('coolio_async_watcher_test')
10
+ nr_fork = 2 # must be at least two for spurious wakeups
11
+
12
+ # We have aetter chance of failing if this overflows the pipe buffer
13
+ # which POSIX requires >= 512 bytes, Linux 2.6 uses 4096 bytes
14
+ nr_signal = 4096 * 4
15
+
16
+ append = File.open(tmp.path, "ab")
17
+ append.sync = true
18
+ rd, wr = ::IO.pipe
19
+
20
+ aw.on_signal { append.syswrite("#$$\n") }
21
+ children = nr_fork.times.map do
22
+ fork do
23
+ trap(:TERM) { exit!(0) }
24
+ rloop = Cool.io::Loop.default
25
+ aw.attach(rloop)
26
+ wr.write '.' # signal to master that we're ready
27
+ rloop.run
28
+ exit!(1) # should not get here
29
+ end
30
+ end
31
+
32
+ # ensure children are ready
33
+ nr_fork.times { rd.sysread(1).should == '.' }
34
+
35
+ # send our signals
36
+ nr_signal.times { aw.signal }
37
+
38
+ # wait for the pipe buffer to be consumed by the children
39
+ sleep 1 while tmp.stat.ctime >= (Time.now - 4)
40
+
41
+ children.each do |pid|
42
+ Process.kill(:TERM, pid)
43
+ _, status = Process.waitpid2(pid)
44
+ status.exitstatus.should == 0
45
+ end
46
+
47
+ # we should've written a line for every signal we sent
48
+ lines = tmp.readlines
49
+ lines.size.should == nr_signal
50
+
51
+ # theoretically a bad kernel scheduler could give us fewer...
52
+ lines.sort.uniq.size.should == nr_fork
53
+
54
+ tmp.close!
55
+ end
56
+
57
+ end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../lib/rev'
2
+ def dbg
3
+ require 'rubygems'
4
+ require 'ruby-debug'
5
+ debugger
6
+ end
7
+ Thread.abort_on_exception=true
8
+
9
+ require 'socket'
10
+
11
+ describe Rev::TCPSocket do
12
+ HOST = '127.0.0.1'
13
+ PORT = 4321
14
+ before :each do
15
+ @server = Rev::TCPServer.new(HOST, PORT) do |c|
16
+ c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
17
+ c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
18
+ #c.on_read { |data| write data }
19
+ end
20
+
21
+ end
22
+
23
+ after :each do
24
+ @server.close
25
+ end
26
+
27
+ def sleep_until(seconds = 1, interval = 0.1)
28
+ raise unless block_given?
29
+ start_time=Time.now
30
+ sleep interval until ((Time.now - start_time) > seconds) or yield
31
+ end
32
+
33
+ it "should stop" do
34
+ loop = Rev::Loop.default
35
+ stopped = false;
36
+ @server.attach(loop)
37
+ Thread.new {
38
+ loop.run
39
+ stopped = true
40
+ }
41
+ sleep 0
42
+ stopped.should == false
43
+ loop.stop
44
+ sleep_until(3) { stopped == true }
45
+ stopped.should == true
46
+ end
47
+ end
48
+
@@ -0,0 +1,9 @@
1
+ require '../rev'
2
+ class Tester < Rev::TCPSocket
3
+ def on_resolve_failed
4
+ print "resolved failed! that's good!"
5
+ end
6
+ end
7
+ a = Tester.connect('asdfgoogle.com', 80)
8
+ a.attach Rev::Loop.default
9
+ Rev::Loop.default.run
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../rev'
2
+
3
+ ADDR = 'wilkboardonline.com'
4
+ PORT = 80
5
+
6
+ class ClientConnection < Rev::TCPSocket
7
+ def on_connect
8
+ puts "#{remote_addr}:#{remote_port} connected"
9
+ write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
10
+ end
11
+
12
+ def on_close
13
+ puts "#{remote_addr}:#{remote_port} disconnected"
14
+ end
15
+
16
+ def on_read(data)
17
+ print "got #{data}"
18
+ close
19
+ end
20
+
21
+ end
22
+
23
+ event_loop = Rev::Loop.default
24
+ client = ClientConnection.connect(ADDR, PORT)
25
+ client.attach(event_loop)
26
+ puts "Echo client started to #{ADDR}:#{PORT}"
27
+ event_loop.run
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../rev'
2
+
3
+ ADDR = 'wilkboardonline.com'
4
+ PORT = 80
5
+
6
+ class ClientConnection < Rev::TCPSocket
7
+ def on_connect
8
+ puts "#{remote_addr}:#{remote_port} connected"
9
+ end
10
+
11
+ def on_close
12
+ puts "#{remote_addr}:#{remote_port} disconnected"
13
+ end
14
+
15
+ def on_read(data)
16
+ print "got #{data}"
17
+ close
18
+ end
19
+
20
+ end
21
+
22
+ event_loop = Rev::Loop.default
23
+ client = ClientConnection.connect(ADDR, PORT)
24
+ client.write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
25
+ client.attach(event_loop)
26
+ puts "Echo client started to #{ADDR}:#{PORT}"
27
+ event_loop.run
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../lib/rev'
2
+ def dbg
3
+ require 'rubygems'
4
+ require 'ruby-debug'
5
+ debugger
6
+ end
7
+ Thread.abort_on_exception=true
8
+
9
+ require 'socket'
10
+
11
+ describe Rev::TCPSocket do
12
+ HOST = '127.0.0.1'
13
+ PORT = 4321
14
+ before :each do
15
+ @server = Rev::TCPServer.new(HOST, PORT) do |c|
16
+ c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
17
+ c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
18
+ #c.on_read { |data| write data }
19
+ end
20
+
21
+ end
22
+
23
+ after :each do
24
+ @server.close
25
+ end
26
+
27
+ def sleep_until(seconds = 1, interval = 0.1)
28
+ raise unless block_given?
29
+ start_time=Time.now
30
+ sleep interval until ((Time.now - start_time) > seconds) or yield
31
+ end
32
+
33
+ it "should stop" do
34
+ loop = Rev::Loop.default
35
+ stopped = false;
36
+ @server.attach(loop)
37
+ Thread.new {
38
+ loop.run_nonblock_over_and_over_again
39
+ stopped = true
40
+ }
41
+ sleep 0
42
+ stopped.should == false
43
+ loop.stop
44
+
45
+ sleep_until { stopped == true }
46
+ stopped.should == true
47
+ end
48
+
49
+ it "should auto bind on 1.8.6" do
50
+ @server.close
51
+ loop = Rev::Loop.default
52
+ server = Rev::TCPServer.new(HOST, PORT) do |c|
53
+ #c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
54
+ #c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
55
+ print "CREATING\n"
56
+ c.on_read { |conn, data| print "WITHIN MYINE"; conn.write data; conn.close; loop.stop }
57
+ end
58
+
59
+ server.attach(loop)
60
+
61
+ Thread.new { loop.run_nonblock_over_and_over_again }
62
+ puts "Echo server listening on #{HOST}:#{PORT}"
63
+ # now connect and write -- it should close
64
+ connector = TCPSocket.new HOST, PORT
65
+ connector.write "yup"
66
+ connector.read.should == 'yup'
67
+ sleep 0
68
+ loop.running?.should != true
69
+ connector.closed?.should == true # it should close me, too
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'rspec'
5
+ require 'cool.io'
@@ -0,0 +1,55 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Cool.io::TimerWatcher do
4
+
5
+ interval = 0.010
6
+
7
+ it "can have the on_timer callback defined after creation" do
8
+ @watcher = Cool.io::TimerWatcher.new(interval, true)
9
+ nr = '0'
10
+ @watcher.on_timer { nr.succ! }.should == nil
11
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
12
+ nr.should == '0'
13
+ sleep interval
14
+ Cool.io::Loop.default.run_once
15
+ nr.should == '1'
16
+ end
17
+
18
+ it "can be subclassed" do
19
+ class MyTimerWatcher < Cool.io::TimerWatcher
20
+ TMP = '0'
21
+
22
+ def on_timer
23
+ TMP.succ!
24
+ end
25
+ end
26
+ @watcher = MyTimerWatcher.new(interval, true)
27
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
28
+ MyTimerWatcher::TMP.should == '0'
29
+ sleep interval
30
+ Cool.io::Loop.default.run_once
31
+ MyTimerWatcher::TMP.should == '1'
32
+ end
33
+
34
+ it "can have the on_timer callback redefined between runs" do
35
+ @watcher = Cool.io::TimerWatcher.new(interval, true)
36
+ nr = '0'
37
+ @watcher.on_timer { nr.succ! }.should == nil
38
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
39
+ nr.should == '0'
40
+ sleep interval
41
+ Cool.io::Loop.default.run_once
42
+ nr.should == '1'
43
+ @watcher.detach
44
+ @watcher.on_timer { nr = :foo }.should == nil
45
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
46
+ nr.should == '1'
47
+ sleep interval
48
+ Cool.io::Loop.default.run_once
49
+ nr.should == :foo
50
+ end
51
+
52
+ after :each do
53
+ @watcher.detach if defined?(@watcher)
54
+ end
55
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+
4
+ describe Cool.io::UNIXListener do
5
+
6
+ before :each do
7
+ @tmp = Tempfile.new('coolio_unix_listener_spec')
8
+ File.unlink(@tmp.path).should == 1
9
+ File.exist?(@tmp.path).should == false
10
+ end
11
+
12
+ it "creates a new UNIXListener" do
13
+ listener = Cool.io::UNIXListener.new(@tmp.path)
14
+ File.socket?(@tmp.path).should == true
15
+ end
16
+
17
+ it "builds off an existing UNIXServer" do
18
+ unix_server = UNIXServer.new(@tmp.path)
19
+ File.socket?(@tmp.path).should == true
20
+ listener = Cool.io::UNIXListener.new(unix_server)
21
+ File.socket?(@tmp.path).should == true
22
+ listener.fileno.should == unix_server.fileno
23
+ end
24
+
25
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+
4
+ describe Cool.io::UNIXServer do
5
+
6
+ before :each do
7
+ @tmp = Tempfile.new('coolio_unix_server_spec')
8
+ File.unlink(@tmp.path).should == 1
9
+ File.exist?(@tmp.path).should == false
10
+ end
11
+
12
+ it "creates a new Cool.io::UNIXServer" do
13
+ listener = Cool.io::UNIXListener.new(@tmp.path)
14
+ File.socket?(@tmp.path).should == true
15
+ end
16
+
17
+ it "builds off an existing ::UNIXServer" do
18
+ unix_server = ::UNIXServer.new(@tmp.path)
19
+ File.socket?(@tmp.path).should == true
20
+ listener = Cool.io::UNIXServer.new(unix_server)
21
+ File.socket?(@tmp.path).should == true
22
+ listener.fileno.should == unix_server.fileno
23
+ end
24
+
25
+ end
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cool.io
3
+ version: !ruby/object:Gem::Version
4
+ hash: 59
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
11
+ platform: ruby
12
+ authors:
13
+ - Tony Arcieri
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-06 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: iobuffer
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 29
30
+ segments:
31
+ - 0
32
+ - 1
33
+ - 3
34
+ version: 0.1.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 15
46
+ segments:
47
+ - 2
48
+ - 0
49
+ - 0
50
+ version: 2.0.0
51
+ type: :development
52
+ version_requirements: *id002
53
+ description: A Ruby wrapper around the libev high performance event library
54
+ email: tony@medioh.com
55
+ executables: []
56
+
57
+ extensions:
58
+ - ext/cool.io/extconf.rb
59
+ - ext/http11_client/extconf.rb
60
+ extra_rdoc_files:
61
+ - LICENSE
62
+ - README.markdown
63
+ files:
64
+ - .gitignore
65
+ - CHANGES
66
+ - LICENSE
67
+ - README.markdown
68
+ - Rakefile
69
+ - VERSION
70
+ - examples/echo_client.rb
71
+ - examples/echo_server.rb
72
+ - examples/google.rb
73
+ - examples/httpclient.rb
74
+ - ext/cool.io/.gitignore
75
+ - ext/cool.io/cool.io.h
76
+ - ext/cool.io/cool.io_ext.c
77
+ - ext/cool.io/ev_wrap.h
78
+ - ext/cool.io/extconf.rb
79
+ - ext/cool.io/iowatcher.c
80
+ - ext/cool.io/libev.c
81
+ - ext/cool.io/loop.c
82
+ - ext/cool.io/stat_watcher.c
83
+ - ext/cool.io/timer_watcher.c
84
+ - ext/cool.io/utils.c
85
+ - ext/cool.io/watcher.c
86
+ - ext/cool.io/watcher.h
87
+ - ext/http11_client/.gitignore
88
+ - ext/http11_client/ext_help.h
89
+ - ext/http11_client/extconf.rb
90
+ - ext/http11_client/http11_client.c
91
+ - ext/http11_client/http11_parser.c
92
+ - ext/http11_client/http11_parser.h
93
+ - ext/http11_client/http11_parser.rl
94
+ - ext/libev/Changes
95
+ - ext/libev/LICENSE
96
+ - ext/libev/README
97
+ - ext/libev/README.embed
98
+ - ext/libev/ev.c
99
+ - ext/libev/ev.h
100
+ - ext/libev/ev_epoll.c
101
+ - ext/libev/ev_kqueue.c
102
+ - ext/libev/ev_poll.c
103
+ - ext/libev/ev_port.c
104
+ - ext/libev/ev_select.c
105
+ - ext/libev/ev_vars.h
106
+ - ext/libev/ev_win32.c
107
+ - ext/libev/ev_wrap.h
108
+ - ext/libev/test_libev_win32.c
109
+ - ext/libev/update_ev_wrap
110
+ - lib/.gitignore
111
+ - lib/cool.io.rb
112
+ - lib/cool.io/async_watcher.rb
113
+ - lib/cool.io/dns_resolver.rb
114
+ - lib/cool.io/eventmachine.rb
115
+ - lib/cool.io/http_client.rb
116
+ - lib/cool.io/io.rb
117
+ - lib/cool.io/iowatcher.rb
118
+ - lib/cool.io/listener.rb
119
+ - lib/cool.io/loop.rb
120
+ - lib/cool.io/meta.rb
121
+ - lib/cool.io/server.rb
122
+ - lib/cool.io/socket.rb
123
+ - lib/cool.io/timer_watcher.rb
124
+ - lib/coolio.rb
125
+ - lib/rev.rb
126
+ - spec/async_watcher_spec.rb
127
+ - spec/possible_tests/schedules_other_threads.rb
128
+ - spec/possible_tests/test_on_resolve_failed.rb
129
+ - spec/possible_tests/test_resolves.rb
130
+ - spec/possible_tests/test_write_during_resolve.rb
131
+ - spec/possible_tests/works_straight.rb
132
+ - spec/spec_helper.rb
133
+ - spec/timer_watcher_spec.rb
134
+ - spec/unix_listener_spec.rb
135
+ - spec/unix_server_spec.rb
136
+ has_rdoc: true
137
+ homepage: http://github.com/tarcieri/cool.io
138
+ licenses: []
139
+
140
+ post_install_message:
141
+ rdoc_options:
142
+ - --charset=UTF-8
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ hash: 3
151
+ segments:
152
+ - 0
153
+ version: "0"
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ hash: 3
160
+ segments:
161
+ - 0
162
+ version: "0"
163
+ requirements: []
164
+
165
+ rubyforge_project:
166
+ rubygems_version: 1.3.7
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: The cool event framework for Ruby
170
+ test_files:
171
+ - spec/async_watcher_spec.rb
172
+ - spec/spec_helper.rb
173
+ - spec/timer_watcher_spec.rb
174
+ - spec/unix_listener_spec.rb
175
+ - spec/unix_server_spec.rb
176
+ - spec/possible_tests/schedules_other_threads.rb
177
+ - spec/possible_tests/test_on_resolve_failed.rb
178
+ - spec/possible_tests/test_resolves.rb
179
+ - spec/possible_tests/test_write_during_resolve.rb
180
+ - spec/possible_tests/works_straight.rb
181
+ - examples/echo_client.rb
182
+ - examples/echo_server.rb
183
+ - examples/google.rb
184
+ - examples/httpclient.rb