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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +67 -34
- data/lib/libuv.rb +30 -5
- data/lib/libuv/async.rb +16 -10
- data/lib/libuv/check.rb +19 -12
- data/lib/libuv/coroutines.rb +39 -12
- data/lib/libuv/dns.rb +25 -18
- data/lib/libuv/error.rb +2 -0
- data/lib/libuv/ext/ext.rb +28 -36
- data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
- data/lib/libuv/ext/platform/unix.rb +2 -0
- data/lib/libuv/ext/platform/windows.rb +2 -0
- data/lib/libuv/ext/tasks.rb +2 -0
- data/lib/libuv/ext/tasks/mac.rb +2 -0
- data/lib/libuv/ext/tasks/unix.rb +2 -0
- data/lib/libuv/ext/tasks/win.rb +2 -0
- data/lib/libuv/ext/types.rb +2 -1
- data/lib/libuv/file.rb +67 -50
- data/lib/libuv/filesystem.rb +63 -61
- data/lib/libuv/fs_event.rb +7 -4
- data/lib/libuv/handle.rb +30 -14
- data/lib/libuv/idle.rb +17 -10
- data/lib/libuv/mixins/accessors.rb +41 -0
- data/lib/libuv/mixins/assertions.rb +3 -1
- data/lib/libuv/mixins/fs_checks.rb +29 -6
- data/lib/libuv/mixins/listener.rb +4 -2
- data/lib/libuv/mixins/net.rb +4 -2
- data/lib/libuv/mixins/resource.rb +5 -3
- data/lib/libuv/mixins/stream.rb +128 -35
- data/lib/libuv/pipe.rb +54 -27
- data/lib/libuv/prepare.rb +19 -12
- data/lib/libuv/q.rb +109 -101
- data/lib/libuv/{loop.rb → reactor.rb} +163 -85
- data/lib/libuv/signal.rb +13 -5
- data/lib/libuv/tcp.rb +109 -63
- data/lib/libuv/timer.rb +44 -24
- data/lib/libuv/tty.rb +8 -3
- data/lib/libuv/udp.rb +49 -22
- data/lib/libuv/version.rb +3 -1
- data/lib/libuv/work.rb +14 -10
- data/libuv.gemspec +11 -9
- data/spec/async_spec.rb +13 -13
- data/spec/coroutines_spec.rb +20 -50
- data/spec/defer_spec.rb +182 -311
- data/spec/dns_spec.rb +51 -41
- data/spec/dsl_spec.rb +43 -0
- data/spec/filesystem_spec.rb +65 -87
- data/spec/idle_spec.rb +19 -33
- data/spec/pipe_spec.rb +25 -32
- data/spec/tcp_spec.rb +116 -53
- data/spec/timer_spec.rb +3 -3
- data/spec/udp_spec.rb +16 -17
- data/spec/zen_spec.rb +2 -3
- 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
|
-
@
|
10
|
-
@
|
11
|
-
|
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
|
-
@
|
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
|
-
@
|
24
|
-
|
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
|
-
@
|
34
|
+
@reactor.stop
|
36
35
|
}, proc { |err|
|
37
36
|
@general_failure << err
|
38
37
|
@timeout.close
|
39
|
-
@
|
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
|
-
@
|
49
|
-
|
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
|
-
@
|
51
|
+
@reactor.stop
|
61
52
|
}, proc { |err|
|
62
53
|
@general_failure << err
|
63
54
|
@timeout.close
|
64
|
-
@
|
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
|
73
|
-
@
|
74
|
-
|
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
|
-
@
|
68
|
+
@reactor.stop
|
86
69
|
}, proc { |err|
|
87
70
|
@general_failure << err
|
88
71
|
@timeout.close
|
89
|
-
@
|
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
|
data/spec/filesystem_spec.rb
CHANGED
@@ -7,36 +7,34 @@ describe Libuv::Filesystem do
|
|
7
7
|
@log = []
|
8
8
|
@general_failure = []
|
9
9
|
|
10
|
-
@
|
11
|
-
@filesystem = @
|
12
|
-
@timeout = @
|
13
|
-
@
|
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
|
-
@
|
18
|
+
@reactor.notifier do |error, context|
|
19
19
|
begin
|
20
|
-
@general_failure << "Log called: #{
|
21
|
-
rescue Exception
|
22
|
-
@general_failure <<
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
-
@
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
@
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
-
@
|
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
|
-
@
|
138
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
161
|
-
|
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 = @
|
169
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
227
|
-
|
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 = @
|
235
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
256
|
+
@reactor.stop
|
279
257
|
end
|
280
258
|
}
|
281
259
|
|