libuv 0.10.0 → 0.10.2
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.
- data/.gitignore +17 -17
- data/.gitmodules +3 -3
- data/.rspec +1 -1
- data/.travis.yml +16 -16
- data/Gemfile +2 -2
- data/LICENSE +23 -23
- data/README.md +82 -73
- data/Rakefile +31 -31
- data/lib/libuv.rb +53 -34
- data/lib/libuv/async.rb +47 -33
- data/lib/libuv/check.rb +55 -48
- data/lib/libuv/error.rb +70 -70
- data/lib/libuv/ext/ext.rb +264 -256
- data/lib/libuv/ext/platform/darwin_x64.rb +12 -12
- data/lib/libuv/ext/platform/linux.rb +7 -7
- data/lib/libuv/ext/platform/unix.rb +13 -13
- data/lib/libuv/ext/platform/windows.rb +26 -26
- data/lib/libuv/ext/tasks.rb +27 -27
- data/lib/libuv/ext/tasks/mac.rb +23 -23
- data/lib/libuv/ext/tasks/unix.rb +23 -23
- data/lib/libuv/ext/tasks/win.rb +11 -11
- data/lib/libuv/ext/types.rb +234 -229
- data/lib/libuv/file.rb +192 -0
- data/lib/libuv/filesystem.rb +233 -0
- data/lib/libuv/fs_event.rb +31 -31
- data/lib/libuv/handle.rb +85 -81
- data/lib/libuv/idle.rb +56 -49
- data/lib/libuv/loop.rb +338 -310
- data/lib/libuv/{assertions.rb → mixins/assertions.rb} +23 -23
- data/lib/libuv/mixins/fs_checks.rb +55 -0
- data/lib/libuv/{listener.rb → mixins/listener.rb} +34 -34
- data/lib/libuv/{net.rb → mixins/net.rb} +37 -37
- data/lib/libuv/{resource.rb → mixins/resource.rb} +27 -27
- data/lib/libuv/{stream.rb → mixins/stream.rb} +143 -123
- data/lib/libuv/pipe.rb +197 -97
- data/lib/libuv/prepare.rb +56 -49
- data/lib/libuv/q.rb +1 -1
- data/lib/libuv/signal.rb +51 -0
- data/lib/libuv/tcp.rb +204 -193
- data/lib/libuv/timer.rb +88 -75
- data/lib/libuv/tty.rb +37 -34
- data/lib/libuv/udp.rb +273 -255
- data/lib/libuv/version.rb +3 -3
- data/lib/libuv/work.rb +63 -61
- data/libuv.gemspec +54 -54
- data/spec/async_spec.rb +60 -60
- data/spec/cpu_spec.rb +10 -0
- data/spec/defer_spec.rb +980 -980
- data/spec/filesystem_spec.rb +119 -0
- data/spec/idle_spec.rb +56 -56
- data/spec/pipe_spec.rb +153 -148
- data/spec/tcp_spec.rb +203 -188
- metadata +73 -49
- checksums.yaml +0 -15
- data/lib/libuv/simple_async.rb +0 -28
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'libuv'
|
2
|
+
require 'thread'
|
3
|
+
|
4
|
+
|
5
|
+
describe Libuv::Filesystem do
|
6
|
+
before :each do
|
7
|
+
@log = []
|
8
|
+
@general_failure = []
|
9
|
+
|
10
|
+
@loop = Libuv::Loop.new
|
11
|
+
@filesystem = @loop.filesystem
|
12
|
+
@timeout = @loop.timer do
|
13
|
+
@loop.stop
|
14
|
+
@general_failure << "test timed out"
|
15
|
+
end
|
16
|
+
@timeout.start(4000)
|
17
|
+
|
18
|
+
@logger = proc { |level, errorid, error|
|
19
|
+
begin
|
20
|
+
p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
|
21
|
+
rescue Exception
|
22
|
+
p 'error in logger'
|
23
|
+
end
|
24
|
+
}
|
25
|
+
|
26
|
+
@thefile = "test-file.txt"
|
27
|
+
|
28
|
+
@loop.all(@filesystem, @timeout).catch do |reason|
|
29
|
+
@general_failure << reason.inspect
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'directory navigation' do
|
34
|
+
it "should list the contents of a folder" do
|
35
|
+
@loop.run { |logger|
|
36
|
+
logger.progress &@logger
|
37
|
+
|
38
|
+
currentDir = Dir.pwd
|
39
|
+
listing = @filesystem.readdir(currentDir)
|
40
|
+
listing.then do |result|
|
41
|
+
@log = result
|
42
|
+
end
|
43
|
+
listing.catch do |error|
|
44
|
+
@general_failure << error
|
45
|
+
end
|
46
|
+
listing.finally do
|
47
|
+
@loop.stop
|
48
|
+
end
|
49
|
+
}
|
50
|
+
|
51
|
+
@general_failure.should == []
|
52
|
+
(@log.length > 0).should == true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'file manipulation' do
|
57
|
+
it "should create and write to a file" do
|
58
|
+
@loop.run { |logger|
|
59
|
+
logger.progress &@logger
|
60
|
+
|
61
|
+
file = @loop.file(@thefile, File::CREAT|File::WRONLY)
|
62
|
+
file.progress do
|
63
|
+
file.write('write some data to a file').then do
|
64
|
+
file.chmod(777).then do
|
65
|
+
file.close
|
66
|
+
@loop.stop
|
67
|
+
@log = :success
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
file.catch do |error|
|
72
|
+
@general_failure << error
|
73
|
+
file.close
|
74
|
+
@loop.stop
|
75
|
+
end
|
76
|
+
}
|
77
|
+
|
78
|
+
@general_failure.should == []
|
79
|
+
@log.should == :success
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should read from a file" do
|
83
|
+
@loop.run { |logger|
|
84
|
+
logger.progress &@logger
|
85
|
+
|
86
|
+
file = @loop.file(@thefile, File::RDONLY)
|
87
|
+
file.progress do
|
88
|
+
file.read(100).then do |result|
|
89
|
+
file.close
|
90
|
+
@loop.stop
|
91
|
+
@log = result
|
92
|
+
end
|
93
|
+
end
|
94
|
+
file.catch do |error|
|
95
|
+
@general_failure << error
|
96
|
+
file.close
|
97
|
+
@loop.stop
|
98
|
+
end
|
99
|
+
}
|
100
|
+
|
101
|
+
@general_failure.should == []
|
102
|
+
@log.should == 'write some data to a file'
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should delete a file" do
|
106
|
+
@loop.run { |logger|
|
107
|
+
logger.progress &@logger
|
108
|
+
|
109
|
+
@loop.filesystem.unlink(@thefile).then do
|
110
|
+
@loop.stop
|
111
|
+
@log = :success
|
112
|
+
end
|
113
|
+
}
|
114
|
+
|
115
|
+
@general_failure.should == []
|
116
|
+
@log.should == :success
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
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.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
|
-
@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
|
-
@general_failure.should == []
|
54
|
-
(@idle_calls > 0).should == 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.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
|
+
@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
|
+
@general_failure.should == []
|
54
|
+
(@idle_calls > 0).should == true
|
55
|
+
end
|
56
|
+
end
|
data/spec/pipe_spec.rb
CHANGED
@@ -1,148 +1,153 @@
|
|
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-pipe.pipe"
|
19
|
-
|
20
|
-
@loop.all(@server, @client, @timeout).catch do |reason|
|
21
|
-
@general_failure << reason.inspect
|
22
|
-
p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\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
|
-
p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
|
45
|
-
rescue Exception
|
46
|
-
p 'error in logger'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
@server.bind(
|
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
|
-
p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\n"
|
66
|
-
end
|
67
|
-
|
68
|
-
# start listening
|
69
|
-
@server.listen(1024)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# connect client to server
|
74
|
-
@client.connect(
|
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
|
-
# Stop the loop once the client handle is closed
|
86
|
-
@client.finally do
|
87
|
-
@server.close
|
88
|
-
@loop.stop
|
89
|
-
end
|
90
|
-
}
|
91
|
-
|
92
|
-
@general_failure.should == []
|
93
|
-
@log.should == ['ping', 'pong']
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# This test won't pass on jRuby as java won't expose file descriptors
|
98
|
-
describe 'unidirectional pipeline'
|
99
|
-
before :each do
|
100
|
-
system "/usr/bin/mkfifo", @pipefile
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should send work to a consumer" do
|
104
|
-
@loop.run { |logger|
|
105
|
-
logger.progress do |level, errorid, error|
|
106
|
-
p "Log called: #{level}: #{errorid}\n#{
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
heartbeat = @loop.timer
|
111
|
-
@file1 =
|
112
|
-
@
|
113
|
-
|
114
|
-
|
115
|
-
@
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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-pipe.pipe"
|
19
|
+
|
20
|
+
@loop.all(@server, @client, @timeout).catch do |reason|
|
21
|
+
@general_failure << reason.inspect
|
22
|
+
p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\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
|
+
p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
|
45
|
+
rescue Exception
|
46
|
+
p '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
|
+
p "Failed with: #{reason.message}\n#{reason.backtrace.join("\n")}\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
|
+
# Stop the loop once the client handle is closed
|
86
|
+
@client.finally do
|
87
|
+
@server.close
|
88
|
+
@loop.stop
|
89
|
+
end
|
90
|
+
}
|
91
|
+
|
92
|
+
@general_failure.should == []
|
93
|
+
@log.should == ['ping', 'pong']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# This test won't pass on jRuby as java won't expose file descriptors
|
98
|
+
describe 'unidirectional pipeline' do
|
99
|
+
before :each do
|
100
|
+
system "/usr/bin/mkfifo", @pipefile
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should send work to a consumer" do
|
104
|
+
@loop.run { |logger|
|
105
|
+
logger.progress do |level, errorid, error|
|
106
|
+
p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
heartbeat = @loop.timer
|
111
|
+
@file1 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
|
112
|
+
@file1.progress do
|
113
|
+
@server.open(@file1.fileno) do |server|
|
114
|
+
heartbeat.progress do
|
115
|
+
@server.write('workload').catch do |err|
|
116
|
+
@general_failure << err
|
117
|
+
end
|
118
|
+
end
|
119
|
+
heartbeat.start(0, 200)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
@file1.catch do |e|
|
123
|
+
p "Log called: #{level}: #{errorid}\n#{e.message}\n#{e.backtrace.join("\n")}\n"
|
124
|
+
end
|
125
|
+
|
126
|
+
@file2 = @loop.file(@pipefile, File::RDWR|File::NONBLOCK)
|
127
|
+
@file2.progress do
|
128
|
+
# connect client to server
|
129
|
+
@client.open(@file2.fileno) do |consumer|
|
130
|
+
consumer.progress do |data|
|
131
|
+
@log = data
|
132
|
+
end
|
133
|
+
|
134
|
+
consumer.start_read
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
timeout = @loop.timer do
|
140
|
+
@server.close
|
141
|
+
@client.close
|
142
|
+
timeout.close
|
143
|
+
heartbeat.close
|
144
|
+
@loop.stop
|
145
|
+
end
|
146
|
+
timeout.start(1000)
|
147
|
+
}
|
148
|
+
|
149
|
+
@general_failure.should == []
|
150
|
+
@log.should == 'workload'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|