net-sftp 1.1.1 → 2.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.
Files changed (138) hide show
  1. data/CHANGELOG.rdoc +23 -0
  2. data/Manifest +55 -0
  3. data/README.rdoc +96 -0
  4. data/Rakefile +30 -0
  5. data/lib/net/sftp.rb +53 -38
  6. data/lib/net/sftp/constants.rb +187 -0
  7. data/lib/net/sftp/errors.rb +34 -20
  8. data/lib/net/sftp/operations/dir.rb +93 -0
  9. data/lib/net/sftp/operations/download.rb +364 -0
  10. data/lib/net/sftp/operations/file.rb +176 -0
  11. data/lib/net/sftp/operations/file_factory.rb +60 -0
  12. data/lib/net/sftp/operations/upload.rb +387 -0
  13. data/lib/net/sftp/packet.rb +21 -0
  14. data/lib/net/sftp/protocol.rb +32 -0
  15. data/lib/net/sftp/protocol/01/attributes.rb +265 -96
  16. data/lib/net/sftp/protocol/01/base.rb +268 -0
  17. data/lib/net/sftp/protocol/01/name.rb +43 -0
  18. data/lib/net/sftp/protocol/02/base.rb +31 -0
  19. data/lib/net/sftp/protocol/03/base.rb +35 -0
  20. data/lib/net/sftp/protocol/04/attributes.rb +120 -195
  21. data/lib/net/sftp/protocol/04/base.rb +94 -0
  22. data/lib/net/sftp/protocol/04/name.rb +67 -0
  23. data/lib/net/sftp/protocol/05/base.rb +66 -0
  24. data/lib/net/sftp/protocol/06/attributes.rb +107 -0
  25. data/lib/net/sftp/protocol/06/base.rb +63 -0
  26. data/lib/net/sftp/protocol/base.rb +50 -0
  27. data/lib/net/sftp/request.rb +91 -0
  28. data/lib/net/sftp/response.rb +76 -0
  29. data/lib/net/sftp/session.rb +914 -238
  30. data/lib/net/sftp/version.rb +14 -21
  31. data/net-sftp.gemspec +60 -0
  32. data/setup.rb +1331 -0
  33. data/test/common.rb +173 -0
  34. data/test/protocol/01/test_attributes.rb +97 -0
  35. data/test/protocol/01/test_base.rb +210 -0
  36. data/test/protocol/01/test_name.rb +27 -0
  37. data/test/protocol/02/test_base.rb +26 -0
  38. data/test/protocol/03/test_base.rb +27 -0
  39. data/test/protocol/04/test_attributes.rb +148 -0
  40. data/test/protocol/04/test_base.rb +74 -0
  41. data/test/protocol/04/test_name.rb +49 -0
  42. data/test/protocol/05/test_base.rb +62 -0
  43. data/test/protocol/06/test_attributes.rb +124 -0
  44. data/test/protocol/06/test_base.rb +51 -0
  45. data/test/protocol/test_base.rb +42 -0
  46. data/test/test_all.rb +3 -0
  47. data/test/test_dir.rb +47 -0
  48. data/test/test_download.rb +252 -0
  49. data/test/test_file.rb +159 -0
  50. data/test/test_file_factory.rb +48 -0
  51. data/test/test_packet.rb +9 -0
  52. data/test/test_protocol.rb +17 -0
  53. data/test/test_request.rb +71 -0
  54. data/test/test_response.rb +53 -0
  55. data/test/test_session.rb +741 -0
  56. data/test/test_upload.rb +219 -0
  57. metadata +59 -111
  58. data/doc/LICENSE-BSD +0 -27
  59. data/doc/LICENSE-GPL +0 -280
  60. data/doc/LICENSE-RUBY +0 -56
  61. data/doc/faq/faq.html +0 -298
  62. data/doc/faq/faq.rb +0 -154
  63. data/doc/faq/faq.yml +0 -183
  64. data/examples/asynchronous.rb +0 -57
  65. data/examples/get-put.rb +0 -45
  66. data/examples/sftp-open-uri.rb +0 -30
  67. data/examples/ssh-service.rb +0 -30
  68. data/examples/synchronous.rb +0 -131
  69. data/lib/net/sftp/operations/abstract.rb +0 -108
  70. data/lib/net/sftp/operations/close.rb +0 -31
  71. data/lib/net/sftp/operations/errors.rb +0 -76
  72. data/lib/net/sftp/operations/fsetstat.rb +0 -36
  73. data/lib/net/sftp/operations/fstat.rb +0 -32
  74. data/lib/net/sftp/operations/lstat.rb +0 -31
  75. data/lib/net/sftp/operations/mkdir.rb +0 -33
  76. data/lib/net/sftp/operations/open.rb +0 -32
  77. data/lib/net/sftp/operations/opendir.rb +0 -32
  78. data/lib/net/sftp/operations/read.rb +0 -88
  79. data/lib/net/sftp/operations/readdir.rb +0 -55
  80. data/lib/net/sftp/operations/realpath.rb +0 -37
  81. data/lib/net/sftp/operations/remove.rb +0 -31
  82. data/lib/net/sftp/operations/rename.rb +0 -32
  83. data/lib/net/sftp/operations/rmdir.rb +0 -31
  84. data/lib/net/sftp/operations/services.rb +0 -42
  85. data/lib/net/sftp/operations/setstat.rb +0 -33
  86. data/lib/net/sftp/operations/stat.rb +0 -31
  87. data/lib/net/sftp/operations/write.rb +0 -63
  88. data/lib/net/sftp/protocol/01/impl.rb +0 -251
  89. data/lib/net/sftp/protocol/01/packet-assistant.rb +0 -82
  90. data/lib/net/sftp/protocol/01/services.rb +0 -47
  91. data/lib/net/sftp/protocol/02/impl.rb +0 -39
  92. data/lib/net/sftp/protocol/02/packet-assistant.rb +0 -32
  93. data/lib/net/sftp/protocol/02/services.rb +0 -44
  94. data/lib/net/sftp/protocol/03/impl.rb +0 -42
  95. data/lib/net/sftp/protocol/03/packet-assistant.rb +0 -35
  96. data/lib/net/sftp/protocol/03/services.rb +0 -44
  97. data/lib/net/sftp/protocol/04/impl.rb +0 -86
  98. data/lib/net/sftp/protocol/04/packet-assistant.rb +0 -45
  99. data/lib/net/sftp/protocol/04/services.rb +0 -44
  100. data/lib/net/sftp/protocol/05/impl.rb +0 -90
  101. data/lib/net/sftp/protocol/05/packet-assistant.rb +0 -34
  102. data/lib/net/sftp/protocol/05/services.rb +0 -44
  103. data/lib/net/sftp/protocol/constants.rb +0 -60
  104. data/lib/net/sftp/protocol/driver.rb +0 -235
  105. data/lib/net/sftp/protocol/packet-assistant.rb +0 -84
  106. data/lib/net/sftp/protocol/services.rb +0 -55
  107. data/lib/uri/open-sftp.rb +0 -54
  108. data/lib/uri/sftp.rb +0 -42
  109. data/test/ALL-TESTS.rb +0 -23
  110. data/test/operations/tc_abstract.rb +0 -124
  111. data/test/operations/tc_close.rb +0 -40
  112. data/test/operations/tc_fsetstat.rb +0 -48
  113. data/test/operations/tc_fstat.rb +0 -40
  114. data/test/operations/tc_lstat.rb +0 -40
  115. data/test/operations/tc_mkdir.rb +0 -48
  116. data/test/operations/tc_open.rb +0 -42
  117. data/test/operations/tc_opendir.rb +0 -40
  118. data/test/operations/tc_read.rb +0 -103
  119. data/test/operations/tc_readdir.rb +0 -88
  120. data/test/operations/tc_realpath.rb +0 -54
  121. data/test/operations/tc_remove.rb +0 -40
  122. data/test/operations/tc_rmdir.rb +0 -40
  123. data/test/operations/tc_setstat.rb +0 -48
  124. data/test/operations/tc_stat.rb +0 -40
  125. data/test/operations/tc_write.rb +0 -91
  126. data/test/protocol/01/tc_attributes.rb +0 -138
  127. data/test/protocol/01/tc_impl.rb +0 -294
  128. data/test/protocol/01/tc_packet_assistant.rb +0 -81
  129. data/test/protocol/02/tc_impl.rb +0 -41
  130. data/test/protocol/02/tc_packet_assistant.rb +0 -31
  131. data/test/protocol/03/tc_impl.rb +0 -48
  132. data/test/protocol/03/tc_packet_assistant.rb +0 -34
  133. data/test/protocol/04/tc_attributes.rb +0 -174
  134. data/test/protocol/04/tc_impl.rb +0 -91
  135. data/test/protocol/04/tc_packet_assistant.rb +0 -38
  136. data/test/protocol/05/tc_impl.rb +0 -61
  137. data/test/protocol/05/tc_packet_assistant.rb +0 -32
  138. data/test/protocol/tc_driver.rb +0 -219
