libuv 0.11.22 → 0.12.0

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +19 -17
  3. data/.gitmodules +3 -3
  4. data/.rspec +1 -1
  5. data/.travis.yml +16 -16
  6. data/Gemfile +4 -4
  7. data/LICENSE +23 -23
  8. data/README.md +89 -89
  9. data/Rakefile +31 -31
  10. data/lib/libuv.rb +54 -54
  11. data/lib/libuv/async.rb +47 -47
  12. data/lib/libuv/check.rb +55 -55
  13. data/lib/libuv/dns.rb +85 -85
  14. data/lib/libuv/error.rb +78 -74
  15. data/lib/libuv/ext/ext.rb +260 -258
  16. data/lib/libuv/ext/platform/darwin_x64.rb +23 -23
  17. data/lib/libuv/ext/platform/linux.rb +7 -7
  18. data/lib/libuv/ext/platform/unix.rb +29 -29
  19. data/lib/libuv/ext/platform/windows.rb +40 -40
  20. data/lib/libuv/ext/tasks.rb +31 -31
  21. data/lib/libuv/ext/tasks/mac.rb +23 -23
  22. data/lib/libuv/ext/tasks/unix.rb +23 -23
  23. data/lib/libuv/ext/tasks/win.rb +14 -14
  24. data/lib/libuv/ext/types.rb +238 -238
  25. data/lib/libuv/file.rb +281 -269
  26. data/lib/libuv/filesystem.rb +232 -232
  27. data/lib/libuv/fs_event.rb +31 -31
  28. data/lib/libuv/handle.rb +85 -85
  29. data/lib/libuv/idle.rb +56 -56
  30. data/lib/libuv/loop.rb +412 -412
  31. data/lib/libuv/mixins/assertions.rb +23 -23
  32. data/lib/libuv/mixins/fs_checks.rb +60 -58
  33. data/lib/libuv/mixins/listener.rb +34 -34
  34. data/lib/libuv/mixins/net.rb +40 -40
  35. data/lib/libuv/mixins/resource.rb +27 -27
  36. data/lib/libuv/mixins/stream.rb +153 -154
  37. data/lib/libuv/pipe.rb +184 -203
  38. data/lib/libuv/prepare.rb +56 -56
  39. data/lib/libuv/signal.rb +51 -51
  40. data/lib/libuv/tcp.rb +334 -334
  41. data/lib/libuv/timer.rb +85 -85
  42. data/lib/libuv/tty.rb +37 -37
  43. data/lib/libuv/udp.rb +240 -240
  44. data/lib/libuv/version.rb +3 -3
  45. data/lib/libuv/work.rb +75 -75
  46. data/libuv.gemspec +56 -56
  47. data/spec/async_spec.rb +61 -60
  48. data/spec/cpu_spec.rb +10 -10
  49. data/spec/defer_spec.rb +980 -980
  50. data/spec/dns_spec.rb +96 -90
  51. data/spec/filesystem_spec.rb +270 -261
  52. data/spec/idle_spec.rb +56 -56
  53. data/spec/pipe_spec.rb +160 -160
  54. data/spec/tcp_spec.rb +271 -267
  55. metadata +64 -51
