t2-server 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +1 -0
  3. data/.ruby-env +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -1
  7. data/CHANGES.rdoc +49 -0
  8. data/README.rdoc +10 -8
  9. data/bin/t2-delete-runs +0 -3
  10. data/lib/t2-server-cli.rb +16 -9
  11. data/lib/t2-server/exceptions.rb +7 -19
  12. data/lib/t2-server/net/connection.rb +14 -6
  13. data/lib/t2-server/net/credentials.rb +12 -1
  14. data/lib/t2-server/net/parameters.rb +3 -3
  15. data/lib/t2-server/port.rb +12 -29
  16. data/lib/t2-server/run.rb +54 -35
  17. data/lib/t2-server/server.rb +3 -4
  18. data/lib/t2-server/xml.rb +0 -1
  19. data/lib/t2-server/xml/methods.rb +97 -4
  20. data/t2-server.gemspec +4 -1
  21. data/test/helpers/fake-run.rb +47 -0
  22. data/test/helpers/test-cache.rb +49 -0
  23. data/test/helpers/test-xml.rb +36 -0
  24. data/test/helpers/timezone.rb +39 -0
  25. data/test/mocked-server-responses/.gitattributes +1 -0
  26. data/test/mocked-server-responses/get-admin.raw +6 -0
  27. data/test/mocked-server-responses/get-rest-policy-runlimit.raw +6 -0
  28. data/test/mocked-server-responses/get-rest-policy.raw +6 -0
  29. data/test/mocked-server-responses/get-rest-run-input-expected.raw +6 -0
  30. data/test/mocked-server-responses/get-rest-run-input.raw +6 -0
  31. data/test/mocked-server-responses/get-rest-run-interaction-feed-0.raw +11 -0
  32. data/test/mocked-server-responses/get-rest-run-interaction-feed-1.raw +92 -0
  33. data/test/mocked-server-responses/get-rest-run-interaction-feed-2.raw +80 -0
  34. data/test/mocked-server-responses/get-rest-run-name.raw +6 -0
  35. data/test/mocked-server-responses/get-rest-run-output-list-errors.raw +6 -0
  36. data/test/mocked-server-responses/get-rest-run-output.raw +6 -0
  37. data/test/mocked-server-responses/get-rest-run-security-permissions.raw +6 -0
  38. data/test/mocked-server-responses/get-rest-run-security.raw +6 -0
  39. data/test/mocked-server-responses/get-rest-run.raw +6 -0
  40. data/test/mocked-server-responses/get-rest-runs.raw +6 -0
  41. data/test/mocked-server-responses/get-rest.raw +6 -0
  42. data/test/mocked-server-responses/log.txt +1 -0
  43. data/test/mocked-server-responses/mocks.rb +107 -0
  44. data/test/mocked-server-responses/options-admin-allownew.raw +7 -0
  45. data/test/tc_admin.rb +52 -24
  46. data/test/tc_admin_live.rb +66 -0
  47. data/test/tc_connection.rb +87 -0
  48. data/test/tc_connection_exceptions.rb +86 -0
  49. data/test/tc_credentials.rb +73 -0
  50. data/test/tc_interaction.rb +182 -0
  51. data/test/{tc_misc.rb → tc_misc_live.rb} +3 -1
  52. data/test/tc_params.rb +82 -4
  53. data/test/tc_perms.rb +54 -101
  54. data/test/tc_perms_live.rb +150 -0
  55. data/test/tc_ports.rb +192 -0
  56. data/test/tc_run.rb +333 -350
  57. data/test/tc_run_live.rb +453 -0
  58. data/test/{tc_secure.rb → tc_secure_live.rb} +30 -29
  59. data/test/tc_server.rb +115 -42
  60. data/test/tc_server_live.rb +92 -0
  61. data/test/tc_server_version.rb +19 -0
  62. data/test/tc_xml_messages.rb +201 -0
  63. data/test/ts_t2server.rb +37 -43
  64. data/test/workflows/secure/heater-pk.pem +24 -18
  65. data/test/workflows/secure/user-cert.p12 +0 -0
  66. data/version.yml +1 -1
  67. metadata +136 -29
  68. data/lib/t2-server/xml/fragments.rb +0 -78
