4
|
1 |
|
|
2 |
require_relative '../../helpers'
|
|
3 |
require 'symphony/tasks/ssh'
|
|
4 |
|
|
5 |
context Symphony::Task::SSH do
|
|
6 |
let( :ssh ) { (Pathname( __FILE__ ).dirname.parent.parent + 'fake_ssh').realpath }
|
|
7 |
|
|
8 |
before( :each ) do
|
|
9 |
described_class.configure(
|
|
10 |
path: ssh.to_s,
|
|
11 |
key: '/tmp/sekrit.rsa',
|
|
12 |
user: 'symphony'
|
|
13 |
)
|
|
14 |
end
|
|
15 |
|
|
16 |
it_should_behave_like "an object with Configurability"
|
|
17 |
|
|
18 |
describe 'subclassed' do
|
|
19 |
let( :instance ) { Class.new(described_class).new('queue') }
|
|
20 |
let( :payload ) {
|
|
21 |
{ 'command' => 'woohoo', 'host' => 'example.com' }
|
|
22 |
}
|
|
23 |
|
|
24 |
it "aborts if there is no command in the payload" do
|
|
25 |
expect {
|
|
26 |
instance.work( {}, {} )
|
|
27 |
}.to raise_exception( ArgumentError, /missing required option 'command'/i )
|
|
28 |
end
|
|
29 |
|
|
30 |
it "aborts if there is no host in the payload" do
|
|
31 |
expect {
|
|
32 |
instance.work({ 'command' => 'boop' }, {} )
|
|
33 |
}.to raise_exception( ArgumentError, /missing required option 'host'/i )
|
|
34 |
end
|
|
35 |
|
|
36 |
it "builds the proper command line" do
|
|
37 |
pipe = double( :fake_pipes ).as_null_object
|
|
38 |
allow( IO ).to receive( :pipe ).and_return([ pipe, pipe ])
|
|
39 |
|
|
40 |
args = [
|
17
|
41 |
'-p', '22', '-i', '/tmp/sekrit.rsa', '-l', 'symphony', 'example.com', 'woohoo'
|
4
|
42 |
]
|
|
43 |
|
|
44 |
expect( Process ).to receive( :spawn ).with(
|
17
|
45 |
*[ {}, ssh.to_s, described_class.opts, args ].flatten,
|
|
46 |
out: pipe, in: pipe, close_others: true, unsetenv_others: true
|
4
|
47 |
).and_return( 12 )
|
|
48 |
|
|
49 |
expect( Process ).to receive( :waitpid2 ).with( 12 ).and_return([ 12, 1 ])
|
|
50 |
|
|
51 |
code = instance.work( payload, {} )
|
|
52 |
expect( code ).to eq( 1 )
|
|
53 |
end
|
|
54 |
|
|
55 |
it "execs and captures output" do
|
|
56 |
code = instance.work( payload, {} )
|
|
57 |
expect( code ).to eq( 0 )
|
|
58 |
|
|
59 |
output = instance.instance_variable_get( :@output )
|
|
60 |
expect( output ).to eq( 'Hi there!' )
|
|
61 |
end
|
|
62 |
end
|
|
63 |
end
|
|
64 |
|