net-sftp 2.0.5 → 3.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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data/.gitignore +5 -0
- data/.travis.yml +20 -0
- data/{CHANGELOG.rdoc → CHANGES.txt} +18 -0
- data/Gemfile +15 -0
- data/LICENSE.txt +19 -0
- data/README.rdoc +23 -1
- data/Rakefile +44 -21
- data/lib/net/sftp/operations/dir.rb +3 -3
- data/lib/net/sftp/operations/download.rb +8 -7
- data/lib/net/sftp/operations/file.rb +30 -8
- data/lib/net/sftp/operations/upload.rb +14 -6
- data/lib/net/sftp/session.rb +9 -7
- data/lib/net/sftp/version.rb +63 -13
- data/lib/net/sftp.rb +12 -4
- data/net-sftp-public_cert.pem +20 -0
- data/net-sftp.gemspec +38 -24
- data.tar.gz.sig +0 -0
- metadata +110 -127
- metadata.gz.sig +0 -0
- data/test/common.rb +0 -172
- data/test/protocol/01/test_attributes.rb +0 -97
- data/test/protocol/01/test_base.rb +0 -210
- data/test/protocol/01/test_name.rb +0 -27
- data/test/protocol/02/test_base.rb +0 -26
- data/test/protocol/03/test_base.rb +0 -27
- data/test/protocol/04/test_attributes.rb +0 -148
- data/test/protocol/04/test_base.rb +0 -74
- data/test/protocol/04/test_name.rb +0 -53
- data/test/protocol/05/test_base.rb +0 -62
- data/test/protocol/06/test_attributes.rb +0 -124
- data/test/protocol/06/test_base.rb +0 -51
- data/test/protocol/test_base.rb +0 -42
- data/test/test_all.rb +0 -7
- data/test/test_dir.rb +0 -47
- data/test/test_download.rb +0 -252
- data/test/test_file.rb +0 -159
- data/test/test_file_factory.rb +0 -48
- data/test/test_packet.rb +0 -9
- data/test/test_protocol.rb +0 -17
- data/test/test_request.rb +0 -71
- data/test/test_response.rb +0 -53
- data/test/test_session.rb +0 -741
- data/test/test_upload.rb +0 -219
data/test/test_session.rb
DELETED
@@ -1,741 +0,0 @@
|
|
1
|
-
require "common"
|
2
|
-
|
3
|
-
class SessionTest < Net::SFTP::TestCase
|
4
|
-
include Net::SFTP::Constants
|
5
|
-
include Net::SFTP::Constants::OpenFlags
|
6
|
-
include Net::SFTP::Constants::PacketTypes
|
7
|
-
|
8
|
-
(1..6).each do |version|
|
9
|
-
define_method("test_server_reporting_version_#{version}_should_cause_version_#{version}_to_be_used") do
|
10
|
-
expect_sftp_session :server_version => version
|
11
|
-
assert_scripted { sftp.connect! }
|
12
|
-
assert_equal version, sftp.protocol.version
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_v1_open_read_only_that_succeeds_should_invoke_callback
|
17
|
-
expect_open("/path/to/file", "r", nil, :server_version => 1)
|
18
|
-
assert_successful_open("/path/to/file")
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_v1_open_read_only_that_fails_should_invoke_callback
|
22
|
-
expect_open("/path/to/file", "r", nil, :server_version => 1, :fail => 2)
|
23
|
-
|
24
|
-
assert_command_with_callback(:open, "/path/to/file") do |response|
|
25
|
-
assert !response.ok?
|
26
|
-
assert_equal 2, response.code
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_v1_open_write_only_that_succeeds_should_invoke_callback
|
31
|
-
expect_open("/path/to/file", "w", nil, :server_version => 1)
|
32
|
-
assert_successful_open("/path/to/file", "w")
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_v1_open_read_write_that_succeeds_should_invoke_callback
|
36
|
-
expect_open("/path/to/file", "rw", nil, :server_version => 1)
|
37
|
-
assert_successful_open("/path/to/file", "r+")
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_v1_open_append_that_succeeds_should_invoke_callback
|
41
|
-
expect_open("/path/to/file", "a", nil, :server_version => 1)
|
42
|
-
assert_successful_open("/path/to/file", "a")
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_v1_open_with_permissions_should_specify_permissions
|
46
|
-
expect_open("/path/to/file", "r", 0765, :server_version => 1)
|
47
|
-
assert_successful_open("/path/to/file", "r", :permissions => 0765)
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_v4_open_with_permissions_should_specify_permissions
|
51
|
-
expect_open("/path/to/file", "r", 0765, :server_version => 4)
|
52
|
-
assert_successful_open("/path/to/file", "r", :permissions => 0765)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_v5_open_read_only_shuld_invoke_callback
|
56
|
-
expect_open("/path/to/file", "r", 0765, :server_version => 5)
|
57
|
-
assert_successful_open("/path/to/file", "r", :permissions => 0765)
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_v6_open_with_permissions_should_specify_permissions
|
61
|
-
expect_open("/path/to/file", "r", 0765, :server_version => 6)
|
62
|
-
assert_successful_open("/path/to/file", "r", :permissions => 0765)
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_open_bang_should_block_and_return_handle
|
66
|
-
expect_open("/path/to/file", "r", nil)
|
67
|
-
handle = assert_synchronous_command(:open!, "/path/to/file", "r")
|
68
|
-
assert_equal "handle", handle
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_open_bang_should_block_and_raise_exception_on_error
|
72
|
-
expect_open("/path/to/file", "r", nil, :fail => 5)
|
73
|
-
assert_raises(Net::SFTP::StatusException) do
|
74
|
-
assert_synchronous_command(:open!, "/path/to/file", "r")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_close_should_send_close_request_and_invoke_callback
|
79
|
-
expect_sftp_session do |channel|
|
80
|
-
channel.sends_packet(FXP_CLOSE, :long, 0, :string, "handle")
|
81
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
82
|
-
end
|
83
|
-
|
84
|
-
assert_command_with_callback(:close, "handle") { |r| assert r.ok? }
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_close_bang_should_block_and_return_response
|
88
|
-
expect_sftp_session do |channel|
|
89
|
-
channel.sends_packet(FXP_CLOSE, :long, 0, :string, "handle")
|
90
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
91
|
-
end
|
92
|
-
|
93
|
-
response = assert_synchronous_command(:close!, "handle")
|
94
|
-
assert response.ok?
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_read_should_send_read_request_and_invoke_callback
|
98
|
-
expect_sftp_session do |channel|
|
99
|
-
channel.sends_packet(FXP_READ, :long, 0, :string, "handle", :int64, 512123, :long, 1024)
|
100
|
-
channel.gets_packet(FXP_DATA, :long, 0, :string, "this is some data!")
|
101
|
-
end
|
102
|
-
|
103
|
-
assert_command_with_callback(:read, "handle", 512123, 1024) do |response|
|
104
|
-
assert response.ok?
|
105
|
-
assert_equal "this is some data!", response[:data]
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_read_bang_should_block_and_return_data
|
110
|
-
expect_sftp_session do |channel|
|
111
|
-
channel.sends_packet(FXP_READ, :long, 0, :string, "handle", :int64, 512123, :long, 1024)
|
112
|
-
channel.gets_packet(FXP_DATA, :long, 0, :string, "this is some data!")
|
113
|
-
end
|
114
|
-
|
115
|
-
data = assert_synchronous_command(:read!, "handle", 512123, 1024)
|
116
|
-
assert_equal "this is some data!", data
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_read_bang_should_block_and_return_nil_on_eof
|
120
|
-
expect_sftp_session do |channel|
|
121
|
-
channel.sends_packet(FXP_READ, :long, 0, :string, "handle", :int64, 512123, :long, 1024)
|
122
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 1)
|
123
|
-
end
|
124
|
-
|
125
|
-
data = assert_synchronous_command(:read!, "handle", 512123, 1024)
|
126
|
-
assert_nil data
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_write_should_send_write_request_and_invoke_callback
|
130
|
-
expect_sftp_session do |channel|
|
131
|
-
channel.sends_packet(FXP_WRITE, :long, 0, :string, "handle", :int64, 512123, :string, "this is some data!")
|
132
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
133
|
-
end
|
134
|
-
|
135
|
-
assert_command_with_callback(:write, "handle", 512123, "this is some data!") do |response|
|
136
|
-
assert response.ok?
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_write_bang_should_block_and_return_response
|
141
|
-
expect_sftp_session do |channel|
|
142
|
-
channel.sends_packet(FXP_WRITE, :long, 0, :string, "handle", :int64, 512123, :string, "this is some data!")
|
143
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
144
|
-
end
|
145
|
-
|
146
|
-
response = assert_synchronous_command(:write!, "handle", 512123, "this is some data!")
|
147
|
-
assert response.ok?
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_v1_lstat_should_send_lstat_request_and_invoke_callback
|
151
|
-
expect_sftp_session :server_version => 1 do |channel|
|
152
|
-
channel.sends_packet(FXP_LSTAT, :long, 0, :string, "/path/to/file")
|
153
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
154
|
-
end
|
155
|
-
|
156
|
-
assert_command_with_callback(:lstat, "/path/to/file") do |response|
|
157
|
-
assert response.ok?
|
158
|
-
assert_equal 123456, response[:attrs].size
|
159
|
-
assert_equal 1, response[:attrs].uid
|
160
|
-
assert_equal 2, response[:attrs].gid
|
161
|
-
assert_equal 0765, response[:attrs].permissions
|
162
|
-
assert_equal 123456789, response[:attrs].atime
|
163
|
-
assert_equal 234567890, response[:attrs].mtime
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_v4_lstat_should_send_default_flags_parameter
|
168
|
-
expect_sftp_session :server_version => 4 do |channel|
|
169
|
-
channel.sends_packet(FXP_LSTAT, :long, 0, :string, "/path/to/file", :long, 0x800001fd)
|
170
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
171
|
-
end
|
172
|
-
|
173
|
-
assert_command_with_callback(:lstat, "/path/to/file")
|
174
|
-
end
|
175
|
-
|
176
|
-
def test_v4_lstat_should_honor_flags_parameter
|
177
|
-
expect_sftp_session :server_version => 4 do |channel|
|
178
|
-
channel.sends_packet(FXP_LSTAT, :long, 0, :string, "/path/to/file", :long, 0x1)
|
179
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
180
|
-
end
|
181
|
-
|
182
|
-
assert_command_with_callback(:lstat, "/path/to/file", 0x1)
|
183
|
-
end
|
184
|
-
|
185
|
-
def test_lstat_bang_should_block_and_return_attrs
|
186
|
-
expect_sftp_session :server_version => 1 do |channel|
|
187
|
-
channel.sends_packet(FXP_LSTAT, :long, 0, :string, "/path/to/file")
|
188
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
189
|
-
end
|
190
|
-
|
191
|
-
attrs = assert_synchronous_command(:lstat!, "/path/to/file")
|
192
|
-
|
193
|
-
assert_equal 123456, attrs.size
|
194
|
-
assert_equal 1, attrs.uid
|
195
|
-
assert_equal 2, attrs.gid
|
196
|
-
assert_equal 0765, attrs.permissions
|
197
|
-
assert_equal 123456789, attrs.atime
|
198
|
-
assert_equal 234567890, attrs.mtime
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_v1_fstat_should_send_fstat_request_and_invoke_callback
|
202
|
-
expect_sftp_session :server_version => 1 do |channel|
|
203
|
-
channel.sends_packet(FXP_FSTAT, :long, 0, :string, "handle")
|
204
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
205
|
-
end
|
206
|
-
|
207
|
-
assert_command_with_callback(:fstat, "handle") do |response|
|
208
|
-
assert response.ok?
|
209
|
-
assert_equal 123456, response[:attrs].size
|
210
|
-
assert_equal 1, response[:attrs].uid
|
211
|
-
assert_equal 2, response[:attrs].gid
|
212
|
-
assert_equal 0765, response[:attrs].permissions
|
213
|
-
assert_equal 123456789, response[:attrs].atime
|
214
|
-
assert_equal 234567890, response[:attrs].mtime
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_v4_fstat_should_send_default_flags_parameter
|
219
|
-
expect_sftp_session :server_version => 4 do |channel|
|
220
|
-
channel.sends_packet(FXP_FSTAT, :long, 0, :string, "handle", :long, 0x800001fd)
|
221
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
222
|
-
end
|
223
|
-
|
224
|
-
assert_command_with_callback(:fstat, "handle")
|
225
|
-
end
|
226
|
-
|
227
|
-
def test_v4_fstat_should_honor_flags_parameter
|
228
|
-
expect_sftp_session :server_version => 4 do |channel|
|
229
|
-
channel.sends_packet(FXP_FSTAT, :long, 0, :string, "handle", :long, 0x1)
|
230
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
231
|
-
end
|
232
|
-
|
233
|
-
assert_command_with_callback(:fstat, "handle", 0x1)
|
234
|
-
end
|
235
|
-
|
236
|
-
def test_fstat_bang_should_block_and_return_attrs
|
237
|
-
expect_sftp_session :server_version => 1 do |channel|
|
238
|
-
channel.sends_packet(FXP_FSTAT, :long, 0, :string, "handle")
|
239
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
240
|
-
end
|
241
|
-
|
242
|
-
attrs = assert_synchronous_command(:fstat!, "handle")
|
243
|
-
|
244
|
-
assert_equal 123456, attrs.size
|
245
|
-
assert_equal 1, attrs.uid
|
246
|
-
assert_equal 2, attrs.gid
|
247
|
-
assert_equal 0765, attrs.permissions
|
248
|
-
assert_equal 123456789, attrs.atime
|
249
|
-
assert_equal 234567890, attrs.mtime
|
250
|
-
end
|
251
|
-
|
252
|
-
def test_v1_setstat_should_send_v1_attributes
|
253
|
-
expect_sftp_session :server_version => 1 do |channel|
|
254
|
-
channel.sends_packet(FXP_SETSTAT, :long, 0, :string, "/path/to/file", :long, 0xc, :long, 0765, :long, 1234567890, :long, 2345678901)
|
255
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
256
|
-
end
|
257
|
-
|
258
|
-
assert_command_with_callback(:setstat, "/path/to/file", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
259
|
-
end
|
260
|
-
|
261
|
-
def test_v4_setstat_should_send_v4_attributes
|
262
|
-
expect_sftp_session :server_version => 4 do |channel|
|
263
|
-
channel.sends_packet(FXP_SETSTAT, :long, 0, :string, "/path/to/file", :long, 0x2c, :byte, 1, :long, 0765, :int64, 1234567890, :int64, 2345678901)
|
264
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
265
|
-
end
|
266
|
-
|
267
|
-
assert_command_with_callback(:setstat, "/path/to/file", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
268
|
-
end
|
269
|
-
|
270
|
-
def test_v6_setstat_should_send_v6_attributes
|
271
|
-
expect_sftp_session :server_version => 6 do |channel|
|
272
|
-
channel.sends_packet(FXP_SETSTAT, :long, 0, :string, "/path/to/file", :long, 0x102c, :byte, 1, :long, 0765, :int64, 1234567890, :int64, 2345678901, :string, "text/plain")
|
273
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
274
|
-
end
|
275
|
-
|
276
|
-
assert_command_with_callback(:setstat, "/path/to/file", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901, :mime_type => "text/plain")
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_setstat_bang_should_block_and_return_response
|
280
|
-
expect_sftp_session :server_version => 1 do |channel|
|
281
|
-
channel.sends_packet(FXP_SETSTAT, :long, 0, :string, "/path/to/file", :long, 0xc, :long, 0765, :long, 1234567890, :long, 2345678901)
|
282
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
283
|
-
end
|
284
|
-
|
285
|
-
response = assert_synchronous_command(:setstat!, "/path/to/file", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
286
|
-
assert response.ok?
|
287
|
-
end
|
288
|
-
|
289
|
-
def test_v1_fsetstat_should_send_v1_attributes
|
290
|
-
expect_sftp_session :server_version => 1 do |channel|
|
291
|
-
channel.sends_packet(FXP_FSETSTAT, :long, 0, :string, "handle", :long, 0xc, :long, 0765, :long, 1234567890, :long, 2345678901)
|
292
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
293
|
-
end
|
294
|
-
|
295
|
-
assert_command_with_callback(:fsetstat, "handle", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
296
|
-
end
|
297
|
-
|
298
|
-
def test_v4_fsetstat_should_send_v4_attributes
|
299
|
-
expect_sftp_session :server_version => 4 do |channel|
|
300
|
-
channel.sends_packet(FXP_FSETSTAT, :long, 0, :string, "handle", :long, 0x2c, :byte, 1, :long, 0765, :int64, 1234567890, :int64, 2345678901)
|
301
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
302
|
-
end
|
303
|
-
|
304
|
-
assert_command_with_callback(:fsetstat, "handle", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
305
|
-
end
|
306
|
-
|
307
|
-
def test_v6_fsetstat_should_send_v6_attributes
|
308
|
-
expect_sftp_session :server_version => 6 do |channel|
|
309
|
-
channel.sends_packet(FXP_FSETSTAT, :long, 0, :string, "handle", :long, 0x102c, :byte, 1, :long, 0765, :int64, 1234567890, :int64, 2345678901, :string, "text/plain")
|
310
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
311
|
-
end
|
312
|
-
|
313
|
-
assert_command_with_callback(:fsetstat, "handle", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901, :mime_type => "text/plain")
|
314
|
-
end
|
315
|
-
|
316
|
-
def test_fsetstat_bang_should_block_and_return_response
|
317
|
-
expect_sftp_session :server_version => 1 do |channel|
|
318
|
-
channel.sends_packet(FXP_FSETSTAT, :long, 0, :string, "handle", :long, 0xc, :long, 0765, :long, 1234567890, :long, 2345678901)
|
319
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
320
|
-
end
|
321
|
-
|
322
|
-
response = assert_synchronous_command(:fsetstat!, "handle", :permissions => 0765, :atime => 1234567890, :mtime => 2345678901)
|
323
|
-
assert response.ok?
|
324
|
-
end
|
325
|
-
|
326
|
-
def test_opendir_should_send_opendir_request_and_invoke_callback
|
327
|
-
expect_sftp_session do |channel|
|
328
|
-
channel.sends_packet(FXP_OPENDIR, :long, 0, :string, "/path/to/dir")
|
329
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
|
330
|
-
end
|
331
|
-
|
332
|
-
assert_command_with_callback(:opendir, "/path/to/dir")
|
333
|
-
end
|
334
|
-
|
335
|
-
def test_opendir_bang_should_block_and_return_handle
|
336
|
-
expect_sftp_session do |channel|
|
337
|
-
channel.sends_packet(FXP_OPENDIR, :long, 0, :string, "/path/to/dir")
|
338
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
|
339
|
-
end
|
340
|
-
|
341
|
-
handle = assert_synchronous_command(:opendir!, "/path/to/dir")
|
342
|
-
assert_equal "handle", handle
|
343
|
-
end
|
344
|
-
|
345
|
-
def test_readdir_should_send_readdir_request_and_invoke_callback
|
346
|
-
expect_sftp_session do |channel|
|
347
|
-
channel.sends_packet(FXP_READDIR, :long, 0, :string, "handle")
|
348
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 1)
|
349
|
-
end
|
350
|
-
|
351
|
-
assert_command_with_callback(:readdir, "handle") { |r| assert r.eof? }
|
352
|
-
end
|
353
|
-
|
354
|
-
def test_readdir_bang_should_block_and_return_names_array
|
355
|
-
expect_sftp_session :server_version => 1 do |channel|
|
356
|
-
channel.sends_packet(FXP_READDIR, :long, 0, :string, "handle")
|
357
|
-
channel.gets_packet(FXP_NAME, :long, 0, :long, 2,
|
358
|
-
:string, "first", :string, "longfirst", :long, 0x0,
|
359
|
-
:string, "next", :string, "longnext", :long, 0x0)
|
360
|
-
end
|
361
|
-
|
362
|
-
names = assert_synchronous_command(:readdir!, "handle")
|
363
|
-
assert_equal 2, names.length
|
364
|
-
assert_equal %w(first next), names.map { |n| n.name }
|
365
|
-
end
|
366
|
-
|
367
|
-
def test_remove_should_send_remove_packet
|
368
|
-
expect_sftp_session do |channel|
|
369
|
-
channel.sends_packet(FXP_REMOVE, :long, 0, :string, "/path/to/file")
|
370
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
371
|
-
end
|
372
|
-
|
373
|
-
assert_command_with_callback(:remove, "/path/to/file")
|
374
|
-
end
|
375
|
-
|
376
|
-
def test_remove_bang_should_block_and_return_response
|
377
|
-
expect_sftp_session do |channel|
|
378
|
-
channel.sends_packet(FXP_REMOVE, :long, 0, :string, "/path/to/file")
|
379
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
380
|
-
end
|
381
|
-
|
382
|
-
response = assert_synchronous_command(:remove!, "/path/to/file")
|
383
|
-
assert response.ok?
|
384
|
-
end
|
385
|
-
|
386
|
-
def test_mkdir_should_send_mkdir_packet
|
387
|
-
expect_sftp_session do |channel|
|
388
|
-
channel.sends_packet(FXP_MKDIR, :long, 0, :string, "/path/to/dir", :long, 0x4, :byte, 1, :long, 0765)
|
389
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
390
|
-
end
|
391
|
-
|
392
|
-
assert_command_with_callback(:mkdir, "/path/to/dir", :permissions => 0765)
|
393
|
-
end
|
394
|
-
|
395
|
-
def test_mkdir_bang_should_block_and_return_response
|
396
|
-
expect_sftp_session do |channel|
|
397
|
-
channel.sends_packet(FXP_MKDIR, :long, 0, :string, "/path/to/dir", :long, 0x4, :byte, 1, :long, 0765)
|
398
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
399
|
-
end
|
400
|
-
|
401
|
-
response = assert_synchronous_command(:mkdir!, "/path/to/dir", :permissions => 0765)
|
402
|
-
assert response.ok?
|
403
|
-
end
|
404
|
-
|
405
|
-
def test_rmdir_should_send_rmdir_packet
|
406
|
-
expect_sftp_session do |channel|
|
407
|
-
channel.sends_packet(FXP_RMDIR, :long, 0, :string, "/path/to/dir")
|
408
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
409
|
-
end
|
410
|
-
|
411
|
-
assert_command_with_callback(:rmdir, "/path/to/dir")
|
412
|
-
end
|
413
|
-
|
414
|
-
def test_rmdir_bang_should_block_and_return_response
|
415
|
-
expect_sftp_session do |channel|
|
416
|
-
channel.sends_packet(FXP_RMDIR, :long, 0, :string, "/path/to/dir")
|
417
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
418
|
-
end
|
419
|
-
|
420
|
-
response = assert_synchronous_command(:rmdir!, "/path/to/dir")
|
421
|
-
assert response.ok?
|
422
|
-
end
|
423
|
-
|
424
|
-
def test_realpath_should_send_realpath_packet
|
425
|
-
expect_sftp_session do |channel|
|
426
|
-
channel.sends_packet(FXP_REALPATH, :long, 0, :string, "/path/to/dir")
|
427
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
428
|
-
end
|
429
|
-
|
430
|
-
assert_command_with_callback(:realpath, "/path/to/dir")
|
431
|
-
end
|
432
|
-
|
433
|
-
def test_realpath_bang_should_block_and_return_names_item
|
434
|
-
expect_sftp_session do |channel|
|
435
|
-
channel.sends_packet(FXP_REALPATH, :long, 0, :string, "/path/to/dir")
|
436
|
-
channel.gets_packet(FXP_NAME, :long, 0, :long, 1, :string, "dir", :long, 0x0, :long, 2)
|
437
|
-
end
|
438
|
-
|
439
|
-
name = assert_synchronous_command(:realpath!, "/path/to/dir")
|
440
|
-
assert_equal "dir", name.name
|
441
|
-
end
|
442
|
-
|
443
|
-
def test_v1_stat_should_send_stat_request_and_invoke_callback
|
444
|
-
expect_sftp_session :server_version => 1 do |channel|
|
445
|
-
channel.sends_packet(FXP_STAT, :long, 0, :string, "/path/to/file")
|
446
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
447
|
-
end
|
448
|
-
|
449
|
-
assert_command_with_callback(:stat, "/path/to/file") do |response|
|
450
|
-
assert response.ok?
|
451
|
-
assert_equal 123456, response[:attrs].size
|
452
|
-
assert_equal 1, response[:attrs].uid
|
453
|
-
assert_equal 2, response[:attrs].gid
|
454
|
-
assert_equal 0765, response[:attrs].permissions
|
455
|
-
assert_equal 123456789, response[:attrs].atime
|
456
|
-
assert_equal 234567890, response[:attrs].mtime
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
def test_v4_stat_should_send_default_flags_parameter
|
461
|
-
expect_sftp_session :server_version => 4 do |channel|
|
462
|
-
channel.sends_packet(FXP_STAT, :long, 0, :string, "/path/to/file", :long, 0x800001fd)
|
463
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
464
|
-
end
|
465
|
-
|
466
|
-
assert_command_with_callback(:stat, "/path/to/file")
|
467
|
-
end
|
468
|
-
|
469
|
-
def test_v4_stat_should_honor_flags_parameter
|
470
|
-
expect_sftp_session :server_version => 4 do |channel|
|
471
|
-
channel.sends_packet(FXP_STAT, :long, 0, :string, "/path/to/file", :long, 0x1)
|
472
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
473
|
-
end
|
474
|
-
|
475
|
-
assert_command_with_callback(:stat, "/path/to/file", 0x1)
|
476
|
-
end
|
477
|
-
|
478
|
-
def test_stat_bang_should_block_and_return_attrs
|
479
|
-
expect_sftp_session :server_version => 1 do |channel|
|
480
|
-
channel.sends_packet(FXP_STAT, :long, 0, :string, "/path/to/file")
|
481
|
-
channel.gets_packet(FXP_ATTRS, :long, 0, :long, 0xF, :int64, 123456, :long, 1, :long, 2, :long, 0765, :long, 123456789, :long, 234567890)
|
482
|
-
end
|
483
|
-
|
484
|
-
attrs = assert_synchronous_command(:stat!, "/path/to/file")
|
485
|
-
|
486
|
-
assert_equal 123456, attrs.size
|
487
|
-
assert_equal 1, attrs.uid
|
488
|
-
assert_equal 2, attrs.gid
|
489
|
-
assert_equal 0765, attrs.permissions
|
490
|
-
assert_equal 123456789, attrs.atime
|
491
|
-
assert_equal 234567890, attrs.mtime
|
492
|
-
end
|
493
|
-
|
494
|
-
def test_v1_rename_should_be_unimplemented
|
495
|
-
assert_not_implemented 1, :rename, "from", "to"
|
496
|
-
end
|
497
|
-
|
498
|
-
def test_v2_rename_should_send_rename_packet
|
499
|
-
expect_sftp_session :server_version => 2 do |channel|
|
500
|
-
channel.sends_packet(FXP_RENAME, :long, 0, :string, "from", :string, "to")
|
501
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
502
|
-
end
|
503
|
-
|
504
|
-
assert_command_with_callback(:rename, "from", "to")
|
505
|
-
end
|
506
|
-
|
507
|
-
def test_v5_rename_should_send_rename_packet_and_default_flags
|
508
|
-
expect_sftp_session :server_version => 5 do |channel|
|
509
|
-
channel.sends_packet(FXP_RENAME, :long, 0, :string, "from", :string, "to", :long, 0)
|
510
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
511
|
-
end
|
512
|
-
|
513
|
-
assert_command_with_callback(:rename, "from", "to")
|
514
|
-
end
|
515
|
-
|
516
|
-
def test_v5_rename_should_send_rename_packet_and_honor_flags
|
517
|
-
expect_sftp_session :server_version => 5 do |channel|
|
518
|
-
channel.sends_packet(FXP_RENAME, :long, 0, :string, "from", :string, "to", :long, 1)
|
519
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
520
|
-
end
|
521
|
-
|
522
|
-
assert_command_with_callback(:rename, "from", "to", 1)
|
523
|
-
end
|
524
|
-
|
525
|
-
def test_rename_bang_should_block_and_return_response
|
526
|
-
expect_sftp_session :server_version => 2 do |channel|
|
527
|
-
channel.sends_packet(FXP_RENAME, :long, 0, :string, "from", :string, "to")
|
528
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
529
|
-
end
|
530
|
-
|
531
|
-
response = assert_synchronous_command(:rename!, "from", "to")
|
532
|
-
assert response.ok?
|
533
|
-
end
|
534
|
-
|
535
|
-
def test_v2_readlink_should_be_unimplemented
|
536
|
-
assert_not_implemented 2, :readlink, "/path/to/link"
|
537
|
-
end
|
538
|
-
|
539
|
-
def test_v3_readlink_should_send_readlink_packet
|
540
|
-
expect_sftp_session :server_version => 3 do |channel|
|
541
|
-
channel.sends_packet(FXP_READLINK, :long, 0, :string, "/path/to/link")
|
542
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 2)
|
543
|
-
end
|
544
|
-
|
545
|
-
assert_command_with_callback(:readlink, "/path/to/link")
|
546
|
-
end
|
547
|
-
|
548
|
-
def test_readlink_bang_should_block_and_return_name
|
549
|
-
expect_sftp_session :server_version => 3 do |channel|
|
550
|
-
channel.sends_packet(FXP_READLINK, :long, 0, :string, "/path/to/link")
|
551
|
-
channel.gets_packet(FXP_NAME, :long, 0, :long, 1, :string, "target", :string, "longtarget", :long, 0x0)
|
552
|
-
end
|
553
|
-
|
554
|
-
name = assert_synchronous_command(:readlink!, "/path/to/link")
|
555
|
-
assert_equal "target", name.name
|
556
|
-
end
|
557
|
-
|
558
|
-
def test_v2_symlink_should_be_unimplemented
|
559
|
-
assert_not_implemented 2, :symlink, "/path/to/source", "/path/to/link"
|
560
|
-
end
|
561
|
-
|
562
|
-
def test_v3_symlink_should_send_symlink_packet
|
563
|
-
expect_sftp_session :server_version => 3 do |channel|
|
564
|
-
channel.sends_packet(FXP_SYMLINK, :long, 0, :string, "/path/to/source", :string, "/path/to/link")
|
565
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
566
|
-
end
|
567
|
-
|
568
|
-
assert_command_with_callback(:symlink, "/path/to/source", "/path/to/link")
|
569
|
-
end
|
570
|
-
|
571
|
-
def test_v6_symlink_should_send_link_packet
|
572
|
-
expect_sftp_session :server_version => 6 do |channel|
|
573
|
-
channel.sends_packet(FXP_LINK, :long, 0, :string, "/path/to/link", :string, "/path/to/source", :bool, true)
|
574
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
575
|
-
end
|
576
|
-
|
577
|
-
assert_command_with_callback(:symlink, "/path/to/link", "/path/to/source")
|
578
|
-
end
|
579
|
-
|
580
|
-
def test_symlink_bang_should_block_and_return_response
|
581
|
-
expect_sftp_session :server_version => 3 do |channel|
|
582
|
-
channel.sends_packet(FXP_SYMLINK, :long, 0, :string, "/path/to/source", :string, "/path/to/link")
|
583
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
584
|
-
end
|
585
|
-
|
586
|
-
response = assert_synchronous_command(:symlink!, "/path/to/source", "/path/to/link")
|
587
|
-
assert response.ok?
|
588
|
-
end
|
589
|
-
|
590
|
-
def test_v5_link_should_be_unimplemented
|
591
|
-
assert_not_implemented 5, :link, "/path/to/source", "/path/to/link", true
|
592
|
-
end
|
593
|
-
|
594
|
-
def test_v6_link_should_send_link_packet
|
595
|
-
expect_sftp_session :server_version => 6 do |channel|
|
596
|
-
channel.sends_packet(FXP_LINK, :long, 0, :string, "/path/to/link", :string, "/path/to/source", :bool, true)
|
597
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
598
|
-
end
|
599
|
-
|
600
|
-
assert_command_with_callback(:link, "/path/to/link", "/path/to/source", true)
|
601
|
-
end
|
602
|
-
|
603
|
-
def test_link_bang_should_block_and_return_response
|
604
|
-
expect_sftp_session :server_version => 6 do |channel|
|
605
|
-
channel.sends_packet(FXP_LINK, :long, 0, :string, "/path/to/link", :string, "/path/to/source", :bool, true)
|
606
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
607
|
-
end
|
608
|
-
|
609
|
-
response = assert_synchronous_command(:link!, "/path/to/link", "/path/to/source", true)
|
610
|
-
assert response.ok?
|
611
|
-
end
|
612
|
-
|
613
|
-
def test_v5_block_should_be_unimplemented
|
614
|
-
assert_not_implemented 5, :block, "handle", 12345, 67890, 0xabcd
|
615
|
-
end
|
616
|
-
|
617
|
-
def test_v6_block_should_send_block_packet
|
618
|
-
expect_sftp_session :server_version => 6 do |channel|
|
619
|
-
channel.sends_packet(FXP_BLOCK, :long, 0, :string, "handle", :int64, 12345, :int64, 67890, :long, 0xabcd)
|
620
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
621
|
-
end
|
622
|
-
|
623
|
-
assert_command_with_callback(:block, "handle", 12345, 67890, 0xabcd)
|
624
|
-
end
|
625
|
-
|
626
|
-
def test_block_bang_should_block_and_return_response
|
627
|
-
expect_sftp_session :server_version => 6 do |channel|
|
628
|
-
channel.sends_packet(FXP_BLOCK, :long, 0, :string, "handle", :int64, 12345, :int64, 67890, :long, 0xabcd)
|
629
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
630
|
-
end
|
631
|
-
|
632
|
-
response = assert_synchronous_command(:block!, "handle", 12345, 67890, 0xabcd)
|
633
|
-
assert response.ok?
|
634
|
-
end
|
635
|
-
|
636
|
-
def test_v5_unblock_should_be_unimplemented
|
637
|
-
assert_not_implemented 5, :unblock, "handle", 12345, 67890
|
638
|
-
end
|
639
|
-
|
640
|
-
def test_v6_unblock_should_send_block_packet
|
641
|
-
expect_sftp_session :server_version => 6 do |channel|
|
642
|
-
channel.sends_packet(FXP_UNBLOCK, :long, 0, :string, "handle", :int64, 12345, :int64, 67890)
|
643
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
644
|
-
end
|
645
|
-
|
646
|
-
assert_command_with_callback(:unblock, "handle", 12345, 67890)
|
647
|
-
end
|
648
|
-
|
649
|
-
def test_unblock_bang_should_block_and_return_response
|
650
|
-
expect_sftp_session :server_version => 6 do |channel|
|
651
|
-
channel.sends_packet(FXP_UNBLOCK, :long, 0, :string, "handle", :int64, 12345, :int64, 67890)
|
652
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, 0)
|
653
|
-
end
|
654
|
-
|
655
|
-
response = assert_synchronous_command(:unblock!, "handle", 12345, 67890)
|
656
|
-
assert response.ok?
|
657
|
-
end
|
658
|
-
|
659
|
-
private
|
660
|
-
|
661
|
-
def assert_not_implemented(server_version, command, *args)
|
662
|
-
expect_sftp_session :server_version => 1
|
663
|
-
sftp.connect!
|
664
|
-
assert_raises(NotImplementedError) { sftp.send(command, *args) }
|
665
|
-
end
|
666
|
-
|
667
|
-
def assert_command_with_callback(command, *args)
|
668
|
-
called = false
|
669
|
-
assert_scripted_command do
|
670
|
-
sftp.send(command, *args) do |response|
|
671
|
-
called = true
|
672
|
-
yield response if block_given?
|
673
|
-
end
|
674
|
-
end
|
675
|
-
assert called, "expected callback to be invoked, but it wasn't"
|
676
|
-
end
|
677
|
-
|
678
|
-
def assert_synchronous_command(command, *args)
|
679
|
-
assert_scripted_command do
|
680
|
-
sequence = [:start]
|
681
|
-
result = sftp.send(command, *args) do |response|
|
682
|
-
sequence << :done
|
683
|
-
yield response if block_given?
|
684
|
-
end
|
685
|
-
sequence << :after
|
686
|
-
assert_equal [:start, :done, :after], sequence, "expected #{command} to be synchronous"
|
687
|
-
return result
|
688
|
-
end
|
689
|
-
end
|
690
|
-
|
691
|
-
def assert_successful_open(*args)
|
692
|
-
assert_command_with_callback(:open, *args) do |response|
|
693
|
-
assert response.ok?
|
694
|
-
assert_equal "handle", response[:handle]
|
695
|
-
end
|
696
|
-
end
|
697
|
-
|
698
|
-
def expect_open(path, mode, perms, options={})
|
699
|
-
version = options[:server_version] || 6
|
700
|
-
|
701
|
-
fail = options.delete(:fail)
|
702
|
-
|
703
|
-
attrs = [:long, perms ? 0x4 : 0]
|
704
|
-
attrs += [:byte, 1] if version >= 4
|
705
|
-
attrs += [:long, perms] if perms
|
706
|
-
|
707
|
-
expect_sftp_session(options) do |channel|
|
708
|
-
if version >= 5
|
709
|
-
flags, access = case mode
|
710
|
-
when "r" then
|
711
|
-
[FV5::OPEN_EXISTING, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES]
|
712
|
-
when "w" then
|
713
|
-
[FV5::CREATE_TRUNCATE, ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES]
|
714
|
-
when "rw" then
|
715
|
-
[FV5::OPEN_OR_CREATE, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES | ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES]
|
716
|
-
when "a" then
|
717
|
-
[FV5::OPEN_OR_CREATE | FV5::APPEND_DATA, ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES | ACE::Mask::APPEND_DATA]
|
718
|
-
else raise ArgumentError, "unsupported mode #{mode.inspect}"
|
719
|
-
end
|
720
|
-
|
721
|
-
channel.sends_packet(FXP_OPEN, :long, 0, :string, path, :long, access, :long, flags, *attrs)
|
722
|
-
else
|
723
|
-
flags = case mode
|
724
|
-
when "r" then FV1::READ
|
725
|
-
when "w" then FV1::WRITE | FV1::TRUNC | FV1::CREAT
|
726
|
-
when "rw" then FV1::WRITE | FV1::READ
|
727
|
-
when "a" then FV1::APPEND | FV1::WRITE | FV1::CREAT
|
728
|
-
else raise ArgumentError, "unsupported mode #{mode.inspect}"
|
729
|
-
end
|
730
|
-
|
731
|
-
channel.sends_packet(FXP_OPEN, :long, 0, :string, path, :long, flags, *attrs)
|
732
|
-
end
|
733
|
-
|
734
|
-
if fail
|
735
|
-
channel.gets_packet(FXP_STATUS, :long, 0, :long, fail)
|
736
|
-
else
|
737
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
|
738
|
-
end
|
739
|
-
end
|
740
|
-
end
|
741
|
-
end
|