@@ -0,0 +1,86 @@
1
+ # Copyright (c) 2014 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'mocked-server-responses/mocks'
34
+ require 't2-server'
35
+
36
+ class TestConnectionExceptions < Test::Unit::TestCase
37
+ include T2Server::Mocks
38
+
39
+ def test_get_404
40
+ mock("", :accept => "*/*", :status => 404)
41
+ connection = T2Server::ConnectionFactory.connect($uri, $conn_params)
42
+
43
+ assert_raise(T2Server::AttributeNotFoundError) do
44
+ connection.GET($uri, "*/*", nil, nil)
45
+ end
46
+ end
47
+
48
+ def test_put_403
49
+ mock("", :method => :put, :accept => "*/*", :status => 403)
50
+
51
+ connection = T2Server::ConnectionFactory.connect($uri, $conn_params)
52
+
53
+ assert_raise(T2Server::AccessForbiddenError) do
54
+ connection.PUT($uri, "", "*/*", nil)
55
+ end
56
+ end
57
+
58
+ def test_post_401
59
+ mock("", :method => :post, :accept => "*/*", :credentials => $userinfo,
60
+ :status => 401)
61
+
62
+ connection = T2Server::ConnectionFactory.connect($uri, $conn_params)
63
+ assert_raise(T2Server::AuthorizationError) do
64
+ connection.POST($uri, "", "*/*", $creds)
65
+ end
66
+ end
67
+
68
+ def test_options_500
69
+ mock("", :method => :options, :status => 500)
70
+
71
+ connection = T2Server::ConnectionFactory.connect($uri, $conn_params)
72
+ assert_raise(T2Server::UnexpectedServerResponse) do
73
+ connection.OPTIONS($uri, nil)
74
+ end
75
+ end
76
+
77
+ def test_network_timeout
78
+ mock("", :timeout => true)
79
+
80
+ connection = T2Server::ConnectionFactory.connect($uri, $conn_params)
81
+ assert_raise(T2Server::ConnectionError) do
82
+ connection.GET($uri, "*/*", nil, nil)
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,73 @@
1
+ # Copyright (c) 2014 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 't2-server'
34
+
35
+ class TestCredentials < Test::Unit::TestCase
36
+
37
+ USERNAME = "username"
38
+ PASSWORD = "password"
39
+ USERINFO = "#{USERNAME}:#{PASSWORD}"
40
+
41
+ # This class is used to ensure that the password is set in the credentials.
42
+ class FakeRequest
43
+ def basic_auth(user, pass)
44
+ pass
45
+ end
46
+ end
47
+
48
+ def test_no_password_exposure
49
+ creds = T2Server::HttpBasic.new(USERNAME, PASSWORD)
50
+
51
+ r_to_s = creds.to_s
52
+ r_inspect = creds.inspect
53
+
54
+ refute r_to_s.include?(PASSWORD)
55
+ refute r_inspect.include?(PASSWORD)
56
+ end
57
+
58
+ def test_create_basic
59
+ request = FakeRequest.new
60
+ creds = T2Server::HttpBasic.new(USERNAME, PASSWORD)
61
+
62
+ assert_equal USERNAME, creds.username
63
+ assert_equal PASSWORD, creds.authenticate(request)
64
+ end
65
+
66
+ def test_parse_basic
67
+ request = FakeRequest.new
68
+ creds = T2Server::HttpBasic.parse(USERINFO)
69
+
70
+ assert_equal USERNAME, creds.username
71
+ assert_equal PASSWORD, creds.authenticate(request)
72
+ end
73
+ end
@@ -0,0 +1,182 @@
1
+ # Copyright (c) 2014 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'mocked-server-responses/mocks'
34
+ require 't2-server'
35
+
36
+ class TestInteractions < Test::Unit::TestCase
37
+ include T2Server::Mocks
38
+
39
+ WKF_PASS = "test/workflows/pass_through.t2flow"
40
+
41
+ # Need to lock down the run UUID so recorded server responses make sense.
42
+ RUN_UUID = "a341b87f-25cc-4dfd-be36-f5b073a6ba74"
43
+ RUN_PATH = "/rest/runs/#{RUN_UUID}"
44
+
45
+ def setup
46
+ # Register common mocks.
47
+ mock("/rest/", :accept => "application/xml", :output => "get-rest.raw")
48
+ mock("/rest/policy", :accept => "application/xml",
49
+ :output => "get-rest-policy.raw")
50
+ mock("/rest/runs", :method => :post, :credentials => $userinfo,
51
+ :status => 201,
52
+ :location => "https://localhost/taverna#{RUN_PATH}")
53
+ mock(RUN_PATH, :accept => "application/xml", :credentials => $userinfo,
54
+ :output => "get-rest-run.raw")
55
+ mock("#{RUN_PATH}/input", :accept => "application/xml",
56
+ :credentials => $userinfo, :output => "get-rest-run-input.raw")
57
+ mock("#{RUN_PATH}/security", :accept => "application/xml",
58
+ :credentials => $userinfo, :output => "get-rest-run-security.raw")
59
+
60
+ @run = T2Server::Run.create($uri, WKF_PASS, $creds, $conn_params)
61
+ end
62
+
63
+ def test_empty_feed
64
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
65
+ :credentials => $userinfo,
66
+ :output => "get-rest-run-interaction-feed-0.raw")
67
+ assert_equal [], @run.notifications(:all)
68
+ end
69
+
70
+ def test_requests
71
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
72
+ :credentials => $userinfo,
73
+ :output => "get-rest-run-interaction-feed-1.raw")
74
+
75
+ entries = @run.notifications(:all)
76
+ requests = @run.notifications(:requests)
77
+ replies = @run.notifications(:replies)
78
+
79
+ assert_equal 2, entries.length
80
+ assert_equal 2, requests.length
81
+ assert_equal [], replies
82
+
83
+ # No new requests...
84
+ assert_equal [], @run.notifications
85
+
86
+ entries.each do |entry|
87
+ refute entry.is_reply?
88
+ refute entry.is_notification?
89
+ refute entry.has_reply?
90
+ assert_not_equal "", entry.serial
91
+ assert_not_nil entry.uri
92
+ assert_nil entry.reply_to
93
+ end
94
+
95
+ test_input_data = "{ \"test\" : \"value\"}"
96
+ mock("#{RUN_PATH}/wd/interactions/interaction#{entries[0].id}InputData.json",
97
+ :credentials => $userinfo, :body => test_input_data)
98
+
99
+ assert_equal test_input_data, entries[0].input_data
100
+ end
101
+
102
+ def test_no_request_input_data
103
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
104
+ :credentials => $userinfo,
105
+ :output => "get-rest-run-interaction-feed-1.raw")
106
+
107
+ entries = @run.notifications
108
+
109
+ mock("#{RUN_PATH}/wd/interactions/interaction#{entries[0].id}InputData.json",
110
+ :credentials => $userinfo, :body => "", :status => 404)
111
+
112
+ assert_nothing_raised(T2Server::AttributeNotFoundError) do
113
+ assert_equal "", entries[0].input_data
114
+ end
115
+ end
116
+
117
+ def test_reply
118
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
119
+ :credentials => $userinfo,
120
+ :output => "get-rest-run-interaction-feed-1.raw")
121
+
122
+ test_reply_data = "{ \"test\" : \"value\" }"
123
+
124
+ entries = @run.notifications
125
+
126
+ mock("#{RUN_PATH}/wd/interactions/interaction#{entries[0].id}OutputData.json",
127
+ :method => :put, :credentials => $userinfo, :body => test_reply_data)
128
+
129
+ # When mocking this POST it doesn't matter (at the moment) what the
130
+ # returned location is.
131
+ mock("#{RUN_PATH}/interaction", :method => :post, :status => 201,
132
+ :credentials => $userinfo, :location => "https://localhost/taverna")
133
+
134
+ entries[0].reply("OK", test_reply_data)
135
+ end
136
+
137
+ def test_replies
138
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
139
+ :credentials => $userinfo,
140
+ :output => "get-rest-run-interaction-feed-1.raw")
141
+
142
+ entries = @run.notifications(:all)
143
+ requests = @run.notifications(:requests)
144
+ replies = @run.notifications(:replies)
145
+
146
+ assert_equal 2, entries.length
147
+ assert_equal 2, requests.length
148
+ assert_equal [], replies
149
+
150
+ mock("#{RUN_PATH}/interaction", :accept => "application/atom+xml",
151
+ :credentials => $userinfo,
152
+ :output => "get-rest-run-interaction-feed-2.raw")
153
+
154
+ # No new requests...
155
+ assert_equal [], @run.notifications
156
+
157
+ # Refresh local lists.
158
+ entries = @run.notifications(:all)
159
+ requests = @run.notifications(:requests)
160
+ replies = @run.notifications(:replies)
161
+
162
+ # One more entry in total.
163
+ assert_equal 3, entries.length
164
+
165
+ # Should not lose a request.
166
+ assert_equal 2, requests.length
167
+
168
+ # Should gain a reply.
169
+ assert_equal 1, replies.length
170
+
171
+ # One request should have a reply.
172
+ assert requests[0].has_reply?
173
+ refute requests[1].has_reply?
174
+
175
+ refute replies[0].is_notification?
176
+ refute replies[0].has_reply?
177
+ assert replies[0].is_reply?
178
+ assert_equal requests[0].id, replies[0].reply_to
179
+ assert_equal "", replies[0].input_data
180
+ end
181
+
182
+ end
@@ -34,10 +34,12 @@ require 't2-server'
34
34
 
