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.
- data/Rakefile +17 -3
- data/bin/vcs +57 -34
- data/doc/jamis.rb +564 -0
- data/ruby_ex/abstract.rb +254 -0
- data/ruby_ex/abstract_node.rb +85 -0
- data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
- data/ruby_ex/array_each_pair.rb +18 -0
- data/ruby_ex/ask.rb +101 -0
- data/ruby_ex/attributed_class.rb +302 -0
- data/ruby_ex/cache.rb +373 -0
- data/ruby_ex/checkout.rb +12 -0
- data/ruby_ex/choose.rb +271 -0
- data/ruby_ex/commands.rb +18 -0
- data/ruby_ex/commands/command.rb +401 -0
- data/ruby_ex/commands/datas.rb +16 -0
- data/ruby_ex/commands/datas/data.rb +33 -0
- data/ruby_ex/commands/datas/factory.rb +66 -0
- data/ruby_ex/commands/factory.rb +66 -0
- data/ruby_ex/commands/helpers.rb +67 -0
- data/ruby_ex/commands/pipe.rb +64 -0
- data/ruby_ex/commands/runners.rb +17 -0
- data/ruby_ex/commands/runners/exec.rb +49 -0
- data/ruby_ex/commands/runners/fork.rb +97 -0
- data/ruby_ex/commands/runners/runner.rb +107 -0
- data/ruby_ex/commands/seq.rb +27 -0
- data/ruby_ex/config_file.rb +96 -0
- data/ruby_ex/const_regexp.rb +59 -0
- data/ruby_ex/daemon.rb +134 -0
- data/ruby_ex/diff.rb +667 -0
- data/ruby_ex/dlogger.rb +62 -0
- data/ruby_ex/drb/dispatcher.rb +252 -0
- data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
- data/ruby_ex/drb/drb_observable.rb +97 -0
- data/ruby_ex/drb/drb_observable_pool.rb +27 -0
- data/ruby_ex/drb/drb_service.rb +43 -0
- data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
- data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
- data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
- data/ruby_ex/drb/session_client_test.rb +40 -0
- data/ruby_ex/drb/session_manager.rb +246 -0
- data/ruby_ex/drb/session_server.rb +53 -0
- data/ruby_ex/dtime.rb +143 -0
- data/ruby_ex/dumpable_proc.rb +63 -0
- data/ruby_ex/exception.rb +32 -0
- data/ruby_ex/filetype.rb +229 -0
- data/ruby_ex/fileutils_ex.rb +44 -0
- data/ruby_ex/fold.rb +58 -0
- data/ruby_ex/generate_id.rb +44 -0
- data/ruby_ex/hookable.rb +262 -0
- data/ruby_ex/hooker.rb +54 -0
- data/ruby_ex/inactive_timeout.rb +137 -0
- data/ruby_ex/indexed_node.rb +66 -0
- data/ruby_ex/io_marshal.rb +100 -0
- data/ruby_ex/ioo.rb +194 -0
- data/ruby_ex/labeled_node.rb +63 -0
- data/ruby_ex/logger_observer.rb +23 -0
- data/ruby_ex/md5sum.rb +66 -0
- data/ruby_ex/mktemp.rb +208 -0
- data/ruby_ex/module/attr_once.rb +36 -0
- data/ruby_ex/module/autoload_tree.rb +75 -0
- data/ruby_ex/module/hierarchy.rb +335 -0
- data/ruby_ex/module/instance_method_visibility.rb +73 -0
- data/ruby_ex/module_ex.rb +11 -0
- data/ruby_ex/node.rb +80 -0
- data/ruby_ex/object_monitor.rb +145 -0
- data/ruby_ex/object_monitor_activity.rb +33 -0
- data/ruby_ex/observable.rb +140 -0
- data/ruby_ex/observable_pool.rb +293 -0
- data/ruby_ex/orderedhash.rb +252 -0
- data/ruby_ex/pathname_ex.rb +152 -0
- data/ruby_ex/pp_hierarchy.rb +29 -0
- data/ruby_ex/pseudo_cache.rb +190 -0
- data/ruby_ex/queue.rb +56 -0
- data/ruby_ex/random_generators.rb +25 -0
- data/ruby_ex/random_generators/random_generator.rb +31 -0
- data/ruby_ex/random_generators/ruby.rb +23 -0
- data/ruby_ex/safe_eval.rb +348 -0
- data/ruby_ex/sendmail.rb +215 -0
- data/ruby_ex/service_manager.rb +121 -0
- data/ruby_ex/session/administrable.rb +120 -0
- data/ruby_ex/session/client.rb +153 -0
- data/ruby_ex/session/const.rb +18 -0
- data/ruby_ex/session/dispatcher.rb +184 -0
- data/ruby_ex/session/error.rb +21 -0
- data/ruby_ex/session/fetchable.rb +57 -0
- data/ruby_ex/session/fetcher.rb +62 -0
- data/ruby_ex/session/hookable.rb +26 -0
- data/ruby_ex/session/profile.rb +110 -0
- data/ruby_ex/session/server.rb +582 -0
- data/ruby_ex/session/test/administrable_test.rb +337 -0
- data/ruby_ex/session/test/basic_test.rb +523 -0
- data/ruby_ex/session/test/dispatcher_test.rb +409 -0
- data/ruby_ex/session/test/fetchable_test.rb +119 -0
- data/ruby_ex/session/test/sub_server_test.rb +188 -0
- data/ruby_ex/shuffle.rb +30 -0
- data/ruby_ex/spring.rb +136 -0
- data/ruby_ex/spring_set.rb +137 -0
- data/ruby_ex/string_ex.rb +28 -0
- data/ruby_ex/symtbl.rb +106 -0
- data/ruby_ex/synflow.rb +474 -0
- data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
- data/ruby_ex/thread_mutex.rb +10 -0
- data/ruby_ex/timeout_ex.rb +81 -0
- data/ruby_ex/top_down.rb +73 -0
- data/ruby_ex/trace.rb +26 -0
- data/ruby_ex/uri/druby.rb +81 -0
- data/ruby_ex/uri/file.rb +65 -0
- data/ruby_ex/uri/ftp_ex.rb +37 -0
- data/ruby_ex/uri/http_ex.rb +43 -0
- data/ruby_ex/uri/ssh.rb +92 -0
- data/ruby_ex/uri/svn.rb +118 -0
- data/ruby_ex/uri_ex.rb +45 -0
- data/ruby_ex/verbose_object.rb +30 -0
- data/ruby_ex/version.rb +66 -0
- data/ruby_ex/yaml/basenode_ext.rb +63 -0
- data/ruby_ex/yaml/chop_header.rb +23 -0
- data/ruby_ex/yaml/transform.rb +449 -0
- data/ruby_ex/yaml/yregexpath.rb +76 -0
- data/src/changelog.rb +28 -18
- data/src/conflict.rb +20 -0
- data/src/diff.rb +18 -0
- data/src/diffstat.rb +9 -3
- data/src/last_changed_date.rb +18 -0
- data/src/mail.rb +33 -65
- data/src/message.rb +15 -9
- data/src/mycommit.rb +29 -14
- data/src/news.rb +24 -3
- data/src/status.rb +17 -0
- data/src/svn.rb +2 -2
- data/src/vcs.rb +24 -3
- metadata +124 -5
- 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
|
+
|