win32-process 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -0
- data/lib/win32/process/constants.rb +1 -3
- data/lib/win32/process/functions.rb +38 -38
- data/lib/win32/process/helper.rb +2 -2
- data/lib/win32/process/structs.rb +9 -16
- data/lib/win32/process/version.rb +6 -0
- data/lib/win32/process.rb +115 -114
- data/lib/win32-process.rb +1 -1
- data/test/test_win32_process.rb +82 -82
- data/test/test_win32_process_kill.rb +36 -31
- data/win32-process.gemspec +5 -5
- metadata +8 -8
- data/README.md +0 -74
data/test/test_win32_process.rb
CHANGED
@@ -11,13 +11,13 @@
|
|
11
11
|
#
|
12
12
|
# You should run this test case via the 'rake test' task.
|
13
13
|
###############################################################################
|
14
|
-
require
|
15
|
-
require
|
14
|
+
require "test-unit"
|
15
|
+
require "win32/process"
|
16
16
|
|
17
17
|
class TC_Win32Process < Test::Unit::TestCase
|
18
18
|
def self.startup
|
19
19
|
@@pids = []
|
20
|
-
@@jruby = RUBY_PLATFORM ==
|
20
|
+
@@jruby = RUBY_PLATFORM == "java"
|
21
21
|
end
|
22
22
|
|
23
23
|
def setup
|
@@ -25,7 +25,7 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
test "win32-process version is set to the correct value" do
|
28
|
-
assert_equal(
|
28
|
+
assert_equal("1.0.0", Process::WIN32_PROCESS_VERSION)
|
29
29
|
end
|
30
30
|
|
31
31
|
test "create basic functionality" do
|
@@ -33,76 +33,76 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
33
33
|
end
|
34
34
|
|
35
35
|
test "create with common flags works as expected" do
|
36
|
-
assert_nothing_raised{
|
36
|
+
assert_nothing_raised {
|
37
37
|
@@pids << Process.create(
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
|
38
|
+
app_name: "notepad.exe",
|
39
|
+
creation_flags: Process::DETACHED_PROCESS,
|
40
|
+
process_inherit: false,
|
41
|
+
thread_inherit: true,
|
42
|
+
cwd: "C:\\"
|
43
|
+
).process_id
|
44
44
|
}
|
45
45
|
|
46
|
-
assert_nothing_raised{ Process.kill(9, @@pids.pop) }
|
46
|
+
assert_nothing_raised { Process.kill(9, @@pids.pop) }
|
47
47
|
end
|
48
48
|
|
49
49
|
test "create requires a hash argument" do
|
50
|
-
assert_raise(TypeError){ Process.create("bogusapp.exe") }
|
50
|
+
assert_raise(TypeError) { Process.create("bogusapp.exe") }
|
51
51
|
end
|
52
52
|
|
53
53
|
test "create does not accept invalid keys" do
|
54
|
-
assert_raise(ArgumentError){ Process.create(:
|
55
|
-
assert_raise_message("invalid key 'bogus'"){
|
56
|
-
Process.create(:
|
54
|
+
assert_raise(ArgumentError) { Process.create(bogus: "test.exe") }
|
55
|
+
assert_raise_message("invalid key 'bogus'") {
|
56
|
+
Process.create(bogus: "test.exe")
|
57
57
|
}
|
58
58
|
end
|
59
59
|
|
60
60
|
test "create does not accept invalid startup_info keys" do
|
61
|
-
assert_raise(ArgumentError){
|
62
|
-
Process.create(:
|
61
|
+
assert_raise(ArgumentError) {
|
62
|
+
Process.create(startup_info: { foo: "test" })
|
63
63
|
}
|
64
|
-
assert_raise_message("invalid startup_info key 'foo'"){
|
65
|
-
Process.create(:
|
64
|
+
assert_raise_message("invalid startup_info key 'foo'") {
|
65
|
+
Process.create(startup_info: { foo: "test" })
|
66
66
|
}
|
67
67
|
end
|
68
68
|
|
69
69
|
test "create raises an error if the executable cannot be found" do
|
70
|
-
assert_raise(Errno::ENOENT){ Process.create(:
|
70
|
+
assert_raise(Errno::ENOENT) { Process.create(app_name: "bogusapp.exe") }
|
71
71
|
end
|
72
72
|
|
73
73
|
test "create passes local environment when environment is not specified" do
|
74
74
|
omit_if(@@jruby)
|
75
75
|
stdout_read, stdout_write = IO.pipe
|
76
76
|
|
77
|
-
ENV[
|
77
|
+
ENV["AARDVARK"] = "B"
|
78
78
|
assert_nothing_raised {
|
79
79
|
Process.create(
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
80
|
+
app_name: "cmd.exe /c echo %AARDVARK%",
|
81
|
+
creation_flags: Process::DETACHED_PROCESS,
|
82
|
+
startup_info: { stdout: stdout_write }
|
83
83
|
)
|
84
84
|
}
|
85
85
|
|
86
86
|
stdout_write.close
|
87
|
-
assert_equal(
|
87
|
+
assert_equal("B", stdout_read.read.chomp)
|
88
88
|
end
|
89
89
|
|
90
90
|
test "create does not pass local environment when environment is specified" do
|
91
91
|
omit_if(@@jruby)
|
92
92
|
stdout_read, stdout_write = IO.pipe
|
93
93
|
|
94
|
-
ENV[
|
94
|
+
ENV["AARDVARK"] = "B"
|
95
95
|
assert_nothing_raised {
|
96
96
|
Process.create(
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
100
|
-
:
|
97
|
+
app_name: "cmd.exe /c echo %AARDVARK%",
|
98
|
+
creation_flags: Process::DETACHED_PROCESS,
|
99
|
+
environment: "",
|
100
|
+
startup_info: { stdout: stdout_write }
|
101
101
|
)
|
102
102
|
}
|
103
103
|
|
104
104
|
stdout_write.close
|
105
|
-
assert_equal(
|
105
|
+
assert_equal("%AARDVARK%", stdout_read.read.chomp)
|
106
106
|
end
|
107
107
|
|
108
108
|
test "create supports :environment as a string" do
|
@@ -111,10 +111,10 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
111
111
|
|
112
112
|
assert_nothing_raised {
|
113
113
|
Process.create(
|
114
|
-
:
|
115
|
-
:
|
116
|
-
:
|
117
|
-
:
|
114
|
+
app_name: "cmd.exe /c echo %A% %C%",
|
115
|
+
creation_flags: Process::DETACHED_PROCESS,
|
116
|
+
environment: "A=B;C=D",
|
117
|
+
startup_info: { stdout: stdout_write }
|
118
118
|
)
|
119
119
|
}
|
120
120
|
|
@@ -128,10 +128,10 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
128
128
|
|
129
129
|
assert_nothing_raised {
|
130
130
|
Process.create(
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
131
|
+
app_name: "cmd.exe /c echo %A% %C%",
|
132
|
+
creation_flags: Process::DETACHED_PROCESS,
|
133
|
+
environment: [ "A=B;X;", "C=;D;Y" ],
|
134
|
+
startup_info: { stdout: stdout_write }
|
135
135
|
)
|
136
136
|
}
|
137
137
|
|
@@ -142,9 +142,9 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
142
142
|
test "create supports empty :environment string" do
|
143
143
|
assert_nothing_raised {
|
144
144
|
Process.create(
|
145
|
-
:
|
146
|
-
:
|
147
|
-
:
|
145
|
+
creation_flags: Process::DETACHED_PROCESS,
|
146
|
+
app_name: "cmd.exe",
|
147
|
+
environment: ""
|
148
148
|
)
|
149
149
|
}
|
150
150
|
end
|
@@ -152,21 +152,21 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
152
152
|
test "create supports empty :environment array" do
|
153
153
|
assert_nothing_raised {
|
154
154
|
Process.create(
|
155
|
-
:
|
156
|
-
:
|
157
|
-
:
|
155
|
+
creation_flags: Process::DETACHED_PROCESS,
|
156
|
+
app_name: "cmd.exe",
|
157
|
+
environment: []
|
158
158
|
)
|
159
159
|
}
|
160
160
|
end
|
161
161
|
|
162
162
|
test "uid basic functionality" do
|
163
163
|
assert_respond_to(Process, :uid)
|
164
|
-
assert_kind_of(
|
164
|
+
assert_kind_of(Integer, Process.uid)
|
165
165
|
end
|
166
166
|
|
167
167
|
test "uid accepts a boolean argument" do
|
168
|
-
assert_nothing_raised{ Process.uid(true) }
|
169
|
-
assert_nothing_raised{ Process.uid(true) }
|
168
|
+
assert_nothing_raised { Process.uid(true) }
|
169
|
+
assert_nothing_raised { Process.uid(true) }
|
170
170
|
end
|
171
171
|
|
172
172
|
test "uid returns a string if its argument is true" do
|
@@ -174,36 +174,36 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
174
174
|
end
|
175
175
|
|
176
176
|
test "uid accepts a maximum of one argument" do
|
177
|
-
assert_raise(ArgumentError){ Process.uid(true, true) }
|
177
|
+
assert_raise(ArgumentError) { Process.uid(true, true) }
|
178
178
|
end
|
179
179
|
|
180
180
|
test "argument to uid must be a boolean" do
|
181
|
-
assert_raise(TypeError){ Process.uid(
|
181
|
+
assert_raise(TypeError) { Process.uid("test") }
|
182
182
|
end
|
183
183
|
|
184
184
|
test "getpriority basic functionality" do
|
185
185
|
assert_respond_to(Process, :getpriority)
|
186
|
-
assert_nothing_raised{ Process.getpriority(Process::PRIO_PROCESS, Process.pid) }
|
187
|
-
assert_kind_of(
|
186
|
+
assert_nothing_raised { Process.getpriority(Process::PRIO_PROCESS, Process.pid) }
|
187
|
+
assert_kind_of(Integer, Process.getpriority(Process::PRIO_PROCESS, Process.pid))
|
188
188
|
end
|
189
189
|
|
190
190
|
test "getpriority treats an int argument of zero as the current process" do
|
191
|
-
assert_nothing_raised{ Process.getpriority(0, 0) }
|
191
|
+
assert_nothing_raised { Process.getpriority(0, 0) }
|
192
192
|
end
|
193
193
|
|
194
194
|
test "getpriority requires both a kind and an int" do
|
195
|
-
assert_raise(ArgumentError){ Process.getpriority }
|
196
|
-
assert_raise(ArgumentError){ Process.getpriority(Process::PRIO_PROCESS) }
|
195
|
+
assert_raise(ArgumentError) { Process.getpriority }
|
196
|
+
assert_raise(ArgumentError) { Process.getpriority(Process::PRIO_PROCESS) }
|
197
197
|
end
|
198
198
|
|
199
199
|
test "getpriority requires integer arguments" do
|
200
|
-
assert_raise(TypeError){ Process.getpriority(
|
201
|
-
assert_raise(TypeError){ Process.getpriority(Process::PRIO_PROCESS,
|
200
|
+
assert_raise(TypeError) { Process.getpriority("test", 0) }
|
201
|
+
assert_raise(TypeError) { Process.getpriority(Process::PRIO_PROCESS, "test") }
|
202
202
|
end
|
203
203
|
|
204
204
|
test "setpriority basic functionality" do
|
205
205
|
assert_respond_to(Process, :setpriority)
|
206
|
-
assert_nothing_raised{ Process.setpriority(0, Process.pid, @priority) }
|
206
|
+
assert_nothing_raised { Process.setpriority(0, Process.pid, @priority) }
|
207
207
|
assert_equal(@priority, Process.getpriority(0, Process.pid))
|
208
208
|
end
|
209
209
|
|
@@ -216,15 +216,15 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
216
216
|
end
|
217
217
|
|
218
218
|
test "setpriority requires at least three arguments" do
|
219
|
-
assert_raise(ArgumentError){ Process.setpriority }
|
220
|
-
assert_raise(ArgumentError){ Process.setpriority(0) }
|
221
|
-
assert_raise(ArgumentError){ Process.setpriority(0, 0) }
|
219
|
+
assert_raise(ArgumentError) { Process.setpriority }
|
220
|
+
assert_raise(ArgumentError) { Process.setpriority(0) }
|
221
|
+
assert_raise(ArgumentError) { Process.setpriority(0, 0) }
|
222
222
|
end
|
223
223
|
|
224
224
|
test "arguments to setpriority must be numeric" do
|
225
|
-
assert_raise(TypeError){ Process.setpriority(
|
226
|
-
assert_raise(TypeError){ Process.setpriority(0,
|
227
|
-
assert_raise(TypeError){ Process.setpriority(0, 0,
|
225
|
+
assert_raise(TypeError) { Process.setpriority("test", 0, @priority) }
|
226
|
+
assert_raise(TypeError) { Process.setpriority(0, "test", @priority) }
|
227
|
+
assert_raise(TypeError) { Process.setpriority(0, 0, "test") }
|
228
228
|
end
|
229
229
|
|
230
230
|
test "custom creation constants are defined" do
|
@@ -243,8 +243,8 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
243
243
|
|
244
244
|
test "getrlimit basic functionality" do
|
245
245
|
assert_respond_to(Process, :getrlimit)
|
246
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_CPU) }
|
247
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_FSIZE) }
|
246
|
+
assert_nothing_raised { Process.getrlimit(Process::RLIMIT_CPU) }
|
247
|
+
assert_nothing_raised { Process.getrlimit(Process::RLIMIT_FSIZE) }
|
248
248
|
end
|
249
249
|
|
250
250
|
test "getrlimit returns an array of two numeric elements" do
|
@@ -254,18 +254,18 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
254
254
|
end
|
255
255
|
|
256
256
|
test "getrlimit can be called multiple times without issue" do
|
257
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_CPU) }
|
258
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_CPU) }
|
259
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_CPU) }
|
257
|
+
assert_nothing_raised { Process.getrlimit(Process::RLIMIT_CPU) }
|
258
|
+
assert_nothing_raised { Process.getrlimit(Process::RLIMIT_CPU) }
|
259
|
+
assert_nothing_raised { Process.getrlimit(Process::RLIMIT_CPU) }
|
260
260
|
end
|
261
261
|
|
262
262
|
test "getrlimit requires a valid resource value" do
|
263
|
-
assert_raise(ArgumentError){ Process.getrlimit(9999) }
|
263
|
+
assert_raise(ArgumentError) { Process.getrlimit(9999) }
|
264
264
|
end
|
265
265
|
|
266
266
|
test "setrlimit basic functionality" do
|
267
267
|
assert_respond_to(Process, :setrlimit)
|
268
|
-
assert_nothing_raised{ Process.setrlimit(Process::RLIMIT_CPU, 1000000) }
|
268
|
+
assert_nothing_raised { Process.setrlimit(Process::RLIMIT_CPU, 1000000) }
|
269
269
|
end
|
270
270
|
|
271
271
|
test "setrlimit returns nil on success" do
|
@@ -273,17 +273,17 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
273
273
|
end
|
274
274
|
|
275
275
|
test "setrlimit sets the resource limit as expected" do
|
276
|
-
assert_nothing_raised{ Process.setrlimit(Process::RLIMIT_CPU, 1000000) }
|
276
|
+
assert_nothing_raised { Process.setrlimit(Process::RLIMIT_CPU, 1000000) }
|
277
277
|
assert_equal([1000000, 1000000], Process.getrlimit(Process::RLIMIT_CPU))
|
278
278
|
end
|
279
279
|
|
280
280
|
test "setrlimit raises an error if the resource value is invalid" do
|
281
|
-
assert_raise(ArgumentError){ Process.setrlimit(9999, 100) }
|
281
|
+
assert_raise(ArgumentError) { Process.setrlimit(9999, 100) }
|
282
282
|
end
|
283
283
|
|
284
284
|
test "is_job basic functionality" do
|
285
285
|
assert_respond_to(Process, :job?)
|
286
|
-
assert_nothing_raised{ Process.job? }
|
286
|
+
assert_nothing_raised { Process.job? }
|
287
287
|
end
|
288
288
|
|
289
289
|
test "is_job returns a boolean value" do
|
@@ -291,7 +291,7 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
291
291
|
end
|
292
292
|
|
293
293
|
test "is_job does not accept any arguments" do
|
294
|
-
assert_raise(ArgumentError){ Process.job?(Process.pid) }
|
294
|
+
assert_raise(ArgumentError) { Process.job?(Process.pid) }
|
295
295
|
end
|
296
296
|
|
297
297
|
test "volume_type is a private method" do
|
@@ -300,19 +300,19 @@ class TC_Win32Process < Test::Unit::TestCase
|
|
300
300
|
|
301
301
|
test "snapshot method basic functionality" do
|
302
302
|
assert_respond_to(Process, :snapshot)
|
303
|
-
assert_nothing_raised{ Process.snapshot }
|
303
|
+
assert_nothing_raised { Process.snapshot }
|
304
304
|
assert_kind_of(Hash, Process.snapshot)
|
305
305
|
end
|
306
306
|
|
307
307
|
test "snapshot accepts :thread, :module or :heap arguments" do
|
308
|
-
assert_nothing_raised{ Process.snapshot(:thread) }
|
309
|
-
assert_nothing_raised{ Process.snapshot(:module) }
|
310
|
-
#assert_nothing_raised{ Process.snapshot(:heap) }
|
311
|
-
assert_nothing_raised{ Process.snapshot(:process) }
|
308
|
+
assert_nothing_raised { Process.snapshot(:thread) }
|
309
|
+
assert_nothing_raised { Process.snapshot(:module) }
|
310
|
+
# assert_nothing_raised{ Process.snapshot(:heap) }
|
311
|
+
assert_nothing_raised { Process.snapshot(:process) }
|
312
312
|
end
|
313
313
|
|
314
314
|
test "snapshot raises an error if an invalid argument is passed" do
|
315
|
-
assert_raise(ArgumentError){ Process.snapshot(:bogus) }
|
315
|
+
assert_raise(ArgumentError) { Process.snapshot(:bogus) }
|
316
316
|
end
|
317
317
|
|
318
318
|
test "ffi functions are private" do
|
@@ -3,8 +3,8 @@
|
|
3
3
|
#
|
4
4
|
# Tests for the custom Process.kill method
|
5
5
|
########################################################################
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require "win32/process"
|
7
|
+
require "test-unit"
|
8
8
|
|
9
9
|
class TC_Win32_Process_Kill < Test::Unit::TestCase
|
10
10
|
def self.startup
|
@@ -12,7 +12,7 @@ class TC_Win32_Process_Kill < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def setup
|
15
|
-
@ruby = RUBY_PLATFORM ==
|
15
|
+
@ruby = RUBY_PLATFORM == "java" ? "jruby" : "ruby"
|
16
16
|
@cmd = "#{@ruby} -e 'sleep 10'"
|
17
17
|
@pid = nil
|
18
18
|
end
|
@@ -22,7 +22,7 @@ class TC_Win32_Process_Kill < Test::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
|
24
24
|
test "kill with signal 0 does not actually send a signal" do
|
25
|
-
assert_nothing_raised{ Process.kill(0, Process.pid) }
|
25
|
+
assert_nothing_raised { Process.kill(0, Process.pid) }
|
26
26
|
end
|
27
27
|
|
28
28
|
test "kill with signal 0 returns 1 if the process exists" do
|
@@ -30,13 +30,13 @@ class TC_Win32_Process_Kill < Test::Unit::TestCase
|
|
30
30
|
end
|
31
31
|
|
32
32
|
test "kill with signal 0 raises an ESRCH error if any process does not exist" do
|
33
|
-
assert_raise(Errno::ESRCH){ Process.kill(0, 99999999) }
|
34
|
-
assert_raise(Errno::ESRCH){ Process.kill(0, Process.pid, 99999999) }
|
33
|
+
assert_raise(Errno::ESRCH) { Process.kill(0, 99999999) }
|
34
|
+
assert_raise(Errno::ESRCH) { Process.kill(0, Process.pid, 99999999) }
|
35
35
|
end
|
36
36
|
|
37
37
|
test "kill accepts multiple pid values" do
|
38
38
|
pid = Process.pid
|
39
|
-
assert_nothing_raised{ Process.kill(0, pid, pid, pid, pid) }
|
39
|
+
assert_nothing_raised { Process.kill(0, pid, pid, pid, pid) }
|
40
40
|
end
|
41
41
|
|
42
42
|
test "kill with any signal returns the number of killed processes" do
|
@@ -47,74 +47,79 @@ class TC_Win32_Process_Kill < Test::Unit::TestCase
|
|
47
47
|
|
48
48
|
test "kill accepts a string as a signal name" do
|
49
49
|
pid = Process.spawn(@cmd)
|
50
|
-
assert_nothing_raised{ Process.kill(
|
50
|
+
assert_nothing_raised { Process.kill("SIGKILL", pid) }
|
51
51
|
end
|
52
52
|
|
53
53
|
test "kill accepts a string without 'SIG' as a signal name" do
|
54
54
|
pid = Process.spawn(@cmd)
|
55
|
-
assert_nothing_raised{ Process.kill(
|
55
|
+
assert_nothing_raised { Process.kill("KILL", pid) }
|
56
56
|
end
|
57
57
|
|
58
58
|
test "kill accepts a symbol as a signal name" do
|
59
59
|
pid = Process.spawn(@cmd)
|
60
|
-
assert_nothing_raised{ Process.kill(:KILL, pid) }
|
60
|
+
assert_nothing_raised { Process.kill(:KILL, pid) }
|
61
61
|
end
|
62
62
|
|
63
63
|
test "kill coerces the pid to an integer" do
|
64
64
|
pid = Process.pid.to_f + 0.7
|
65
|
-
assert_nothing_raised{ Process.kill(0, pid) }
|
65
|
+
assert_nothing_raised { Process.kill(0, pid) }
|
66
66
|
end
|
67
67
|
|
68
68
|
test "an EINVAL error is raised on Windows if the signal is negative" do
|
69
69
|
@pid = Process.spawn(@cmd)
|
70
|
-
assert_raise(Errno::EINVAL){ Process.kill(-3, @pid) }
|
70
|
+
assert_raise(Errno::EINVAL) { Process.kill(-3, @pid) }
|
71
71
|
end
|
72
72
|
|
73
73
|
test "an EINVAL error is raised on Windows if the pid is 0 and it's not a SIGINT" do
|
74
|
-
assert_raise(Errno::EINVAL){ Process.kill(9, 0) }
|
74
|
+
assert_raise(Errno::EINVAL) { Process.kill(9, 0) }
|
75
75
|
end
|
76
76
|
|
77
|
-
test
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
# This test is busted under Ruby 3.x with current Windows versions
|
78
|
+
# The problem is on Windows, not the code or the test
|
79
|
+
# We're testing to see if we're under Buildkite and bypassing
|
80
|
+
if !defined?(ENV["BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"])
|
81
|
+
test "kill accepts BRK or SIGBRK as a signal name" do
|
82
|
+
pid = Process.spawn(@cmd)
|
83
|
+
assert_nothing_raised { Process.kill(:BRK, pid) }
|
84
|
+
assert_nothing_raised { Process.kill(:SIGBRK, pid) }
|
85
|
+
end
|
81
86
|
end
|
82
87
|
|
83
88
|
# We break from the spec here.
|
84
|
-
#test "an EINVAL error is raised if the pid is the current process and it's not a 0 or SIGKILL" do
|
89
|
+
# test "an EINVAL error is raised if the pid is the current process and it's not a 0 or SIGKILL" do
|
85
90
|
# assert_raise(Errno::EINVAL){ Process.kill(1, Process.pid) }
|
86
|
-
#end
|
91
|
+
# end
|
87
92
|
|
88
93
|
test "kill requires at least two arguments" do
|
89
|
-
assert_raise(ArgumentError){ Process.kill }
|
90
|
-
assert_raise(ArgumentError){ Process.kill(@pid) }
|
94
|
+
assert_raise(ArgumentError) { Process.kill }
|
95
|
+
assert_raise(ArgumentError) { Process.kill(@pid) }
|
91
96
|
end
|
92
97
|
|
93
98
|
test "the first argument to kill must be an integer or string" do
|
94
|
-
assert_raise(ArgumentError){ Process.kill([], 0) }
|
99
|
+
assert_raise(ArgumentError) { Process.kill([], 0) }
|
95
100
|
end
|
96
101
|
|
97
102
|
test "kill raises an ArgumentError if the signal name is invalid" do
|
98
|
-
assert_raise(ArgumentError){ Process.kill("BOGUS", 0) }
|
103
|
+
assert_raise(ArgumentError) { Process.kill("BOGUS", 0) }
|
99
104
|
end
|
100
105
|
|
101
106
|
test "kill does not accept lowercase signal names" do
|
102
|
-
assert_raise(ArgumentError){ Process.kill("kill", 0) }
|
107
|
+
assert_raise(ArgumentError) { Process.kill("kill", 0) }
|
103
108
|
end
|
104
109
|
|
105
110
|
test "kill raises an EINVAL error if the signal number is invalid" do
|
106
|
-
assert_raise(Errno::EINVAL){ Process.kill(999999, 0) }
|
111
|
+
assert_raise(Errno::EINVAL) { Process.kill(999999, 0) }
|
107
112
|
end
|
108
113
|
|
109
114
|
test "kill raises an TypeError if the pid value is not an integer" do
|
110
|
-
assert_raise(TypeError){ Process.kill(0, "BOGUS") }
|
115
|
+
assert_raise(TypeError) { Process.kill(0, "BOGUS") }
|
111
116
|
end
|
112
117
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
+
# TODO: Fix this
|
119
|
+
# test "kill raises an EPERM if user does not have proper privileges" do
|
120
|
+
# omit_if(Process.uid == 0)
|
121
|
+
# assert_raise(Errno::EPERM){ Process.kill(9, 1) }
|
122
|
+
# end
|
118
123
|
|
119
124
|
=begin
|
120
125
|
test "kill(0) can't tell if the process ended, use get_exitcode instead" do
|
data/win32-process.gemspec
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
+
require_relative "lib/win32/process/version"
|
2
|
+
|
1
3
|
Gem::Specification.new do |spec|
|
2
4
|
spec.name = "win32-process"
|
3
|
-
spec.version =
|
5
|
+
spec.version = Win32::Process::VERSION
|
4
6
|
spec.license = "Artistic-2.0"
|
5
7
|
spec.authors = ["Daniel Berger", "Park Heesob"]
|
6
8
|
spec.email = "djberg96@gmail.com"
|
7
9
|
spec.homepage = "https://github.com/chef/win32-process"
|
8
10
|
spec.summary = "Adds and redefines several Process methods for Microsoft Windows"
|
9
11
|
spec.test_files = Dir["test/*.rb"]
|
10
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(/^(\..*|Gemfile|Rakefile|examples|test|CHANGELOG.md)/) }
|
11
|
-
|
12
|
-
spec.extra_rdoc_files = ["README.md"]
|
12
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(/^(\..*|Gemfile|Rakefile|examples|test|CHANGELOG.md|README.md)/) }
|
13
13
|
|
14
|
-
spec.required_ruby_version = "
|
14
|
+
spec.required_ruby_version = ">= 2.7" # required for the use of Integer
|
15
15
|
spec.add_dependency("ffi", ">= 1.0.0")
|
16
16
|
|
17
17
|
spec.description = <<-EOF
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-process
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Berger
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -33,16 +33,16 @@ description: |2
|
|
33
33
|
email: djberg96@gmail.com
|
34
34
|
executables: []
|
35
35
|
extensions: []
|
36
|
-
extra_rdoc_files:
|
37
|
-
- README.md
|
36
|
+
extra_rdoc_files: []
|
38
37
|
files:
|
39
|
-
-
|
38
|
+
- VERSION
|
40
39
|
- lib/win32-process.rb
|
41
40
|
- lib/win32/process.rb
|
42
41
|
- lib/win32/process/constants.rb
|
43
42
|
- lib/win32/process/functions.rb
|
44
43
|
- lib/win32/process/helper.rb
|
45
44
|
- lib/win32/process/structs.rb
|
45
|
+
- lib/win32/process/version.rb
|
46
46
|
- test/test_win32_process.rb
|
47
47
|
- test/test_win32_process_kill.rb
|
48
48
|
- win32-process.gemspec
|
@@ -56,16 +56,16 @@ require_paths:
|
|
56
56
|
- lib
|
57
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '2.7'
|
62
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
64
|
- - ">="
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: '0'
|
67
67
|
requirements: []
|
68
|
-
rubygems_version: 3.1.
|
68
|
+
rubygems_version: 3.1.4
|
69
69
|
signing_key:
|
70
70
|
specification_version: 4
|
71
71
|
summary: Adds and redefines several Process methods for Microsoft Windows
|
data/README.md
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# win32-process
|
2
|
-
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/win32-process.svg)](https://badge.fury.io/rb/win32-process)
|
4
|
-
|
5
|
-
This library provides analogues of the :getpriority, :setpriority, :getrlimit, :setrlimit and :uid methods for MS Windows. It also adds the new methods :job?, :get_affinity, and :create, and redefines the :kill method.
|
6
|
-
|
7
|
-
## Prerequisites
|
8
|
-
|
9
|
-
- ffi
|
10
|
-
- sys-proctable (dev only)
|
11
|
-
- test-unit 2 (dev only)
|
12
|
-
|
13
|
-
## Supported Platforms
|
14
|
-
|
15
|
-
This library is supported on Windows 2000 or later.
|
16
|
-
|
17
|
-
## Installation
|
18
|
-
|
19
|
-
```
|
20
|
-
gem install win32-process
|
21
|
-
```
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
```ruby
|
26
|
-
require 'win32/process'
|
27
|
-
|
28
|
-
p Process.job? # => true or false
|
29
|
-
|
30
|
-
info = Process.create( :app_name => "notepad.exe", :creation_flags => Process::DETACHED_PROCESS, :process_inherit => false, :thread_inherit => true, :cwd => "C:\" )
|
31
|
-
|
32
|
-
p info.process_id
|
33
|
-
```
|
34
|
-
|
35
|
-
## Developer's Notes
|
36
|
-
|
37
|
-
### Removal of Process.fork in release 0.7.0
|
38
|
-
|
39
|
-
The Process.fork method was originally experimental but it has never been particularly useful in practice. On top of that, it required special implementations of the Process.waitXXX methods, so it was a maintenance issue as well.
|
40
|
-
|
41
|
-
With Ruby 1.9 now becoming standard and its addition of Process.spawn and friends (and concomitant support for the Process.waitXXX methods) I felt it was time to remove it.
|
42
|
-
|
43
|
-
You can still simulate Process.fork if you like using Process.create, which is how it was implemented internally anyway. A better solution might be to follow in the footsteps of ActiveState Perl, which uses native threads to simulate fork on Windows.
|
44
|
-
|
45
|
-
### Changes in the custom Process.kill method for 0.7.0
|
46
|
-
|
47
|
-
The Process.kill method in 0.7.0 more closely matches the spec now, but the internal method for killing processes is still nicer for most signals. With the release of 0.7.0 users can now specify options that provide finer control over how a process is killed. See the documentation for details.
|
48
|
-
|
49
|
-
## The removal of the custom Process.ppid method
|
50
|
-
|
51
|
-
This was added at some point in the Ruby 1.9 dev cycle so it was removed from this library.
|
52
|
-
|
53
|
-
## Known Issues
|
54
|
-
|
55
|
-
JRuby doesn't seem to like SIGBRK for Process.kill.
|
56
|
-
|
57
|
-
Any issues or bugs should be reported on the project page at <https://github.com/djberg96/win32-process>.
|
58
|
-
|
59
|
-
## License
|
60
|
-
|
61
|
-
Artistic 2.0
|
62
|
-
|
63
|
-
## Copyright
|
64
|
-
|
65
|
-
(C) 2003-2015 Daniel J. Berger All Rights Reserved
|
66
|
-
|
67
|
-
## Warranty
|
68
|
-
|
69
|
-
This library is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose.
|
70
|
-
|
71
|
-
## Author(s)
|
72
|
-
|
73
|
-
- Park Heesob
|
74
|
-
- Daniel J. Berger
|