35
35
  class TestMisc < Test::Unit::TestCase
36
36
 
37
+ WKF_MISS_O = "test/workflows/missing_outputs.t2flow"
38
+
37
39
  # Test a run with the missing output data bug to check that the library can
38
40
  # workaround it ok. Bug is: http://dev.mygrid.org.uk/issues/browse/T2-2100
39
41
  def test_missing_ports
40
- T2Server::Run.create($uri, $wkf_miss_o, $creds, $conn_params) do |run|
42
+ T2Server::Run.create($uri, WKF_MISS_O, $creds, $conn_params) do |run|
41
43
  assert_nothing_raised { run.start }
42
44
  assert(run.running?)
43
45
  run.wait
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010, 2011 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -34,13 +34,91 @@ require 't2-server'
34
34
 
35
35
  class TestParams < Test::Unit::TestCase
36
36
 
37
- def test_params
37
+ CERT_DIR = "test/workflows/secure"
38
+ SERVER_PK = "#{CERT_DIR}/heater-pk.pem"
39
+ CLNT_CERT = "#{CERT_DIR}/user-cert.p12"
40
+ CLNT_PASS = "testcert"
41
+
42
+ def test_base_params
38
43
  params = T2Server::ConnectionParameters.new
39
44
 
40
45
  params[:verify_peer] = true
