libuv 2.0.12 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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