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
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
|
3
|
-
module Etc; end
|
4
|
-
|
5
|
-
class Protocol::V06::TestAttributes < Net::SFTP::TestCase
|
6
|
-
def test_from_buffer_should_correctly_parse_buffer_and_return_attribute_object
|
7
|
-
attributes = attributes_factory.from_buffer(full_buffer)
|
8
|
-
|
9
|
-
assert_equal 9, attributes.type
|
10
|
-
assert_equal 1234567890, attributes.size
|
11
|
-
assert_equal 2345678901, attributes.allocation_size
|
12
|
-
assert_equal "jamis", attributes.owner
|
13
|
-
assert_equal "users", attributes.group
|
14
|
-
assert_equal 0755, attributes.permissions
|
15
|
-
assert_equal 1234567890, attributes.atime
|
16
|
-
assert_equal 12345, attributes.atime_nseconds
|
17
|
-
assert_equal 2345678901, attributes.createtime
|
18
|
-
assert_equal 23456, attributes.createtime_nseconds
|
19
|
-
assert_equal 3456789012, attributes.mtime
|
20
|
-
assert_equal 34567, attributes.mtime_nseconds
|
21
|
-
assert_equal 4567890123, attributes.ctime
|
22
|
-
assert_equal 45678, attributes.ctime_nseconds
|
23
|
-
|
24
|
-
assert_equal 2, attributes.acl.length
|
25
|
-
|
26
|
-
assert_equal 1, attributes.acl.first.type
|
27
|
-
assert_equal 2, attributes.acl.first.flag
|
28
|
-
assert_equal 3, attributes.acl.first.mask
|
29
|
-
assert_equal "foo", attributes.acl.first.who
|
30
|
-
|
31
|
-
assert_equal 4, attributes.acl.last.type
|
32
|
-
assert_equal 5, attributes.acl.last.flag
|
33
|
-
assert_equal 6, attributes.acl.last.mask
|
34
|
-
assert_equal "bar", attributes.acl.last.who
|
35
|
-
|
36
|
-
assert_equal 0x12341234, attributes.attrib_bits
|
37
|
-
assert_equal 0x23452345, attributes.attrib_bits_valid
|
38
|
-
assert_equal 0x3, attributes.text_hint
|
39
|
-
assert_equal "text/html", attributes.mime_type
|
40
|
-
assert_equal 144, attributes.link_count
|
41
|
-
assert_equal "an untranslated name", attributes.untranslated_name
|
42
|
-
|
43
|
-
assert_equal "second", attributes.extended["first"]
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_from_buffer_should_correctly_parse_buffer_with_attribute_subset_and_return_attribute_object
|
47
|
-
buffer = Net::SSH::Buffer.from(:long, 0x4, :byte, 1, :long, 0755)
|
48
|
-
|
49
|
-
attributes = attributes_factory.from_buffer(buffer)
|
50
|
-
|
51
|
-
assert_equal 1, attributes.type
|
52
|
-
assert_equal 0755, attributes.permissions
|
53
|
-
|
54
|
-
assert_nil attributes.size
|
55
|
-
assert_nil attributes.allocation_size
|
56
|
-
assert_nil attributes.owner
|
57
|
-
assert_nil attributes.group
|
58
|
-
assert_nil attributes.atime
|
59
|
-
assert_nil attributes.atime_nseconds
|
60
|
-
assert_nil attributes.createtime
|
61
|
-
assert_nil attributes.createtime_nseconds
|
62
|
-
assert_nil attributes.mtime
|
63
|
-
assert_nil attributes.mtime_nseconds
|
64
|
-
assert_nil attributes.ctime
|
65
|
-
assert_nil attributes.ctime_nseconds
|
66
|
-
assert_nil attributes.acl
|
67
|
-
assert_nil attributes.attrib_bits
|
68
|
-
assert_nil attributes.attrib_bits_valid
|
69
|
-
assert_nil attributes.text_hint
|
70
|
-
assert_nil attributes.mime_type
|
71
|
-
assert_nil attributes.link_count
|
72
|
-
assert_nil attributes.untranslated_name
|
73
|
-
assert_nil attributes.extended
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_attributes_to_s_should_build_binary_representation
|
77
|
-
attributes = attributes_factory.new(
|
78
|
-
:type => 9,
|
79
|
-
:size => 1234567890, :allocation_size => 2345678901,
|
80
|
-
:owner => "jamis", :group => "users",
|
81
|
-
:permissions => 0755,
|
82
|
-
:atime => 1234567890, :atime_nseconds => 12345,
|
83
|
-
:createtime => 2345678901, :createtime_nseconds => 23456,
|
84
|
-
:mtime => 3456789012, :mtime_nseconds => 34567,
|
85
|
-
:ctime => 4567890123, :ctime_nseconds => 45678,
|
86
|
-
:acl => [attributes_factory::ACL.new(1,2,3,"foo"),
|
87
|
-
attributes_factory::ACL.new(4,5,6,"bar")],
|
88
|
-
:attrib_bits => 0x12341234, :attrib_bits_valid => 0x23452345,
|
89
|
-
:text_hint => 0x3, :mime_type => "text/html",
|
90
|
-
:link_count => 144, :untranslated_name => "an untranslated name",
|
91
|
-
:extended => { "first" => "second" })
|
92
|
-
|
93
|
-
assert_equal full_buffer.to_s, attributes.to_s
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_attributes_to_s_should_build_binary_representation_when_subset_is_present
|
97
|
-
attributes = attributes_factory.new(:permissions => 0755)
|
98
|
-
assert_equal Net::SSH::Buffer.from(:long, 0x4, :byte, 1, :long, 0755).to_s, attributes.to_s
|
99
|
-
end
|
100
|
-
|
101
|
-
private
|
102
|
-
|
103
|
-
def full_buffer
|
104
|
-
Net::SSH::Buffer.from(:long, 0x8000fffd,
|
105
|
-
:byte, 9, :int64, 1234567890, :int64, 2345678901,
|
106
|
-
:string, "jamis", :string, "users",
|
107
|
-
:long, 0755,
|
108
|
-
:int64, 1234567890, :long, 12345,
|
109
|
-
:int64, 2345678901, :long, 23456,
|
110
|
-
:int64, 3456789012, :long, 34567,
|
111
|
-
:int64, 4567890123, :long, 45678,
|
112
|
-
:string, raw(:long, 2,
|
113
|
-
:long, 1, :long, 2, :long, 3, :string, "foo",
|
114
|
-
:long, 4, :long, 5, :long, 6, :string, "bar"),
|
115
|
-
:long, 0x12341234, :long, 0x23452345,
|
116
|
-
:byte, 0x3, :string, "text/html", :long, 144,
|
117
|
-
:string, "an untranslated name",
|
118
|
-
:long, 1, :string, "first", :string, "second")
|
119
|
-
end
|
120
|
-
|
121
|
-
def attributes_factory
|
122
|
-
Net::SFTP::Protocol::V06::Attributes
|
123
|
-
end
|
124
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
require 'protocol/05/test_base'
|
3
|
-
|
4
|
-
class Protocol::V06::TestBase < Protocol::V05::TestBase
|
5
|
-
include Net::SFTP::Constants::OpenFlags
|
6
|
-
include Net::SFTP::Constants
|
7
|
-
|
8
|
-
def test_version
|
9
|
-
assert_equal 6, @base.version
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_parse_attrs_packet_should_use_correct_attributes_class
|
13
|
-
Net::SFTP::Protocol::V06::Attributes.expects(:from_buffer).with(:packet).returns(:result)
|
14
|
-
assert_equal({ :attrs => :result }, @base.parse_attrs_packet(:packet))
|
15
|
-
end
|
16
|
-
|
17
|
-
undef test_link_should_raise_not_implemented_error
|
18
|
-
undef test_block_should_raise_not_implemented_error
|
19
|
-
undef test_unblock_should_raise_not_implemented_error
|
20
|
-
undef test_symlink_should_send_symlink_packet
|
21
|
-
|
22
|
-
def test_link_should_send_link_packet
|
23
|
-
@session.expects(:send_packet).with(FXP_LINK, :long, 0, :string, "/path/to/link", :string, "/path/to/file", :bool, true)
|
24
|
-
assert_equal 0, @base.link("/path/to/link", "/path/to/file", true)
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_symlink_should_send_link_packet_as_symlink
|
28
|
-
@session.expects(:send_packet).with(FXP_LINK, :long, 0, :string, "/path/to/link", :string, "/path/to/file", :bool, true)
|
29
|
-
assert_equal 0, @base.symlink("/path/to/link", "/path/to/file")
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_block_should_send_block_packet
|
33
|
-
@session.expects(:send_packet).with(FXP_BLOCK, :long, 0, :string, "handle", :int64, 1234, :int64, 4567, :long, 0x40)
|
34
|
-
assert_equal 0, @base.block("handle", 1234, 4567, 0x40)
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_unblock_should_send_unblock_packet
|
38
|
-
@session.expects(:send_packet).with(FXP_UNBLOCK, :long, 0, :string, "handle", :int64, 1234, :int64, 4567)
|
39
|
-
assert_equal 0, @base.unblock("handle", 1234, 4567)
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def driver
|
45
|
-
Net::SFTP::Protocol::V06::Base
|
46
|
-
end
|
47
|
-
|
48
|
-
def attributes
|
49
|
-
Net::SFTP::Protocol::V06::Attributes
|
50
|
-
end
|
51
|
-
end
|
data/test/protocol/test_base.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
|
3
|
-
class Protocol::TestBase < Net::SFTP::TestCase
|
4
|
-
def setup
|
5
|
-
@base = Net::SFTP::Protocol::Base.new(stub('session', :logger => nil))
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_parse_with_status_packet_should_delegate_to_parse_status_packet
|
9
|
-
packet = stub('packet', :type => FXP_STATUS)
|
10
|
-
@base.expects(:parse_status_packet).with(packet).returns(:result)
|
11
|
-
assert_equal :result, @base.parse(packet)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_parse_with_handle_packet_should_delegate_to_parse_handle_packet
|
15
|
-
packet = stub('packet', :type => FXP_HANDLE)
|
16
|
-
@base.expects(:parse_handle_packet).with(packet).returns(:result)
|
17
|
-
assert_equal :result, @base.parse(packet)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_parse_with_data_packet_should_delegate_to_parse_data_packet
|
21
|
-
packet = stub('packet', :type => FXP_DATA)
|
22
|
-
@base.expects(:parse_data_packet).with(packet).returns(:result)
|
23
|
-
assert_equal :result, @base.parse(packet)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_parse_with_name_packet_should_delegate_to_parse_name_packet
|
27
|
-
packet = stub('packet', :type => FXP_NAME)
|
28
|
-
@base.expects(:parse_name_packet).with(packet).returns(:result)
|
29
|
-
assert_equal :result, @base.parse(packet)
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_parse_with_attrs_packet_should_delegate_to_parse_attrs_packet
|
33
|
-
packet = stub('packet', :type => FXP_ATTRS)
|
34
|
-
@base.expects(:parse_attrs_packet).with(packet).returns(:result)
|
35
|
-
assert_equal :result, @base.parse(packet)
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_parse_with_unknown_packet_should_raise_exception
|
39
|
-
packet = stub('packet', :type => FXP_WRITE)
|
40
|
-
assert_raises(NotImplementedError) { @base.parse(packet) }
|
41
|
-
end
|
42
|
-
end
|
data/test/test_all.rb
DELETED
data/test/test_dir.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
|
3
|
-
class DirOperationsTest < Net::SFTP::TestCase
|
4
|
-
def setup
|
5
|
-
@sftp = mock("sftp")
|
6
|
-
@dir = Net::SFTP::Operations::Dir.new(@sftp)
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_foreach_should_iterate_over_all_entries_in_directory
|
10
|
-
@sftp.expects(:opendir!).with("/path/to/remote").returns("handle")
|
11
|
-
@sftp.expects(:readdir!).with("handle").returns([:e1, :e2, :e3], [:e4, :e5], nil).times(3)
|
12
|
-
@sftp.expects(:close!).with("handle")
|
13
|
-
|
14
|
-
entries = []
|
15
|
-
@dir.foreach("/path/to/remote") { |entry| entries << entry }
|
16
|
-
assert_equal [:e1, :e2, :e3, :e4, :e5], entries
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_entries_should_return_all_entries_in_a_single_array
|
20
|
-
@sftp.expects(:opendir!).with("/path/to/remote").returns("handle")
|
21
|
-
@sftp.expects(:readdir!).with("handle").returns([:e1, :e2, :e3], [:e4, :e5], nil).times(3)
|
22
|
-
@sftp.expects(:close!).with("handle")
|
23
|
-
|
24
|
-
assert_equal [:e1, :e2, :e3, :e4, :e5], @dir.entries("/path/to/remote")
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_glob_should_search_under_path_for_matching_entries
|
28
|
-
@sftp.expects(:opendir!).with("/path/to/remote").returns("handle")
|
29
|
-
@sftp.expects(:opendir!).with("/path/to/remote/e3").returns("handle-e3")
|
30
|
-
@sftp.expects(:opendir!).with("/path/to/remote/e5").returns("handle-e5")
|
31
|
-
@sftp.expects(:readdir!).with("handle").returns([n(".", true), n("..", true), n("e1"), n("e2"), n("e3", true)], [n("e4"), n("e5", true)], nil).times(3)
|
32
|
-
@sftp.expects(:readdir!).with("handle-e3").returns([n(".", true), n("..", true), n("e3e1"), n("e3e2")], nil).times(2)
|
33
|
-
@sftp.expects(:readdir!).with("handle-e5").returns([n(".", true), n("..", true), n("e5e1"), n("e5e2"), n("e5e3")], nil).times(2)
|
34
|
-
@sftp.expects(:close!).with("handle")
|
35
|
-
@sftp.expects(:close!).with("handle-e3")
|
36
|
-
@sftp.expects(:close!).with("handle-e5")
|
37
|
-
|
38
|
-
assert_equal %w(e3/e3e2 e5/e5e2), @dir.glob("/path/to/remote", "**/e?e2").map { |e| e.name }
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def n(name, directory=false)
|
44
|
-
Net::SFTP::Protocol::V01::Name.new(name.to_s, "longname for #{name}",
|
45
|
-
Net::SFTP::Protocol::V01::Attributes.new(:permissions => directory ? 040755 : 0100644))
|
46
|
-
end
|
47
|
-
end
|
data/test/test_download.rb
DELETED
@@ -1,252 +0,0 @@
|
|
1
|
-
require "common"
|
2
|
-
|
3
|
-
class DownloadTest < Net::SFTP::TestCase
|
4
|
-
def setup
|
5
|
-
prepare_progress!
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_download_file_should_transfer_remote_to_local
|
9
|
-
local = "/path/to/local"
|
10
|
-
remote = "/path/to/remote"
|
11
|
-
text = "this is some text\n"
|
12
|
-
|
13
|
-
expect_file_transfer(remote, text)
|
14
|
-
|
15
|
-
file = StringIO.new
|
16
|
-
File.stubs(:open).with(local, "wb").returns(file)
|
17
|
-
|
18
|
-
assert_scripted_command { sftp.download(remote, local) }
|
19
|
-
assert_equal text, file.string
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_download_large_file_should_transfer_remote_to_local
|
23
|
-
local = "/path/to/local"
|
24
|
-
remote = "/path/to/remote"
|
25
|
-
text = "0123456789" * 1024
|
26
|
-
|
27
|
-
file = prepare_large_file_download(local, remote, text)
|
28
|
-
|
29
|
-
assert_scripted_command { sftp.download(remote, local, :read_size => 1024) }
|
30
|
-
assert_equal text, file.string
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_download_large_file_with_progress_should_report_progress
|
34
|
-
local = "/path/to/local"
|
35
|
-
remote = "/path/to/remote"
|
36
|
-
text = "0123456789" * 1024
|
37
|
-
|
38
|
-
file = prepare_large_file_download(local, remote, text)
|
39
|
-
|
40
|
-
assert_scripted_command do
|
41
|
-
sftp.download(remote, local, :read_size => 1024) do |*args|
|
42
|
-
record_progress(args)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
assert_equal text, file.string
|
47
|
-
|
48
|
-
assert_progress_reported_open :remote => "/path/to/remote"
|
49
|
-
assert_progress_reported_get 0, 1024
|
50
|
-
assert_progress_reported_get 1024, 1024
|
51
|
-
assert_progress_reported_get 2048, 1024
|
52
|
-
assert_progress_reported_get 3072, 1024
|
53
|
-
assert_progress_reported_get 4096, 1024
|
54
|
-
assert_progress_reported_get 5120, 1024
|
55
|
-
assert_progress_reported_get 6144, 1024
|
56
|
-
assert_progress_reported_get 7168, 1024
|
57
|
-
assert_progress_reported_get 8192, 1024
|
58
|
-
assert_progress_reported_get 9216, 1024
|
59
|
-
assert_progress_reported_close
|
60
|
-
assert_progress_reported_finish
|
61
|
-
assert_no_more_reported_events
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_download_directory_should_mirror_directory_locally
|
65
|
-
file1, file2 = prepare_directory_tree_download("/path/to/local", "/path/to/remote")
|
66
|
-
|
67
|
-
assert_scripted_command do
|
68
|
-
sftp.download("/path/to/remote", "/path/to/local", :recursive => true)
|
69
|
-
end
|
70
|
-
|
71
|
-
assert_equal "contents of file1", file1.string
|
72
|
-
assert_equal "contents of file2", file2.string
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_download_directory_with_progress_should_report_progress
|
76
|
-
file1, file2 = prepare_directory_tree_download("/path/to/local", "/path/to/remote")
|
77
|
-
|
78
|
-
assert_scripted_command do
|
79
|
-
sftp.download("/path/to/remote", "/path/to/local", :recursive => true) do |*args|
|
80
|
-
record_progress(args)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
assert_equal "contents of file1", file1.string
|
85
|
-
assert_equal "contents of file2", file2.string
|
86
|
-
|
87
|
-
assert_progress_reported_mkdir "/path/to/local"
|
88
|
-
assert_progress_reported_mkdir "/path/to/local/subdir1"
|
89
|
-
assert_progress_reported_open :remote => "/path/to/remote/file1"
|
90
|
-
assert_progress_reported_open :remote => "/path/to/remote/subdir1/file2"
|
91
|
-
assert_progress_reported_get 0, "contents of file1"
|
92
|
-
assert_progress_reported_close :remote => "/path/to/remote/file1"
|
93
|
-
assert_progress_reported_get 0, "contents of file2"
|
94
|
-
assert_progress_reported_close :remote => "/path/to/remote/subdir1/file2"
|
95
|
-
assert_progress_reported_finish
|
96
|
-
assert_no_more_reported_events
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_download_file_should_transfer_remote_to_local_buffer
|
100
|
-
remote = "/path/to/remote"
|
101
|
-
text = "this is some text\n"
|
102
|
-
|
103
|
-
expect_file_transfer(remote, text)
|
104
|
-
|
105
|
-
local = StringIO.new
|
106
|
-
|
107
|
-
assert_scripted_command { sftp.download(remote, local) }
|
108
|
-
assert_equal text, local.string
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_download_directory_to_buffer_should_fail
|
112
|
-
expect_sftp_session :server_version => 3
|
113
|
-
assert_raises(ArgumentError) { sftp.download("/path/to/remote", StringIO.new, :recursive => true) }
|
114
|
-
end
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
def expect_file_transfer(remote, text)
|
119
|
-
expect_sftp_session :server_version => 3 do |channel|
|
120
|
-
channel.sends_packet(FXP_OPEN, :long, 0, :string, remote, :long, 0x01, :long, 0)
|
121
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
|
122
|
-
channel.sends_packet(FXP_READ, :long, 1, :string, "handle", :int64, 0, :long, 32_000)
|
123
|
-
channel.gets_packet(FXP_DATA, :long, 1, :string, text)
|
124
|
-
channel.sends_packet(FXP_READ, :long, 2, :string, "handle", :int64, 32_000, :long, 32_000)
|
125
|
-
channel.gets_packet(FXP_STATUS, :long, 2, :long, 1)
|
126
|
-
channel.sends_packet(FXP_CLOSE, :long, 3, :string, "handle")
|
127
|
-
channel.gets_packet(FXP_STATUS, :long, 3, :long, 0)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def prepare_large_file_download(local, remote, text)
|
132
|
-
expect_sftp_session :server_version => 3 do |channel|
|
133
|
-
channel.sends_packet(FXP_OPEN, :long, 0, :string, remote, :long, 0x01, :long, 0)
|
134
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
|
135
|
-
10.times do |n|
|
136
|
-
channel.sends_packet(FXP_READ, :long, n+1, :string, "handle", :int64, n*1024, :long, 1024)
|
137
|
-
channel.gets_packet(FXP_DATA, :long, n+1, :string, text[n*1024,1024])
|
138
|
-
end
|
139
|
-
channel.sends_packet(FXP_READ, :long, 11, :string, "handle", :int64, 10240, :long, 1024)
|
140
|
-
channel.gets_packet(FXP_STATUS, :long, 11, :long, 1)
|
141
|
-
channel.sends_packet(FXP_CLOSE, :long, 12, :string, "handle")
|
142
|
-
channel.gets_packet(FXP_STATUS, :long, 12, :long, 0)
|
143
|
-
end
|
144
|
-
|
145
|
-
file = StringIO.new
|
146
|
-
File.stubs(:open).with(local, "wb").returns(file)
|
147
|
-
|
148
|
-
return file
|
149
|
-
end
|
150
|
-
|
151
|
-
# 0:OPENDIR(remote) ->
|
152
|
-
# <- 0:HANDLE("dir1")
|
153
|
-
# 1:READDIR("dir1") ->
|
154
|
-
# <- 1:NAME("..", ".", "subdir1", "file1")
|
155
|
-
# 2:OPENDIR(remote/subdir1) ->
|
156
|
-
# 3:OPEN(remote/file1) ->
|
157
|
-
# 4:READDIR("dir1") ->
|
158
|
-
# <- 2:HANDLE("dir2")
|
159
|
-
# 5:READDIR("dir2") ->
|
160
|
-
# <- 3:HANDLE("file1")
|
161
|
-
# 6:READ("file1", 0, 32k) ->
|
162
|
-
# <- 4:STATUS(1)
|
163
|
-
# 7:CLOSE("dir1") ->
|
164
|
-
# <- 5:NAME("..", ".", "file2")
|
165
|
-
# 8:OPEN(remote/subdir1/file2) ->
|
166
|
-
# 9:READDIR("dir2") ->
|
167
|
-
# <- 6:DATA("blah blah blah")
|
168
|
-
# 10:READ("file1", n, 32k)
|
169
|
-
# <- 7:STATUS(0)
|
170
|
-
# <- 8:HANDLE("file2")
|
171
|
-
# 11:READ("file2", 0, 32k) ->
|
172
|
-
# <- 9:STATUS(1)
|
173
|
-
# 12:CLOSE("dir2") ->
|
174
|
-
# <- 10:STATUS(1)
|
175
|
-
# 13:CLOSE("file1") ->
|
176
|
-
# <- 11:DATA("blah blah blah")
|
177
|
-
# 14:READ("file2", n, 32k) ->
|
178
|
-
# <- 12:STATUS(0)
|
179
|
-
# <- 13:STATUS(0)
|
180
|
-
# <- 14:STATUS(1)
|
181
|
-
# 15:CLOSE("file2") ->
|
182
|
-
# <- 15:STATUS(0)
|
183
|
-
|
184
|
-
def prepare_directory_tree_download(local, remote)
|
185
|
-
expect_sftp_session :server_version => 3 do |channel|
|
186
|
-
channel.sends_packet(FXP_OPENDIR, :long, 0, :string, remote)
|
187
|
-
channel.gets_packet(FXP_HANDLE, :long, 0, :string, "dir1")
|
188
|
-
|
189
|
-
channel.sends_packet(FXP_READDIR, :long, 1, :string, "dir1")
|
190
|
-
channel.gets_packet(FXP_NAME, :long, 1, :long, 4,
|
191
|
-
:string, "..", :string, "drwxr-xr-x 4 bob bob 136 Aug 1 ..", :long, 0x04, :long, 040755,
|
192
|
-
:string, ".", :string, "drwxr-xr-x 4 bob bob 136 Aug 1 .", :long, 0x04, :long, 040755,
|
193
|
-
:string, "subdir1", :string, "drwxr-xr-x 4 bob bob 136 Aug 1 subdir1", :long, 0x04, :long, 040755,
|
194
|
-
:string, "file1", :string, "-rw-rw-r-- 1 bob bob 100 Aug 1 file1", :long, 0x04, :long, 0100644)
|
195
|
-
|
196
|
-
channel.sends_packet(FXP_OPENDIR, :long, 2, :string, File.join(remote, "subdir1"))
|
197
|
-
channel.sends_packet(FXP_OPEN, :long, 3, :string, File.join(remote, "file1"), :long, 0x01, :long, 0)
|
198
|
-
channel.sends_packet(FXP_READDIR, :long, 4, :string, "dir1")
|
199
|
-
|
200
|
-
channel.gets_packet(FXP_HANDLE, :long, 2, :string, "dir2")
|
201
|
-
channel.sends_packet(FXP_READDIR, :long, 5, :string, "dir2")
|
202
|
-
|
203
|
-
channel.gets_packet(FXP_HANDLE, :long, 3, :string, "file1")
|
204
|
-
channel.sends_packet(FXP_READ, :long, 6, :string, "file1", :int64, 0, :long, 32_000)
|
205
|
-
|
206
|
-
channel.gets_packet(FXP_STATUS, :long, 4, :long, 1)
|
207
|
-
channel.sends_packet(FXP_CLOSE, :long, 7, :string, "dir1")
|
208
|
-
|
209
|
-
channel.gets_packet(FXP_NAME, :long, 5, :long, 3,
|
210
|
-
:string, "..", :string, "drwxr-xr-x 4 bob bob 136 Aug 1 ..", :long, 0x04, :long, 040755,
|
211
|
-
:string, ".", :string, "drwxr-xr-x 4 bob bob 136 Aug 1 .", :long, 0x04, :long, 040755,
|
212
|
-
:string, "file2", :string, "-rw-rw-r-- 1 bob bob 100 Aug 1 file2", :long, 0x04, :long, 0100644)
|
213
|
-
|
214
|
-
channel.sends_packet(FXP_OPEN, :long, 8, :string, File.join(remote, "subdir1", "file2"), :long, 0x01, :long, 0)
|
215
|
-
channel.sends_packet(FXP_READDIR, :long, 9, :string, "dir2")
|
216
|
-
|
217
|
-
channel.gets_packet(FXP_DATA, :long, 6, :string, "contents of file1")
|
218
|
-
channel.sends_packet(FXP_READ, :long, 10, :string, "file1", :int64, 32_000, :long, 32_000)
|
219
|
-
|
220
|
-
channel.gets_packet(FXP_STATUS, :long, 7, :long, 0)
|
221
|
-
channel.gets_packet(FXP_HANDLE, :long, 8, :string, "file2")
|
222
|
-
channel.sends_packet(FXP_READ, :long, 11, :string, "file2", :int64, 0, :long, 32_000)
|
223
|
-
|
224
|
-
channel.gets_packet(FXP_STATUS, :long, 9, :long, 1)
|
225
|
-
channel.sends_packet(FXP_CLOSE, :long, 12, :string, "dir2")
|
226
|
-
|
227
|
-
channel.gets_packet(FXP_STATUS, :long, 10, :long, 1)
|
228
|
-
channel.sends_packet(FXP_CLOSE, :long, 13, :string, "file1")
|
229
|
-
|
230
|
-
channel.gets_packet(FXP_DATA, :long, 11, :string, "contents of file2")
|
231
|
-
channel.sends_packet(FXP_READ, :long, 14, :string, "file2", :int64, 32_000, :long, 32_000)
|
232
|
-
|
233
|
-
channel.gets_packet(FXP_STATUS, :long, 12, :long, 0)
|
234
|
-
channel.gets_packet(FXP_STATUS, :long, 13, :long, 0)
|
235
|
-
channel.gets_packet(FXP_STATUS, :long, 14, :long, 1)
|
236
|
-
channel.sends_packet(FXP_CLOSE, :long, 15, :string, "file2")
|
237
|
-
channel.gets_packet(FXP_STATUS, :long, 15, :long, 0)
|
238
|
-
end
|
239
|
-
|
240
|
-
File.expects(:directory?).with(local).returns(false)
|
241
|
-
File.expects(:directory?).with(File.join(local, "subdir1")).returns(false)
|
242
|
-
Dir.expects(:mkdir).with(local)
|
243
|
-
Dir.expects(:mkdir).with(File.join(local, "subdir1"))
|
244
|
-
|
245
|
-
file1 = StringIO.new
|
246
|
-
file2 = StringIO.new
|
247
|
-
File.expects(:open).with(File.join(local, "file1"), "wb").returns(file1)
|
248
|
-
File.expects(:open).with(File.join(local, "subdir1", "file2"), "wb").returns(file2)
|
249
|
-
|
250
|
-
[file1, file2]
|
251
|
-
end
|
252
|
-
end
|
data/test/test_file.rb
DELETED
@@ -1,159 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
|
3
|
-
class FileOperationsTest < Net::SFTP::TestCase
|
4
|
-
def setup
|
5
|
-
@sftp = mock("sftp")
|
6
|
-
@file = Net::SFTP::Operations::File.new(@sftp, "handle")
|
7
|
-
@save_dollar_fslash, $/ = $/, "\n"
|
8
|
-
@save_dollar_bslash, $\ = $\, nil
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
$/ = @save_dollar_fslash
|
13
|
-
$\ = @save_dollar_bslash
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_pos_assignment_should_set_position
|
17
|
-
@file.pos = 15
|
18
|
-
assert_equal 15, @file.pos
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_pos_assignment_should_reset_eof
|
22
|
-
@sftp.expects(:read!).with("handle", 0, 8192).returns(nil)
|
23
|
-
assert !@file.eof?
|
24
|
-
@file.read
|
25
|
-
assert @file.eof?
|
26
|
-
@file.pos = 0
|
27
|
-
assert !@file.eof?
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_close_should_close_handle_and_set_handle_to_nil
|
31
|
-
assert_equal "handle", @file.handle
|
32
|
-
@sftp.expects(:close!).with("handle")
|
33
|
-
@file.close
|
34
|
-
assert_nil @file.handle
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_eof_should_be_false_if_at_eof_but_data_remains_in_buffer
|
38
|
-
@sftp.expects(:read!).returns("hello world", nil)
|
39
|
-
@file.read(1)
|
40
|
-
assert !@file.eof?
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_eof_should_be_true_if_at_eof_and_no_data_in_buffer
|
44
|
-
@sftp.expects(:read!).times(2).returns("hello world", nil)
|
45
|
-
@file.read
|
46
|
-
assert @file.eof?
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_read_without_argument_should_read_and_return_remainder_of_file_and_set_pos
|
50
|
-
@sftp.expects(:read!).times(2).returns("hello world", nil)
|
51
|
-
assert_equal "hello world", @file.read
|
52
|
-
assert_equal 11, @file.pos
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_read_with_argument_should_read_and_return_n_bytes_and_set_pos
|
56
|
-
@sftp.expects(:read!).returns("hello world")
|
57
|
-
assert_equal "hello", @file.read(5)
|
58
|
-
assert_equal 5, @file.pos
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_read_after_pos_assignment_should_read_from_specified_position
|
62
|
-
@sftp.expects(:read!).with("handle", 5, 8192).returns("hello world")
|
63
|
-
@file.pos = 5
|
64
|
-
assert_equal "hello", @file.read(5)
|
65
|
-
assert_equal 10, @file.pos
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_gets_without_argument_should_read_until_first_dollar_fslash
|
69
|
-
@sftp.expects(:read!).returns("hello world\ngoodbye world\n\nfarewell!\n")
|
70
|
-
assert_equal "\n", $/
|
71
|
-
assert_equal "hello world\n", @file.gets
|
72
|
-
assert_equal 12, @file.pos
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_gets_with_empty_argument_should_read_until_double_dollar_fslash
|
76
|
-
@sftp.expects(:read!).returns("hello world\ngoodbye world\n\nfarewell!\n")
|
77
|
-
assert_equal "\n", $/
|
78
|
-
assert_equal "hello world\ngoodbye world\n\n", @file.gets("")
|
79
|
-
assert_equal 27, @file.pos
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_gets_with_argument_should_read_until_first_instance_of_argument
|
83
|
-
@sftp.expects(:read!).returns("hello world\ngoodbye world\n\nfarewell!\n")
|
84
|
-
assert_equal "hello w", @file.gets("w")
|
85
|
-
assert_equal 7, @file.pos
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_gets_when_no_such_delimiter_exists_in_stream_should_read_to_EOF
|
89
|
-
@sftp.expects(:read!).times(2).returns("hello world\ngoodbye world\n\nfarewell!\n", nil)
|
90
|
-
assert_equal "hello world\ngoodbye world\n\nfarewell!\n", @file.gets("X")
|
91
|
-
assert @file.eof?
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_gets_at_EOF_should_return_nil
|
95
|
-
@sftp.expects(:read!).returns(nil)
|
96
|
-
assert_nil @file.gets
|
97
|
-
assert @file.eof?
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_readline_should_raise_exception_on_EOF
|
101
|
-
@sftp.expects(:read!).returns(nil)
|
102
|
-
assert_raises(EOFError) { @file.readline }
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_write_should_write_data_and_increment_pos_and_return_data_length
|
106
|
-
@sftp.expects(:write!).with("handle", 0, "hello world")
|
107
|
-
assert_equal 11, @file.write("hello world")
|
108
|
-
assert_equal 11, @file.pos
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_write_after_pos_assignment_should_write_at_position
|
112
|
-
@sftp.expects(:write!).with("handle", 15, "hello world")
|
113
|
-
@file.pos = 15
|
114
|
-
assert_equal 11, @file.write("hello world")
|
115
|
-
assert_equal 26, @file.pos
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_print_with_no_arguments_should_write_nothing_if_dollar_bslash_is_nil
|
119
|
-
assert_nil $\
|
120
|
-
@sftp.expects(:write!).never
|
121
|
-
@file.print
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_print_with_no_arguments_should_write_dollar_bslash_if_dollar_bslash_is_not_nil
|
125
|
-
$\ = "-"
|
126
|
-
@sftp.expects(:write!).with("handle", 0, "-")
|
127
|
-
@file.print
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_print_with_arguments_should_write_all_arguments
|
131
|
-
@sftp.expects(:write!).with("handle", 0, "hello")
|
132
|
-
@sftp.expects(:write!).with("handle", 5, " ")
|
133
|
-
@sftp.expects(:write!).with("handle", 6, "world")
|
134
|
-
@file.print("hello", " ", "world")
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_puts_should_recursively_puts_array_arguments
|
138
|
-
10.times do |i|
|
139
|
-
@sftp.expects(:write!).with("handle", i*2, i.to_s)
|
140
|
-
@sftp.expects(:write!).with("handle", i*2+1, "\n")
|
141
|
-
end
|
142
|
-
@file.puts 0, [1, [2, 3], 4, [5, [6, 7, 8]]], 9
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_puts_should_not_append_newline_if_argument_ends_in_newline
|
146
|
-
@sftp.expects(:write!).with("handle", 0, "a")
|
147
|
-
@sftp.expects(:write!).with("handle", 1, "\n")
|
148
|
-
@sftp.expects(:write!).with("handle", 2, "b\n")
|
149
|
-
@sftp.expects(:write!).with("handle", 4, "c")
|
150
|
-
@sftp.expects(:write!).with("handle", 5, "\n")
|
151
|
-
@file.puts "a", "b\n", "c"
|
152
|
-
end
|
153
|
-
|
154
|
-
def test_stat_should_return_attributes_object_for_handle
|
155
|
-
stat = stub("stat")
|
156
|
-
@sftp.expects(:fstat!).with("handle").returns(stat)
|
157
|
-
assert_equal stat, @file.stat
|
158
|
-
end
|
159
|
-
end
|