41
- assert_not_nil(params[:verify_peer])
46
+ assert_not_nil params[:verify_peer]
42
47
 
43
48
  params[:not_a_chance] = true
44
- assert_nil(params[:not_a_chance])
49
+ assert_nil params[:not_a_chance]
45
50
  end
51
+
52
+ def test_insecure
53
+ params = T2Server::InsecureSSLConnectionParameters.new
54
+
55
+ assert_not_nil params[:verify_peer]
56
+ refute params[:verify_peer]
57
+
58
+ assert_nothing_raised do
59
+ T2Server::Server.new("#{$uri}/insecure", params)
60
+ end
61
+ end
62
+
63
+ def test_ssl3
64
+ params = T2Server::SSL3ConnectionParameters.new
65
+
66
+ assert_not_nil params[:verify_peer]
67
+ assert params[:verify_peer]
68
+
69
+ assert_not_nil params[:ssl_version]
70
+ assert_equal :SSLv3, params[:ssl_version]
71
+
72
+ assert_nothing_raised do
73
+ T2Server::Server.new("#{$uri}/ssl3", params)
74
+ end
75
+ end
76
+
77
+ def test_custom_ca
78
+ uri_suffix = 0
79
+
80
+ [CERT_DIR, SERVER_PK, Dir.new(CERT_DIR), File.new(SERVER_PK)].each do |c|
81
+ params = T2Server::CustomCASSLConnectionParameters.new(c)
82
+
83
+ assert_not_nil params[:verify_peer]
84
+ assert params[:verify_peer]
85
+
86
+ if c.instance_of?(Dir) || File.directory?(c)
87
+ assert_not_nil params[:ca_path]
88
+ assert_equal CERT_DIR, params[:ca_path]
89
+ else
90
+ assert_not_nil params[:ca_file]
91
+ assert_equal SERVER_PK, params[:ca_file]
92
+ end
93
+
94
+ assert_nothing_raised do
95
+ T2Server::Server.new("#{$uri}/ca/#{uri_suffix}", params)
96
+ end
97
+
98
+ uri_suffix += 1
99
+ end
100
+ end
101
+
102
+ def test_client_cert
103
+ uri_suffix = 0
104
+
105
+ [CLNT_CERT, File.new(CLNT_CERT)].each do |c|
106
+ params = T2Server::ClientAuthSSLConnectionParameters.new(c, CLNT_PASS)
107
+
108
+ assert_not_nil params[:verify_peer]
109
+ assert params[:verify_peer]
110
+
111
+ assert_not_nil params[:client_certificate]
112
+ assert_equal CLNT_CERT, params[:client_certificate]
113
+ assert_not_nil params[:client_password]
114
+ assert_equal CLNT_PASS, params[:client_password]
115
+
116
+ assert_nothing_raised do
117
+ T2Server::Server.new("#{$uri}/client/#{uri_suffix}", params)
118
+ end
119
+
120
+ uri_suffix += 1
121
+ end
122
+ end
123
+
46
124
  end