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.
Files changed (55) hide show
  1. data/.gitignore +17 -17
  2. data/.gitmodules +3 -3
  3. data/.rspec +1 -1
  4. data/.travis.yml +16 -16
  5. data/Gemfile +2 -2
  6. data/LICENSE +23 -23
  7. data/README.md +82 -73
  8. data/Rakefile +31 -31
  9. data/lib/libuv.rb +53 -34
  10. data/lib/libuv/async.rb +47 -33
  11. data/lib/libuv/check.rb +55 -48
  12. data/lib/libuv/error.rb +70 -70
  13. data/lib/libuv/ext/ext.rb +264 -256
  14. data/lib/libuv/ext/platform/darwin_x64.rb +12 -12
  15. data/lib/libuv/ext/platform/linux.rb +7 -7
  16. data/lib/libuv/ext/platform/unix.rb +13 -13
  17. data/lib/libuv/ext/platform/windows.rb +26 -26
  18. data/lib/libuv/ext/tasks.rb +27 -27
  19. data/lib/libuv/ext/tasks/mac.rb +23 -23
  20. data/lib/libuv/ext/tasks/unix.rb +23 -23
  21. data/lib/libuv/ext/tasks/win.rb +11 -11
  22. data/lib/libuv/ext/types.rb +234 -229
  23. data/lib/libuv/file.rb +192 -0
  24. data/lib/libuv/filesystem.rb +233 -0
  25. data/lib/libuv/fs_event.rb +31 -31
  26. data/lib/libuv/handle.rb +85 -81
  27. data/lib/libuv/idle.rb +56 -49
  28. data/lib/libuv/loop.rb +338 -310
  29. data/lib/libuv/{assertions.rb → mixins/assertions.rb} +23 -23
  30. data/lib/libuv/mixins/fs_checks.rb +55 -0
  31. data/lib/libuv/{listener.rb → mixins/listener.rb} +34 -34
  32. data/lib/libuv/{net.rb → mixins/net.rb} +37 -37
  33. data/lib/libuv/{resource.rb → mixins/resource.rb} +27 -27
  34. data/lib/libuv/{stream.rb → mixins/stream.rb} +143 -123
  35. data/lib/libuv/pipe.rb +197 -97
  36. data/lib/libuv/prepare.rb +56 -49
  37. data/lib/libuv/q.rb +1 -1
  38. data/lib/libuv/signal.rb +51 -0
  39. data/lib/libuv/tcp.rb +204 -193
  40. data/lib/libuv/timer.rb +88 -75
  41. data/lib/libuv/tty.rb +37 -34
  42. data/lib/libuv/udp.rb +273 -255
  43. data/lib/libuv/version.rb +3 -3
  44. data/lib/libuv/work.rb +63 -61
  45. data/libuv.gemspec +54 -54
  46. data/spec/async_spec.rb +60 -60
  47. data/spec/cpu_spec.rb +10 -0
  48. data/spec/defer_spec.rb +980 -980
  49. data/spec/filesystem_spec.rb +119 -0
  50. data/spec/idle_spec.rb +56 -56
  51. data/spec/pipe_spec.rb +153 -148
  52. data/spec/tcp_spec.rb +203 -188
  53. metadata +73 -49
  54. checksums.yaml +0 -15
  55. 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("/tmp/ipc-example.ipc") 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("/tmp/ipc-example.ipc") 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', :real_io => true 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#{e.message}\n#{e.backtrace.join("\n")}\n"
107
- end
108
-
109
-
110
- heartbeat = @loop.timer
111
- @file1 = File.open(@pipefile, File::RDWR|File::NONBLOCK)
112
- @server.open(@file1.fileno) do |server|
113
- heartbeat.progress do
114
- @server.write('workload').catch do |err|
115
- @general_failure << err
116
- end
117
- end
118
- heartbeat.start(0, 200)
119
- end
120
-
121
-
122
-
123
- @file2 = File.open(@pipefile, File::RDWR|File::NONBLOCK)
124
- # connect client to server
125
- @client.open(@file2.fileno) do |consumer|
126
- consumer.progress do |data|
127
- @log = data
128
- end
129
-
130
- consumer.start_read
131
- end
132
-
133
-
134
- timeout = @loop.timer do
135
- @server.close
136
- @client.close
137
- timeout.close
138
- heartbeat.close
139
- @loop.stop
140
- end
141
- timeout.start(1000)
142
- }
143
-
144
- @general_failure.should == []
145
- @log.should == 'workload'
146
- end
147
- end
148
- 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-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