libuv 0.10.0 → 0.10.2

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