-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
transfer_test.rb
168 lines (142 loc) · 6.83 KB
/
transfer_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
require 'utils'
require 'capistrano/transfer'
class TransferTest < Test::Unit::TestCase
def test_class_process_should_delegate_to_instance_process
Capistrano::Transfer.expects(:new).with(:up, "from", "to", %w(a b c), {}).returns(mock('transfer', :process! => nil)).yields
yielded = false
Capistrano::Transfer.process(:up, "from", "to", %w(a b c), {}) { yielded = true }
assert yielded
end
def test_default_transport_is_sftp
transfer = Capistrano::Transfer.new(:up, "from", "to", [])
assert_equal :sftp, transfer.transport
end
def test_active_is_true_when_any_sftp_transfers_are_active
returns = [false, false, true]
sessions = [session('app1', :sftp), session('app2', :sftp), session('app3', :sftp)].each { |s| s.xsftp.expects(:upload).returns(stub('operation', :active? => returns.shift)) }
transfer = Capistrano::Transfer.new(:up, "from", "to", sessions, :via => :sftp)
assert_equal true, transfer.active?
end
def test_active_is_false_when_all_sftp_transfers_are_not_active
sessions = [session('app1', :sftp), session('app2', :sftp)].each { |s| s.xsftp.expects(:upload).returns(stub('operation', :active? => false)) }
transfer = Capistrano::Transfer.new(:up, "from", "to", sessions, :via => :sftp)
assert_equal false, transfer.active?
end
def test_active_is_true_when_any_scp_transfers_are_active
returns = [false, false, true]
sessions = [session('app1', :scp), session('app2', :scp), session('app3', :scp)].each do |s|
channel = stub('channel', :[]= => nil, :active? => returns.shift)
s.scp.expects(:upload).returns(channel)
end
transfer = Capistrano::Transfer.new(:up, "from", "to", sessions, :via => :scp)
assert_equal true, transfer.active?
end
def test_active_is_false_when_all_scp_transfers_are_not_active
sessions = [session('app1', :scp), session('app2', :scp), session('app3', :scp)].each do |s|
channel = stub('channel', :[]= => nil, :active? => false)
s.scp.expects(:upload).returns(channel)
end
transfer = Capistrano::Transfer.new(:up, "from", "to", sessions, :via => :scp)
assert_equal false, transfer.active?
end
[:up, :down].each do |direction|
define_method("test_sftp_#{direction}load_from_file_to_file_should_normalize_from_and_to") do
sessions = [session('app1', :sftp), session('app2', :sftp)]
sessions.each do |session|
session.xsftp.expects("#{direction}load".to_sym).with("from-#{session.xserver.host}", "to-#{session.xserver.host}",
:properties => { :server => session.xserver, :host => session.xserver.host })
end
transfer = Capistrano::Transfer.new(direction, "from-$CAPISTRANO:HOST$", "to-$CAPISTRANO:HOST$", sessions)
end
define_method("test_scp_#{direction}load_from_file_to_file_should_normalize_from_and_to") do
sessions = [session('app1', :scp), session('app2', :scp)]
sessions.each do |session|
session.scp.expects("#{direction}load".to_sym).returns({}).with("from-#{session.xserver.host}", "to-#{session.xserver.host}", :via => :scp)
end
transfer = Capistrano::Transfer.new(direction, "from-$CAPISTRANO:HOST$", "to-$CAPISTRANO:HOST$", sessions, :via => :scp)
end
end
def test_sftp_upload_from_IO_to_file_should_clone_the_IO_for_each_connection
sessions = [session('app1', :sftp), session('app2', :sftp)]
io = StringIO.new("from here")
sessions.each do |session|
session.xsftp.expects(:upload).with do |from, to, opts|
from != io && from.is_a?(StringIO) && from.string == io.string &&
to == "/to/here-#{session.xserver.host}" &&
opts[:properties][:server] == session.xserver &&
opts[:properties][:host] == session.xserver.host
end
end
transfer = Capistrano::Transfer.new(:up, StringIO.new("from here"), "/to/here-$CAPISTRANO:HOST$", sessions)
end
def test_scp_upload_from_IO_to_file_should_clone_the_IO_for_each_connection
sessions = [session('app1', :scp), session('app2', :scp)]
io = StringIO.new("from here")
sessions.each do |session|
channel = mock('channel')
channel.expects(:[]=).with(:server, session.xserver)
channel.expects(:[]=).with(:host, session.xserver.host)
session.scp.expects(:upload).returns(channel).with do |from, to, opts|
from != io && from.is_a?(StringIO) && from.string == io.string &&
to == "/to/here-#{session.xserver.host}"
end
end
transfer = Capistrano::Transfer.new(:up, StringIO.new("from here"), "/to/here-$CAPISTRANO:HOST$", sessions, :via => :scp)
end
def test_process_should_block_until_transfer_is_no_longer_active
transfer = Capistrano::Transfer.new(:up, "from", "to", [])
transfer.expects(:process_iteration).times(4).yields.returns(true,true,true,false)
transfer.expects(:active?).times(4)
transfer.process!
end
def test_errors_raised_for_a_sftp_session_should_abort_session_and_continue_with_remaining_sessions
s = session('app1')
error = ExceptionWithSession.new(s)
transfer = Capistrano::Transfer.new(:up, "from", "to", [])
transfer.expects(:process_iteration).raises(error).times(3).returns(true, false)
txfr = mock('transfer', :abort! => true)
txfr.expects(:[]=).with(:failed, true)
txfr.expects(:[]=).with(:error, error)
transfer.expects(:session_map).returns(s => txfr)
transfer.process!
end
def test_errors_raised_for_a_scp_session_should_abort_session_and_continue_with_remaining_sessions
s = session('app1')
error = ExceptionWithSession.new(s)
transfer = Capistrano::Transfer.new(:up, "from", "to", [], :via => :scp)
transfer.expects(:process_iteration).raises(error).times(3).returns(true, false)
txfr = mock('channel', :close => true)
txfr.expects(:[]=).with(:failed, true)
txfr.expects(:[]=).with(:error, error)
transfer.expects(:session_map).returns(s => txfr)
transfer.process!
end
def test_uploading_a_non_existing_file_should_raise_an_understandable_error
s = session('app1')
error = Capistrano::Processable::SessionAssociation.on(ArgumentError.new('expected a file to upload'), s)
transfer = Capistrano::Transfer.new(:up, "from", "to", [], :via => :scp)
transfer.expects(:process_iteration).raises(error)
assert_raise(ArgumentError, 'expected a file to upload') { transfer.process! }
end
private
class ExceptionWithSession < ::Exception
attr_reader :session
def initialize(session)
@session = session
super()
end
end
def session(host, mode=nil)
session = stub('session', :xserver => stub('server', :host => host))
case mode
when :sftp
sftp = stub('sftp')
session.expects(:sftp).with(false).returns(sftp)
sftp.expects(:connect).yields(sftp).returns(sftp)
session.stubs(:xsftp).returns(sftp)
when :scp
session.stubs(:scp).returns(stub('scp'))
end
session
end
end