vcs 0.1 → 0.2.148

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 (132) hide show
  1. data/Rakefile +17 -3
  2. data/bin/vcs +57 -34
  3. data/doc/jamis.rb +564 -0
  4. data/ruby_ex/abstract.rb +254 -0
  5. data/ruby_ex/abstract_node.rb +85 -0
  6. data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
  7. data/ruby_ex/array_each_pair.rb +18 -0
  8. data/ruby_ex/ask.rb +101 -0
  9. data/ruby_ex/attributed_class.rb +302 -0
  10. data/ruby_ex/cache.rb +373 -0
  11. data/ruby_ex/checkout.rb +12 -0
  12. data/ruby_ex/choose.rb +271 -0
  13. data/ruby_ex/commands.rb +18 -0
  14. data/ruby_ex/commands/command.rb +401 -0
  15. data/ruby_ex/commands/datas.rb +16 -0
  16. data/ruby_ex/commands/datas/data.rb +33 -0
  17. data/ruby_ex/commands/datas/factory.rb +66 -0
  18. data/ruby_ex/commands/factory.rb +66 -0
  19. data/ruby_ex/commands/helpers.rb +67 -0
  20. data/ruby_ex/commands/pipe.rb +64 -0
  21. data/ruby_ex/commands/runners.rb +17 -0
  22. data/ruby_ex/commands/runners/exec.rb +49 -0
  23. data/ruby_ex/commands/runners/fork.rb +97 -0
  24. data/ruby_ex/commands/runners/runner.rb +107 -0
  25. data/ruby_ex/commands/seq.rb +27 -0
  26. data/ruby_ex/config_file.rb +96 -0
  27. data/ruby_ex/const_regexp.rb +59 -0
  28. data/ruby_ex/daemon.rb +134 -0
  29. data/ruby_ex/diff.rb +667 -0
  30. data/ruby_ex/dlogger.rb +62 -0
  31. data/ruby_ex/drb/dispatcher.rb +252 -0
  32. data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
  33. data/ruby_ex/drb/drb_observable.rb +97 -0
  34. data/ruby_ex/drb/drb_observable_pool.rb +27 -0
  35. data/ruby_ex/drb/drb_service.rb +43 -0
  36. data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
  37. data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
  38. data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
  39. data/ruby_ex/drb/session_client_test.rb +40 -0
  40. data/ruby_ex/drb/session_manager.rb +246 -0
  41. data/ruby_ex/drb/session_server.rb +53 -0
  42. data/ruby_ex/dtime.rb +143 -0
  43. data/ruby_ex/dumpable_proc.rb +63 -0
  44. data/ruby_ex/exception.rb +32 -0
  45. data/ruby_ex/filetype.rb +229 -0
  46. data/ruby_ex/fileutils_ex.rb +44 -0
  47. data/ruby_ex/fold.rb +58 -0
  48. data/ruby_ex/generate_id.rb +44 -0
  49. data/ruby_ex/hookable.rb +262 -0
  50. data/ruby_ex/hooker.rb +54 -0
  51. data/ruby_ex/inactive_timeout.rb +137 -0
  52. data/ruby_ex/indexed_node.rb +66 -0
  53. data/ruby_ex/io_marshal.rb +100 -0
  54. data/ruby_ex/ioo.rb +194 -0
  55. data/ruby_ex/labeled_node.rb +63 -0
  56. data/ruby_ex/logger_observer.rb +23 -0
  57. data/ruby_ex/md5sum.rb +66 -0
  58. data/ruby_ex/mktemp.rb +208 -0
  59. data/ruby_ex/module/attr_once.rb +36 -0
  60. data/ruby_ex/module/autoload_tree.rb +75 -0
  61. data/ruby_ex/module/hierarchy.rb +335 -0
  62. data/ruby_ex/module/instance_method_visibility.rb +73 -0
  63. data/ruby_ex/module_ex.rb +11 -0
  64. data/ruby_ex/node.rb +80 -0
  65. data/ruby_ex/object_monitor.rb +145 -0
  66. data/ruby_ex/object_monitor_activity.rb +33 -0
  67. data/ruby_ex/observable.rb +140 -0
  68. data/ruby_ex/observable_pool.rb +293 -0
  69. data/ruby_ex/orderedhash.rb +252 -0
  70. data/ruby_ex/pathname_ex.rb +152 -0
  71. data/ruby_ex/pp_hierarchy.rb +29 -0
  72. data/ruby_ex/pseudo_cache.rb +190 -0
  73. data/ruby_ex/queue.rb +56 -0
  74. data/ruby_ex/random_generators.rb +25 -0
  75. data/ruby_ex/random_generators/random_generator.rb +31 -0
  76. data/ruby_ex/random_generators/ruby.rb +23 -0
  77. data/ruby_ex/safe_eval.rb +348 -0
  78. data/ruby_ex/sendmail.rb +215 -0
  79. data/ruby_ex/service_manager.rb +121 -0
  80. data/ruby_ex/session/administrable.rb +120 -0
  81. data/ruby_ex/session/client.rb +153 -0
  82. data/ruby_ex/session/const.rb +18 -0
  83. data/ruby_ex/session/dispatcher.rb +184 -0
  84. data/ruby_ex/session/error.rb +21 -0
  85. data/ruby_ex/session/fetchable.rb +57 -0
  86. data/ruby_ex/session/fetcher.rb +62 -0
  87. data/ruby_ex/session/hookable.rb +26 -0
  88. data/ruby_ex/session/profile.rb +110 -0
  89. data/ruby_ex/session/server.rb +582 -0
  90. data/ruby_ex/session/test/administrable_test.rb +337 -0
  91. data/ruby_ex/session/test/basic_test.rb +523 -0
  92. data/ruby_ex/session/test/dispatcher_test.rb +409 -0
  93. data/ruby_ex/session/test/fetchable_test.rb +119 -0
  94. data/ruby_ex/session/test/sub_server_test.rb +188 -0
  95. data/ruby_ex/shuffle.rb +30 -0
  96. data/ruby_ex/spring.rb +136 -0
  97. data/ruby_ex/spring_set.rb +137 -0
  98. data/ruby_ex/string_ex.rb +28 -0
  99. data/ruby_ex/symtbl.rb +106 -0
  100. data/ruby_ex/synflow.rb +474 -0
  101. data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
  102. data/ruby_ex/thread_mutex.rb +10 -0
  103. data/ruby_ex/timeout_ex.rb +81 -0
  104. data/ruby_ex/top_down.rb +73 -0
  105. data/ruby_ex/trace.rb +26 -0
  106. data/ruby_ex/uri/druby.rb +81 -0
  107. data/ruby_ex/uri/file.rb +65 -0
  108. data/ruby_ex/uri/ftp_ex.rb +37 -0
  109. data/ruby_ex/uri/http_ex.rb +43 -0
  110. data/ruby_ex/uri/ssh.rb +92 -0
  111. data/ruby_ex/uri/svn.rb +118 -0
  112. data/ruby_ex/uri_ex.rb +45 -0
  113. data/ruby_ex/verbose_object.rb +30 -0
  114. data/ruby_ex/version.rb +66 -0
  115. data/ruby_ex/yaml/basenode_ext.rb +63 -0
  116. data/ruby_ex/yaml/chop_header.rb +23 -0
  117. data/ruby_ex/yaml/transform.rb +449 -0
  118. data/ruby_ex/yaml/yregexpath.rb +76 -0
  119. data/src/changelog.rb +28 -18
  120. data/src/conflict.rb +20 -0
  121. data/src/diff.rb +18 -0
  122. data/src/diffstat.rb +9 -3
  123. data/src/last_changed_date.rb +18 -0
  124. data/src/mail.rb +33 -65
  125. data/src/message.rb +15 -9
  126. data/src/mycommit.rb +29 -14
  127. data/src/news.rb +24 -3
  128. data/src/status.rb +17 -0
  129. data/src/svn.rb +2 -2
  130. data/src/vcs.rb +24 -3
  131. metadata +124 -5
  132. data/lrdetools.rb +0 -12
