r2corba 1.6.1-x64-mingw-ucrt

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 (237) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +173 -0
  3. data/LICENSE +59 -0
  4. data/README.rdoc +62 -0
  5. data/THANKS +54 -0
  6. data/bin/r2corba +8 -0
  7. data/bin/r2corba.bat +20 -0
  8. data/bin/ridlc +11 -0
  9. data/bin/ridlc.bat +23 -0
  10. data/bin/rins +7 -0
  11. data/bin/rins.bat +19 -0
  12. data/ext/.keep +0 -0
  13. data/lib/corba/cbase/IORMap.rb +32 -0
  14. data/lib/corba/cbase/ORB.rb +239 -0
  15. data/lib/corba/cbase/Request.rb +133 -0
  16. data/lib/corba/cbase/Streams.rb +128 -0
  17. data/lib/corba/cbase/Stub.rb +18 -0
  18. data/lib/corba/cbase/Typecode.rb +440 -0
  19. data/lib/corba/cbase/Values.rb +130 -0
  20. data/lib/corba/cbase/exception.rb +67 -0
  21. data/lib/corba/cbase/poa.rb +22 -0
  22. data/lib/corba/cbase/policies.rb +77 -0
  23. data/lib/corba/cbase/post_require.rb +13 -0
  24. data/lib/corba/cbase/require.rb +36 -0
  25. data/lib/corba/cmds/base.rb +84 -0
  26. data/lib/corba/cmds/test.rb +29 -0
  27. data/lib/corba/common/Any.rb +91 -0
  28. data/lib/corba/common/IDL.rb +100 -0
  29. data/lib/corba/common/ORB.rb +367 -0
  30. data/lib/corba/common/Object.rb +211 -0
  31. data/lib/corba/common/Request.rb +19 -0
  32. data/lib/corba/common/Servant.rb +107 -0
  33. data/lib/corba/common/Struct.rb +21 -0
  34. data/lib/corba/common/Stub.rb +78 -0
  35. data/lib/corba/common/Typecode.rb +1147 -0
  36. data/lib/corba/common/Union.rb +60 -0
  37. data/lib/corba/common/Values.rb +92 -0
  38. data/lib/corba/common/const.rb +21 -0
  39. data/lib/corba/common/exception.rb +68 -0
  40. data/lib/corba/common/require.rb +34 -0
  41. data/lib/corba/common/version.rb +21 -0
  42. data/lib/corba/idl/BiDirPolicyC.rb +62 -0
  43. data/lib/corba/idl/CosNamingC.rb +460 -0
  44. data/lib/corba/idl/CosNamingS.rb +308 -0
  45. data/lib/corba/idl/IDL.rb +20 -0
  46. data/lib/corba/idl/IORTable.pidl +61 -0
  47. data/lib/corba/idl/IORTableC.rb +116 -0
  48. data/lib/corba/idl/MessagingC.rb +903 -0
  49. data/lib/corba/idl/POAC.rb +929 -0
  50. data/lib/corba/idl/TAO_Ext.pidl +45 -0
  51. data/lib/corba/idl/TAO_ExtC.rb +178 -0
  52. data/lib/corba/idl/r2c_orb.rb +571 -0
  53. data/lib/corba/idl/require.rb +19 -0
  54. data/lib/corba/jbase/Any.rb +274 -0
  55. data/lib/corba/jbase/IORMap.rb +35 -0
  56. data/lib/corba/jbase/ORB.rb +111 -0
  57. data/lib/corba/jbase/Object.rb +98 -0
  58. data/lib/corba/jbase/Request.rb +225 -0
  59. data/lib/corba/jbase/Servant.rb +247 -0
  60. data/lib/corba/jbase/ServerRequest.rb +127 -0
  61. data/lib/corba/jbase/Streams.rb +734 -0
  62. data/lib/corba/jbase/Stub.rb +37 -0
  63. data/lib/corba/jbase/Typecode.rb +520 -0
  64. data/lib/corba/jbase/Values.rb +174 -0
  65. data/lib/corba/jbase/exception.rb +106 -0
  66. data/lib/corba/jbase/poa.rb +228 -0
  67. data/lib/corba/jbase/policies.rb +299 -0
  68. data/lib/corba/jbase/post_require.rb +13 -0
  69. data/lib/corba/jbase/require.rb +92 -0
  70. data/lib/corba/naming.rb +13 -0
  71. data/lib/corba/naming_service.rb +14 -0
  72. data/lib/corba/poa.rb +14 -0
  73. data/lib/corba/policies.rb +17 -0
  74. data/lib/corba/require.rb +16 -0
  75. data/lib/corba/svcs/ins/cos_naming.rb +432 -0
  76. data/lib/corba/svcs/ins/ins.rb +525 -0
  77. data/lib/corba/svcs/ins/naming_service.rb +118 -0
  78. data/lib/corba.rb +15 -0
  79. data/lib/ridlbe/ruby/config.rb +340 -0
  80. data/lib/ridlbe/ruby/orb.pidlc +0 -0
  81. data/lib/ridlbe/ruby/require.rb +15 -0
  82. data/lib/ridlbe/ruby/walker.rb +1605 -0
  83. data/mkrf_conf_bingem.rb +149 -0
  84. data/rakelib/bin.rake +79 -0
  85. data/rakelib/bin.rb +145 -0
  86. data/rakelib/build.rake +87 -0
  87. data/rakelib/config.rake +51 -0
  88. data/rakelib/config.rb +542 -0
  89. data/rakelib/ext.rake +183 -0
  90. data/rakelib/ext.rb +277 -0
  91. data/rakelib/ext_r2tao.rb +208 -0
  92. data/rakelib/gem.rake +251 -0
  93. data/rakelib/gem.rb +145 -0
  94. data/rakelib/package.rake +25 -0
  95. data/rakelib/test.rake +22 -0
  96. data/test/BiDirectional/Test.idl +33 -0
  97. data/test/BiDirectional/client.rb +131 -0
  98. data/test/BiDirectional/run_test.rb +67 -0
  99. data/test/BiDirectional/server.rb +167 -0
  100. data/test/CORBA_Services/Naming/BindingIterator/Test.idl +26 -0
  101. data/test/CORBA_Services/Naming/BindingIterator/client.rb +120 -0
  102. data/test/CORBA_Services/Naming/BindingIterator/run_test.rb +81 -0
  103. data/test/CORBA_Services/Naming/BindingIterator/server.rb +108 -0
  104. data/test/CORBA_Services/Naming/Corbaname/Test.idl +26 -0
  105. data/test/CORBA_Services/Naming/Corbaname/client.rb +84 -0
  106. data/test/CORBA_Services/Naming/Corbaname/run_test.rb +87 -0
  107. data/test/CORBA_Services/Naming/Corbaname/server.rb +134 -0
  108. data/test/CORBA_Services/Naming/Simple/Test.idl +26 -0
  109. data/test/CORBA_Services/Naming/Simple/client.rb +83 -0
  110. data/test/CORBA_Services/Naming/Simple/run_test.rb +81 -0
  111. data/test/CORBA_Services/Naming/Simple/server.rb +108 -0
  112. data/test/Collocation/Diamond.idl +38 -0
  113. data/test/Collocation/run_test.rb +51 -0
  114. data/test/Collocation/test.rb +201 -0
  115. data/test/Connect_Timeout/Test.idl +26 -0
  116. data/test/Connect_Timeout/client.rb +109 -0
  117. data/test/Connect_Timeout/run_test.rb +51 -0
  118. data/test/DII/Test.idl +26 -0
  119. data/test/DII/client.rb +114 -0
  120. data/test/DII/run_test.rb +68 -0
  121. data/test/DII/server.rb +94 -0
  122. data/test/DSI/Test.idl +26 -0
  123. data/test/DSI/client.rb +65 -0
  124. data/test/DSI/run_test.rb +68 -0
  125. data/test/DSI/server.rb +105 -0
  126. data/test/Exceptions/Test.idl +47 -0
  127. data/test/Exceptions/client.rb +117 -0
  128. data/test/Exceptions/run_test.rb +68 -0
  129. data/test/Exceptions/server.rb +130 -0
  130. data/test/Hello/Test.idl +26 -0
  131. data/test/Hello/client.rb +77 -0
  132. data/test/Hello/run_test.rb +70 -0
  133. data/test/Hello/server.rb +94 -0
  134. data/test/IDL_Test/Test.idl +116 -0
  135. data/test/IDL_Test/Test_inc.idl +17 -0
  136. data/test/IDL_Test/client.rb +103 -0
  137. data/test/IDL_Test/run_test.rb +68 -0
  138. data/test/IDL_Test/server.rb +103 -0
  139. data/test/IORMap/Test.idl +26 -0
  140. data/test/IORMap/client.rb +72 -0
  141. data/test/IORMap/run_test.rb +68 -0
  142. data/test/IORMap/server.rb +113 -0
  143. data/test/IORTable/Test.idl +26 -0
  144. data/test/IORTable/client.rb +74 -0
  145. data/test/IORTable/run_test.rb +68 -0
  146. data/test/IORTable/server.rb +129 -0
  147. data/test/Implicit_Conversion/Test.idl +30 -0
  148. data/test/Implicit_Conversion/client.rb +112 -0
  149. data/test/Implicit_Conversion/run_test.rb +68 -0
  150. data/test/Implicit_Conversion/server.rb +98 -0
  151. data/test/Multi_Threading/Multiple_ORB/Test.idl +26 -0
  152. data/test/Multi_Threading/Multiple_ORB/client.rb +81 -0
  153. data/test/Multi_Threading/Multiple_ORB/run_test.rb +70 -0
  154. data/test/Multi_Threading/Multiple_ORB/server.rb +107 -0
  155. data/test/Multi_Threading/Simple/Test.idl +26 -0
  156. data/test/Multi_Threading/Simple/client.rb +92 -0
  157. data/test/Multi_Threading/Simple/run_test.rb +68 -0
  158. data/test/Multi_Threading/Simple/server.rb +117 -0
  159. data/test/Multi_Threading/Threads/Test.idl +27 -0
  160. data/test/Multi_Threading/Threads/client.rb +77 -0
  161. data/test/Multi_Threading/Threads/run_test.rb +75 -0
  162. data/test/Multi_Threading/Threads/server.rb +116 -0
  163. data/test/Multi_Threading/Threads/watchdog.rb +87 -0
  164. data/test/Multiple_Servant_Interfaces/Test.idl +33 -0
  165. data/test/Multiple_Servant_Interfaces/client.rb +69 -0
  166. data/test/Multiple_Servant_Interfaces/run_test.rb +68 -0
  167. data/test/Multiple_Servant_Interfaces/server.rb +101 -0
  168. data/test/Nil/Test.idl +26 -0
  169. data/test/Nil/run_test.rb +51 -0
  170. data/test/Nil/test.rb +80 -0
  171. data/test/OBV/AbstractInterface/client.rb +178 -0
  172. data/test/OBV/AbstractInterface/run_test.rb +68 -0
  173. data/test/OBV/AbstractInterface/server.rb +149 -0
  174. data/test/OBV/AbstractInterface/test.idl +52 -0
  175. data/test/OBV/Custom/OBV.idl +18 -0
  176. data/test/OBV/Custom/OBV_impl.rb +41 -0
  177. data/test/OBV/Custom/client.rb +85 -0
  178. data/test/OBV/Custom/run_test.rb +68 -0
  179. data/test/OBV/Custom/server.rb +99 -0
  180. data/test/OBV/Simple/OBV.idl +15 -0
  181. data/test/OBV/Simple/OBV_impl.rb +26 -0
  182. data/test/OBV/Simple/client.rb +85 -0
  183. data/test/OBV/Simple/run_test.rb +68 -0
  184. data/test/OBV/Simple/server.rb +99 -0
  185. data/test/OBV/Simple_Event/Event.idl +15 -0
  186. data/test/OBV/Simple_Event/Event_impl.rb +26 -0
  187. data/test/OBV/Simple_Event/client.rb +85 -0
  188. data/test/OBV/Simple_Event/run_test.rb +68 -0
  189. data/test/OBV/Simple_Event/server.rb +99 -0
  190. data/test/OBV/Supports/client.rb +115 -0
  191. data/test/OBV/Supports/run_test.rb +68 -0
  192. data/test/OBV/Supports/server.rb +102 -0
  193. data/test/OBV/Supports/supports.idl +32 -0
  194. data/test/OBV/Supports/supports_impl.rb +59 -0
  195. data/test/OBV/Tree/client.rb +115 -0
  196. data/test/OBV/Tree/run_test.rb +68 -0
  197. data/test/OBV/Tree/server.rb +116 -0
  198. data/test/OBV/Tree/test.idl +31 -0
  199. data/test/OBV/Truncatable/Extra.idl +26 -0
  200. data/test/OBV/Truncatable/Truncatable.idl +105 -0
  201. data/test/OBV/Truncatable/Truncatable_impl.rb +85 -0
  202. data/test/OBV/Truncatable/client.rb +278 -0
  203. data/test/OBV/Truncatable/run_test.rb +68 -0
  204. data/test/OBV/Truncatable/server.rb +88 -0
  205. data/test/OBV/ValueBox/client.rb +497 -0
  206. data/test/OBV/ValueBox/run_test.rb +68 -0
  207. data/test/OBV/ValueBox/server.rb +271 -0
  208. data/test/OBV/ValueBox/valuebox.idl +101 -0
  209. data/test/OBV/ValueBox/vb_basic.idl +75 -0
  210. data/test/OBV/ValueBox/vb_struct.idl +68 -0
  211. data/test/OBV/ValueBox/vb_union.idl +21 -0
  212. data/test/Object/Test.idl +26 -0
  213. data/test/Object/client.rb +111 -0
  214. data/test/Object/run_test.rb +68 -0
  215. data/test/Object/server.rb +125 -0
  216. data/test/POA/Test.idl +27 -0
  217. data/test/POA/run_test.rb +51 -0
  218. data/test/POA/test.rb +111 -0
  219. data/test/Param_Test/Test.idl +182 -0
  220. data/test/Param_Test/client.rb +276 -0
  221. data/test/Param_Test/run_test.rb +68 -0
  222. data/test/Param_Test/server.rb +295 -0
  223. data/test/Performance/Simple/Test.idl +26 -0
  224. data/test/Performance/Simple/client.rb +89 -0
  225. data/test/Performance/Simple/run_test.rb +68 -0
  226. data/test/Performance/Simple/server.rb +94 -0
  227. data/test/Policies/Test.idl +26 -0
  228. data/test/Policies/run_test.rb +51 -0
  229. data/test/Policies/test.rb +142 -0
  230. data/test/Timeout/client.rb +206 -0
  231. data/test/Timeout/run_test.rb +68 -0
  232. data/test/Timeout/server.rb +108 -0
  233. data/test/Timeout/test.idl +18 -0
  234. data/test/lib/assert.rb +41 -0
  235. data/test/lib/test.rb +546 -0
  236. data/test/test_runner.rb +191 -0
  237. metadata +318 -0
