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,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
+