@@ -0,0 +1,43 @@
1
+ # Author:: Nicolas Despres <nicolas.despres@epita.fr>.
2
+ # Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: drb_service.rb 137 2005-01-28 17:41:56Z polrop $
7
+
8
+
9
+ require 'drb/drb'
10
+
11
+
12
+ module DRb
13
+
14
+ class DRbService
15
+ include DRbUndumped
16
+
17
+ def initialize(config={})
18
+ @config = config
19
+ @server = nil
20
+ @uri = nil
21
+ @front = nil
22
+ end
23
+
24
+ attr_reader :server, :uri, :front
25
+
26
+ def start_service(uri)
27
+ @server = DRb.start_service(uri.nil? ? uri : uri.to_s, @front, @config)
28
+ @uri = URI.parse(@server.uri)
29
+ end
30
+
31
+ def stop_service
32
+ @server.stop_service if @server
33
+ end
34
+
35
+ def thread
36
+ @server.thread if @server
37
+ end
38
+
39
+ end # class DRbService
40
+
41
+ end # module DRb
42
+
43
+
@@ -0,0 +1,55 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: drb_undumped_attributes.rb 88 2005-01-09 21:11:26Z polrop $
7
+
8
+
9
+ require 'drb/drb'
10
+
11
+
12
+ module DRb
13
+
14
+ module DRbUndumpedAttributes
15
+
16
+ def DRbUndumpedAttributes.append_features(cl)
17
+ super
18
+ cl.module_eval do
19
+
20
+ def _dump(depth)
21
+ if self.class.include?(DRb::DRbUndumped)
22
+ raise(TypeError, 'can\'t dump')
23
+ end
24
+ attribs = {}
25
+ instance_variables.each do |attr|
26
+ obj = instance_variable_get(attr)
27
+ begin
28
+ attribs[attr] = Marshal.dump(obj)
29
+ rescue TypeError
30
+ if (defined? LOG) and (not obj.class.include? DRb::DRbUndumped)
31
+ LOG.warn("#{self.class}._dump") do
32
+ "can't dump a #{attr}:#{obj.class}"
33
+ end
34
+ end
35
+ attribs[attr] = Marshal.dump(DRbObject.new(obj))
36
+ end
37
+ end
38
+ Marshal.dump([self.class, attribs])
39
+ end
40
+
41
+ def self._load(data)
42
+ klass, attribs = Marshal.load(data)
43
+ obj = klass.new
44
+ attribs.each do |attr, value|
45
+ obj.instance_variable_set(attr, Marshal.load(value))
46
+ end
47
+ obj
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ end # module DRbUndumpedAttributes
54
+
55
+ end # module DRb
@@ -0,0 +1,54 @@
1
+ # Author:: Nicolas Despres <nicolas.despres@epita.fr>.
2
+ # Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: drb_undumped_indexed_object.rb 73 2004-12-09 18:24:52Z polrop $
7
+
8
+
9
+ require 'drb'
10
+
11
+
12
+ module DRb
13
+
14
+ module DRbUndumpedIndexedObject
15
+
16
+ def DRbUndumpedIndexedObject.append_features(cl)
17
+ super
18
+ cl.module_eval do
19
+
20
+ def _dump(depth)
21
+ if self.class.include?(DRb::DRbUndumped)
22
+ raise(TypeError, 'can\'t dump')
23
+ end
24
+ attribs = {}
25
+ each_pair do |k, v|
26
+ begin
27
+ attribs[k] = Marshal.dump(v)
28
+ rescue TypeError
29
+ if (defined? LOG) and (not v.class.include? DRb::DRbUndumped)
30
+ LOG.warn("#{self.class}._dump") do
31
+ "can't dump a #{k}:#{v.class}"
32
+ end
33
+ end
34
+ attribs[k] = Marshal.dump(DRbObject.new(v))
35
+ end
36
+ end
37
+ Marshal.dump([self.class, attribs])
38
+ end
39
+
40
+ def self._load(data)
41
+ klass, attribs = Marshal.load(data)
42
+ obj = klass.new
43
+ attribs.each do |key, value|
44
+ obj[key] = Marshal.load(value)
45
+ end
46
+ obj
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end # module DRbUndumpedIndexedObject
53
+
54
+ end # module DRb
@@ -0,0 +1,103 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: insecure_protected_methods.rb 88 2005-01-09 21:11:26Z polrop $
7
+
8
+
9
+ require 'drb/drb'
10
+
11
+
12
+ module DRb
13
+
14
+ class DRbServer
15
+
16
+ alias_method :ori_check_insecure_method, :check_insecure_method
17
+ def check_insecure_method(obj, msg_id)
18
+ ori_check_insecure_method(obj, msg_id)
19
+ if obj.protected_methods.include?(msg_id.to_s)
20
+ desc = any_to_s(obj)
21
+ if desc.nil? || desc[0] == '#'
22
+ desc << ":#{obj.class}"
23
+ end
24
+ raise NameError, "protected method `#{msg_id}' called for #{desc}"
25
+ end
26
+ true
27
+ end
28
+
29
+ end # class DRbServer
30
+
31
+ end # module DRb
32
+
33
+
34
+ #
35
+ # Unit test suite
36
+ #
37
+ if defined? TEST_MODE or $0 == __FILE__
38
+
39
+
40
+ require 'test/unit/ui/yaml/testrunner'
41
+
42
+
43
+ module DRb
44
+
45
+ class InsecureProtectedMethodsTest < Test::Unit::TestCase
46
+
47
+ class SrvFoo
48
+
49
+ def public_request
50
+ end
51
+
52
+ protected
53
+ def protected_request
54
+ end
55
+
56
+ end # class Foo
57
+
58
+ def setup
59
+ rd, wr = IO.pipe
60
+ unless @srv_pid = fork # son
61
+ rd.close
62
+ DRb.start_service("druby://localhost:42000", SrvFoo.new)
63
+ wr.puts('ready')
64
+ wr.close
65
+ DRb.thread.join
66
+ else # father
67
+ wr.close
68
+ rd.gets
69
+ @drb_srv = DRb.start_service
70
+ @drb_obj = DRbObject.new(nil, "druby://localhost:42000")
71
+ rd.close
72
+ end
73
+ end
74
+
75
+ def teardown
76
+ @drb_srv.stop_service
77
+ Process.kill('TERM', @srv_pid)
78
+ Process.waitpid(@srv_pid)
79
+ end
80
+
81
+ #
82
+ # Test
83
+ #
84
+ def test_simple
85
+ assert_raises(NameError) { @drb_obj.send(:protected_resquest) }
86
+ assert_nothing_raised { @drb_obj.public_request }
87
+ end
88
+
89
+ #
90
+ # Tools
91
+ #
92
+ def server_request(req)
93
+ end
94
+
95
+ end # class InsecureProtectedMethodsTest
96
+
97
+
98
+ end # module DRb
99
+
100
+
101
+ end
102
+
103
+
@@ -0,0 +1,40 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: session_client_test.rb 91 2005-01-09 22:24:40Z polrop $
7
+
8
+
9
+ # Test client used by session_manager.
10
+ if __FILE__ == $0
11
+
12
+ require 'drb/drb'
13
+
14
+ server = nil
15
+ service = nil
16
+ uri = ARGV.shift
17
+ num = ARGV.shift
18
+ name = ARGV.shift
19
+ begin
20
+ STDERR.puts "#{num}:A: start server" if $VERBOSE
21
+ server = DRb.start_service
22
+ STDERR.puts "#{num}:B: bind front" if $VERBOSE
23
+ front = DRb::DRbObject.new(nil, uri)
24
+ STDERR.puts "#{num}:C: start service" if $VERBOSE
25
+ service = front.service(name)
26
+ ensure
27
+ begin
28
+ STDERR.puts "#{num}:D: stop service" if $VERBOSE
29
+ service.stop_service unless service.nil?
30
+ rescue DRb::DRbConnError
31
+ STDERR.puts "#{num}: stop service too late" if $VERBOSE
32
+ ensure
33
+ STDERR.puts "#{num}:E: stop server" if $VERBOSE
34
+ server.stop_service unless server.nil?
35
+ STDERR.puts "#{num}:F: finish" if $VERBOSE
36
+ end
37
+ end
38
+
39
+ end
40
+
@@ -0,0 +1,246 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: session_manager.rb 186 2005-04-03 00:07:45Z ertai $
7
+
8
+
9
+ require 'drb/extservm.rb'
10
+
11
+
12
+ module DRb
13
+
14
+ class SessionManager < ExtServManager
15
+
16
+ SESSION_LIMIT = 1024
17
+
18
+ class Error < RuntimeError; end
19
+ class FullError < Error; end
20
+
21
+ @@session_type = {}
22
+ @@mutex = Mutex.new
23
+
24
+ class << self
25
+
26
+ alias_method :super_command, :command
27
+ alias_method :super_command=, :command=
28
+
29
+ undef_method :super_command, :super_command=
30
+
31
+ def command
32
+ @@session_type
33
+ end
34
+
35
+ def command=
36
+ @@session_type = session_type
37
+ end
38
+
39
+ alias session_type command
40
+ alias session_type= command=
41
+
42
+ end
43
+
44
+ attr_reader :nb_sessions, :total_session_started, :total_session_stoped
45
+ attr_accessor :session_limit
46
+
47
+ def initialize(session_limit=SESSION_LIMIT)
48
+ super()
49
+ @session_limit = session_limit
50
+ @nb_sessions = 0
51
+ @total_session_started = 0
52
+ @total_session_stoped = 0
53
+ end
54
+
55
+ def service(name)
56
+ raise("`#{name}' - invalid session type") unless @@session_type[name]
57
+ sid = nil
58
+ @@mutex.synchronize do
59
+ test_server_full
60
+ sid = gen_id("#{name}_#{Time.now.to_s.gsub!(/\s/, '_')}_") do |id|
61
+ @@command[id]
62
+ end
63
+ @@command[sid] = @@session_type[name]
64
+ super(sid)
65
+ end
66
+ end
67
+
68
+ def regist(sid, ro)
69
+ test_server_full
70
+ ret = super
71
+ @total_session_started += 1
72
+ @nb_sessions += 1
73
+ ret
74
+ end
75
+
76
+ def unregist(sid)
77
+ super
78
+ @@mutex.synchronize do
79
+ if @@command.delete(sid)
80
+ @total_session_stoped += 1
81
+ @nb_sessions -= 1
82
+ end
83
+ end
84
+ end
85
+
86
+ protected
87
+ def gen_id(base, &block)
88
+ c = 0
89
+ begin
90
+ id = base + c.to_s
91
+ c += 1
92
+ end while block[id]
93
+ id
94
+ end
95
+
96
+ protected
97
+ def test_server_full
98
+ raise(FullError, "server full") unless @nb_sessions < @session_limit
99
+ end
100
+
101
+ end # class SessionManager
102
+
103
+ end # module DRb
104
+
105
+
106
+ if defined? TEST_MODE or __FILE__ == $0
107
+
108
+ require 'test/unit/ui/yaml/testrunner'
109
+ require 'rbconfig'
110
+
111
+ module DRb
112
+
113
+ class SessionManagerTest < ::Test::Unit::TestCase
114
+
115
+ def test_visibility
116
+ assert_respond_to(SessionManager, :command=)
117
+ assert_respond_to(SessionManager, :command)
118
+ assert_respond_to(SessionManager, :session_type=)
119
+ assert_respond_to(SessionManager, :session_type)
120
+ assert_raises(NoMethodError) { SessionManager.super_command }
121
+ assert_raises(NoMethodError) { SessionManager.super_command=(nil) }
122
+ end
123
+
124
+ def test_service
125
+ name, ruby_bin = add_command
126
+ drb_session_manager = DRb::SessionManager.new
127
+ server = DRb.start_service('druby://localhost:0',
128
+ drb_session_manager,
129
+ {})
130
+ assert_raises(RuntimeError) { drb_session_manager.service('foo') }
131
+ tester = drb_session_manager.service(name)
132
+ assert_match(Regexp.new("^#{name}"), tester.sid)
133
+ front = tester.front
134
+ assert_equal('hello', front.hello)
135
+ assert_equal('salut', front.salut)
136
+ tester.stop_service
137
+ server.stop_service
138
+ end
139
+
140
+ def test_service_full
141
+ name, ruby_bin = add_command
142
+ drb_session_manager = DRb::SessionManager.new
143
+ drb_session_manager.session_limit = 2
144
+ assert_equal(2, drb_session_manager.session_limit)
145
+ server = DRb.start_service('druby://localhost:0',
146
+ drb_session_manager,
147
+ {})
148
+
149
+ tester1 = drb_session_manager.service(name)
150
+ assert_match(Regexp.new("^#{name}"), tester1.sid)
151
+ front1 = tester1.front
152
+ assert_equal('hello', front1.hello)
153
+ assert_equal('salut', front1.salut)
154
+ assert_equal(1, drb_session_manager.nb_sessions)
155
+
156
+ tester2 = drb_session_manager.service(name)
157
+ assert_match(Regexp.new("^#{name}"), tester2.sid)
158
+ front2 = tester2.front
159
+ assert_equal('hello', front2.hello)
160
+ assert_equal('salut', front2.salut)
161
+ assert_equal(2, drb_session_manager.nb_sessions)
162
+
163
+ assert_raises(SessionManager::FullError) do
164
+ drb_session_manager.service(name)
165
+ end
166
+ tester2.stop_service
167
+ assert_equal(1, drb_session_manager.nb_sessions)
168
+ tester3 = nil
169
+ assert_nothing_raised { tester3 = drb_session_manager.service(name) }
170
+ assert_equal(2, drb_session_manager.nb_sessions)
171
+ tester3.stop_service
172
+ assert_equal(1, drb_session_manager.nb_sessions)
173
+ tester1.stop_service
174
+ assert_equal(0, drb_session_manager.nb_sessions)
175
+ server.stop_service
176
+ end
177
+
178
+ def test_several_local_client
179
+ name, ruby_bin, chdir = add_command
180
+ drb_session_manager = SessionManager.new
181
+ server = DRb.start_service('druby://localhost:0',
182
+ drb_session_manager,
183
+ {})
184
+ services = []
185
+ nb_clients = 10
186
+ nb_clients.times do |i|
187
+ services << drb_session_manager.service(name)
188
+ end
189
+ until (n = drb_session_manager.nb_sessions) == nb_clients
190
+ STDERR.puts "wait for #{n} sessions started" if $VERBOSE
191
+ sleep(2)
192
+ end
193
+ services.each do |service|
194
+ assert_equal('hello', service.front.hello)
195
+ assert_equal('salut', service.front.salut)
196
+ end
197
+ services.each do |service|
198
+ service.stop_service
199
+ end
200
+ while (n = drb_session_manager.nb_sessions) > 0
201
+ STDERR.puts "wait for #{n} sessions stoped" if $VERBOSE
202
+ sleep(2)
203
+ end
204
+ server.stop_service
205
+ end
206
+
207
+ def test_non_local_client
208
+ name, ruby_bin, chdir = add_command
209
+ drb_session_manager = SessionManager.new
210
+ server = DRb.start_service('druby://localhost:0',
211
+ drb_session_manager,
212
+ {})
213
+ nb_clients = 10
214
+ cmd = chdir + "#{ruby_bin} drb/session_client_test.rb"
215
+ nb_clients.times do |i|
216
+ system("#{cmd} #{server.uri} #{i} #{name} &")
217
+ end
218
+ until (n = drb_session_manager.total_session_started) == nb_clients
219
+ STDERR.puts "wait for #{n} sessions started" if $VERBOSE
220
+ sleep(2)
221
+ end
222
+ until (n = drb_session_manager.total_session_stoped) == nb_clients
223
+ STDERR.puts "wait for #{n} sessions stoped" if $VERBOSE
224
+ sleep(2)
225
+ end
226
+ STDERR.puts 'stop service' if $VERBOSE
227
+ server.stop_service
228
+ end
229
+
230
+ protected
231
+ def add_command
232
+ ruby_bin = Config::CONFIG["RUBY_INSTALL_NAME"]
233
+ ruby_bin += ' -w' if $VERBOSE
234
+ name = "session_server"
235
+ chdir = (defined? TEST_MODE) ? "cd src;" : ''
236
+ cmd = chdir + "#{ruby_bin} drb/#{name}.rb"
237
+ DRb::SessionManager.command[name] = cmd
238
+ [ name, ruby_bin, chdir ]
239
+ end
240
+
241
+ end # class SessionManagerTest
242
+
243
+ end # module DRb
244
+
245
+ end
246
+