net-ssh-multi 1.0.0

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.
@@ -0,0 +1,201 @@
1
+ require 'common'
2
+ require 'net/ssh/multi/session'
3
+
4
+ class SessionTest < Test::Unit::TestCase
5
+ def setup
6
+ @session = Net::SSH::Multi::Session.new
7
+ end
8
+
9
+ def test_group_should_fail_when_given_both_mapping_and_block
10
+ assert_raises(ArgumentError) do
11
+ @session.group(:app => mock('server')) { |s| }
12
+ end
13
+ end
14
+
15
+ def test_group_with_block_should_use_groups_within_block_and_restore_on_exit
16
+ @session.open_groups.concat([:first, :second])
17
+ assert_equal [:first, :second], @session.open_groups
18
+ yielded = nil
19
+ @session.group(:third, :fourth) do |s|
20
+ yielded = s
21
+ assert_equal [:first, :second, :third, :fourth], @session.open_groups
22
+ end
23
+ assert_equal [:first, :second], @session.open_groups
24
+ assert_equal @session, yielded
25
+ end
26
+
27
+ def test_group_with_mapping_should_append_new_servers_to_specified_and_open_groups
28
+ s1, s2, s3, s4 = @session.use('h1', 'h2', 'h3', 'h4')
29
+ @session.group :second => s1
30
+ @session.open_groups.concat([:first, :second])
31
+ @session.group %w(third fourth) => [s2, s3], :fifth => s1, :sixth => [s4]
32
+ assert_equal [s1, s2, s3, s4], @session.groups[:first].sort
33
+ assert_equal [s1, s2, s3, s4], @session.groups[:second].sort
34
+ assert_equal [s2, s3], @session.groups[:third].sort
35
+ assert_equal [s2, s3], @session.groups[:fourth].sort
36
+ assert_equal [s1], @session.groups[:fifth].sort
37
+ assert_equal [s4], @session.groups[:sixth].sort
38
+ end
39
+
40
+ def test_via_should_instantiate_and_set_default_gateway
41
+ Net::SSH::Gateway.expects(:new).with('host', 'user', :a => :b).returns(:gateway)
42
+ assert_equal @session, @session.via('host', 'user', :a => :b)
43
+ assert_equal :gateway, @session.default_gateway
44
+ end
45
+
46
+ def test_use_should_add_new_server_to_server_list
47
+ @session.open_groups.concat([:first, :second])
48
+ server = @session.use('user@host', :a => :b)
49
+ assert_equal [server], @session.servers
50
+ assert_equal 'host', server.host
51
+ assert_equal 'user', server.user
52
+ assert_equal({:a => :b}, server.options)
53
+ assert_nil server.gateway
54
+ end
55
+
56
+ def test_use_with_open_groups_should_add_new_server_to_server_list_and_groups
57
+ @session.open_groups.concat([:first, :second])
58
+ server = @session.use('host')
59
+ assert_equal [server], @session.groups[:first].sort
60
+ assert_equal [server], @session.groups[:second].sort
61
+ end
62
+
63
+ def test_use_with_default_gateway_should_set_gateway_on_server
64
+ Net::SSH::Gateway.expects(:new).with('host', 'user', {}).returns(:gateway)
65
+ @session.via('host', 'user')
66
+ server = @session.use('host2')
67
+ assert_equal :gateway, server.gateway
68
+ end
69
+
70
+ def test_use_with_duplicate_server_will_not_add_server_twice
71
+ s1, s2 = @session.use('host', 'host')
72
+ assert_equal 1, @session.servers.length
73
+ assert_equal s1.object_id, s2.object_id
74
+ end
75
+
76
+ def test_with_should_yield_new_subsession_with_servers_for_criteria
77
+ yielded = nil
78
+ @session.expects(:servers_for).with(:app, :web).returns([:servers])
79
+ result = @session.with(:app, :web) do |s|
80
+ yielded = s
81
+ end
82
+ assert_equal result, yielded
83
+ assert_equal [:servers], yielded.servers
84
+ end
85
+
86
+ def test_servers_for_with_unknown_constraint_should_raise_error
87
+ assert_raises(ArgumentError) do
88
+ @session.servers_for(:app => { :all => :foo })
89
+ end
90
+ end
91
+
92
+ def test_with_with_constraints_should_build_subsession_with_matching_servers
93
+ conditions = { :app => { :only => { :primary => true }, :except => { :backup => true } } }
94
+ @session.expects(:servers_for).with(conditions).returns([:servers])
95
+ assert_equal [:servers], @session.with(conditions).servers
96
+ end
97
+
98
+ def test_on_should_return_subsession_containing_only_the_given_servers
99
+ s1, s2 = @session.use('h1', 'h2')
100
+ subsession = @session.on(s1, s2)
101
+ assert_equal [s1, s2], subsession.servers
102
+ end
103
+
104
+ def test_on_should_yield_subsession_if_block_is_given
105
+ s1 = @session.use('h1')
106
+ yielded = nil
107
+ result = @session.on(s1) do |s|
108
+ yielded = s
109
+ assert_equal [s1], s.servers
110
+ end
111
+ assert_equal result, yielded
112
+ end
113
+
114
+ def test_servers_for_should_return_all_servers_if_no_arguments
115
+ srv1, srv2, srv3 = @session.use('h1', 'h2', 'h3')
116
+ assert_equal [srv1, srv2, srv3], @session.servers_for.sort
117
+ end
118
+
119
+ def test_servers_for_should_return_servers_only_for_given_group
120
+ srv1, srv2, srv3 = @session.use('h1', 'h2', 'h3')
121
+ @session.group :app => [srv1, srv2], :db => [srv3]
122
+ assert_equal [srv1, srv2], @session.servers_for(:app).sort
123
+ end
124
+
125
+ def test_servers_for_should_not_return_duplicate_servers
126
+ srv1, srv2, srv3 = @session.use('h1', 'h2', 'h3')
127
+ @session.group :app => [srv1, srv2], :db => [srv2, srv3]
128
+ assert_equal [srv1, srv2, srv3], @session.servers_for(:app, :db).sort
129
+ end
130
+
131
+ def test_servers_for_should_correctly_apply_only_and_except_constraints
132
+ srv1, srv2, srv3 = @session.use('h1', :properties => {:a => 1}), @session.use('h2', :properties => {:a => 1, :b => 2}), @session.use('h3')
133
+ @session.group :app => [srv1, srv2, srv3]
134
+ assert_equal [srv1], @session.servers_for(:app => {:only => {:a => 1}, :except => {:b => 2}})
135
+ end
136
+
137
+ def test_close_should_close_server_sessions
138
+ srv1, srv2 = @session.use('h1', 'h2')
139
+ srv1.expects(:close_channels)
140
+ srv2.expects(:close_channels)
141
+ srv1.expects(:close)
142
+ srv2.expects(:close)
143
+ @session.close
144
+ end
145
+
146
+ def test_close_should_shutdown_default_gateway
147
+ gateway = mock('gateway')
148
+ gateway.expects(:shutdown!)
149
+ Net::SSH::Gateway.expects(:new).returns(gateway)
150
+ @session.via('host', 'user')
151
+ @session.close
152
+ end
153
+
154
+ def test_loop_should_loop_until_process_is_false
155
+ @session.expects(:process).with(5).times(4).returns(true,true,true,false).yields
156
+ yielded = false
157
+ @session.loop(5) { yielded = true }
158
+ assert yielded
159
+ end
160
+
161
+ def test_preprocess_should_immediately_return_false_if_block_returns_false
162
+ srv = @session.use('h1')
163
+ srv.expects(:preprocess).never
164
+ assert_equal false, @session.preprocess { false }
165
+ end
166
+
167
+ def test_preprocess_should_call_preprocess_on_component_servers
168
+ srv = @session.use('h1')
169
+ srv.expects(:preprocess)
170
+ assert_equal :hello, @session.preprocess { :hello }
171
+ end
172
+
173
+ def test_preprocess_should_succeed_even_without_block
174
+ srv = @session.use('h1')
175
+ srv.expects(:preprocess)
176
+ assert_equal true, @session.preprocess
177
+ end
178
+
179
+ def test_postprocess_should_call_postprocess_on_component_servers
180
+ srv = @session.use('h1')
181
+ srv.expects(:postprocess).with([:a], [:b])
182
+ assert_equal true, @session.postprocess([:a], [:b])
183
+ end
184
+
185
+ def test_process_should_return_false_if_preprocess_returns_false
186
+ assert_equal false, @session.process { false }
187
+ end
188
+
189
+ def test_process_should_call_select_on_combined_readers_and_writers_from_all_servers
190
+ @session.expects(:postprocess).with([:b, :c], [:a, :c])
191
+ srv1, srv2, srv3 = @session.use('h1', 'h2', 'h3')
192
+ srv1.expects(:readers).returns([:a])
193
+ srv1.expects(:writers).returns([:a])
194
+ srv2.expects(:readers).returns([])
195
+ srv2.expects(:writers).returns([])
196
+ srv3.expects(:readers).returns([:b, :c])
197
+ srv3.expects(:writers).returns([:c])
198
+ IO.expects(:select).with([:a, :b, :c], [:a, :c], nil, 5).returns([[:b, :c], [:a, :c]])
199
+ @session.process(5)
200
+ end
201
+ end
data/test/test_all.rb ADDED
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/**/*_test.rb"].each do |file|
2
+ load(file)
3
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: net-ssh-multi
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jamis Buck
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-01 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: net-ssh
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.99.2
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: net-ssh-gateway
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 0.99.0
32
+ version:
33
+ description: Control multiple Net::SSH connections via a single interface
34
+ email: jamis@jamisbuck.org
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - CHANGELOG.rdoc
43
+ - lib/net/ssh/multi/channel.rb
44
+ - lib/net/ssh/multi/channel_proxy.rb
45
+ - lib/net/ssh/multi/dynamic_server.rb
46
+ - lib/net/ssh/multi/pending_connection.rb
47
+ - lib/net/ssh/multi/server.rb
48
+ - lib/net/ssh/multi/server_list.rb
49
+ - lib/net/ssh/multi/session.rb
50
+ - lib/net/ssh/multi/session_actions.rb
51
+ - lib/net/ssh/multi/subsession.rb
52
+ - lib/net/ssh/multi/version.rb
53
+ - lib/net/ssh/multi.rb
54
+ - Manifest
55
+ - Rakefile
56
+ - README.rdoc
57
+ - setup.rb
58
+ - test/channel_test.rb
59
+ - test/common.rb
60
+ - test/multi_test.rb
61
+ - test/server_test.rb
62
+ - test/session_actions_test.rb
63
+ - test/session_test.rb
64
+ - test/test_all.rb
65
+ - net-ssh-multi.gemspec
66
+ has_rdoc: true
67
+ homepage: http://net-ssh.rubyforge.org/multi
68
+ post_install_message:
69
+ rdoc_options: []
70
+
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ requirements: []
86
+
87
+ rubyforge_project: net-ssh-multi
88
+ rubygems_version: 1.1.1
89
+ signing_key:
90
+ specification_version: 2
91
+ summary: Control multiple Net::SSH connections via a single interface
92
+ test_files:
93
+ - test/test_all.rb