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