data/test/common.rb ADDED
@@ -0,0 +1,173 @@
1
+ require 'test/unit'
2
+ require 'mocha'
3
+
4
+ begin
5
+ gem 'net-ssh', ">= 2.0.0"
6
+ require 'net/ssh'
7
+ rescue LoadError
8
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../net-ssh/lib"
9
+
10
+ begin
11
+ require 'net/ssh'
12
+ require 'net/ssh/version'
13
+ raise LoadError, "wrong version" unless Net::SSH::Version::STRING >= '1.99.0'
14
+ rescue LoadError => e
15
+ abort "could not load net/ssh v2 (#{e.inspect})"
16
+ end
17
+ end
18
+
19
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
20
+ require 'net/sftp'
21
+ require 'net/sftp/constants'
22
+ require 'net/ssh/test'
23
+
24
+ class Net::SFTP::TestCase < Test::Unit::TestCase
25
+ include Net::SFTP::Constants::PacketTypes
26
+ include Net::SSH::Test
27
+
28
+ def default_test
29
+ # do nothing, this is just hacky-hack to work around Test::Unit's
30
+ # insistence that all TestCase subclasses have at least one test
31
+ # method defined.
32
+ end
33
+
34
+ protected
35
+
36
+ def raw(*args)
37
+ Net::SSH::Buffer.from(*args).to_s
38
+ end
39
+
40
+ def sftp(options={})
41
+ @sftp ||= Net::SFTP::Session.new(connection(options))
42
+ end
43
+
44
+ def expect_sftp_session(opts={})
45
+ story do |session|
46
+ channel = session.opens_channel
47
+ channel.sends_subsystem("sftp")
48
+ channel.sends_packet(FXP_INIT, :long, opts[:client_version] || Net::SFTP::Session::HIGHEST_PROTOCOL_VERSION_SUPPORTED)
49
+ channel.gets_packet(FXP_VERSION, :long, opts[:server_version] || Net::SFTP::Session::HIGHEST_PROTOCOL_VERSION_SUPPORTED)
50
+ yield channel if block_given?
51
+ end
52
+ end
53
+
54
+ def assert_scripted_command
55
+ assert_scripted do
56
+ sftp.connect!
57
+ yield
58
+ sftp.loop
59
+ end
60
+ end
61
+
62
+ def assert_progress_reported_open(expect={})
63
+ assert_progress_reported(:open, expect)
64
+ end
65
+
66
+ def assert_progress_reported_put(offset, data, expect={})
67
+ assert_equal offset, current_event[3] if offset
68
+ assert_equal data, current_event[4] if data
69
+ assert_progress_reported(:put, expect)
70
+ end
71
+
72
+ def assert_progress_reported_get(offset, data, expect={})
73
+ assert_equal offset, current_event[3] if offset
74
+ if data.is_a?(Fixnum)
75
+ assert_equal data, current_event[4].length
76
+ elsif data
77
+ assert_equal data, current_event[4]
78
+ end
79
+ assert_progress_reported(:get, expect)
80
+ end
81
+
82
+ def assert_progress_reported_close(expect={})
83
+ assert_progress_reported(:close, expect)
84
+ end
85
+
86
+ def assert_progress_reported_mkdir(dir)
87
+ assert_equal dir, current_event[2]
88
+ assert_progress_reported(:mkdir)
89
+ end
90
+
91
+ def assert_progress_reported_finish
92
+ assert_progress_reported(:finish)
93
+ end
94
+
95
+ def assert_progress_reported(event, expect={})
96
+ assert_equal event, current_event[0]
97
+ expect.each do |key, value|
98
+ assert_equal value, current_event[2].send(key)
99
+ end
100
+ next_event!
101
+ end
102
+
103
+ def assert_no_more_reported_events
104
+ assert @progress.empty?, "expected #{@progress.empty?} to be empty"
105
+ end
106
+
107
+ def prepare_progress!
108
+ @progress = []
109
+ end
110
+
111
+ def record_progress(event)
112
+ @progress << event
113
+ end
114
+
115
+ def current_event
116
+ @progress.first
117
+ end
118
+
119
+ def next_event!
120
+ @progress.shift
121
+ end
122
+ end
123
+
124
+ class Net::SSH::Test::Channel
125
+ def gets_packet(type, *args)
126
+ gets_data(sftp_packet(type, *args))
127
+ end
128
+
129
+ def sends_packet(type, *args)
130
+ sends_data(sftp_packet(type, *args))
131
+ end
132
+
133
+ private
134
+
135
+ def sftp_packet(type, *args)
136
+ data = Net::SSH::Buffer.from(*args)
137
+ Net::SSH::Buffer.from(:long, data.length+1, :byte, type, :raw, data).to_s
138
+ end
139
+ end
140
+
141
+ class ProgressHandler
142
+ def initialize(progress_ref)
143
+ @progress = progress_ref
144
+ end
145
+
146
+ def on_open(*args)
147
+ @progress << [:open, *args]
148
+ end
149
+
150
+ def on_put(*args)
151
+ @progress << [:put, *args]
152
+ end
153
+
154
+ def on_close(*args)
155
+ @progress << [:close, *args]
156
+ end
157
+
158
+ def on_finish(*args)
159
+ @progress << [:finish, *args]
160
+ end
161
+ end
162
+
163
+ # "prime the pump", so to speak: predefine the modules we need so we can
164
+ # define the test classes in a more elegant short-hand.
165
+
166
+ module Protocol
167
+ module V01; end
168
+ module V02; end
169
+ module V03; end
170
+ module V04; end
171
+ module V05; end
172
+ module V06; end
173
+ end
@@ -0,0 +1,97 @@
1
+ require 'common'
2
+
3
+ module Etc; end
4
+
5
+ class Protocol::V01::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 1234567890, attributes.size
10
+ assert_equal 100, attributes.uid
11
+ assert_equal 200, attributes.gid
12
+ assert_equal 0755, attributes.permissions
13
+ assert_equal 1234567890, attributes.atime
14
+ assert_equal 2345678901, attributes.mtime
15
+ assert_equal "second", attributes.extended["first"]
16
+ end
17
+
18
+ def test_from_buffer_should_correctly_parse_buffer_with_attribute_subset_and_return_attribute_object
19
+ buffer = Net::SSH::Buffer.from(:long, 0x4, :long, 0755)
20
+
21
+ attributes = attributes_factory.from_buffer(buffer)
22
+
23
+ assert_equal 0755, attributes.permissions
24
+
25
+ assert_nil attributes.size
26
+ assert_nil attributes.uid
27
+ assert_nil attributes.gid
28
+ assert_nil attributes.atime
29
+ assert_nil attributes.mtime
30
+ assert_nil attributes.extended
31
+ end
32
+
33
+ def test_attributes_to_s_should_build_binary_representation
34
+ attributes = attributes_factory.new(
35
+ :size => 1234567890,
36
+ :uid => 100, :gid => 200,
37
+ :permissions => 0755,
38
+ :atime => 1234567890, :mtime => 2345678901,
39
+ :extended => { "first" => "second" })
40
+
41
+ assert_equal full_buffer.to_s, attributes.to_s
42
+ end
43
+
44
+ def test_attributes_to_s_should_build_binary_representation_when_subset_is_present
45
+ attributes = attributes_factory.new(:permissions => 0755)
46
+ assert_equal Net::SSH::Buffer.from(:long, 0x4, :long, 0755).to_s, attributes.to_s
47
+ end
48
+
49
+ def test_attributes_to_s_with_owner_and_group_should_translate_to_uid_and_gid
50
+ attributes = attributes_factory.new(:owner => "jamis", :group => "sftp")
51
+ attributes.expects(:require).with("etc").times(2)
52
+ Etc.expects(:getpwnam).with("jamis").returns(mock('user', :uid => 100))
53
+ Etc.expects(:getgrnam).with("sftp").returns(mock('group', :gid => 200))
54
+ assert_equal Net::SSH::Buffer.from(:long, 0x2, :long, 100, :long, 200).to_s, attributes.to_s
55
+ end
56
+
57
+ def test_owner_should_translate_from_uid
58
+ attributes = attributes_factory.new(:uid => 100)
59
+ attributes.expects(:require).with("etc")
60
+ Etc.expects(:getpwuid).with(100).returns(mock('user', :name => "jamis"))
61
+ assert_equal "jamis", attributes.owner
62
+ end
63
+
64
+ def test_group_should_translate_from_gid
65
+ attributes = attributes_factory.new(:gid => 200)
66
+ attributes.expects(:require).with("etc")
67
+ Etc.expects(:getgrgid).with(200).returns(mock('group', :name => "sftp"))
68
+ assert_equal "sftp", attributes.group
69
+ end
70
+
71
+ def test_type_should_infer_type_from_permissions
72
+ assert_equal af::T_SOCKET, af.new(:permissions => 0140755).type
73
+ assert_equal af::T_SYMLINK, af.new(:permissions => 0120755).type
74
+ assert_equal af::T_REGULAR, af.new(:permissions => 0100755).type
75
+ assert_equal af::T_BLOCK_DEVICE, af.new(:permissions => 060755).type
76
+ assert_equal af::T_DIRECTORY, af.new(:permissions => 040755).type
77
+ assert_equal af::T_CHAR_DEVICE, af.new(:permissions => 020755).type
78
+ assert_equal af::T_FIFO, af.new(:permissions => 010755).type
79
+ assert_equal af::T_UNKNOWN, af.new(:permissions => 0755).type
80
+ assert_equal af::T_UNKNOWN, af.new.type
81
+ end
82
+
83
+ private
84
+
85
+ def full_buffer
86
+ Net::SSH::Buffer.from(:long, 0x8000000f,
87
+ :int64, 1234567890, :long, 100, :long, 200,
88
+ :long, 0755, :long, 1234567890, :long, 2345678901,
89
+ :long, 1, :string, "first", :string, "second")
90
+ end
91
+
92
+ def attributes_factory
93
+ Net::SFTP::Protocol::V01::Attributes
94
+ end
95
+
96
+ alias af attributes_factory
97
+ end
@@ -0,0 +1,210 @@
1
+ require 'common'
2
+
3
+ # NOTE: these tests assume that the interface to Net::SFTP::Session#send_packet
4
+ # will remain constant. If that interface ever changes, these tests will need
5
+ # to be updated!
6
+
7
+ class Protocol::V01::TestBase < Net::SFTP::TestCase
8
+ include Net::SFTP::Constants
9
+ include Net::SFTP::Constants::PacketTypes
10
+ include Net::SFTP::Constants::OpenFlags
11
+
12
+ def setup
13
+ @session = stub('session', :logger => nil)
14
+ @base = driver.new(@session)
15
+ end
16
+
17
+ def test_version
18
+ assert_equal 1, @base.version
19
+ end
20
+
21
+ def test_parse_handle_packet_should_read_string_from_packet_and_return_handle_in_hash
22
+ packet = Net::SSH::Buffer.from(:string, "here is a string")
23
+ assert_equal({ :handle => "here is a string" }, @base.parse_handle_packet(packet))
24
+ end
25
+
26
+ def test_parse_status_packet_should_read_long_from_packet_and_return_code_in_hash
27
+ packet = Net::SSH::Buffer.from(:long, 15)
28
+ assert_equal({ :code => 15 }, @base.parse_status_packet(packet))
29
+ end
30
+
31
+ def test_parse_data_packet_should_read_string_from_packet_and_return_data_in_hash
32
+ packet = Net::SSH::Buffer.from(:string, "here is a string")
33
+ assert_equal({ :data => "here is a string" }, @base.parse_data_packet(packet))
34
+ end
35
+
36
+ def test_parse_attrs_packet_should_use_correct_attributes_class
37
+ Net::SFTP::Protocol::V01::Attributes.expects(:from_buffer).with(:packet).returns(:result)
38
+ assert_equal({ :attrs => :result }, @base.parse_attrs_packet(:packet))
39
+ end
40
+
41
+ def test_parse_name_packet_should_use_correct_name_class
42
+ packet = Net::SSH::Buffer.from(:long, 2,
43
+ :string, "name1", :string, "long1", :long, 0x4, :long, 0755,
44
+ :string, "name2", :string, "long2", :long, 0x4, :long, 0550)
45
+ names = @base.parse_name_packet(packet)[:names]
46
+
47
+ assert_not_nil names
48
+ assert_equal 2, names.length
49
+ assert_instance_of Net::SFTP::Protocol::V01::Name, names.first
50
+
51
+ assert_equal "name1", names.first.name
52
+ assert_equal "long1", names.first.longname
53
+ assert_equal 0755, names.first.attributes.permissions
54
+
55
+ assert_equal "name2", names.last.name
56
+ assert_equal "long2", names.last.longname
57
+ assert_equal 0550, names.last.attributes.permissions
58
+ end
59
+
60
+ def test_open_with_numeric_flag_should_accept_IO_constants
61
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
62
+ :string, "/path/to/file",
63
+ :long, FV1::READ | FV1::WRITE | FV1::CREAT | FV1::EXCL,
64
+ :raw, attributes.new.to_s)
65
+
66
+ assert_equal 0, @base.open("/path/to/file", IO::RDWR | IO::CREAT | IO::EXCL, {})
67
+ end
68
+
69
+ { "r" => FV1::READ,
70
+ "rb" => FV1::READ,
71
+ "r+" => FV1::READ | FV1::WRITE,
72
+ "w" => FV1::WRITE | FV1::TRUNC | FV1::CREAT,
73
+ "w+" => FV1::WRITE | FV1::READ | FV1::TRUNC | FV1::CREAT,
74
+ "a" => FV1::APPEND | FV1::WRITE | FV1::CREAT,
75
+ "a+" => FV1::APPEND | FV1::WRITE | FV1::READ | FV1::CREAT
76
+ }.each do |flags, options|
77
+ safe_name = flags.sub(/\+/, "_plus")
78
+ define_method("test_open_with_#{safe_name}_should_translate_correctly") do
79
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
80
+ :string, "/path/to/file", :long, options, :raw, attributes.new.to_s)
81
+
82
+ assert_equal 0, @base.open("/path/to/file", flags, {})
83
+ end
84
+ end
85
+
86
+ def test_open_with_attributes_converts_hash_to_attribute_packet
87
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
88
+ :string, "/path/to/file", :long, FV1::READ, :raw, attributes.new(:permissions => 0755).to_s)
89
+ @base.open("/path/to/file", "r", :permissions => 0755)
90
+ end
91
+
92
+ def test_close_should_send_close_packet
93
+ @session.expects(:send_packet).with(FXP_CLOSE, :long, 0, :string, "handle")
94
+ assert_equal 0, @base.close("handle")
95
+ end
96
+
97
+ def test_read_should_send_read_packet
98
+ @session.expects(:send_packet).with(FXP_READ, :long, 0, :string, "handle", :int64, 1234, :long, 5678)
99
+ assert_equal 0, @base.read("handle", 1234, 5678)
100
+ end
101
+
102
+ def test_write_should_send_write_packet
103
+ @session.expects(:send_packet).with(FXP_WRITE, :long, 0, :string, "handle", :int64, 1234, :string, "data")
104
+ assert_equal 0, @base.write("handle", 1234, "data")
105
+ end
106
+
107
+ def test_lstat_should_send_lstat_packet
108
+ @session.expects(:send_packet).with(FXP_LSTAT, :long, 0, :string, "/path/to/file")
109
+ assert_equal 0, @base.lstat("/path/to/file")
110
+ end
111
+
112
+ def test_lstat_should_ignore_flags_parameter
113
+ @session.expects(:send_packet).with(FXP_LSTAT, :long, 0, :string, "/path/to/file")
114
+ assert_equal 0, @base.lstat("/path/to/file", 12345)
115
+ end
116
+
117
+ def test_fstat_should_send_fstat_packet
118
+ @session.expects(:send_packet).with(FXP_FSTAT, :long, 0, :string, "handle")
119
+ assert_equal 0, @base.fstat("handle")
120
+ end
121
+
122
+ def test_fstat_should_ignore_flags_parameter
123
+ @session.expects(:send_packet).with(FXP_FSTAT, :long, 0, :string, "handle")
124
+ assert_equal 0, @base.fstat("handle", 12345)
125
+ end
126
+
127
+ def test_setstat_should_translate_hash_to_attributes_and_send_setstat_packet
128
+ @session.expects(:send_packet).with(FXP_SETSTAT, :long, 0, :string, "/path/to/file", :raw, attributes.new(:atime => 1, :mtime => 2, :permissions => 0755).to_s)
129
+ assert_equal 0, @base.setstat("/path/to/file", :atime => 1, :mtime => 2, :permissions => 0755)
130
+ end
131
+
132
+ def test_fsetstat_should_translate_hash_to_attributes_and_send_fsetstat_packet
133
+ @session.expects(:send_packet).with(FXP_FSETSTAT, :long, 0, :string, "handle", :raw, attributes.new(:atime => 1, :mtime => 2, :permissions => 0755).to_s)
134
+ assert_equal 0, @base.fsetstat("handle", :atime => 1, :mtime => 2, :permissions => 0755)
135
+ end
136
+
137
+ def test_opendir_should_send_opendir_packet
138
+ @session.expects(:send_packet).with(FXP_OPENDIR, :long, 0, :string, "/path/to/dir")
139
+ assert_equal 0, @base.opendir("/path/to/dir")
140
+ end
141
+
142
+ def test_readdir_should_send_readdir_packet
143
+ @session.expects(:send_packet).with(FXP_READDIR, :long, 0, :string, "handle")
144
+ assert_equal 0, @base.readdir("handle")
145
+ end
146
+
147
+ def test_remove_should_send_remove_packet
148
+ @session.expects(:send_packet).with(FXP_REMOVE, :long, 0, :string, "/path/to/file")
149
+ assert_equal 0, @base.remove("/path/to/file")
150
+ end
151
+
152
+ def test_mkdir_should_translate_hash_to_attributes_and_send_mkdir_packet
153
+ @session.expects(:send_packet).with(FXP_MKDIR, :long, 0, :string, "/path/to/dir", :raw, attributes.new(:atime => 1, :mtime => 2, :permissions => 0755).to_s)
154
+ assert_equal 0, @base.mkdir("/path/to/dir", :atime => 1, :mtime => 2, :permissions => 0755)
155
+ end
156
+
157
+ def test_rmdir_should_send_rmdir_packet
158
+ @session.expects(:send_packet).with(FXP_RMDIR, :long, 0, :string, "/path/to/dir")
159
+ assert_equal 0, @base.rmdir("/path/to/dir")
160
+ end
161
+
162
+ def test_realpath_should_send_realpath_packet
163
+ @session.expects(:send_packet).with(FXP_REALPATH, :long, 0, :string, "/path/to/file")
164
+ assert_equal 0, @base.realpath("/path/to/file")
165
+ end
166
+
167
+ def test_stat_should_send_stat_packet
168
+ @session.expects(:send_packet).with(FXP_STAT, :long, 0, :string, "/path/to/file")
169
+ assert_equal 0, @base.stat("/path/to/file")
170
+ end
171
+
172
+ def test_stat_should_ignore_flags_parameter
173
+ @session.expects(:send_packet).with(FXP_STAT, :long, 0, :string, "/path/to/file")
174
+ assert_equal 0, @base.stat("/path/to/file", 12345)
175
+ end
176
+
177
+ def test_rename_should_raise_not_implemented_error
178
+ assert_raises(NotImplementedError) { @base.rename("/path/to/old", "/path/to/new") }
179
+ end
180
+
181
+ def test_readlink_should_raise_not_implemented_error
182
+ assert_raises(NotImplementedError) { @base.readlink("/path/to/link") }
183
+ end
184
+
185
+ def test_symlink_should_raise_not_implemented_error
186
+ assert_raises(NotImplementedError) { @base.symlink("/path/to/link", "/path/to/file") }
187
+ end
188
+
189
+ def test_link_should_raise_not_implemented_error
190
+ assert_raises(NotImplementedError) { @base.link("/path/to/link", "/path/to/file", true) }
191
+ end
192
+
193
+ def test_block_should_raise_not_implemented_error
194
+ assert_raises(NotImplementedError) { @base.block("handle", 100, 200, 0) }
195
+ end
196
+
197
+ def test_unblock_should_raise_not_implemented_error
198
+ assert_raises(NotImplementedError) { @base.unblock("handle", 100, 200) }
199
+ end
200
+
201
+ private
202
+
203
+ def driver
204
+ Net::SFTP::Protocol::V01::Base
205
+ end
206
+
207
+ def attributes
208
+ Net::SFTP::Protocol::V01::Attributes
209
+ end
210
+ end