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
@@ -0,0 +1,27 @@
1
+ require 'common'
2
+
3
+ class Protocol::V01::TestName < Net::SFTP::TestCase
4
+ def setup
5
+ @directory = Net::SFTP::Protocol::V01::Name.new("test", "drwxr-x-r-x 89 test test 3026 Mar 10 17:45 test", Net::SFTP::Protocol::V01::Attributes.new(:permissions => 040755))
6
+ @link = Net::SFTP::Protocol::V01::Name.new("test", "lrwxr-x-r-x 89 test test 3026 Mar 10 17:45 test", Net::SFTP::Protocol::V01::Attributes.new(:permissions => 0120755))
7
+ @file = Net::SFTP::Protocol::V01::Name.new("test", "-rwxr-x-r-x 89 test test 3026 Mar 10 17:45 test", Net::SFTP::Protocol::V01::Attributes.new(:permissions => 0100755))
8
+ end
9
+
10
+ def test_directory?
11
+ assert @directory.directory?
12
+ assert !@link.directory?
13
+ assert !@file.directory?
14
+ end
15
+
16
+ def test_symlink?
17
+ assert !@directory.symlink?
18
+ assert @link.symlink?
19
+ assert !@file.symlink?
20
+ end
21
+
22
+ def test_file?
23
+ assert !@directory.file?
24
+ assert !@link.file?
25
+ assert @file.file?
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ require 'common'
2
+ require 'protocol/01/test_base'
3
+
4
+ class Protocol::V02::TestBase < Protocol::V01::TestBase
5
+ def test_version
6
+ assert_equal 2, @base.version
7
+ end
8
+
9
+ undef test_rename_should_raise_not_implemented_error
10
+
11
+ def test_rename_should_send_rename_packet
12
+ @session.expects(:send_packet).with(FXP_RENAME, :long, 0, :string, "/old/file", :string, "/new/file")
13
+ assert_equal 0, @base.rename("/old/file", "/new/file")
14
+ end
15
+
16
+ def test_rename_should_ignore_flags_parameter
17
+ @session.expects(:send_packet).with(FXP_RENAME, :long, 0, :string, "/old/file", :string, "/new/file")
18
+ assert_equal 0, @base.rename("/old/file", "/new/file", 1234)
19
+ end
20
+
21
+ private
22
+
23
+ def driver
24
+ Net::SFTP::Protocol::V02::Base
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ require 'common'
2
+ require 'protocol/02/test_base'
3
+
4
+ class Protocol::V03::TestBase < Protocol::V02::TestBase
5
+ def test_version
6
+ assert_equal 3, @base.version
7
+ end
8
+
9
+ undef test_readlink_should_raise_not_implemented_error
10
+ undef test_symlink_should_raise_not_implemented_error
11
+
12
+ def test_readlink_should_send_readlink_packet
13
+ @session.expects(:send_packet).with(FXP_READLINK, :long, 0, :string, "/path/to/link")
14
+ assert_equal 0, @base.readlink("/path/to/link")
15
+ end
16
+
17
+ def test_symlink_should_send_symlink_packet
18
+ @session.expects(:send_packet).with(FXP_SYMLINK, :long, 0, :string, "/path/to/link", :string, "/path/to/file")
19
+ assert_equal 0, @base.symlink("/path/to/link", "/path/to/file")
20
+ end
21
+
22
+ private
23
+
24
+ def driver
25
+ Net::SFTP::Protocol::V03::Base
26
+ end
27
+ end
@@ -0,0 +1,148 @@
1
+ require 'common'
2
+
3
+ module Etc; end
4
+
5
+ class Protocol::V04::TestAttributes < Net::SFTP::TestCase
6
+ def setup
7
+ @directory = attributes_factory.new(:type => attributes_factory::T_DIRECTORY)
8
+ @symlink = attributes_factory.new(:type => attributes_factory::T_SYMLINK)
9
+ @file = attributes_factory.new(:type => attributes_factory::T_REGULAR)
10
+ end
11
+
12
+ def test_from_buffer_should_correctly_parse_buffer_and_return_attribute_object
13
+ attributes = attributes_factory.from_buffer(full_buffer)
14
+
15
+ assert_equal 9, attributes.type
16
+ assert_equal 1234567890, attributes.size
17
+ assert_equal "jamis", attributes.owner
18
+ assert_equal "users", attributes.group
19
+ assert_equal 0755, attributes.permissions
20
+ assert_equal 1234567890, attributes.atime
21
+ assert_equal 12345, attributes.atime_nseconds
22
+ assert_equal 2345678901, attributes.createtime
23
+ assert_equal 23456, attributes.createtime_nseconds
24
+ assert_equal 3456789012, attributes.mtime
25
+ assert_equal 34567, attributes.mtime_nseconds
26
+
27
+ assert_equal 2, attributes.acl.length
28
+
29
+ assert_equal 1, attributes.acl.first.type
30
+ assert_equal 2, attributes.acl.first.flag
31
+ assert_equal 3, attributes.acl.first.mask
32
+ assert_equal "foo", attributes.acl.first.who
33
+
34
+ assert_equal 4, attributes.acl.last.type
35
+ assert_equal 5, attributes.acl.last.flag
36
+ assert_equal 6, attributes.acl.last.mask
37
+ assert_equal "bar", attributes.acl.last.who
38
+
39
+ assert_equal "second", attributes.extended["first"]
40
+ end
41
+
42
+ def test_from_buffer_should_correctly_parse_buffer_with_attribute_subset_and_return_attribute_object
43
+ buffer = Net::SSH::Buffer.from(:long, 0x4, :byte, 1, :long, 0755)
44
+
45
+ attributes = attributes_factory.from_buffer(buffer)
46
+
47
+ assert_equal 1, attributes.type
48
+ assert_equal 0755, attributes.permissions
49
+
50
+ assert_nil attributes.size
51
+ assert_nil attributes.owner
52
+ assert_nil attributes.group
53
+ assert_nil attributes.atime
54
+ assert_nil attributes.atime_nseconds
55
+ assert_nil attributes.createtime
56
+ assert_nil attributes.createtime_nseconds
57
+ assert_nil attributes.mtime
58
+ assert_nil attributes.mtime_nseconds
59
+ assert_nil attributes.acl
60
+ assert_nil attributes.extended
61
+ end
62
+
63
+ def test_attributes_to_s_should_build_binary_representation
64
+ attributes = attributes_factory.new(
65
+ :type => 9,
66
+ :size => 1234567890,
67
+ :owner => "jamis", :group => "users",
68
+ :permissions => 0755,
69
+ :atime => 1234567890, :atime_nseconds => 12345,
70
+ :createtime => 2345678901, :createtime_nseconds => 23456,
71
+ :mtime => 3456789012, :mtime_nseconds => 34567,
72
+ :acl => [attributes_factory::ACL.new(1,2,3,"foo"),
73
+ attributes_factory::ACL.new(4,5,6,"bar")],
74
+ :extended => { "first" => "second" })
75
+
76
+ assert_equal full_buffer.to_s, attributes.to_s
77
+ end
78
+
79
+ def test_attributes_to_s_should_build_binary_representation_when_subset_is_present
80
+ attributes = attributes_factory.new(:permissions => 0755)
81
+ assert_equal Net::SSH::Buffer.from(:long, 0x4, :byte, 1, :long, 0755).to_s, attributes.to_s
82
+ end
83
+
84
+ def test_attributes_to_s_with_uid_and_gid_should_translate_to_owner_and_group
85
+ attributes = attributes_factory.new(:uid => 100, :gid => 200)
86
+ attributes.expects(:require).with("etc").times(2)
87
+ Etc.expects(:getpwuid).with(100).returns(mock('user', :name => "jamis"))
88
+ Etc.expects(:getgrgid).with(200).returns(mock('group', :name => "sftp"))
89
+ assert_equal Net::SSH::Buffer.from(:long, 0x80, :byte, 1, :string, "jamis", :string, "sftp").to_s, attributes.to_s
90
+ end
91
+
92
+ def test_uid_should_translate_from_owner
93
+ attributes = attributes_factory.new(:owner => "jamis")
94
+ attributes.expects(:require).with("etc")
95
+ Etc.expects(:getpwnam).with("jamis").returns(mock('user', :uid => 100))
96
+ assert_equal 100, attributes.uid
97
+ end
98
+
99
+ def test_gid_should_translate_from_group
100
+ attributes = attributes_factory.new(:group => "sftp")
101
+ attributes.expects(:require).with("etc")
102
+ Etc.expects(:getgrnam).with("sftp").returns(mock('group', :gid => 200))
103
+ assert_equal 200, attributes.gid
104
+ end
105
+
106
+ def test_attributes_without_subsecond_times_should_serialize_without_subsecond_times
107
+ attributes = attributes_factory.new(:atime => 100)
108
+ assert_equal Net::SSH::Buffer.from(:long, 0x8, :byte, 1, :int64, 100).to_s, attributes.to_s
109
+ end
110
+
111
+ def test_directory_should_be_true_only_when_type_is_directory
112
+ assert @directory.directory?
113
+ assert !@symlink.directory?
114
+ assert !@file.directory?
115
+ end
116
+
117
+ def test_symlink_should_be_true_only_when_type_is_symlink
118
+ assert !@directory.symlink?
119
+ assert @symlink.symlink?
120
+ assert !@file.symlink?
121
+ end
122
+
123
+ def test_file_should_be_true_only_when_type_is_file
124
+ assert !@directory.file?
125
+ assert !@symlink.file?
126
+ assert @file.file?
127
+ end
128
+
129
+ private
130
+
131
+ def full_buffer
132
+ Net::SSH::Buffer.from(:long, 0x800001fd,
133
+ :byte, 9, :int64, 1234567890,
134
+ :string, "jamis", :string, "users",
135
+ :long, 0755,
136
+ :int64, 1234567890, :long, 12345,
137
+ :int64, 2345678901, :long, 23456,
138
+ :int64, 3456789012, :long, 34567,
139
+ :string, raw(:long, 2,
140
+ :long, 1, :long, 2, :long, 3, :string, "foo",
141
+ :long, 4, :long, 5, :long, 6, :string, "bar"),
142
+ :long, 1, :string, "first", :string, "second")
143
+ end
144
+
145
+ def attributes_factory
146
+ Net::SFTP::Protocol::V04::Attributes
147
+ end
148
+ end
@@ -0,0 +1,74 @@
1
+ require 'common'
2
+ require 'protocol/03/test_base'
3
+
4
+ class Protocol::V04::TestBase < Protocol::V03::TestBase
5
+ def test_version
6
+ assert_equal 4, @base.version
7
+ end
8
+
9
+ def test_parse_attrs_packet_should_use_correct_attributes_class
10
+ Net::SFTP::Protocol::V04::Attributes.expects(:from_buffer).with(:packet).returns(:result)
11
+ assert_equal({ :attrs => :result }, @base.parse_attrs_packet(:packet))
12
+ end
13
+
14
+ def test_parse_name_packet_should_use_correct_name_class
15
+ packet = Net::SSH::Buffer.from(:long, 2,
16
+ :string, "name1", :long, 0x4, :byte, 1, :long, 0755,
17
+ :string, "name2", :long, 0x4, :byte, 1, :long, 0550)
18
+ names = @base.parse_name_packet(packet)[:names]
19
+
20
+ assert_not_nil names
21
+ assert_equal 2, names.length
22
+ assert_instance_of Net::SFTP::Protocol::V04::Name, names.first
23
+
24
+ assert_equal "name1", names.first.name
25
+ assert_equal 0755, names.first.attributes.permissions
26
+
27
+ assert_equal "name2", names.last.name
28
+ assert_equal 0550, names.last.attributes.permissions
29
+ end
30
+
31
+ undef test_fstat_should_ignore_flags_parameter
32
+ undef test_lstat_should_ignore_flags_parameter
33
+ undef test_stat_should_ignore_flags_parameter
34
+
35
+ def test_lstat_should_send_lstat_packet
36
+ @session.expects(:send_packet).with(FXP_LSTAT, :long, 0, :string, "/path/to/file", :long, 0x800001fd)
37
+ assert_equal 0, @base.lstat("/path/to/file")
38
+ end
39
+
40
+ def test_lstat_with_custom_flags_should_send_lstat_packet_with_given_flags
41
+ @session.expects(:send_packet).with(FXP_LSTAT, :long, 0, :string, "/path/to/file", :long, 1234)
42
+ assert_equal 0, @base.lstat("/path/to/file", 1234)
43
+ end
44
+
45
+ def test_fstat_should_send_fstat_packet
46
+ @session.expects(:send_packet).with(FXP_FSTAT, :long, 0, :string, "handle", :long, 0x800001fd)
47
+ assert_equal 0, @base.fstat("handle")
48
+ end
49
+
50
+ def test_fstat_with_custom_flags_should_send_fstat_packet_with_given_flags
51
+ @session.expects(:send_packet).with(FXP_FSTAT, :long, 0, :string, "handle", :long, 1234)
52
+ assert_equal 0, @base.fstat("handle", 1234)
53
+ end
54
+
55
+ def test_stat_should_send_stat_packet
56
+ @session.expects(:send_packet).with(FXP_STAT, :long, 0, :string, "/path/to/file", :long, 0x800001fd)
57
+ assert_equal 0, @base.stat("/path/to/file")
58
+ end
59
+
60
+ def test_stat_with_custom_flags_should_send_stat_packet_with_given_flags
61
+ @session.expects(:send_packet).with(FXP_STAT, :long, 0, :string, "/path/to/file", :long, 1234)
62
+ assert_equal 0, @base.stat("/path/to/file", 1234)
63
+ end
64
+
65
+ private
66
+
67
+ def driver
68
+ Net::SFTP::Protocol::V04::Base
69
+ end
70
+
71
+ def attributes
72
+ Net::SFTP::Protocol::V04::Attributes
73
+ end
74
+ end
@@ -0,0 +1,49 @@
1
+ require 'common'
2
+
3
+ class Protocol::V04::TestName < Net::SFTP::TestCase
4
+ def setup
5
+ @save_tz = ENV['TZ']
6
+ ENV['TZ'] = 'UTC'
7
+
8
+ @directory = Net::SFTP::Protocol::V04::Name.new("test", Net::SFTP::Protocol::V04::Attributes.new(:type => 2, :mtime => 1205293237, :owner => "jamis", :group => "users", :size => 1024, :permissions => 0755))
9
+ @link = Net::SFTP::Protocol::V04::Name.new("test", Net::SFTP::Protocol::V04::Attributes.new(:type => 3, :mtime => 1205293237, :owner => "jamis", :group => "users", :size => 32, :permissions => 0755))
10
+ @file = Net::SFTP::Protocol::V04::Name.new("test", Net::SFTP::Protocol::V04::Attributes.new(:type => 1, :mtime => 1205293237, :owner => "jamis", :group => "users", :size => 10240, :permissions => 0755))
11
+ end
12
+
13
+ def teardown
14
+ ENV['TZ'] = @save_tz
15
+ end
16
+
17
+ def test_directory?
18
+ assert @directory.directory?
19
+ assert !@link.directory?
20
+ assert !@file.directory?
21
+ end
22
+
23
+ def test_symlink?
24
+ assert !@directory.symlink?
25
+ assert @link.symlink?
26
+ assert !@file.symlink?
27
+ end
28
+
29
+ def test_file?
30
+ assert !@directory.file?
31
+ assert !@link.file?
32
+ assert @file.file?
33
+ end
34
+
35
+ def test_longname_for_directory_should_format_as_directory
36
+ assert_equal "drwxr-xr-x jamis users 1024 Mar 12 03:40 test",
37
+ @directory.longname
38
+ end
39
+
40
+ def test_longname_for_symlink_should_format_as_symlink
41
+ assert_equal "lrwxr-xr-x jamis users 32 Mar 12 03:40 test",
42
+ @link.longname
43
+ end
44
+
45
+ def test_longname_for_file_should_format_as_file
46
+ assert_equal "-rwxr-xr-x jamis users 10240 Mar 12 03:40 test",
47
+ @file.longname
48
+ end
49
+ end
@@ -0,0 +1,62 @@
1
+ require 'common'
2
+ require 'protocol/04/test_base'
3
+
4
+ class Protocol::V05::TestBase < Protocol::V04::TestBase
5
+ include Net::SFTP::Constants::OpenFlags
6
+ include Net::SFTP::Constants
7
+
8
+ def test_version
9
+ assert_equal 5, @base.version
10
+ end
11
+
12
+ undef test_rename_should_ignore_flags_parameter
13
+
14
+ def test_rename_should_send_rename_packet
15
+ @session.expects(:send_packet).with(FXP_RENAME, :long, 0, :string, "/old/file", :string, "/new/file", :long, 0)
16
+ assert_equal 0, @base.rename("/old/file", "/new/file")
17
+ end
18
+
19
+ def test_rename_with_flags_should_send_rename_packet_with_flags
20
+ @session.expects(:send_packet).with(FXP_RENAME, :long, 0, :string, "/old/file", :string, "/new/file", :long, RenameFlags::ATOMIC)
21
+ assert_equal 0, @base.rename("/old/file", "/new/file", RenameFlags::ATOMIC)
22
+ end
23
+
24
+ def test_open_with_numeric_flag_should_accept_IO_constants
25
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
26
+ :string, "/path/to/file",
27
+ :long, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES | ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES,
28
+ :long, FV5::CREATE_NEW,
29
+ :raw, attributes.new.to_s)
30
+
31
+ assert_equal 0, @base.open("/path/to/file", IO::RDWR | IO::CREAT | IO::EXCL, {})
32
+ end
33
+
34
+ { "r" => [FV5::OPEN_EXISTING, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES],
35
+ "rb" => [FV5::OPEN_EXISTING, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES],
36
+ "r+" => [FV5::OPEN_EXISTING, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES | ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES],
37
+ "w" => [FV5::CREATE_TRUNCATE, ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES],
38
+ "w+" => [FV5::CREATE_TRUNCATE, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES | ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES],
39
+ "a" => [FV5::OPEN_OR_CREATE | FV5::APPEND_DATA, ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES | ACE::Mask::APPEND_DATA],
40
+ "a+" => [FV5::OPEN_OR_CREATE | FV5::APPEND_DATA, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES | ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES | ACE::Mask::APPEND_DATA]
41
+ }.each do |mode_string, (flags, access)|
42
+ define_method("test_open_with_#{mode_string.sub(/\+/, '_plus')}_should_translate_correctly") do
43
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
44
+ :string, "/path/to/file", :long, access, :long, flags, :raw, attributes.new.to_s)
45
+
46
+ assert_equal 0, @base.open("/path/to/file", mode_string, {})
47
+ end
48
+ end
49
+
50
+ def test_open_with_attributes_converts_hash_to_attribute_packet
51
+ @session.expects(:send_packet).with(FXP_OPEN, :long, 0,
52
+ :string, "/path/to/file", :long, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES,
53
+ :long, FV5::OPEN_EXISTING, :raw, attributes.new(:permissions => 0755).to_s)
54
+ @base.open("/path/to/file", "r", :permissions => 0755)
55
+ end
56
+
57
+ private
58
+
59
+ def driver
60
+ Net::SFTP::Protocol::V05::Base
61
+ end
62
+ end
@@ -0,0 +1,124 @@
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