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,337 @@
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: administrable_test.rb 67 2004-12-07 01:00:10Z polrop $
7
+
8
+
9
+ #
10
+ # Client/Server administrable test suite
11
+ #
12
+ if defined? TEST_MODE or $0 == __FILE__
13
+
14
+
15
+ if RUBY_VERSION >= '1.9.0'
16
+
17
+
18
+ require 'test/unit/ui/yaml/testrunner'
19
+ require 'session/server'
20
+ require 'session/administrable'
21
+ require 'session/client'
22
+
23
+
24
+ module Session
25
+
26
+ module Test
27
+
28
+ class AdministrableTest < ::Test::Unit::TestCase
29
+
30
+ class ServerAdministrable < Server
31
+ include Administrable
32
+
33
+ end # class ServerAdministrable
34
+
35
+ def setup
36
+ unless @srv_pid = fork # son
37
+ $stderr = File.open('/dev/null')
38
+ @opts = Server::OPTS
39
+ @opts[:usrdb] = Server::USRDB
40
+ @opts[:max_usr] = 2
41
+ @opts[:wipeout_delay] = 2
42
+ @srv = ServerAdministrable.new(@opts)
43
+ DRb.start_service("druby://localhost:42000", @srv)
44
+ DRb.thread.join
45
+ end
46
+ end
47
+
48
+ def teardown
49
+ Process.kill('TERM', @srv_pid)
50
+ Process.waitpid(@srv_pid)
51
+ end
52
+
53
+ #
54
+ # Tests
55
+ #
56
+ def test_normal_login_logout
57
+ assert_nothing_raised do
58
+ clt = Client.new
59
+ clt.logout
60
+ end
61
+ end
62
+
63
+ def test_admin_can_connect_even_if_server_full
64
+ clt1 = nil
65
+ assert_nothing_raised { clt1 = Client.new }
66
+ assert_not_nil(clt1, 'login 1 failed')
67
+ assert(! clt1.online?, 'clt 1 not online')
68
+ assert_equal('data', clt1.request(:ping, 'data'))
69
+ assert(clt1.online?, 'clt 1 online')
70
+ clt2 = nil
71
+ assert_nothing_raised { clt2 = Client.new }
72
+ assert_not_nil(clt2, 'login 2 failed')
73
+ assert(! clt2.online?, 'clt 2 not online')
74
+ assert_equal('data', clt2.request(:ping, 'data'))
75
+ assert(clt2.online?, 'clt 2 online')
76
+ clt3 = nil
77
+ assert_raises(Session::FullError) do
78
+ clt3 = Client.new
79
+ assert_not_nil(clt3, 'login 3 failed')
80
+ assert(! clt3.online?, 'clt 3 not online')
81
+ assert_equal('data', clt3.request(:ping, 'data'))
82
+ assert(clt3.online?, 'clt 3 online')
83
+ end
84
+ clt_admin = nil
85
+ assert_nothing_raised do
86
+ clt_admin = Client.new('druby://localhost:42000',
87
+ 'admin',
88
+ 'admin'.crypt(Const::SALT_KEY))
89
+ end
90
+ assert_not_nil(clt_admin, 'login admin failed')
91
+ assert_equal(3, clt_admin.request(:sessions).size)
92
+ assert_equal(2, clt_admin.request(:get_max_usr))
93
+ assert_nothing_raised { clt_admin.logout }
94
+ assert_nothing_raised { clt1.logout }
95
+ assert_nothing_raised { clt3 = Client.new }
96
+ assert_not_nil(clt3, 'login 3 failed')
97
+ assert_nothing_raised { clt2.logout }
98
+ assert_nothing_raised { clt3.logout }
99
+ end
100
+
101
+ def test_request_set_get_max_usr
102
+ clt = nil
103
+ assert_nothing_raised do
104
+ clt = Client.new('druby://localhost:42000',
105
+ 'root',
106
+ 'root'.crypt(Const::SALT_KEY))
107
+ end
108
+ assert_not_nil(clt, 'login failed')
109
+ assert_nothing_raised do
110
+ assert_equal(2, clt.request(:get_max_usr), 'bad max_usr')
111
+ assert_equal(3, clt.request(:set_max_usr, 3))
112
+ assert_equal(3, clt.request(:get_max_usr), 'bad max_usr')
113
+ clt.request(:set_max_usr, 2)
114
+ assert_equal(2, clt.request(:get_max_usr), 'bad max_usr')
115
+ end
116
+ assert_raises(Session::ParameterError, 'set O') do
117
+ clt.request(:set_max_usr, 0)
118
+ end
119
+ assert_raises(Session::ParameterError, 'set -42') do
120
+ clt.request(:set_max_usr, -42)
121
+ end
122
+ assert_raises(Session::ParameterError, 'set 4') do
123
+ clt.request(:set_max_usr, '4')
124
+ end
125
+ assert_nothing_raised do
126
+ assert_equal(2, clt.request(:set_max_usr, '2'.to_i), 'bad max_usr')
127
+ end
128
+ assert_nothing_raised do
129
+ assert_equal(2, clt.request(:get_max_usr), 'bad max_usr')
130
+ end
131
+ assert_nothing_raised { clt.logout }
132
+ end
133
+
134
+ def test_request_set_get_wipeout_delay
135
+ clt = nil
136
+ assert_nothing_raised do
137
+ clt = Client.new('druby://localhost:42000',
138
+ 'root',
139
+ 'root'.crypt(Const::SALT_KEY))
140
+ end
141
+ assert_not_nil(clt, 'login failed')
142
+ assert_nothing_raised do
143
+ assert_equal(2, clt.request(:get_wipeout_delay), 'bad wipeout_delay')
144
+ assert_equal(3, clt.request(:set_wipeout_delay, 3))
145
+ assert_equal(3, clt.request(:get_wipeout_delay), 'bad wipeout_delay')
146
+ clt.request(:set_wipeout_delay, 2)
147
+ assert_equal(2, clt.request(:get_wipeout_delay), 'bad wipeout_delay')
148
+ end
149
+ assert_raises(Session::ParameterError, 'set 1') do
150
+ clt.request(:set_wipeout_delay, 1)
151
+ end
152
+ assert_raises(Session::ParameterError, 'set -42') do
153
+ clt.request(:set_wipeout_delay, -42)
154
+ end
155
+ assert_raises(Session::ParameterError, 'set 4') do
156
+ clt.request(:set_wipeout_delay, '4')
157
+ end
158
+ assert_nothing_raised do
159
+ assert_equal(2,
160
+ clt.request(:set_wipeout_delay, '2'.to_i),
161
+ 'bad wipeout_delay')
162
+ end
163
+ assert_nothing_raised do
164
+ assert_equal(2, clt.request(:get_wipeout_delay), 'bad wipeout_delay')
165
+ end
166
+ assert_nothing_raised { clt.logout }
167
+ end
168
+
169
+ def test_request_sessions
170
+ clt1 = nil
171
+ assert_nothing_raised { clt1 = Client.new }
172
+ assert_not_nil(clt1, 'login 1 failed')
173
+ assert(! clt1.online?, 'clt 1 not online')
174
+ assert_equal('data', clt1.ping('data'))
175
+ assert(clt1.online?, 'clt 1 online')
176
+ clt2 = nil
177
+ assert_nothing_raised do
178
+ clt2 = Client.new('druby://localhost:42000',
179
+ 'root',
180
+ 'root'.crypt(Const::SALT_KEY))
181
+ end
182
+ assert_not_nil(clt2, 'login 2 failed')
183
+ ses = clt2.request(:sessions)
184
+ assert_equal(2, ses.size, 'bad sessions number')
185
+ assert(ses.has_key?(clt1.sid), 'bad clt1 sid')
186
+ assert(ses.has_key?(clt2.sid), 'bad clt2 sid')
187
+ ses.each do |sid, prof|
188
+ prof[:usrname] = 'toto'
189
+ end
190
+ assert_equal(2, clt2.request(:sessions).size, 'bad sessions number')
191
+ clt2.request(:sessions).each do |sid, prof|
192
+ assert_equal('toto', ses[sid][:usrname])
193
+ assert_not_equal('toto', prof[:usrname])
194
+ end
195
+ assert_nothing_raised { clt1.logout }
196
+ assert_nothing_raised { clt2.logout }
197
+ end
198
+
199
+ def test_request_kick
200
+ clt1 = nil
201
+ assert_nothing_raised { clt1 = Client.new }
202
+ assert_not_nil(clt1, 'login 1 failed')
203
+ assert(! clt1.online?, 'clt 1 not online')
204
+ assert_equal('data', clt1.ping('data'))
205
+ assert(clt1.online?, 'clt 1 online')
206
+ clt2 = nil
207
+ assert_nothing_raised do
208
+ clt2 = Client.new('druby://localhost:42000',
209
+ 'root',
210
+ 'root'.crypt(Const::SALT_KEY))
211
+ end
212
+ assert_not_nil(clt2, 'login 2 failed')
213
+ ses = clt2.request(:sessions)
214
+ assert_equal(2, ses.size, 'bad sessions number')
215
+ assert(ses.has_key?(clt1.sid), 'bad clt1 sid')
216
+ assert(ses.has_key?(clt2.sid), 'bad clt2 sid')
217
+ assert_raises(Session::SessionError) do
218
+ clt2.request(:kick, 'toto')
219
+ end
220
+ assert_raises(Session::PermissionError) do
221
+ clt2.request(:kick, clt2.sid)
222
+ end
223
+ assert_nothing_raised { clt2.request(:kick, clt1.sid) }
224
+ assert(! clt1.online?)
225
+ assert_nil(clt1.sid)
226
+ assert_nothing_raised { assert(clt2.logout) }
227
+ end
228
+
229
+ def test_usr_management
230
+ clt2 = nil
231
+ assert_nothing_raised do
232
+ clt2 = Client.new('druby://localhost:42000',
233
+ 'root',
234
+ 'root'.crypt(Const::SALT_KEY))
235
+ end
236
+ assert_not_nil(clt2, 'login 2 failed')
237
+ assert_equal(ServerAdministrable::USRDB, clt2.request(:get_usrdb))
238
+ assert_raises(Session::ParameterError) do
239
+ clt2.request(:get_usr_desc, '')
240
+ end
241
+ assert_raises(Session::UserError) do
242
+ clt2.request(:add_usr, 'guest', clt2.request(:get_usr_desc, 'guest'))
243
+ end
244
+ assert_raises(Session::UserError) do
245
+ clt2.request(:add_usr, 'root', clt2.request(:get_usr_desc, 'root'))
246
+ end
247
+ assert_raises(Session::ParameterError) do
248
+ clt2.request(:add_usr, 'toto)', {})
249
+ end
250
+ assert_raises(Session::ParameterError) do
251
+ clt2.request(:add_usr, '', {})
252
+ end
253
+ usrdesc = {
254
+ :allowed_requests => [ :profile, :add_hook ],
255
+ :allowed_hooks => [],
256
+ :admin => false,
257
+ :passwd => 'toto'.crypt(Const::SALT_KEY)
258
+ }
259
+ assert_equal(usrdesc, clt2.request(:add_usr, 'toto', usrdesc))
260
+ assert_equal(ServerAdministrable::USRDB.merge('toto'=>usrdesc),
261
+ clt2.request(:get_usrdb))
262
+ assert_raises(Session::UserError) do
263
+ clt2.request(:del_usr, 'foo')
264
+ end
265
+ assert_raises(Session::UserError) do
266
+ clt2.request(:del_usr, 'root')
267
+ end
268
+ assert_raises(Session::UserError) do
269
+ clt2.request(:del_usr, 'admin')
270
+ end
271
+ prof = Profile.new('toto', usrdesc, DRb.uri, nil)
272
+ clt1 = nil
273
+ assert_nothing_raised do
274
+ clt1 = Client.new('druby://localhost:42000',
275
+ 'toto',
276
+ 'toto'.crypt(Const::SALT_KEY), true)
277
+ end
278
+ assert_not_nil(clt1, 'login 1 failed')
279
+ prof[:uri] = clt1.local_uri
280
+ prof[:protocol], prof[:hostname], prof[:port] = Profile.parse_uri(clt1.local_uri)
281
+ prof[:hooks] = [ clt1 ]
282
+ comp_profile(prof, clt1.profile, :dispatcher)
283
+ assert_raises(Session::PermissionError) { clt1.help }
284
+ new_usrdesc = {
285
+ :allowed_requests => [ :profile, :help, :add_hook ],
286
+ :allowed_hooks => [],
287
+ :admin => false,
288
+ :passwd => 'toto'.crypt(Const::SALT_KEY)
289
+ }
290
+ assert_equal(new_usrdesc,
291
+ clt2.request(:set_usr_desc, 'toto', new_usrdesc))
292
+ assert_raises(Session::PermissionError) { clt1.help }
293
+ assert_nothing_raised { clt1.logout }
294
+ clt1 = nil
295
+ assert_nothing_raised do
296
+ clt1 = Client.new('druby://localhost:42000',
297
+ 'toto',
298
+ 'toto'.crypt(Const::SALT_KEY))
299
+ end
300
+ assert_not_nil(clt1, 'login 1 new failed')
301
+ assert_nothing_raised('help is allowed now') { clt1.help }
302
+ assert_nothing_raised { clt1.logout }
303
+ assert_equal(new_usrdesc,
304
+ clt2.request(:del_usr, 'toto'),
305
+ 'bad usrdesc returned')
306
+ assert_equal(ServerAdministrable::USRDB, clt2.request(:get_usrdb))
307
+ assert_nothing_raised { clt2.logout }
308
+ end
309
+
310
+ #
311
+ # Utilities
312
+ #
313
+ protected
314
+ def comp_profile(ref_prof, prof, *ignore)
315
+ ref_prof.each do |k, v|
316
+ next if ignore.include?(k)
317
+ if k == :login_time or k == :last_request_time
318
+ assert(ref_prof[k] <= prof[k], "bad time for #{k}")
319
+ else
320
+ assert_equal(ref_prof[k], prof[k], "bad value for #{k}")
321
+ end
322
+ end
323
+ end
324
+
325
+ end # class AdministrableTest
326
+
327
+ end # module Test
328
+
329
+ end # module Session
330
+
331
+
332
+ else
333
+ STDERR.puts('need ruby1.9')
334
+ end
335
+
336
+
337
+ end
@@ -0,0 +1,523 @@
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: basic_test.rb 67 2004-12-07 01:00:10Z polrop $
7
+
8
+
9
+ #
10
+ # Client/Server basic test suite
11
+ #
12
+ if defined? TEST_MODE or $0 == __FILE__
13
+
14
+ if RUBY_VERSION >= '1.9.0'
15
+
16
+
17
+ require 'test/unit/ui/yaml/testrunner'
18
+ require 'session/server'
19
+ require 'session/client'
20
+
21
+
22
+ module Session
23
+
24
+ module Test
25
+
26
+ class BasicTest < ::Test::Unit::TestCase
27
+
28
+ USRDB = Server::USRDB.merge('no_rights' => {
29
+ :passwd => 'no_rights'.crypt(Const::SALT_KEY),
30
+ :allowed_requests => [],
31
+ :admin => false},
32
+ 'tester' => {
33
+ :passwd => 'tester'.crypt(Const::SALT_KEY),
34
+ :allowed_requests => [ :testme ],
35
+ :admin => false})
36
+
37
+ class MyServer < Server
38
+
39
+ protected
40
+ def request_testme(sid, profile, test_obj)
41
+ ret = test_obj.run
42
+ return test_obj, ret
43
+ end
44
+
45
+ end
46
+
47
+ def setup
48
+ unless @srv_pid = fork # son
49
+ $stderr = File.open('/dev/null')
50
+ @opts = MyServer::OPTS
51
+ @opts[:usrdb] = USRDB
52
+ @opts[:max_usr] = 2
53
+ @opts[:wipeout_delay] = 2
54
+ @srv = MyServer.new(@opts)
55
+ DRb.start_service('druby://localhost:42000', @srv)
56
+ DRb.thread.join
57
+ exit(0)
58
+ end
59
+ end
60
+
61
+ def teardown
62
+ Process.kill('TERM', @srv_pid)
63
+ Process.waitpid(@srv_pid)
64
+ end
65
+
66
+ #
67
+ # Tests
68
+ #
69
+ def test_single_login_logout
70
+ assert_nothing_raised do
71
+ clt = Client.new
72
+ assert(! clt.online?, 'clt online 1')
73
+ assert(clt.logout)
74
+ assert(! clt.online?, 'clt online 2')
75
+ assert('data', clt.request(:ping, 'data'))
76
+ assert(clt.online?, 'clt online 3')
77
+ assert(clt.logout)
78
+ assert(! clt.online?, 'clt online 4')
79
+ end
80
+ end
81
+
82
+ def test_single_force_login_logout
83
+ assert_raises(ArgumentError) do
84
+ clt = Client.new(Client::URI,
85
+ Client::USRNAME,
86
+ Client::PASSWD,
87
+ nil)
88
+ end
89
+ assert_nothing_raised do
90
+ clt = Client.new(Client::URI,
91
+ Client::USRNAME,
92
+ Client::PASSWD,
93
+ true)
94
+ assert(clt.online?, 'clt online 1')
95
+ assert('data', clt.request(:ping, 'data'))
96
+ assert(clt.online?, 'clt online 3')
97
+ assert(clt.logout)
98
+ assert(! clt.online?, 'clt online 2')
99
+ assert(clt.logout)
100
+ assert(! clt.online?, 'clt online 2')
101
+ end
102
+ end
103
+
104
+ def test_several_login_logout
105
+ assert_nothing_raised do
106
+ clt = Client.new(Client::URI,
107
+ Client::USRNAME,
108
+ Client::PASSWD,
109
+ true)
110
+ assert(clt.online?, 'clt online? 1')
111
+ assert(clt.logout)
112
+ assert(! clt.online?, 'clt not online? 1')
113
+ assert(clt.login)
114
+ assert(clt.online?, 'clt online? 2')
115
+ assert(clt.logout)
116
+ assert(! clt.online?, 'clt not online? 2')
117
+ assert(clt.login)
118
+ assert(clt.online?, 'clt online? 3')
119
+ assert(clt.logout)
120
+ assert(! clt.online?, 'clt not online? 3')
121
+ end
122
+ end
123
+
124
+ class Hook
125
+ include Session::Hookable
126
+
127
+ def initialize
128
+ @online = nil
129
+ end
130
+
131
+ def online?
132
+ @online
133
+ end
134
+
135
+ protected
136
+ def hook_logout(sid, profile)
137
+ @online = false
138
+ end
139
+
140
+ protected
141
+ def hook_login(sid, profile)
142
+ @online = true
143
+ end
144
+
145
+ end
146
+
147
+ def test_hook
148
+ hook = Hook.new
149
+ assert_nil(hook.online?)
150
+ clt = nil
151
+ assert_raises(ArgumentError) do
152
+ clt = Client.new(Client::URI,
153
+ Client::USRNAME,
154
+ Client::PASSWD,
155
+ true,
156
+ nil)
157
+ end
158
+ assert_nothing_raised do
159
+ clt = Client.new(Client::URI,
160
+ Client::USRNAME,
161
+ Client::PASSWD,
162
+ true,
163
+ hook)
164
+ assert(clt.online?, 'clt online? 1')
165
+ end
166
+ assert_not_nil(clt, 'login failed')
167
+ assert_equal(true, hook.online?, 'bad hook online?')
168
+ assert_nothing_raised { assert(clt.logout) }
169
+ end
170
+
171
+ def test_bad_usr_name
172
+ clt = nil
173
+ assert_raises(Session::AuthError) do
174
+ clt = Client.new('druby://localhost:42000',
175
+ 'nobody',
176
+ 'prout'.crypt(Const::SALT_KEY),
177
+ true)
178
+ end
179
+ end
180
+
181
+ def test_bad_passwd
182
+ assert_raises(Session::AuthError) do
183
+ clt = Client.new('druby://localhost:42000',
184
+ 'guest',
185
+ 'prout'.crypt(Const::SALT_KEY),
186
+ true)
187
+ end
188
+ end
189
+
190
+ def test_permission_denied
191
+ clt = nil
192
+ assert_nothing_raised do
193
+ clt = Client.new
194
+ end
195
+ assert_not_nil(clt, 'login failed')
196
+ assert_raises(Session::PermissionError) do
197
+ clt.request(:get_usr_profile, 'toto')
198
+ end
199
+ assert_nothing_raised { assert(clt.logout) }
200
+ end
201
+
202
+ def test_bad_request
203
+ clt = nil
204
+ assert_nothing_raised { clt = Client.new }
205
+ assert_not_nil(clt, 'login failed')
206
+ assert_raises(Session::RequestError) do
207
+ clt.request(:foo)
208
+ end
209
+ assert_nothing_raised { assert(clt.logout) }
210
+ end
211
+
212
+ def test_no_opened_session
213
+ drb_srv = DRb.start_service
214
+ drb_obj = DRbObject.new(nil, 'druby://localhost:42000')
215
+ assert_raises(Session::ParameterError) do
216
+ drb_obj.request('mais_ou���_mon_sid', :logout)
217
+ end
218
+ assert_raises(Session::SessionError) do
219
+ drb_obj.request('0123456789abcdef', :foo)
220
+ end
221
+ drb_srv.stop_service
222
+ end
223
+
224
+ def test_cannot_call_server_protected_method
225
+ drb_srv = DRb.start_service
226
+ drb_obj = DRbObject.new(nil, 'druby://localhost:42000')
227
+ assert_raises(NameError) do
228
+ drb_obj.request_profile('sid')
229
+ end
230
+ drb_srv.stop_service
231
+ end
232
+
233
+ def test_max_users
234
+ clt1 = nil
235
+ assert_nothing_raised { clt1 = Client.new }
236
+ assert_not_nil(clt1, 'login 1 failed')
237
+ assert(! clt1.online?, 'clt 1 not online')
238
+ assert_equal('data', clt1.request(:ping, 'data'))
239
+ assert(clt1.online?, 'clt 1 online')
240
+ clt2 = nil
241
+ assert_nothing_raised { clt2 = Client.new }
242
+ assert_not_nil(clt2, 'login 2 failed')
243
+ assert(! clt2.online?, 'clt 2 not online')
244
+ assert_equal('data', clt2.request(:ping, 'data'))
245
+ assert(clt2.online?, 'clt 2 online')
246
+ clt3 = nil
247
+ assert_raises(Session::FullError) do
248
+ clt3 = Client.new
249
+ assert_not_nil(clt3, 'login 3 failed')
250
+ assert(! clt3.online?, 'clt 3 not online')
251
+ assert_equal('data', clt3.request(:ping, 'data'))
252
+ assert(false, 'not reached')
253
+ end
254
+ assert_not_nil(clt3, 'login 3 failed')
255
+ assert_nothing_raised { assert(clt1.logout, 'clt1 logout') }
256
+ assert(! clt1.online?, 'clt 1 not online 2')
257
+ assert_nothing_raised { clt3.login }
258
+ assert(clt3.online?, 'clt 3 online')
259
+ assert_nothing_raised { assert(clt2.logout, 'clt2 logout') }
260
+ assert(! clt2.online?, 'clt 2 not online 2')
261
+ assert_nothing_raised { assert(clt3.logout, 'clt3 logout') }
262
+ assert(! clt3.online?, 'clt 3 not online')
263
+ end
264
+
265
+ def test_wipeout
266
+ clt1 = nil
267
+ assert_nothing_raised { clt1 = Client.new }
268
+ assert_not_nil(clt1, 'login 1 failed')
269
+ assert(! clt1.online?, 'clt 1 not online')
270
+ assert_equal('data', clt1.request(:ping, 'data'))
271
+ assert(clt1.online?, 'clt 1 online')
272
+ clt2 = nil
273
+ assert_nothing_raised { clt2 = Client.new }
274
+ assert_not_nil(clt2, 'login 2 failed')
275
+ assert(! clt2.online?, 'clt 2 not online')
276
+ assert_equal('data', clt2.request(:ping, 'data'))
277
+ assert(clt2.online?, 'clt 2 online')
278
+ clt3 = nil
279
+ assert_raises(Session::FullError) do
280
+ clt3 = Client.new
281
+ assert_not_nil(clt3, 'login 3 failed')
282
+ assert(! clt3.online?, 'clt 3 not online')
283
+ assert_equal('data', clt3.request(:ping, 'data'))
284
+ assert(false, 'not reached')
285
+ end
286
+ while clt1.online? and clt2.online?
287
+ sleep(4)
288
+ end
289
+ assert(clt1.logout, 'clt1 already logout')
290
+ assert(clt2.logout, 'clt2 already logout')
291
+ clt1 = nil
292
+ assert_nothing_raised { clt1 = Client.new }
293
+ assert_not_nil(clt1, 'login 1 failed 2')
294
+ assert(! clt1.online?, 'clt 1 not online')
295
+ assert_equal('data', clt1.request(:ping, 'data'))
296
+ assert(clt1.online?, 'clt 1 online')
297
+ clt2 = nil
298
+ assert_nothing_raised { clt2 = Client.new }
299
+ assert_not_nil(clt2, 'login 2 failed 2')
300
+ assert(! clt2.online?, 'clt 2 not online')
301
+ assert_equal('data', clt2.request(:ping, 'data'))
302
+ assert(clt2.online?, 'clt 2 online')
303
+ clt3 = nil
304
+ assert_raises(Session::FullError) do
305
+ clt3 = Client.new
306
+ assert_not_nil(clt3, 'login 3 failed')
307
+ assert(! clt3.online?, 'clt 3 not online')
308
+ assert_equal('data', clt3.request(:ping, 'data'))
309
+ assert(false, 'not reached')
310
+ end
311
+ assert_nothing_raised { assert(clt1.logout) }
312
+ assert_nothing_raised { assert(clt2.logout) }
313
+ end
314
+
315
+ def test_request_profile
316
+ usrname = 'guest'
317
+ passwd = 'guest'.crypt(Const::SALT_KEY)
318
+ usr = Server::USRDB
319
+ usr = {
320
+ usrname => {
321
+ :passwd => passwd,
322
+ :allowed_requests => [
323
+ :profile, :help, :nb_requests, :ping
324
+ ],
325
+ :admin => false
326
+ }
327
+ }
328
+ prof = Profile.new(usrname, usr[usrname], DRb.uri, nil)
329
+ clt = nil
330
+ assert_nothing_raised do
331
+ clt = Client.new('druby://localhost:42000', usrname, passwd, true)
332
+ end
333
+ assert_not_nil(clt, 'login failed')
334
+ prof[:uri] = clt.local_uri
335
+ prof[:protocol], prof[:hostname], prof[:port] = Profile.parse_uri(clt.local_uri)
336
+ prof[:hooks] = [clt]
337
+ comp_profile(prof, clt.profile, :dispatcher)
338
+ assert(clt.profile[:login_time] < clt.profile[:last_request_time])
339
+ assert_nothing_raised { assert(clt.logout) }
340
+ end
341
+
342
+ def test_request_help
343
+ clt = nil
344
+ assert_nothing_raised { clt = Client.new }
345
+ assert_not_nil(clt, 'login 1 failed')
346
+ ref_res = {
347
+ "ping"=>"no description available",
348
+ "help"=>"[requests...] return all or several request descriptions",
349
+ "detach"=>"no description available",
350
+ "logout_at"=>"no description available",
351
+ "add_hook"=>"no description available",
352
+ "login_at"=>"no description available",
353
+ "profile"=>"return the session profile",
354
+ "stop"=>"no description available",
355
+ "logout"=>"disconnect from the server",
356
+ "testme"=>"no description available",
357
+ "rsend"=>"no description available",
358
+ "del_hook"=>"no description available",
359
+ "request_at"=>"no description available",
360
+ "stop_all_sub_server"=>"no description available",
361
+ "nb_requests"=>"no description available",
362
+ "chdir"=>"no description available",
363
+ "start_sub_server"=>"no description available",
364
+ "stop_sub_server"=>"no description available",
365
+ "total_nb_requests"=>"no description available",
366
+ "get_usr_profile"=>"no description available",
367
+ "pid"=>"no description available"
368
+ }
369
+ assert_equal(ref_res, clt.help)
370
+ assert_equal({'profile' => ref_res['profile']}, clt.help('profile'))
371
+ assert_equal({
372
+ 'profile' => ref_res['profile'],
373
+ 'help' => ref_res['help']
374
+ },
375
+ clt.help('profile', :help, 'sessions'))
376
+ assert_equal({}, clt.help('toto'))
377
+ assert_equal({'help' => ref_res['help']}, clt.help(:help))
378
+ assert_nothing_raised { assert(clt.logout) }
379
+ end
380
+
381
+ def test_request_get_usr_profile
382
+ clt1 = nil
383
+ assert_nothing_raised { clt1 = Client.new }
384
+ assert_not_nil(clt1, 'login 1 failed')
385
+ clt2 = nil
386
+ assert_nothing_raised do
387
+ clt2 = Client.new('druby://localhost:42000',
388
+ 'root',
389
+ 'root'.crypt(Const::SALT_KEY))
390
+ end
391
+ assert_not_nil(clt2, 'login 2 failed')
392
+ assert_nothing_raised do
393
+ comp_profile(clt1.profile,
394
+ clt2.request(:get_usr_profile, 'guest'),
395
+ :hooks)
396
+ end
397
+ assert_raises(Session::UserError) do
398
+ clt2.request(:get_usr_profile, 'toto')
399
+ end
400
+ assert_nothing_raised do
401
+ comp_profile(clt2.profile,
402
+ clt2.request(:get_usr_profile, clt2.profile[:usrname]))
403
+ end
404
+ assert_nothing_raised { assert(clt1.logout) }
405
+ assert_nothing_raised { assert(clt2.logout) }
406
+ end
407
+
408
+ def test_nb_request
409
+ nb_clt = 2
410
+ clt = []
411
+ for i in 0...nb_clt do
412
+ assert_nothing_raised { clt[i] = Client.new }
413
+ assert_not_nil(clt[i], "login #{i} failed")
414
+ end
415
+ threads = []
416
+ for i in 0...nb_clt do
417
+ threads << Thread.new do
418
+ c = i
419
+ for j in 0...nb_clt do
420
+ clt[c].request(:nb_requests)
421
+ end
422
+ end
423
+ end
424
+ threads.each { |t| t.join }
425
+ for i in 0...nb_clt do
426
+ assert_equal(1,
427
+ clt[i].request(:nb_requests),
428
+ "#{i}: bad request number")
429
+ end
430
+ for i in 0...nb_clt do
431
+ assert_nothing_raised { assert(clt[i].logout) }
432
+ end
433
+ end
434
+
435
+ class TestObj
436
+
437
+ def run
438
+ DRb.uri
439
+ end
440
+
441
+ end
442
+
443
+ def test_object_is_runned_remotely
444
+ clt = nil
445
+ assert_nothing_raised do
446
+ clt = Client.new('druby://localhost:42000',
447
+ 'tester',
448
+ 'tester'.crypt(Const::SALT_KEY))
449
+ end
450
+ assert_not_nil(clt, "login failed")
451
+ foo = TestObj.new
452
+ assert_not_equal('druby://localhost:42000', clt.local_uri)
453
+ robj, foo_uri = clt.request(:testme, foo)
454
+ assert_equal('druby://localhost:42000', foo_uri)
455
+ comp_obj(foo, robj)
456
+ assert_nothing_raised { clt.logout }
457
+ end
458
+
459
+ def test_rsend
460
+ begin
461
+ clt = nil
462
+ assert_nothing_raised do
463
+ clt = Client.new('druby://localhost:42000',
464
+ 'root',
465
+ 'root'.crypt(Const::SALT_KEY),
466
+ true)
467
+ end
468
+ assert_not_nil(clt, "login failed")
469
+ io = clt.request(:rsend, File, :open, '/tmp/x', 'w')
470
+ assert(io.is_a?(DRb::DRbObject), 'io is a DRbObject')
471
+ assert_equal(5,
472
+ clt.request(:rsend, io, :write, "test\n"),
473
+ 'test write')
474
+ assert_nothing_raised { clt.request(:rsend, io, :close) }
475
+ assert(File.exist?('/tmp/x'), 'file exist')
476
+ assert_nothing_raised { clt.logout }
477
+ ensure
478
+ File.delete('/tmp/x') if File.exist?('/tmp/x')
479
+ end
480
+ end
481
+
482
+ #
483
+ # Utilities
484
+ #
485
+ protected
486
+ def comp_profile(ref_prof, prof, *ignore)
487
+ ref_prof.each do |k, v|
488
+ next if ignore.include?(k)
489
+ if k == :login_time or k == :last_request_time
490
+ assert(ref_prof[k] <= prof[k], "bad time for #{k}")
491
+ else
492
+ assert_equal(ref_prof[k], prof[k], "bad value for #{k}")
493
+ end
494
+ end
495
+ end
496
+
497
+ protected
498
+ def comp_obj(ref, val)
499
+ assert_equal(ref.class, val.class, 'bad class')
500
+ assert_not_equal(ref.object_id, val.object_id)
501
+ assert_not_equal(ref, val)
502
+ ref.instance_variables.each do |v|
503
+ assert_equal(val.instance_variable_get(v),
504
+ ref.instance_variable_get(v),
505
+ "bad attributes #{v}")
506
+ end
507
+ val.instance_variables.each do |v|
508
+ assert(ref.instance_variables.include?(v), 'addionnal attributes')
509
+ end
510
+ end
511
+
512
+ end # class BasicTest
513
+
514
+ end # module Test
515
+
516
+ end # module Session
517
+
518
+ else
519
+ STDERR.puts('need ruby1.9')
520
+ end
521
+
522
+
523
+ end