data/test/lib/test.rb ADDED
@@ -0,0 +1,546 @@
1
+ #--------------------------------------------------------------------
2
+ # test.rb - Test running utils
3
+ #
4
+ # Author: Martin Corino
5
+ #
6
+ # This program is free software; you can redistribute it and/or
7
+ # modify it under the terms of the R2CORBA LICENSE which is
8
+ # included with this program.
9
+ #
10
+ # Copyright (c) Remedy IT Expertise BV
11
+ #--------------------------------------------------------------------
12
+
13
+ require 'rbconfig'
14
+
15
+ module TestUtil
16
+
17
+ if defined? RbConfig
18
+ RB_CONFIG = RbConfig::CONFIG
19
+ else
20
+ RB_CONFIG = Config::CONFIG
21
+ end
22
+
23
+ def self.is_win32?
24
+ (RB_CONFIG['target_os'] =~ /win32/ || RB_CONFIG['target_os'] =~ /mingw/) ? true : false
25
+ end
26
+
27
+ RBVersion = RUBY_VERSION.split('.').collect {|x| x.to_i}
28
+ end
29
+
30
+
31
+ if defined?(JRUBY_VERSION)
32
+ require 'ffi'
33
+ elsif TestUtil::is_win32?
34
+ unless TestUtil::RBVersion[0] >= 2 || TestUtil::RBVersion[1] > 8
35
+ # get Win32 Process support
36
+ require 'rubygems'
37
+ gem 'windows-pr', '>= 1.2.2'
38
+ require 'windows/api'
39
+ require 'windows/process'
40
+ require 'windows/error'
41
+ require 'windows/library'
42
+ require 'windows/console'
43
+ require 'windows/handle'
44
+ require 'windows/synchronize'
45
+ require 'windows/thread'
46
+ end
47
+ end
48
+
49
+ module TestUtil
50
+
51
+ class ProcessError < RuntimeError; end
52
+
53
+ if defined?(JRUBY_VERSION)
54
+ class Process
55
+ JRUBY_CMD = File.join(RB_CONFIG['bindir'], RB_CONFIG['RUBY_INSTALL_NAME']).sub(/.*\s.*/m, '"\&"')
56
+ protected
57
+ module Exec
58
+ extend FFI::Library
59
+ ffi_lib 'c'
60
+
61
+ if TestUtil::is_win32?
62
+
63
+ # intptr_t _spawnvpe(int mode,
64
+ # const char *cmdname,
65
+ # const char *const *argv,
66
+ # const char *const *envp);
67
+
68
+ attach_function :_spawnvpe, :_spawnvpe, [:int, :string, :pointer, :pointer], :pointer
69
+
70
+ P_NOWAIT = 1
71
+
72
+ # intptr_t _cwait(int *termstat,
73
+ # intptr_t procHandle,
74
+ # int action);
75
+
76
+ attach_function :_wait, :_cwait, [:pointer, :pointer, :int], :pointer
77
+
78
+ module Kernel32
79
+ extend FFI::Library
80
+ ffi_lib 'kernel32'
81
+ ffi_convention :stdcall
82
+
83
+ attach_function :terminate_process, :TerminateProcess, [:pointer, :uint], :int
84
+ end
85
+
86
+ def self.run(cmd, args)
87
+ argv = ['cmd', '/c']
88
+ argv << "cd #{Dir.getwd.gsub('/', '\\')} && #{Process::JRUBY_CMD} #{$VERBOSE ? '-v' : ''} #{cmd} #{args}"
89
+ spawnp(*argv)
90
+ end
91
+
92
+ def self.spawnp(*args)
93
+ spawn_args = _prepare_spawn_args(args)
94
+ _spawnvpe(*spawn_args)
95
+ end
96
+
97
+ def self.stop(pid)
98
+ kill(pid)
99
+ end
100
+
101
+ def self.kill(pid)
102
+ Kernel32.terminate_process(pid, 0) if pid
103
+ end
104
+
105
+ def self.wait(pid)
106
+ stat_ptr = FFI::MemoryPointer.new(:int, 1)
107
+ tmp_pid = _wait(stat_ptr, pid, 0)
108
+ if tmp_pid == pid
109
+ return [pid, stat_ptr.get_int()]
110
+ else
111
+ return [pid, 0]
112
+ end
113
+ end
114
+
115
+ private
116
+
117
+ def self._prepare_spawn_args(args)
118
+ args_ary = FFI::MemoryPointer.new(:pointer, args.length + 1)
119
+ str_ptrs = args.map {|str| FFI::MemoryPointer.from_string(str)}
120
+ args_ary.put_array_of_pointer(0, str_ptrs)
121
+
122
+ env_ary = FFI::MemoryPointer.new(:pointer, ENV.length + 1)
123
+ env_ptrs = ENV.map {|key, value| FFI::MemoryPointer.from_string("#{key}=#{value}")}
124
+ env_ary.put_array_of_pointer(0, env_ptrs)
125
+
126
+ [P_NOWAIT, args[0], args_ary, env_ary]
127
+ end
128
+ else
129
+ # Extracted from the Spoon gem by Charles Oliver Nutter
130
+
131
+ # int
132
+ # posix_spawnp(pid_t *restrict pid, const char *restrict path,
133
+ # const posix_spawn_file_actions_t *file_actions,
134
+ # const posix_spawnattr_t *restrict attrp, char *const argv[restrict],
135
+ # char *const envp[restrict]);
136
+
137
+ attach_function :_posix_spawnp, :posix_spawnp, [:pointer, :string, :pointer, :pointer, :pointer, :pointer], :int
138
+
139
+ def self.run(cmd, args)
140
+ argv = ['sh', '-c']
141
+ argv << "cd #{Dir.getwd} && #{Process::JRUBY_CMD} #{$VERBOSE ? '-v' : ''} #{cmd} #{args}"
142
+ spawnp(*argv)
143
+ end
144
+
145
+ def self.spawnp(*args)
146
+ spawn_args = _prepare_spawn_args(args)
147
+ _posix_spawnp(*spawn_args)
148
+ spawn_args[0].read_int
149
+ end
150
+
151
+ def self.stop(pid)
152
+ ::Process.kill('TERM', pid) if pid
153
+ end
154
+
155
+ def self.kill(pid)
156
+ ::Process.kill('KILL', pid) if pid
157
+ end
158
+
159
+ def self.wait(pid)
160
+ begin
161
+ tmp, status = ::Process.waitpid2(pid, ::Process::WNOHANG)
162
+ if tmp == pid and status.success? != nil
163
+ return [pid, status.success?() ? 0 : status.exitstatus]
164
+ end
165
+ return [nil, 0]
166
+ rescue Errno::ECHILD
167
+ return [pid, 0]
168
+ end
169
+ end
170
+
171
+ private
172
+
173
+ def self._prepare_spawn_args(args)
174
+ pid_ptr = FFI::MemoryPointer.new(:pid_t, 1)
175
+
176
+ args_ary = FFI::MemoryPointer.new(:pointer, args.length + 1)
177
+ str_ptrs = args.map {|str| FFI::MemoryPointer.from_string(str)}
178
+ args_ary.put_array_of_pointer(0, str_ptrs)
179
+
180
+ env_ary = FFI::MemoryPointer.new(:pointer, ENV.length + 1)
181
+ env_ptrs = ENV.map {|key, value| FFI::MemoryPointer.from_string("#{key}=#{value}")}
182
+ env_ary.put_array_of_pointer(0, env_ptrs)
183
+
184
+ [pid_ptr, args[0], nil, nil, args_ary, env_ary]
185
+ end
186
+ end
187
+ end
188
+
189
+ def initialize(cmd_, arg_)
190
+ @pid = nil
191
+ @exitstatus = nil
192
+ @trd = Thread.start() do
193
+ exit_status = 0
194
+ @pid = Exec.run(cmd_, arg_)
195
+ if @pid
196
+ is_running = true
197
+ while is_running
198
+ sleep 0.01
199
+
200
+ tmp_pid, tmp_status = Exec.wait(@pid)
201
+ if tmp_pid == @pid
202
+ exit_status = tmp_status
203
+ is_running = false
204
+ end
205
+ end
206
+ end
207
+ exit_status
208
+ end
209
+ end
210
+ public
211
+ private_class_method :new
212
+
213
+ def Process.run(cmd_, arg_)
214
+ proc = new(cmd_, arg_)
215
+ sleep(0.1)
216
+ proc.check_status
217
+ return proc
218
+ end
219
+
220
+ def pid
221
+ @pid
222
+ end
223
+
224
+ def check_status
225
+ begin
226
+ unless @trd.alive?
227
+ @exitstatus = @trd.value
228
+ end
229
+ return @trd.alive?
230
+ rescue
231
+ @exitstatus = 0
232
+ return false
233
+ end
234
+ end
235
+
236
+ def exitstatus
237
+ @exitstatus
238
+ end
239
+
240
+ def is_running?; @exitstatus.nil?; end
241
+
242
+ def has_error? ; @trd.status.nil? or (!self.is_running? and self.exitstatus != 0) ;end
243
+
244
+ def stop
245
+ Exec.stop(@pid)
246
+ end
247
+
248
+ def kill
249
+ Exec.kill(@pid)
250
+ end
251
+ end # Process
252
+ elsif is_win32? && TestUtil::RBVersion[0] < 2 && TestUtil::RBVersion[1] < 9
253
+ class Process
254
+ include Windows::Error
255
+ include Windows::Library
256
+ include Windows::Console
257
+ include Windows::Handle
258
+ include Windows::Synchronize
259
+ include Windows::Thread
260
+ extend Windows::Error
261
+ extend Windows::Library
262
+ extend Windows::Console
263
+ extend Windows::Handle
264
+ extend Windows::Synchronize
265
+ extend Windows::Thread
266
+
267
+ protected
268
+ # Used by Process.create
269
+ ProcessInfo = Struct.new('ProcessInfo',
270
+ :process_handle,
271
+ :thread_handle,
272
+ :process_id,
273
+ :thread_id
274
+ )
275
+
276
+ module WinAPI
277
+ Windows::API.auto_namespace = 'TestUtil::Process::WinAPI'
278
+ Windows::API.auto_constant = true
279
+ Windows::API.auto_method = true
280
+ Windows::API.auto_unicode = true
281
+
282
+ STILL_ACTIVE = 259
283
+
284
+ Windows::API.new('CreateProcess', 'PPPPLLLPPP', 'B')
285
+ Windows::API.new('GetExitCodeProcess', 'LP', 'B')
286
+ end
287
+
288
+ include WinAPI
289
+ extend WinAPI
290
+
291
+ def Process.create(cmd_)
292
+ startinfo = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
293
+ startinfo = startinfo.pack('LLLLLLLLLLLLSSLLLL')
294
+ procinfo = [0, 0, 0, 0].pack('LLLL')
295
+
296
+ bool = CreateProcess(
297
+ 0, # App name
298
+ cmd_, # Command line
299
+ 0, # Process attributes
300
+ 0, # Thread attributes
301
+ 1, # Inherit handles?
302
+ 0, # Creation flags
303
+ 0, # Environment
304
+ 0, # Working directory
305
+ startinfo, # Startup Info
306
+ procinfo # Process Info
307
+ )
308
+
309
+ unless bool
310
+ raise ProcessError, 'CreateProcess() failed: ', get_last_error
311
+ end
312
+
313
+ ProcessInfo.new(
314
+ procinfo[0, 4].unpack('L').first, # hProcess
315
+ procinfo[4, 4].unpack('L').first, # hThread
316
+ procinfo[8, 4].unpack('L').first, # hProcessId
317
+ procinfo[12, 4].unpack('L').first # hThreadId
318
+ )
319
+ end
320
+
321
+ def Process.waitpi(pi_)
322
+ exit_code = [0].pack('L')
323
+ if GetExitCodeProcess(pi_.process_handle, exit_code)
324
+ exit_code = exit_code.unpack('L').first
325
+ return exit_code == STILL_ACTIVE ? nil : exit_code
326
+ else
327
+ CloseHandle(pi_.process_handle) unless pi_.process_handle == INVALID_HANDLE_VALUE
328
+ pi_.process_handle = INVALID_HANDLE_VALUE
329
+ raise ProcessError, 'GetExitCodeProcess failed: ', get_last_error
330
+ end
331
+ end
332
+
333
+ def Process.stop(pi_)
334
+ if pi_.process_handle != INVALID_HANDLE_VALUE
335
+ thread_id = [0].pack('L')
336
+ dll = 'kernel32'
337
+ proc = 'ExitProcess'
338
+
339
+ mh = GetModuleHandle(dll)
340
+ pa = GetProcAddress(mh, proc)
341
+ thread = CreateRemoteThread(
342
+ pi_.process_handle,
343
+ 0,
344
+ 0,
345
+ pa,
346
+ 0,
347
+ 0,
348
+ thread_id
349
+ )
350
+
351
+ if thread
352
+ WaitForSingleObject(thread, 5)
353
+ CloseHandle(pi_.process_handle)
354
+ pi_.process_handle = INVALID_HANDLE_VALUE
355
+ else
356
+ CloseHandle(pi_.process_handle)
357
+ pi_.process_handle = INVALID_HANDLE_VALUE
358
+ raise ProcessError, get_last_error
359
+ end
360
+ end
361
+ end
362
+
363
+ def Process.kill(pi_)
364
+ if pi_.process_handle != INVALID_HANDLE_VALUE
365
+ if TerminateProcess(pi_.process_handle, pi_.process_id)
366
+ CloseHandle(pi_.process_handle)
367
+ pi_.process_handle = INVALID_HANDLE_VALUE
368
+ else
369
+ CloseHandle(pi_.process_handle)
370
+ pi_.process_handle = INVALID_HANDLE_VALUE
371
+ raise ProcessError, get_last_error
372
+ end
373
+ end
374
+ end
375
+
376
+ def initialize(pi_)
377
+ @pi = pi_
378
+ @exitstatus = nil
379
+ end
380
+ public
381
+ private_class_method :new
382
+ def Process.run(cmd_, arg_)
383
+ pi = self.create("#{RB_CONFIG['RUBY_INSTALL_NAME']} #{$VERBOSE ? '-v' : ''} #{cmd_} #{arg_}")
384
+ proc = new(pi)
385
+ sleep(0.1)
386
+ proc.check_status
387
+ return proc
388
+ end
389
+
390
+ def pid; @pi.process_id; end
391
+
392
+ def check_status
393
+ @exitstatus ||= self.class.waitpi(@pi)
394
+ return @exitstatus.nil?
395
+ end
396
+
397
+ def exitstatus; @exitstatus; end
398
+
399
+ def is_running?; @exitstatus.nil?; end
400
+
401
+ def has_error?; !@exitstatus.nil? and (@exitstatus != 0); end
402
+
403
+ def stop
404
+ self.class.stop(@pi)
405
+ @exitstatus = 0
406
+ end
407
+
408
+ def kill
409
+ self.class.kill(@pi)
410
+ end
411
+ end # Process
412
+ else # !win32
413
+ class Process
414
+ protected
415
+ def initialize(pid_)
416
+ @pid = pid_
417
+ @status = nil
418
+ @exitstatus = nil
419
+ end
420
+ public
421
+ private_class_method :new
422
+ unless TestUtil::RBVersion[0] >= 2 || TestUtil::RBVersion[1] > 8
423
+ def Process.run(cmd_, arg_)
424
+ pid = ::Process.fork do
425
+ ::Kernel.exec("#{RB_CONFIG['RUBY_INSTALL_NAME']} #{$VERBOSE ? '-v' : ''} #{cmd_} #{arg_}")
426
+ end
427
+ proc = new(pid)
428
+ sleep(0.1)
429
+ proc.check_status
430
+ return proc
431
+ end
432
+ else
433
+ def Process.run(cmd_, arg_)
434
+ pid = ::Kernel.spawn("#{RB_CONFIG['RUBY_INSTALL_NAME']} #{$VERBOSE ? '-v' : ''} #{cmd_} #{arg_}")
435
+ proc = new(pid)
436
+ sleep(0.1)
437
+ proc.check_status
438
+ return proc
439
+ end
440
+ end
441
+
442
+ attr_reader :pid
443
+
444
+ def check_status
445
+ begin
446
+ tmp, @status = ::Process.waitpid2(@pid, ::Process::WNOHANG)
447
+ if tmp == @pid and @status.success? == false
448
+ @exitstatus = @status.exitstatus
449
+ return false
450
+ end
451
+ return true
452
+ rescue Errno::ECHILD
453
+ @exitstatus = 0
454
+ return false
455
+ end
456
+ end
457
+
458
+ def exitstatus
459
+ @exitstatus
460
+ end
461
+
462
+ def is_running?; @exitstatus.nil?; end
463
+
464
+ def has_error?; !@status.nil? and (@status.success? == false); end
465
+
466
+ def stop
467
+ ::Process.kill('SIGTERM', @pid)
468
+ end
469
+
470
+ def kill
471
+ ::Process.kill('SIGKILL', @pid)
472
+ end
473
+ end # Process
474
+ end
475
+
476
+ class Test
477
+ def initialize
478
+ @proc = nil
479
+ @cmd = ''
480
+ end
481
+
482
+ def run(cmd_, arg_)
483
+ @cmd = cmd_
484
+ begin
485
+ @proc = Process.run(cmd_, arg_)
486
+ rescue ProcessError
487
+ STDERR.puts "ERROR: failed to run <#{@cmd}>"
488
+ return false
489
+ end
490
+ true
491
+ end
492
+
493
+ def pid; @proc.pid; end
494
+
495
+ def is_running?; @proc.is_running?; end
496
+
497
+ def exit_status; @proc.exitstatus; end
498
+
499
+ def wait(timeout, check_exit = true)
500
+ t = Time.now
501
+ begin
502
+ if @proc.check_status
503
+ if (Time.now() - t) >= timeout.to_f
504
+ STDERR.puts "ERROR: KILLING #{@cmd}"
505
+ @proc.kill
506
+ return 255
507
+ end
508
+ sleep(0.1)
509
+ end
510
+ end until !@proc.is_running?
511
+ if check_exit && @proc.has_error?
512
+ STDERR.puts "ERROR: #{@cmd} returned: #{@proc.exitstatus}"
513
+ return @proc.exitstatus != 0 ? @proc.exitstatus : 255
514
+ end
515
+ return 0
516
+ end
517
+
518
+ def wait_term(timeout)
519
+ @proc.stop
520
+ self.wait(timeout, false)
521
+ end
522
+
523
+ def kill(timeout)
524
+ @proc.kill
525
+ self.wait(timeout, false)
526
+ end
527
+
528
+ end
529
+
530
+ def TestUtil.wait_for_file(filename, timeout)
531
+ t = Time.now
532
+ while !File.readable?(filename)
533
+ sleep(0.1)
534
+ if (Time.now() - t) >= timeout.to_f
535
+ STDERR.puts "ERROR: could not find file '#{filename}'"
536
+ return false
537
+ end
538
+ end
539
+ true
540
+ end
541
+
542
+ def TestUtil.remove_file(filename)
543
+ File.delete(filename) if File.exist?(filename)
544
+ end
545
+
546
+ end