libuv 2.0.12 → 3.0.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 +2 -0
  3. data/README.md +67 -34
  4. data/lib/libuv.rb +30 -5
  5. data/lib/libuv/async.rb +16 -10
  6. data/lib/libuv/check.rb +19 -12
  7. data/lib/libuv/coroutines.rb +39 -12
  8. data/lib/libuv/dns.rb +25 -18
  9. data/lib/libuv/error.rb +2 -0
  10. data/lib/libuv/ext/ext.rb +28 -36
  11. data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
  12. data/lib/libuv/ext/platform/unix.rb +2 -0
  13. data/lib/libuv/ext/platform/windows.rb +2 -0
  14. data/lib/libuv/ext/tasks.rb +2 -0
  15. data/lib/libuv/ext/tasks/mac.rb +2 -0
  16. data/lib/libuv/ext/tasks/unix.rb +2 -0
  17. data/lib/libuv/ext/tasks/win.rb +2 -0
  18. data/lib/libuv/ext/types.rb +2 -1
  19. data/lib/libuv/file.rb +67 -50
  20. data/lib/libuv/filesystem.rb +63 -61
  21. data/lib/libuv/fs_event.rb +7 -4
  22. data/lib/libuv/handle.rb +30 -14
  23. data/lib/libuv/idle.rb +17 -10
  24. data/lib/libuv/mixins/accessors.rb +41 -0
  25. data/lib/libuv/mixins/assertions.rb +3 -1
  26. data/lib/libuv/mixins/fs_checks.rb +29 -6
  27. data/lib/libuv/mixins/listener.rb +4 -2
  28. data/lib/libuv/mixins/net.rb +4 -2
  29. data/lib/libuv/mixins/resource.rb +5 -3
  30. data/lib/libuv/mixins/stream.rb +128 -35
  31. data/lib/libuv/pipe.rb +54 -27
  32. data/lib/libuv/prepare.rb +19 -12
  33. data/lib/libuv/q.rb +109 -101
  34. data/lib/libuv/{loop.rb → reactor.rb} +163 -85
  35. data/lib/libuv/signal.rb +13 -5
  36. data/lib/libuv/tcp.rb +109 -63
  37. data/lib/libuv/timer.rb +44 -24
  38. data/lib/libuv/tty.rb +8 -3
  39. data/lib/libuv/udp.rb +49 -22
  40. data/lib/libuv/version.rb +3 -1
  41. data/lib/libuv/work.rb +14 -10
  42. data/libuv.gemspec +11 -9
  43. data/spec/async_spec.rb +13 -13
  44. data/spec/coroutines_spec.rb +20 -50
  45. data/spec/defer_spec.rb +182 -311
  46. data/spec/dns_spec.rb +51 -41
  47. data/spec/dsl_spec.rb +43 -0
  48. data/spec/filesystem_spec.rb +65 -87
  49. data/spec/idle_spec.rb +19 -33
  50. data/spec/pipe_spec.rb +25 -32
  51. data/spec/tcp_spec.rb +116 -53
  52. data/spec/timer_spec.rb +3 -3
  53. data/spec/udp_spec.rb +16 -17
  54. data/spec/zen_spec.rb +2 -3
  55. metadata +37 -30
data/spec/dns_spec.rb CHANGED
@@ -6,37 +6,36 @@ describe Libuv::Dns do
6
6
  @log = []
7
7
  @general_failure = []
8
8
 
9
- @loop = Libuv::Loop.default
10
- @timeout = @loop.timer do
11
- @loop.stop
9
+ @reactor = Libuv::Reactor.default
10
+ @reactor.notifier do |error, context|
11
+ begin
12
+ p "Log called: #{context}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
13
+ rescue Exception
14
+ p 'error in logger'
15
+ end
16
+ end
17
+ @timeout = @reactor.timer do
18
+ @reactor.stop
12
19
  @general_failure << "test timed out"
13
20
  end
14
21
  @timeout.start(5000)
15
22
 
16
- @loop.all(@server, @client, @timeout).catch do |reason|
23
+ @reactor.all(@server, @client, @timeout).catch do |reason|
17
24
  @general_failure << reason.inspect
18
25
  p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\n"
19
26
  end
20
27
  end
21
28
 
22
29
  it "should resolve localhost using IP4", :network => true do