data/spec/idle_spec.rb CHANGED
@@ -1,56 +1,56 @@
1
- require 'libuv'
2
-
3
-
4
- describe Libuv::Idle do
5
- before :each do
6
- @log = []
7
- @general_failure = []
8
-
9
- @loop = Libuv::Loop.default
10
- @server = @loop.pipe
11
- @client = @loop.pipe
12
- @timeout = @loop.timer do
13
- @loop.stop
14
- @general_failure << "test timed out"
15
- end
16
- @timeout.start(5000)
17
-
18
- @loop.all(@server, @client, @timeout).catch do |reason|
19
- @general_failure << reason.inspect
20
- p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\n"
21
- end
22
- end
23
-
24
- it "should increase the idle count when there is nothing to process" do
25
- @loop.run { |logger|
26
- logger.progress do |level, errorid, error|
27
- begin
28
- p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
29
- rescue Exception
30
- p 'error in logger'
31
- end
32
- end
33
-
34
- @idle_calls = 0
35
-
36
- idle = @loop.idle do |e|
37
- @idle_calls += 1
38
- end
39
- idle.start
40
-
41
- timer = @loop.timer proc {}
42
- timer.start(1, 0)
43
-
44
- stopper = @loop.timer do
45
- idle.close
46
- timer.close
47
- stopper.close
48
- @loop.stop
49
- end
50
- stopper.start(1000, 0)
51
- }
52
-
53
- expect(@general_failure).to eq([])
54
- expect((@idle_calls > 0)).to eq(true)
55
- end
56
- end
1
+ require 'libuv'
2
+
3
+
4
+ describe Libuv::Idle do
5
+ before :each do
6
+ @log = []
7
+ @general_failure = []
8
+
9
+ @loop = Libuv::Loop.default
10
+ @server = @loop.pipe
11
+ @client = @loop.pipe
12
+ @timeout = @loop.timer do
13
+ @loop.stop
14
+ @general_failure << "test timed out"
15
+ end
16
+ @timeout.start(5000)
17
+
18
+ @loop.all(@server, @client, @timeout).catch do |reason|
19
+ @general_failure << reason.inspect
20
+ p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\n"
21
+ end
22
+ end
23
+
24
+ it "should increase the idle count when there is nothing to process" do
25
+ @loop.run { |logger|
26
+ logger.progress do |level, errorid, error|
27
+ begin
28
+ p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
29
+ rescue Exception
30
+ p 'error in logger'
31
+ end
32
+ end
33
+
34
+ @idle_calls = 0
35
+
36
+ idle = @loop.idle do |e|
37
+ @idle_calls += 1
38
+ end
39
+ idle.start
40
+
41
+ timer = @loop.timer proc {}
42
+ timer.start(1, 0)
43
+
44
+ stopper = @loop.timer do
45
+ idle.close
46
+ timer.close
47
+ stopper.close
48
+ @loop.stop
49
+ end
50
+ stopper.start(1000, 0)
51
+ }
52
+
53
+ expect(@general_failure).to eq([])
54
+ expect((@idle_calls > 0)).to eq(true)
55
+ end
56
+ end
data/spec/pipe_spec.rb CHANGED
@@ -1,160 +1,160 @@
1
- require 'libuv'
2
-
3
-
4
- describe Libuv::Pipe do
5
- before :each do
6
- @log = []
7
- @general_failure = []
8
-
9
- @loop = Libuv::Loop.new
10
- @server = @loop.pipe
11
- @client = @loop.pipe
12
- @timeout = @loop.timer do
13
- @loop.stop
14
- @general_failure << "test timed out"
15
- end
16
- @timeout.start(5000)
17
-
18
- @pipefile = "/tmp/test-pipes.pipe"
19
-
20
- @loop.all(@server, @client, @timeout).catch do |reason|
21
- @general_failure << reason.inspect
22
- @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
23
- end
24
-
25
- begin
26
- File.unlink(@pipefile)
27
- rescue
28
- end
29
- end
30
-
31
- after :each do
32
- begin
33
- File.unlink(@pipefile)
34
- rescue
35
- end
36
- end
37
-
38
- describe 'bidirectional inter process communication' do
39
-
40
- it "should send a ping and return a pong" do
41
- @loop.run { |logger|
42
- logger.progress do |level, errorid, error|
43
- begin
44
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace}\n"
45
- rescue Exception
46
- @general_failure << 'error in logger'
47
- end
48
- end
49
-
50
- @server.bind(@pipefile) do |connection|
51
- connection.accept do |client|
52
- client.progress do |data|
53
- @log << data
54
- client.write('pong')
55
- end
56
- client.start_read
57
- end
58
- end
59
-
60
- # catch server errors
61
- @server.catch do |reason|
62
- @general_failure << reason.inspect
63
- @loop.stop
64
-
65
- @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
66
- end
67
-
68
- # start listening
69
- @server.listen(1024)
70
-
71
-
72
-
73
- # connect client to server
74
- @client.connect(@pipefile) do |client|
75
- @client.progress do |data|
76
- @log << data
77
-
78
- @client.close
79
- end
80
-
81
- @client.start_read
82
- @client.write('ping')
83
- end
84
-
85
- @client.catch do |reason|
86
- @general_failure << reason.inspect
87
- @loop.stop
88
-
89
- @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
90
- end
91
-
92
- # Stop the loop once the client handle is closed
93
- @client.finally do
94
- @server.close
95
- @loop.stop
96
- end
97
- }
98
-
99
- expect(@general_failure).to eq([])
100
- expect(@log).to eq(['ping', 'pong'])
101
- end
102
- end
103
-
104
- # This test won't pass on windows as pipes don't work like this on windows
105
- describe 'unidirectional pipeline', :unix_only => true do
106
- before :each do
107
- system "/usr/bin/mkfifo", @pipefile
108
- end
109
-
110
- it "should send work to a consumer" do
111
- @loop.run { |logger|
112
- logger.progress do |level, errorid, error|
113
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
114
- end
115
-
116
-
117
- heartbeat = @loop.timer
118
- @file1 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
119
- @file1.progress do
120
- @server.open(@file1.fileno) do |server|
121
- heartbeat.progress do
122
- @server.write('workload').catch do |err|
123
- @general_failure << err
124
- end
125
- end
126
- heartbeat.start(0, 200)
127
- end
128
- end
129
- @file1.catch do |e|
130
- @general_failure << "Log called: #{e.inspect} - #{e.message}\n"
131
- end
132
-
133
- @file2 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
134
- @file2.progress do
135
- # connect client to server
136
- @client.open(@file2.fileno) do |consumer|
137
- consumer.progress do |data|
138
- @log = data
139
- end
140
-
141
- consumer.start_read
142
- end
143
- end
144
-
145
-
146
- timeout = @loop.timer do
147
- @server.close
148
- @client.close
149
- timeout.close
150
- heartbeat.close
151
- @loop.stop
152
- end
153
- timeout.start(1000)
154
- }
155
-
156
- expect(@general_failure).to eq([])
157
- expect(@log).to eq('workload')
158
- end
159
- end
160
- end
1
+ require 'libuv'
2
+
3
+
4
+ describe Libuv::Pipe do
5
+ before :each do
6
+ @log = []
7
+ @general_failure = []
8
+
9
+ @loop = Libuv::Loop.new
10
+ @server = @loop.pipe
11
+ @client = @loop.pipe
12
+ @timeout = @loop.timer do
13
+ @loop.stop
14
+ @general_failure << "test timed out"
15
+ end
16
+ @timeout.start(5000)
17
+
18
+ @pipefile = "/tmp/test-pipes.pipe"
19
+
20
+ @loop.all(@server, @client, @timeout).catch do |reason|
21
+ @general_failure << reason.inspect
22
+ @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
23
+ end
24
+
25
+ begin
26
+ File.unlink(@pipefile)
27
+ rescue
28
+ end
29
+ end
30
+
31
+ after :each do
32
+ begin
33
+ File.unlink(@pipefile)
34
+ rescue
35
+ end
36
+ end
37
+
38
+ describe 'bidirectional inter process communication' do
39
+
40
+ it "should send a ping and return a pong" do
41
+ @loop.run { |logger|
42
+ logger.progress do |level, errorid, error|
43
+ begin
44
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace}\n"
45
+ rescue Exception
46
+ @general_failure << 'error in logger'
47
+ end
48
+ end
49
+
50
+ @server.bind(@pipefile) do |connection|
51
+ connection.accept do |client|
52
+ client.progress do |data|
53
+ @log << data
54
+ client.write('pong')
55
+ end
56
+ client.start_read
57
+ end
58
+ end
59
+
60
+ # catch server errors
61
+ @server.catch do |reason|
62
+ @general_failure << reason.inspect
63
+ @loop.stop
64
+
65
+ @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
66
+ end
67
+
68
+ # start listening
69
+ @server.listen(1024)
70
+
71
+
72
+
73
+ # connect client to server
74
+ @client.connect(@pipefile) do |client|
75
+ @client.progress do |data|
76
+ @log << data
77
+
78
+ @client.close
79
+ end
80
+
81
+ @client.start_read
82
+ @client.write('ping')
83
+ end
84
+
85
+ @client.catch do |reason|
86
+ @general_failure << reason.inspect
87
+ @loop.stop
88
+
89
+ @general_failure << "Failed with: #{reason.message}\n#{reason.backtrace}\n"
90
+ end
91
+
92
+ # Stop the loop once the client handle is closed
93
+ @client.finally do
94
+ @server.close
95
+ @loop.stop
96
+ end
97
+ }
98
+
99
+ expect(@general_failure).to eq([])
100
+ expect(@log).to eq(['ping', 'pong'])
101
+ end
102
+ end
103
+
104
+ # This test won't pass on windows as pipes don't work like this on windows
105
+ describe 'unidirectional pipeline', :unix_only => true do
106
+ before :each do
107
+ system "/usr/bin/mkfifo", @pipefile
108
+ end
109
+
110
+ it "should send work to a consumer" do
111
+ @loop.run { |logger|
112
+ logger.progress do |level, errorid, error|
113
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
114
+ end
115
+
116
+
117
+ heartbeat = @loop.timer
118
+ @file1 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
119
+ @file1.progress do
120
+ @server.open(@file1.fileno) do |server|
121
+ heartbeat.progress do
122
+ @server.write('workload').catch do |err|
123
+ @general_failure << err
124
+ end
125
+ end
126
+ heartbeat.start(0, 200)
127
+ end
128
+ end
129
+ @file1.catch do |e|
130
+ @general_failure << "Log called: #{e.inspect} - #{e.message}\n"
131
+ end
132
+
133
+ @file2 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
134
+ @file2.progress do
135
+ # connect client to server
136
+ @client.open(@file2.fileno) do |consumer|
137
+ consumer.progress do |data|
138
+ @log = data
139
+ end
140
+
141
+ consumer.start_read
142
+ end
143
+ end
144
+
145
+
146
+ timeout = @loop.timer do
147
+ @server.close
148
+ @client.close
149
+ timeout.close
150
+ heartbeat.close
151
+ @loop.stop
152
+ end
153
+ timeout.start(1000)
154
+ }
155
+
156
+ expect(@general_failure).to eq([])
157
+ expect(@log).to eq('workload')
158
+ end
159
+ end
160
+ end
data/spec/tcp_spec.rb CHANGED
@@ -1,267 +1,271 @@
1
- require 'libuv'
2
- require 'thread'
3
-
4
-
5
- describe Libuv::TCP do
6
- before :each do
7
- @log = []
8
- @general_failure = []
9
-
10
- @loop = Libuv::Loop.new
11
- @server = @loop.tcp
12
- @client = @loop.tcp
13
- @timeout = @loop.timer do
14
- @loop.stop
15
- @loop2.stop if @loop2
16
- @general_failure << "test timed out"
17
- end
18
- @timeout.start(5000)
19
-
20
- @loop.all(@server, @client, @timeout).catch do |reason|
21
- @general_failure << reason.inspect
22
- end
23
-
24
-
25
- @pipefile = "/tmp/test-pipe.pipe"
26
-
27
- begin
28
- File.unlink(@pipefile)
29
- rescue
30
- end
31
- end
32
-
33
- describe 'basic client server' do
34
- it "should send a ping and return a pong", :network => true do
35
- @loop.run { |logger|
36
- logger.progress do |level, errorid, error|
37
- begin
38
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
39
- rescue Exception
40
- @general_failure << 'error in logger'
41
- end
42
- end
43
-
44
-
45
- @server.bind('127.0.0.1', 34567) do |server|
46
- server.accept do |client|
47
- client.progress do |data|
48
- @log << data
49
-
50
- client.write('pong')
51
- end
52
- client.start_read
53
- end
54
- end
55
-
56
- # catch errors
57
- @server.catch do |reason|
58
- @general_failure << reason.inspect
59
- end
60
-
61
- # start listening
62
- @server.listen(1024)
63
-
64
-
65
-
66
- # connect client to server
67
- @client.connect('127.0.0.1', 34567) do |client|
68
- client.progress do |data|
69
- @log << data
70
-
71
- @client.shutdown
72
- end
73
-
74
- @client.start_read
75
- @client.write('ping')
76
- end
77
-
78
- # catch errors
79
- @client.catch do |reason|
80
- @general_failure << reason.inspect
81
- end
82
-
83
- # close the handle
84
- @client.finally do
85
- @server.close
86
- @loop.stop
87
- end
88
- }
89
-
90
- expect(@general_failure).to eq([])
91
- expect(@log).to eq(['ping', 'pong'])
92
- end
93
- end
94
-
95
- it "should handle requests on different threads", :network => true do
96
- @sync = Mutex.new
97
-
98
- @loop.run { |logger|
99
- logger.progress do |level, errorid, error|
100
- begin
101
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
102
- rescue Exception
103
- @general_failure << 'error in logger'
104
- end
105
- end
106
-
107
-
108
- @remote = nil
109
- @server.bind('127.0.0.1', 45678) do |server|
110
- server.accept do |client|
111
- @remote.write2(client)
112
- end
113
- end
114
-
115
- # catch errors
116
- @server.catch do |reason|
117
- @general_failure << reason.inspect
118
- end
119
-
120
-
121
- @pipeserve = @loop.pipe(true)
122
- @pipeserve.bind(@pipefile) do |connection|
123
- connection.accept do |client|
124
- @remote = client
125
-
126
- # start listening on TCP server
127
- @server.listen(1024)
128
-
129
- # connect client to server
130
- @client.connect('127.0.0.1', 45678) do |client|
131
- client.progress do |data|
132
- @sync.synchronize {
133
- @log << data
134
- }
135
- @client.shutdown
136
- end
137
-
138
- @client.start_read
139
- @client.write('ping')
140
- end
141
- end
142
- end
143
-
144
- # start listening
145
- @pipeserve.listen(1024)
146
-
147
-
148
-
149
- # catch errors
150
- @client.catch do |reason|
151
- @general_failure << reason.inspect
152
- end
153
-
154
- # close the handle
155
- @client.finally do
156
- @server.close
157
- @pipeserve.close
158
- end
159
-
160
-
161
-
162
- Thread.new do
163
- @loop2 = Libuv::Loop.new
164
- @pipeclient = @loop2.pipe(true)
165
-
166
-
167
- @loop2.run do |logger|
168
- logger.progress do |level, errorid, error|
169
- begin
170
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
171
- rescue Exception
172
- @general_failure << 'error in logger'
173
- end
174
- end
175
-
176
- # connect client to server
177
- @pipeclient.connect(@pipefile) do |client|
178
- @pipeclient.progress do |data, connection|
179
- connection.progress do |data|
180
- @sync.synchronize {
181
- @log << data
182
- }
183
- connection.write('pong')
184
- end
185
- connection.start_read
186
- connection.finally do
187
- @pipeclient.close
188
- @loop2.stop
189
- @loop.stop
190
- end
191
- end
192
-
193
- @pipeclient.start_read2
194
- end
195
- end
196
- end
197
- }
198
-
199
- expect(@general_failure).to eq([])
200
- expect(@log).to eq(['ping', 'pong'])
201
- end
202
-
203
- describe 'basic TLS client and server' do
204
- it "should send a ping and return a pong", :network => true do
205
- @loop.run { |logger|
206
- logger.progress do |level, errorid, error|
207
- begin
208
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
209
- rescue Exception
210
- @general_failure << 'error in logger'
211
- end
212
- end
213
-
214
-
215
- @server.bind('127.0.0.1', 34567) do |server|
216
- server.accept do |client|
217
- client.start_tls(server: true)
218
- client.progress do |data|
219
- @log << data
220
-
221
- client.write('pong')
222
- end
223
- client.start_read
224
- end
225
- end
226
-
227
- # catch errors
228
- @server.catch do |reason|
229
- @general_failure << reason.inspect
230
- end
231
-
232
- # start listening
233
- @server.listen(1024)
234
-
235
-
236
-
237
- # connect client to server
238
- @client.connect('127.0.0.1', 34567) do |client|
239
- client.start_tls
240
- client.progress do |data|
241
- @log << data
242
-
243
- @client.shutdown
244
- end
245
-
246
- @client.start_read
247
- @client.write('ping')
248
- end
249
-
250
- # catch errors
251
- @client.catch do |reason|
252
- @general_failure << reason.inspect
253
- end
254
-
255
- # close the handle
256
- @client.finally do
257
- @server.close
258
- @loop.stop
259
- end
260
- }
261
-
262
- expect(@general_failure).to eq([])
263
- expect(@log).to eq(['ping', 'pong'])
264
- end
265
- end
266
-
267
- end
1
+ require 'libuv'
2
+ require 'thread'
3
+
4
+
5
+ describe Libuv::TCP do
6
+ before :each do
7
+ @log = []
8
+ @general_failure = []
9
+
10
+ @loop = Libuv::Loop.new
11
+ @server = @loop.tcp
12
+ @client = @loop.tcp
13
+ @timeout = @loop.timer do
14
+ @loop.stop
15
+ @loop2.stop if @loop2
16
+ @general_failure << "test timed out"
17
+ end
18
+ @timeout.start(5000)
19
+
20
+ @loop.all(@server, @client, @timeout).catch do |reason|
21
+ @general_failure << reason.inspect
22
+ end
23
+
24
+
25
+ @pipefile = "/tmp/test-pipe.pipe"
26
+
27
+ begin
28
+ File.unlink(@pipefile)
29
+ rescue
30
+ end
31
+ end
32
+
33
+ describe 'basic client server' do
34
+ it "should send a ping and return a pong", :network => true do
35
+ @loop.run { |logger|
36
+ logger.progress do |level, errorid, error|
37
+ begin
38
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
39
+ rescue Exception
40
+ @general_failure << 'error in logger'
41
+ end
42
+ end
43
+
44
+
45
+ @server.bind('127.0.0.1', 34567) do |server|
46
+ server.accept do |client|
47
+ client.progress do |data|
48
+ @log << data
49
+
50
+ client.write('pong')
51
+ end
52
+ client.start_read
53
+ end
54
+ end
55
+
56
+ # catch errors
57
+ @server.catch do |reason|
58
+ @general_failure << reason.inspect
59
+ end
60
+
61
+ # start listening
62
+ @server.listen(1024)
63
+
64
+
65
+
66
+ # connect client to server
67
+ @client.connect('127.0.0.1', 34567) do |client|
68
+ client.progress do |data|
69
+ @log << data
70
+
71
+ @client.shutdown
72
+ end
73
+
74
+ @client.start_read
75
+ @client.write('ping')
76
+ end
77
+
78
+ # catch errors
79
+ @client.catch do |reason|
80
+ @general_failure << reason.inspect
81
+ end
82
+
83
+ # close the handle
84
+ @client.finally do
85
+ @server.close
86
+ @loop.stop
87
+ end
88
+ }
89
+
90
+ expect(@general_failure).to eq([])
91
+ expect(@log).to eq(['ping', 'pong'])
92
+ end
93
+ end
94
+
95
+ it "should handle requests on different threads", :network => true do
96
+ @sync = Mutex.new
97
+
98
+ @loop.run { |logger|
99
+ logger.progress do |level, errorid, error|
100
+ begin
101
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
102
+ rescue Exception
103
+ @general_failure << 'error in logger'
104
+ end
105
+ end
106
+
107
+
108
+ @remote = nil
109
+ @server.bind('127.0.0.1', 45678) do |server|
110
+ server.accept do |client|
111
+ @remote.write2(client)
112
+ end
113
+ end
114
+
115
+ # catch errors
116
+ @server.catch do |reason|
117
+ @general_failure << reason.inspect
118
+ end
119
+
120
+
121
+ @pipeserve = @loop.pipe(true)
122
+ @pipeserve.bind(@pipefile) do |connection|
123
+ connection.accept do |client|
124
+ @remote = client
125
+
126
+ # start listening on TCP server
127
+ @server.listen(1024)
128
+
129
+ # connect client to server
130
+ @client.connect('127.0.0.1', 45678) do |client|
131
+ client.progress do |data|
132
+ @sync.synchronize {
133
+ @log << data
134
+ }
135
+ @client.shutdown
136
+ end
137
+
138
+ @client.start_read
139
+ @client.write('ping')
140
+ end
141
+ end
142
+
143
+ @pipeserve.getsockname
144
+ end
145
+
146
+ # start listening
147
+ @pipeserve.listen(1024)
148
+
149
+
150
+
151
+ # catch errors
152
+ @client.catch do |reason|
153
+ @general_failure << reason.inspect
154
+ end
155
+
156
+ # close the handle
157
+ @client.finally do
158
+ @server.close
159
+ @pipeserve.close
160
+ end
161
+
162
+
163
+
164
+ Thread.new do
165
+ @loop2 = Libuv::Loop.new
166
+ @pipeclient = @loop2.pipe(true)
167
+
168
+
169
+ @loop2.run do |logger|
170
+ logger.progress do |level, errorid, error|
171
+ begin
172
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
173
+ rescue Exception
174
+ @general_failure << 'error in logger'
175
+ end
176
+ end
177
+
178
+ # connect client to server
179
+ @pipeclient.connect(@pipefile) do |client|
180
+ @pipeclient.progress do |data|
181
+ connection = @pipeclient.check_pending
182
+
183
+ connection.progress do |data|
184
+ @sync.synchronize {
185
+ @log << data
186
+ }
187
+ connection.write('pong')
188
+ end
189
+ connection.start_read
190
+ connection.finally do
191
+ @pipeclient.close
192
+ @loop2.stop
193
+ @loop.stop
194
+ end
195
+ end
196
+
197
+ @pipeclient.start_read
198
+ end
199
+ end
200
+ end
201
+ }
202
+
203
+ expect(@general_failure).to eq([])
204
+ expect(@log).to eq(['ping', 'pong'])
205
+ end
206
+
207
+ describe 'basic TLS client and server' do
208
+ it "should send a ping and return a pong", :network => true do
209
+ @loop.run { |logger|
210
+ logger.progress do |level, errorid, error|
211
+ begin
212
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
213
+ rescue Exception
214
+ @general_failure << 'error in logger'
215
+ end
216
+ end
217
+
218
+
219
+ @server.bind('127.0.0.1', 34567) do |server|
220
+ server.accept do |client|
221
+ client.start_tls(server: true)
222
+ client.progress do |data|
223
+ @log << data
224
+
225
+ client.write('pong')
226
+ end
227
+ client.start_read
228
+ end
229
+ end
230
+
231
+ # catch errors
232
+ @server.catch do |reason|
233
+ @general_failure << reason.inspect
234
+ end
235
+
236
+ # start listening
237
+ @server.listen(1024)
238
+
239
+
240
+
241
+ # connect client to server
242
+ @client.connect('127.0.0.1', 34567) do |client|
243
+ client.start_tls
244
+ client.progress do |data|
245
+ @log << data
246
+
247
+ @client.shutdown
248
+ end
249
+
250
+ @client.start_read
251
+ @client.write('ping')
252
+ end
253
+
254
+ # catch errors
255
+ @client.catch do |reason|
256
+ @general_failure << reason.inspect
257
+ end
258
+
259
+ # close the handle
260
+ @client.finally do
261
+ @server.close
262
+ @loop.stop
263
+ end
264
+ }
265
+
266
+ expect(@general_failure).to eq([])
267
+ expect(@log).to eq(['ping', 'pong'])
268
+ end
269
+ end
270
+
271
+ end