vcs 0.1 → 0.2.148

Sign up to get free protection for your applications and to get access to all the features.
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,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
+