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,409 @@
|
|
|
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: dispatcher_test.rb 186 2005-04-03 00:07:45Z ertai $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Dispatcher test suite
|
|
11
|
+
#
|
|
12
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
13
|
+
|
|
14
|
+
if RUBY_VERSION >= '1.9.0'
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# WARNING:
|
|
18
|
+
#
|
|
19
|
+
# run me with ruby1.9 !!
|
|
20
|
+
# commented tests are very violents and can crash your machine
|
|
21
|
+
#
|
|
22
|
+
# ADVICE:
|
|
23
|
+
#
|
|
24
|
+
# run this test suite using this command:
|
|
25
|
+
#
|
|
26
|
+
# killall -KILL ruby1.9; ruby1.9 session/test/dispatcher_test.rb; killall -KILL ruby1.9
|
|
27
|
+
#
|
|
28
|
+
# keep a killall -KILL ruby1.9 next to you if things go wrong ;-p
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
32
|
+
require 'session/dispatcher'
|
|
33
|
+
require 'session/server'
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
module Session
|
|
37
|
+
|
|
38
|
+
module Test
|
|
39
|
+
|
|
40
|
+
class DispatcherTest < ::Test::Unit::TestCase
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Setup
|
|
44
|
+
#
|
|
45
|
+
class HelloServer < Server
|
|
46
|
+
|
|
47
|
+
protected
|
|
48
|
+
def request_hello(sid, profile)
|
|
49
|
+
uri = @mutex.synchronize { profile[:uri].dup }
|
|
50
|
+
"hello to #{uri} from #{DRb.uri}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
protected
|
|
54
|
+
def request_dispatch_hello(sid, profile, dispatcher)
|
|
55
|
+
dispatcher.dispatch_all(:hello)
|
|
56
|
+
# dispatcher.hello # doesn't work from a server
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
protected
|
|
60
|
+
def request_hello_block(sid, profile, &block)
|
|
61
|
+
uri = @mutex.synchronize { profile[:uri].dup }
|
|
62
|
+
"#{block[]} to #{uri} from #{DRb.uri}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
protected
|
|
66
|
+
def request_my_sleep(sid, profile)
|
|
67
|
+
sleep(2)
|
|
68
|
+
request_hello(sid, profile)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
protected
|
|
72
|
+
def request_dispatch_my_sleep(sid, profile, dispatcher)
|
|
73
|
+
dispatcher.dispatch_all(:my_sleep)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
protected
|
|
77
|
+
def request_active_loop(sid, profile)
|
|
78
|
+
for i in 0...10000 do end
|
|
79
|
+
request_hello(sid, profile)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
protected
|
|
83
|
+
def request_dispatch_active_loop(sid, profile, dispatcher)
|
|
84
|
+
dispatcher.dispatch_all(:active_loop)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end # class HelloServer
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Tests
|
|
91
|
+
#
|
|
92
|
+
def test_multi_select_by
|
|
93
|
+
n = 5
|
|
94
|
+
uris = []
|
|
95
|
+
for i in 0...n do
|
|
96
|
+
uris << "druby://localhost:#{42000 + i * 100}"
|
|
97
|
+
end
|
|
98
|
+
srvdb = create_srvdb(*uris)
|
|
99
|
+
assert(srvdb.size > 0, 'bad srvdb')
|
|
100
|
+
d = nil
|
|
101
|
+
assert_nothing_raised { d = Dispatcher.new(srvdb, 1) }
|
|
102
|
+
assert_not_nil(d)
|
|
103
|
+
|
|
104
|
+
h1 = { :port => 42000, :hostname => 'localhost' }
|
|
105
|
+
r1 = d.and_multi_select_by(h1)
|
|
106
|
+
assert_equal(1, r1.size)
|
|
107
|
+
assert_equal(d['druby://localhost:42000'][:client], r1[0])
|
|
108
|
+
r2 = d.multi_select_by(h1) { |a, b| (a and b) }
|
|
109
|
+
assert_equal(1, r2.size)
|
|
110
|
+
assert_equal(r1, r2)
|
|
111
|
+
r1 = d.or_multi_select_by(h1)
|
|
112
|
+
r2 = d.multi_select_by(h1, false) { |a, b| (a or b) }
|
|
113
|
+
assert_equal(r1, r2)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_hello_block
|
|
117
|
+
begin
|
|
118
|
+
n = 5
|
|
119
|
+
uris = []
|
|
120
|
+
for i in 0...n do
|
|
121
|
+
uris << "druby://localhost:#{42000 + i * 100}"
|
|
122
|
+
end
|
|
123
|
+
start_servers(*uris)
|
|
124
|
+
srvdb = create_srvdb(*uris)
|
|
125
|
+
assert(srvdb.size > 0, 'bad srvdb')
|
|
126
|
+
d = nil
|
|
127
|
+
assert_nothing_raised { d = Dispatcher.new(srvdb, 1) }
|
|
128
|
+
assert_not_nil(d)
|
|
129
|
+
assert_equal(n, d.select_all.size, 'bad select_all size')
|
|
130
|
+
|
|
131
|
+
STDERR.puts "hello_block" if $VERBOSE
|
|
132
|
+
|
|
133
|
+
ref_res = {}
|
|
134
|
+
d.each do |uri, desc|
|
|
135
|
+
client = desc[:client]
|
|
136
|
+
ref_res[uri] = "salut to #{client.profile[:uri]} from #{client.uri}"
|
|
137
|
+
end
|
|
138
|
+
assert_equal(ref_res,
|
|
139
|
+
d.dispatch_all(:hello_block) { 'salut' },
|
|
140
|
+
'bad hello_block')
|
|
141
|
+
|
|
142
|
+
assert_nothing_raised { d.logout }
|
|
143
|
+
ensure
|
|
144
|
+
stop_servers
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_hello_1
|
|
149
|
+
several_server_test(1, 1, :hello, 5)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def test_hello_2x1
|
|
153
|
+
several_server_test(2, 1, :hello, 5)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_hello_3x1
|
|
157
|
+
several_server_test(3, 1, :hello, 2)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_hello_5x1
|
|
161
|
+
several_server_test(5, 1, :hello, 2)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_hello_10x1
|
|
165
|
+
several_server_test(10, 1, :hello, 1)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_my_sleep_1x1
|
|
169
|
+
several_server_test(1, 1, :my_sleep, 1)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def test_my_sleep_2x1
|
|
173
|
+
several_server_test(2, 1, :my_sleep, 2)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def test_my_sleep_3x1
|
|
177
|
+
several_server_test(3, 1, :my_sleep, 3)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def test_my_sleep_5x1
|
|
181
|
+
several_server_test(5, 1, :my_sleep, 5)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_my_sleep_10x1
|
|
185
|
+
several_server_test(10, 1, :my_sleep, 100)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def test_active_loop_1x1
|
|
189
|
+
several_server_test(1, 1, :active_loop, 1)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def test_active_loop_2x1
|
|
193
|
+
several_server_test(2, 1, :active_loop, 2)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def test_active_loop_3x1
|
|
197
|
+
several_server_test(3, 1, :active_loop, 3)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_active_loop_5x1
|
|
201
|
+
several_server_test(5, 1, :active_loop, 5)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_active_loop_10x1
|
|
205
|
+
several_server_test(10, 1, :active_loop, 10)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def test_hello_1x2
|
|
209
|
+
several_server_test(1, 2, :hello, 5)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_hello_1x10
|
|
213
|
+
several_server_test(1, 10, :hello, 5)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def test_hello_5x5
|
|
217
|
+
several_server_test(5, 5, :hello, 5)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def test_active_loop_5x5
|
|
221
|
+
several_server_test(5, 5, :active_loop, 5)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_my_sleep_5x5
|
|
225
|
+
several_server_test(5, 5, :my_sleep, 5)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
# Ruby thread implementation can segfault with this test
|
|
230
|
+
# def test_hello_10x10
|
|
231
|
+
# several_server_test(10, 10, :hello, 5)
|
|
232
|
+
# end
|
|
233
|
+
|
|
234
|
+
# Ruby thread implementation can segfault with this test
|
|
235
|
+
# def test_hello_10x10
|
|
236
|
+
# several_server_test(10, 10, :hello, 10)
|
|
237
|
+
# end
|
|
238
|
+
|
|
239
|
+
# 50 servers is quite a lot for a single machine. Very dangerous test
|
|
240
|
+
# def test_hello_50x1
|
|
241
|
+
# several_server_test(50, 1, :hello, 1)
|
|
242
|
+
# end
|
|
243
|
+
|
|
244
|
+
#
|
|
245
|
+
# Utilities
|
|
246
|
+
#
|
|
247
|
+
protected
|
|
248
|
+
def start_servers(*uris)
|
|
249
|
+
@srv_pids = []
|
|
250
|
+
uris.each do |uri|
|
|
251
|
+
unless @srv_pid = fork # son
|
|
252
|
+
begin
|
|
253
|
+
my_uri = uri
|
|
254
|
+
$stderr = File.open('/dev/null')
|
|
255
|
+
opts = Server::OPTS
|
|
256
|
+
opts[:usrdb]['guest'][:allowed_requests] += [
|
|
257
|
+
:hello, :dispatch_hello, :my_sleep, :dispatch_my_sleep,
|
|
258
|
+
:active_loop, :dispatch_active_loop, :hello_block
|
|
259
|
+
]
|
|
260
|
+
@srv = HelloServer.new(opts)
|
|
261
|
+
DRb.start_service(my_uri, @srv)
|
|
262
|
+
DRb.thread.join
|
|
263
|
+
rescue Exception => exc
|
|
264
|
+
STDERR.puts "!!!EXCEPTION IN START SERVER!!! #{exc.inspect}"
|
|
265
|
+
raise
|
|
266
|
+
end
|
|
267
|
+
else
|
|
268
|
+
@srv_pids << @srv_pid
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
protected
|
|
274
|
+
def stop_servers
|
|
275
|
+
@srv_pids.each do |pid|
|
|
276
|
+
Process.kill('TERM', pid)
|
|
277
|
+
Process.waitpid(pid)
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
protected
|
|
282
|
+
def create_srvdb(*uris)
|
|
283
|
+
srvdb = {}
|
|
284
|
+
uris.each do |uri|
|
|
285
|
+
srvdb[uri] = {
|
|
286
|
+
:usrname => 'guest',
|
|
287
|
+
:passwd => 'guest'.crypt(Const::SALT_KEY)
|
|
288
|
+
}
|
|
289
|
+
end
|
|
290
|
+
srvdb
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
# Create n HelloServer plus m dispatchers each connected to the n servers
|
|
295
|
+
# Run these m dispatchers in m separated threads. The test procedure is
|
|
296
|
+
# the same for all the dispatchers. First send request ping to all server.
|
|
297
|
+
# Then, send a bad requests to all server. Then, a request request. Then,
|
|
298
|
+
# a request request to server selected by port (result to all server).
|
|
299
|
+
# Then, a request request to server selected by hostname (result to all
|
|
300
|
+
# server).
|
|
301
|
+
# Finaly, send a resquest dispatch_request to all servers. Dispatch_request
|
|
302
|
+
# dispatch to all server the request request.
|
|
303
|
+
# use ruby -w to display progression message.
|
|
304
|
+
protected
|
|
305
|
+
def several_server_test(n, m, request, max_jobs)
|
|
306
|
+
begin
|
|
307
|
+
STDERR.puts "+++ start #{n}x#{m} #{request} #{max_jobs}" if $VERBOSE
|
|
308
|
+
|
|
309
|
+
uris = []
|
|
310
|
+
for i in 0...n do
|
|
311
|
+
uris << "druby://localhost:#{42000 + i * 100}"
|
|
312
|
+
end
|
|
313
|
+
start_servers(*uris)
|
|
314
|
+
|
|
315
|
+
threads = []
|
|
316
|
+
for i in 1..m do
|
|
317
|
+
threads << Thread.new(i) do |j|
|
|
318
|
+
STDERR.puts "#{j}: create dispatcher #{n}" if $VERBOSE
|
|
319
|
+
|
|
320
|
+
srvdb = create_srvdb(*uris)
|
|
321
|
+
assert(srvdb.size > 0, 'bad srvdb')
|
|
322
|
+
d = nil
|
|
323
|
+
assert_nothing_raised { d = Dispatcher.new(srvdb, max_jobs) }
|
|
324
|
+
assert_not_nil(d)
|
|
325
|
+
assert_equal(n, d.select_all.size, 'bad select_all size')
|
|
326
|
+
|
|
327
|
+
STDERR.puts "#{j}: ping" if $VERBOSE
|
|
328
|
+
|
|
329
|
+
ref_res = {}
|
|
330
|
+
uris.each { |uri| ref_res[uri] = 'data' }
|
|
331
|
+
assert_equal(ref_res, d.dispatch_all(:ping, 'data'), 'bad ping')
|
|
332
|
+
|
|
333
|
+
STDERR.puts "#{j}: bad request" if $VERBOSE
|
|
334
|
+
|
|
335
|
+
ref_res = {}
|
|
336
|
+
uris.each { |uri| ref_res[uri] = '#<Session::RequestError: `unknown\' - not a request>' }
|
|
337
|
+
res = {}
|
|
338
|
+
assert_nothing_raised do
|
|
339
|
+
res = d.dispatch(d.select_all, :unknown, 'data')
|
|
340
|
+
end
|
|
341
|
+
res.each do |uri, desc|
|
|
342
|
+
assert_equal(ref_res[uri], desc.inspect, "bad result #{uri}")
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
STDERR.puts "#{j}: select all, #{request}" if $VERBOSE
|
|
346
|
+
|
|
347
|
+
ref_res = {}
|
|
348
|
+
d.each do |uri, desc|
|
|
349
|
+
client = desc[:client]
|
|
350
|
+
ref_res[uri] = "hello to #{client.profile[:uri]} from #{client.uri}"
|
|
351
|
+
end
|
|
352
|
+
assert_equal(ref_res, d.dispatch(d.select_all, request), 'bad result for sid')
|
|
353
|
+
|
|
354
|
+
STDERR.puts "#{j}: select_by port, #{request}" if $VERBOSE
|
|
355
|
+
|
|
356
|
+
ports_selected = []
|
|
357
|
+
for i in 0...n do
|
|
358
|
+
ports_selected << d.select_by(:port, 42000 + i * 100)
|
|
359
|
+
end
|
|
360
|
+
ports_selected.flatten!
|
|
361
|
+
assert_equal(n, ports_selected.size, 'bad port selected size')
|
|
362
|
+
result = d.dispatch(ports_selected, request)
|
|
363
|
+
assert_equal(ref_res, result, 'bad result for port')
|
|
364
|
+
|
|
365
|
+
STDERR.puts "#{j}: select_by hostname, #{request}" if $VERBOSE
|
|
366
|
+
|
|
367
|
+
hosts_selected = d.select_by(:hostname, 'localhost')
|
|
368
|
+
assert_equal(n, hosts_selected.size, 'bad hosts selected size')
|
|
369
|
+
result = d.dispatch(hosts_selected, request)
|
|
370
|
+
assert_equal(ref_res, result, 'bad result for hosts')
|
|
371
|
+
|
|
372
|
+
STDERR.puts "#{j}: dispatch" if $VERBOSE
|
|
373
|
+
|
|
374
|
+
ref_res = {}
|
|
375
|
+
d.each_client do |uri1, c1|
|
|
376
|
+
ref_res[uri1] = {}
|
|
377
|
+
d.each_client do |uri2, c2|
|
|
378
|
+
ref_res[uri1][uri2] = "hello to #{c2.profile[:uri]} from #{c2.uri}"
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
req = ('dispatch_' + request.to_s).to_sym
|
|
382
|
+
res = d.dispatch_all(req, d)
|
|
383
|
+
assert_equal(ref_res, res, "bad result for dispatch #{req}")
|
|
384
|
+
|
|
385
|
+
STDERR.puts "#{j}: logout" if $VERBOSE
|
|
386
|
+
|
|
387
|
+
assert_nothing_raised { d.logout }
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
threads.each { |t| t.join }
|
|
391
|
+
ensure
|
|
392
|
+
stop_servers
|
|
393
|
+
STDERR.puts "*** finish #{n}x#{m} #{request} #{max_jobs}" if $VERBOSE
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
end # DispatcherTest
|
|
398
|
+
|
|
399
|
+
end # module Test
|
|
400
|
+
|
|
401
|
+
end # module Session
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
else
|
|
405
|
+
STDERR.puts('need ruby1.9')
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
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: fetchable_test.rb 74 2004-12-10 13:47:17Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Unit test suite
|
|
11
|
+
#
|
|
12
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
13
|
+
|
|
14
|
+
if RUBY_VERSION >= '1.9.0'
|
|
15
|
+
|
|
16
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
17
|
+
require 'session/server'
|
|
18
|
+
require 'session/fetchable'
|
|
19
|
+
require 'session/client'
|
|
20
|
+
require 'session/fetcher'
|
|
21
|
+
require 'pathname'
|
|
22
|
+
require 'fileutils'
|
|
23
|
+
require 'tempfile'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
module Session
|
|
27
|
+
|
|
28
|
+
class FetcherTest < ::Test::Unit::TestCase
|
|
29
|
+
|
|
30
|
+
class MyServer < Server
|
|
31
|
+
include Fetchable
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class MyClient < Client
|
|
35
|
+
include Fetcher
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Tests
|
|
40
|
+
#
|
|
41
|
+
def test_simple
|
|
42
|
+
src_filename = nil
|
|
43
|
+
dst_filename = nil
|
|
44
|
+
begin
|
|
45
|
+
start_server
|
|
46
|
+
clt = nil
|
|
47
|
+
assert_nothing_raised do
|
|
48
|
+
clt = MyClient.new('druby://localhost:42000',
|
|
49
|
+
'root',
|
|
50
|
+
'root'.crypt(Const::SALT_KEY),
|
|
51
|
+
true)
|
|
52
|
+
end
|
|
53
|
+
assert_not_nil(clt, "login failed")
|
|
54
|
+
src_filename = Tempfile.new('src_fetcher')
|
|
55
|
+
dst_filename = Tempfile.new('dst_fetcher')
|
|
56
|
+
filename = dst_filename.path
|
|
57
|
+
dst_filename.delete
|
|
58
|
+
dst_filename = Pathname.new(filename)
|
|
59
|
+
system("man printf > #{src_filename.path} 2> /dev/null")
|
|
60
|
+
|
|
61
|
+
assert_raises(ArgumentError) { clt.fetch('azer', 'z') }
|
|
62
|
+
assert_raises(Errno::ENOENT) { clt.fetch('azer', 'r') }
|
|
63
|
+
|
|
64
|
+
assert(clt.upload(src_filename.path, dst_filename.to_s))
|
|
65
|
+
assert(dst_filename.exist?, 'no dest file')
|
|
66
|
+
assert_equal(src_filename.size, dst_filename.size, 'bad size')
|
|
67
|
+
assert(FileUtils.compare_file(src_filename.path,
|
|
68
|
+
dst_filename.to_s),
|
|
69
|
+
'files different')
|
|
70
|
+
|
|
71
|
+
File.truncate(src_filename.path, 0)
|
|
72
|
+
assert_equal(0, src_filename.size)
|
|
73
|
+
|
|
74
|
+
assert(clt.download(dst_filename.to_s, src_filename.path))
|
|
75
|
+
assert_equal(src_filename.size, dst_filename.size, 'bad size')
|
|
76
|
+
assert(FileUtils.compare_file(src_filename.path,
|
|
77
|
+
dst_filename.to_s),
|
|
78
|
+
'files different')
|
|
79
|
+
|
|
80
|
+
assert_nothing_raised { clt.logout }
|
|
81
|
+
ensure
|
|
82
|
+
src_filename.delete if src_filename
|
|
83
|
+
dst_filename.delete if (dst_filename) and (dst_filename.exist?)
|
|
84
|
+
stop_server
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# Utilities
|
|
90
|
+
#
|
|
91
|
+
protected
|
|
92
|
+
def start_server
|
|
93
|
+
unless $srv_pid = fork # son
|
|
94
|
+
$stderr = File.open('/dev/null')
|
|
95
|
+
@opts = MyServer::OPTS
|
|
96
|
+
@srv = MyServer.new(@opts)
|
|
97
|
+
DRb.start_service('druby://localhost:42000', @srv)
|
|
98
|
+
DRb.thread.join
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
protected
|
|
103
|
+
def stop_server
|
|
104
|
+
Process.kill('TERM', $srv_pid)
|
|
105
|
+
Process.waitpid($srv_pid)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end # class Fetcher
|
|
109
|
+
|
|
110
|
+
end # module Session
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
else
|
|
114
|
+
STDERR.puts('need ruby1.9')
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|