23
- @loop.run { |logger|
24
- logger.progress do |level, errorid, error|
25
- begin
26
- p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
27
- rescue Exception
28
- p 'error in logger'
29
- end
30
- end
31
-
32
- @loop.lookup('localhost').then proc { |addrinfo|
30
+ @reactor.run { |reactor|
31
+ @reactor.lookup('localhost', wait: false).then proc { |addrinfo|
33
32
  @result = addrinfo[0][0]
34
33
  @timeout.close
35
- @loop.stop
34
+ @reactor.stop
36
35
  }, proc { |err|
37
36
  @general_failure << err
38
37
  @timeout.close
39
- @loop.stop
38
+ @reactor.stop
40
39
  }
41
40
  }
42
41
 
@@ -45,23 +44,15 @@ describe Libuv::Dns do
45
44
  end
46
45
 
47
46
  it "should resolve localhost using IP6", :network => true do
48
- @loop.run { |logger|
49
- logger.progress do |level, errorid, error|
50
- begin
51
- p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
52
- rescue Exception
53
- p 'error in logger'
54
- end
55
- end
56
-
57
- @loop.lookup('localhost', :IPv6).then proc { |addrinfo|
47
+ @reactor.run { |reactor|
48
+ @reactor.lookup('localhost', :IPv6, wait: false).then proc { |addrinfo|
58
49
  @result = addrinfo[0][0]
59
50
  @timeout.close
60
- @loop.stop
51
+ @reactor.stop
61
52
  }, proc { |err|
62
53
  @general_failure << err
63
54
  @timeout.close
64
- @loop.stop
55
+ @reactor.stop
65
56
  }
66
57
  }
67
58
 
@@ -69,28 +60,47 @@ describe Libuv::Dns do
69
60
  expect(@result).to eq('::1')
70
61
  end
71
62
 
72
- it "should resolve loop back" do
73
- @loop.run { |logger|
74
- logger.progress do |level, errorid, error|
75
- begin
76
- p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
77
- rescue Exception
78
- p 'error in logger'
79
- end
80
- end
81
-
82
- @loop.lookup('127.0.0.1').then proc { |addrinfo|
63
+ it "should resolve reactor back" do
64
+ @reactor.run { |reactor|
65
+ @reactor.lookup('127.0.0.1', wait: false).then proc { |addrinfo|
83
66
  @result = addrinfo[0][0]
84
67
  @timeout.close
85
- @loop.stop
68
+ @reactor.stop
86
69
  }, proc { |err|
87
70
  @general_failure << err
88
71
  @timeout.close
89
- @loop.stop
72
+ @reactor.stop
90
73
  }
91
74
  }
92
75
 
93
76
  expect(@general_failure).to eq([])
94
77
  expect(@result).to eq('127.0.0.1')
95
78
  end
79
+
80
+ it "should work with coroutines" do
81
+ @reactor.run { |reactor|
82
+ begin
83
+ addrinfo = @reactor.lookup('127.0.0.1')
84
+ @result = [addrinfo[0][0]]
85
+
86
+ begin
87
+ addrinfo = @reactor.lookup('test.fail.blah').results
88
+ @general_failure << "should have failed"
89
+ @timeout.close
90
+ @reactor.stop
91
+ rescue => err
92
+ @result << err.class
93
+ @timeout.close
94
+ @reactor.stop
95
+ end
96
+ rescue => err
97
+ @general_failure << err
98
+ @timeout.close
99
+ @reactor.stop
100
+ end
101
+ }
102
+
103
+ expect(@general_failure).to eq([])
104
+ expect(@result).to eq(['127.0.0.1', Libuv::Error::EAI_NONAME])
105
+ end
96
106
  end
data/spec/dsl_spec.rb ADDED
@@ -0,0 +1,43 @@
1
+ require 'libuv'
2
+
3
+ describe Libuv::Accessors do
4
+ describe 'basic usage' do
5
+ it 'should work seamlessly with the default thread' do
6
+ count = 0
7
+ reactor do |reactor|
8
+ reactor.timer {
9
+ count += 1
10
+ reactor.stop if count == 3
11
+ }.start(50, 10)
12
+ end
13
+
14
+ expect(count).to eq(3)
15
+ end
16
+
17
+ it 'work simply with new threads' do
18
+ count = 0
19
+ sig = ConditionVariable.new
20
+ mutex = Mutex.new
21
+ mutex.synchronize {
22
+
23
+ # This will run on a new thread
24
+ Libuv::Reactor.new do |reactor|
25
+ reactor.timer {
26
+ count += 1
27
+
28
+ if count == 3
29
+ reactor.stop
30
+ mutex.synchronize {
31
+ sig.signal
32
+ }
33
+ end
34
+ }.start(50, 10)
35
+ end
36
+
37
+ sig.wait(mutex)
38
+ }
39
+
40
+ expect(count).to eq(3)
41
+ end
42
+ end
43
+ end
@@ -7,36 +7,34 @@ describe Libuv::Filesystem do
7
7
  @log = []
8
8
  @general_failure = []
9
9
 
10
- @loop = Libuv::Loop.default
11
- @filesystem = @loop.filesystem
12
- @timeout = @loop.timer do
13
- @loop.stop
10
+ @reactor = Libuv::Reactor.default
11
+ @filesystem = @reactor.filesystem
12
+ @timeout = @reactor.timer do
13
+ @reactor.stop
14
14
  @general_failure << "test timed out"
15
15
  end
16
16
  @timeout.start(4000)
17
17
 
18
- @logger = proc { |level, errorid, error|
18
+ @reactor.notifier do |error, context|
19
19
  begin
20
- @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
21
- rescue Exception
22
- @general_failure << 'error in logger'
20
+ @general_failure << "Log called: #{context}\n#{error.message}\n#{error.backtrace.join("\n") if error.backtrace}\n"
21
+ rescue Exception => e
22
+ @general_failure << "error in logger #{e.inspect}"
23
23
  end
24
- }
24
+ end
25
25
 
26
26
  @thefile = "test-file.txt"
27
27
 
28
- @loop.all(@filesystem, @timeout).catch do |reason|
28
+ @reactor.all(@filesystem, @timeout).catch do |reason|
29
29
  @general_failure << reason.inspect
30
30
  end
31
31
  end
32
32
 
33
33
  describe 'directory navigation' do
34
34
  it "should list the contents of a folder" do
35
- @loop.run { |logger|
36
- logger.progress &@logger
37
-
35
+ @reactor.run { |reactor|
38
36
  currentDir = Dir.pwd
39
- listing = @filesystem.readdir(currentDir)
37
+ listing = @filesystem.readdir(currentDir, wait: false)
40
38
  listing.then do |result|
41
39
  @log = result
42
40
  end
@@ -45,7 +43,7 @@ describe Libuv::Filesystem do
45
43
  end
46
44
  listing.finally do
47
45
  @timeout.close
48
- @loop.stop
46
+ @reactor.stop
49
47
  end
50
48
  }
51
49
 
@@ -56,25 +54,20 @@ describe Libuv::Filesystem do
56
54
 
57
55
  describe 'file manipulation' do
58
56
  it "should create and write to a file" do
59
- @loop.run { |logger|
60
- logger.progress &@logger
61
-
62
- file = @loop.file(@thefile, File::CREAT|File::WRONLY)
63
- file.progress do
64
- file.write('write some data to a file').then do
65
- file.chmod(777).then do
66
- file.close
67
- @timeout.close
68
- @loop.stop
69
- @log = :success
70
- end
71
- end
72
- end
73
- file.catch do |error|
57
+ @reactor.run { |reactor|
58
+ file = @reactor.file(@thefile, File::CREAT|File::WRONLY)
59
+ begin
60
+ file.write('write some data to a file')
61
+ file.chmod(777)
62
+ @timeout.close
63
+ @reactor.stop
64
+ @log = :success
65
+ rescue => error
74
66
  @general_failure << error
75
67
  @timeout.close
68
+ @reactor.stop
69
+ ensure
76
70
  file.close
77
- @loop.stop
78
71
  end
79
72
  }
80
73
 
@@ -83,23 +76,19 @@ describe Libuv::Filesystem do
83
76
  end
84
77
 
85
78
  it "should return stats on the file" do
86
- @loop.run { |logger|
87
- logger.progress &@logger
88
-
89
- file = @loop.file(@thefile, File::RDONLY)
90
- file.progress do
91
- file.stat.then do |stats|
92
- file.close
93
- @timeout.close
94
- @loop.stop
95
- @log << stats[:st_mtim][:tv_sec]
96
- end
97
- end
98
- file.catch do |error|
79
+ @reactor.run { |reactor|
80
+ file = @reactor.file(@thefile, File::RDONLY)
81
+ begin
82
+ stats = file.stat
83
+ @timeout.close
84
+ @reactor.stop
85
+ @log << stats[:st_mtim][:tv_sec]
86
+ rescue => error
99
87
  @general_failure << error
100
88
  @timeout.close
89
+ @reactor.stop
90
+ ensure
101
91
  file.close
102
- @loop.stop
103
92
  end
104
93
  }
105
94
 
@@ -109,23 +98,20 @@ describe Libuv::Filesystem do
109
98
  end
110
99
 
111
100
  it "should read from a file" do
112
- @loop.run { |logger|
113
- logger.progress &@logger
114
-
115
- file = @loop.file(@thefile, File::RDONLY)
116
- file.progress do
117
- file.read(100).then do |result|
118
- file.close
119
- @timeout.close
120
- @loop.stop
121
- @log = result
122
- end
123
- end
124
- file.catch do |error|
101
+ @reactor.run { |reactor|
102
+ file = @reactor.file(@thefile, File::RDONLY)
103
+ begin
104
+ result = file.read(100)
105
+ @timeout.close
106
+ @reactor.stop
107
+ @log = result
108
+ rescue => error
125
109
  @general_failure << error
126
110
  @timeout.close
127
111
  file.close
128
- @loop.stop
112
+ @reactor.stop
113
+ ensure
114
+ file.close
129
115
  end
130
116
  }
131
117
 
@@ -134,19 +120,17 @@ describe Libuv::Filesystem do
134
120
  end
135
121
 
136
122
  it "should delete a file" do
137
- @loop.run { |logger|
138
- logger.progress &@logger
139
-
140
- op = @loop.filesystem.unlink(@thefile)
123
+ @reactor.run { |reactor|
124
+ op = @reactor.filesystem.unlink(@thefile, wait: false)
141
125
  op.then do
142
126
  @timeout.close
143
- @loop.stop
127
+ @reactor.stop
144
128
  @log = :success
145
129
  end
146
130
  op.catch do |error|
147
131
  @general_failure << error
148
132
  @timeout.close
149
- @loop.stop
133
+ @reactor.stop
150
134
  end
151
135
  }
152
136
 
@@ -157,17 +141,14 @@ describe Libuv::Filesystem do
157
141
 
158
142
  describe 'file streaming' do
159
143
  it "should send a file over a stream", :network => true do
160
- @loop.run { |logger|
161
- logger.progress &@logger
162
-
163
- @server = @loop.tcp
164
- @client = @loop.tcp
144
+ @reactor.run { |reactor|
145
+ @server = @reactor.tcp
146
+ @client = @reactor.tcp
165
147
 
166
148
  @server.bind('127.0.0.1', 34570) do |client|
167
149
  client.progress do |data|
168
- file = @loop.file('.rspec', File::RDONLY)
169
- file.progress do
170
- file.send_file(client).then(proc {
150
+ file = @reactor.file('.rspec', File::RDONLY) do
151
+ file.send_file(client, wait: false).then(proc {
171
152
  file.close
172
153
  client.close
173
154
  }, proc { |error|
@@ -184,13 +165,13 @@ describe Libuv::Filesystem do
184
165
  client.finally do
185
166
  @timeout.close
186
167
  @server.close
187
- @loop.stop
168
+ @reactor.stop
188
169
  end
189
170
  end
190
171
  # catch errors
191
172
  @server.catch do |reason|
192
173
  @general_failure << reason.inspect
193
- @loop.stop
174
+ @reactor.stop
194
175
  end
195
176
  # start listening
196
177
  @server.listen(5)
@@ -209,7 +190,7 @@ describe Libuv::Filesystem do
209
190
  @client.catch do |reason|
210
191
  @general_failure << reason.inspect
211
192
  @server.close
212
- @loop.stop
193
+ @reactor.stop
213
194
  end
214
195
  }
215
196
 
@@ -223,17 +204,14 @@ describe Libuv::Filesystem do
223
204
  end
224
205
 
225
206
  it "should send a file as a HTTP chunked response", :network => true do
226
- @loop.run { |logger|
227
- logger.progress &@logger
228
-
229
- @server = @loop.tcp
230
- @client = @loop.tcp
207
+ @reactor.run { |reactor|
208
+ @server = @reactor.tcp
209
+ @client = @reactor.tcp
231
210
 
232
211
  @server.bind('127.0.0.1', 34568) do |client|
233
212
  client.progress do |data|
234
- file = @loop.file('.rspec', File::RDONLY)
235
- file.progress do
236
- file.send_file(client, :http).then(proc {
213
+ file = @reactor.file('.rspec', File::RDONLY) do
214
+ file.send_file(client, using: :http, wait: false).then(proc {
237
215
  file.close
238
216
  client.close
239
217
  }, proc { |error|
@@ -250,13 +228,13 @@ describe Libuv::Filesystem do
250
228
  client.finally do
251
229
  @timeout.close
252
230
  @server.close
253
- @loop.stop
231
+ @reactor.stop
254
232
  end
255
233
  end
256
234
  # catch errors
257
235
  @server.catch do |reason|
258
236
  @general_failure << reason.inspect
259
- @loop.stop
237
+ @reactor.stop
260
238
  end
261
239
  # start listening
262
240
  @server.listen(5)
@@ -275,7 +253,7 @@ describe Libuv::Filesystem do
275
253
  @client.catch do |reason|
276
254
  @general_failure << reason.inspect
277
255
  @server.close
278
- @loop.stop
256
+ @reactor.stop
279
257
  end
280
258
  }
281
259