net-sftp 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/LICENSE-BSD +27 -0
- data/doc/LICENSE-GPL +280 -0
- data/doc/LICENSE-RUBY +56 -0
- data/examples/asynchronous.rb +57 -0
- data/examples/ssh-service.rb +31 -0
- data/examples/synchronous.rb +120 -0
- data/lib/net/sftp.rb +39 -0
- data/lib/net/sftp/errors.rb +25 -0
- data/lib/net/sftp/operations/abstract.rb +103 -0
- data/lib/net/sftp/operations/close.rb +31 -0
- data/lib/net/sftp/operations/errors.rb +76 -0
- data/lib/net/sftp/operations/fsetstat.rb +36 -0
- data/lib/net/sftp/operations/fstat.rb +32 -0
- data/lib/net/sftp/operations/lstat.rb +31 -0
- data/lib/net/sftp/operations/mkdir.rb +33 -0
- data/lib/net/sftp/operations/open.rb +32 -0
- data/lib/net/sftp/operations/opendir.rb +32 -0
- data/lib/net/sftp/operations/read.rb +84 -0
- data/lib/net/sftp/operations/readdir.rb +55 -0
- data/lib/net/sftp/operations/realpath.rb +37 -0
- data/lib/net/sftp/operations/remove.rb +31 -0
- data/lib/net/sftp/operations/rename.rb +32 -0
- data/lib/net/sftp/operations/rmdir.rb +31 -0
- data/lib/net/sftp/operations/services.rb +42 -0
- data/lib/net/sftp/operations/setstat.rb +33 -0
- data/lib/net/sftp/operations/stat.rb +31 -0
- data/lib/net/sftp/operations/write.rb +63 -0
- data/lib/net/sftp/protocol/01/attributes.rb +146 -0
- data/lib/net/sftp/protocol/01/impl.rb +251 -0
- data/lib/net/sftp/protocol/01/packet-assistant.rb +82 -0
- data/lib/net/sftp/protocol/01/services.rb +47 -0
- data/lib/net/sftp/protocol/02/impl.rb +39 -0
- data/lib/net/sftp/protocol/02/packet-assistant.rb +32 -0
- data/lib/net/sftp/protocol/02/services.rb +44 -0
- data/lib/net/sftp/protocol/03/impl.rb +42 -0
- data/lib/net/sftp/protocol/03/packet-assistant.rb +35 -0
- data/lib/net/sftp/protocol/03/services.rb +44 -0
- data/lib/net/sftp/protocol/04/attributes.rb +227 -0
- data/lib/net/sftp/protocol/04/impl.rb +134 -0
- data/lib/net/sftp/protocol/04/packet-assistant.rb +51 -0
- data/lib/net/sftp/protocol/04/services.rb +44 -0
- data/lib/net/sftp/protocol/05/services.rb +44 -0
- data/lib/net/sftp/protocol/constants.rb +60 -0
- data/lib/net/sftp/protocol/driver.rb +232 -0
- data/lib/net/sftp/protocol/packet-assistant.rb +84 -0
- data/lib/net/sftp/protocol/services.rb +55 -0
- data/lib/net/sftp/session.rb +215 -0
- data/lib/net/sftp/version.rb +25 -0
- data/test/ALL-TESTS.rb +21 -0
- data/test/operations/tc_abstract.rb +124 -0
- data/test/operations/tc_close.rb +40 -0
- data/test/operations/tc_fsetstat.rb +48 -0
- data/test/operations/tc_fstat.rb +40 -0
- data/test/operations/tc_lstat.rb +40 -0
- data/test/operations/tc_mkdir.rb +48 -0
- data/test/operations/tc_open.rb +42 -0
- data/test/operations/tc_opendir.rb +40 -0
- data/test/operations/tc_read.rb +103 -0
- data/test/operations/tc_readdir.rb +88 -0
- data/test/operations/tc_realpath.rb +54 -0
- data/test/operations/tc_remove.rb +40 -0
- data/test/operations/tc_rmdir.rb +40 -0
- data/test/operations/tc_setstat.rb +48 -0
- data/test/operations/tc_stat.rb +40 -0
- data/test/operations/tc_write.rb +91 -0
- data/test/protocol/01/tc_attributes.rb +138 -0
- data/test/protocol/01/tc_impl.rb +294 -0
- data/test/protocol/01/tc_packet_assistant.rb +81 -0
- data/test/protocol/02/tc_impl.rb +41 -0
- data/test/protocol/02/tc_packet_assistant.rb +31 -0
- data/test/protocol/03/tc_impl.rb +48 -0
- data/test/protocol/03/tc_packet_assistant.rb +34 -0
- data/test/protocol/04/tc_attributes.rb +174 -0
- data/test/protocol/04/tc_impl.rb +102 -0
- data/test/protocol/04/tc_packet_assistant.rb +41 -0
- data/test/protocol/tc_driver.rb +219 -0
- metadata +137 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/realpath'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_Realpath < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@session = FlexMock.new
|
28
|
+
@driver = FlexMock.new
|
29
|
+
@operation = Net::SFTP::Operations::Realpath.new( @log, @session, @driver )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_perform
|
33
|
+
id = path = nil
|
34
|
+
@driver.mock_handle( :realpath ) { |i,p| id, path = i, p; 10 }
|
35
|
+
assert_equal 10, @operation.perform( "foo" )
|
36
|
+
assert_nil id
|
37
|
+
assert_equal "foo", path
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_do_name
|
41
|
+
@session.mock_handle( :loop )
|
42
|
+
@session.mock_handle( :status= )
|
43
|
+
@session.mock_handle( :register )
|
44
|
+
@driver.mock_handle( :realpath )
|
45
|
+
@log.mock_handle( :debug? )
|
46
|
+
@log.mock_handle( :debug )
|
47
|
+
|
48
|
+
called = false
|
49
|
+
@operation.execute( "foo" ) { |s,v| called = v }
|
50
|
+
@operation.do_name( [ :a, :b ] )
|
51
|
+
assert_equal :a, called
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/remove'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_Remove < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@session = FlexMock.new
|
28
|
+
@driver = FlexMock.new
|
29
|
+
@operation = Net::SFTP::Operations::Remove.new( @log, @session, @driver )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_perform
|
33
|
+
id = filename = nil
|
34
|
+
@driver.mock_handle( :remove ) { |i,f,m| id, filename = i, f; 10 }
|
35
|
+
assert_equal 10, @operation.perform( "foo" )
|
36
|
+
assert_nil id
|
37
|
+
assert_equal "foo", filename
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/rmdir'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_Rmdir < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@session = FlexMock.new
|
28
|
+
@driver = FlexMock.new
|
29
|
+
@operation = Net::SFTP::Operations::Rmdir.new( @log, @session, @driver )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_perform
|
33
|
+
id = path = nil
|
34
|
+
@driver.mock_handle( :rmdir ) { |i,p| id, path = i, p; 10 }
|
35
|
+
assert_equal 10, @operation.perform( "foo" )
|
36
|
+
assert_nil id
|
37
|
+
assert_equal "foo", path
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/setstat'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_setstat < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@session = FlexMock.new
|
28
|
+
@attr_factory = FlexMock.new
|
29
|
+
@driver = FlexMock.new
|
30
|
+
@driver.mock_handle( :attr_factory ) { @attr_factory }
|
31
|
+
@operation = Net::SFTP::Operations::Setstat.new( @log, @session, @driver )
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_perform
|
35
|
+
hash = nil
|
36
|
+
@attr_factory.mock_handle( :from_hash ) { |h| hash = h; :foo }
|
37
|
+
|
38
|
+
id = path = attrs = nil
|
39
|
+
@driver.mock_handle( :setstat ) { |i,p,a| id, path, attrs = i, p, a; 10 }
|
40
|
+
|
41
|
+
assert_equal 10, @operation.perform( "foo", "bar" )
|
42
|
+
assert_nil id
|
43
|
+
assert_equal "foo", path
|
44
|
+
assert_equal "bar", hash
|
45
|
+
assert_equal :foo, attrs
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/stat'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_Stat < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@session = FlexMock.new
|
28
|
+
@driver = FlexMock.new
|
29
|
+
@operation = Net::SFTP::Operations::Stat.new( @log, @session, @driver )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_perform
|
33
|
+
id = path = nil
|
34
|
+
@driver.mock_handle( :stat ) { |i,p| id, path = i, p; 10 }
|
35
|
+
assert_equal 10, @operation.perform( "foo" )
|
36
|
+
assert_nil id
|
37
|
+
assert_equal "foo", path
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/operations/write'
|
21
|
+
require 'flexmock'
|
22
|
+
|
23
|
+
class TC_Operations_Write < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@log = FlexMock.new
|
27
|
+
@log.mock_handle( :debug? )
|
28
|
+
@log.mock_handle( :debug )
|
29
|
+
|
30
|
+
@session = FlexMock.new
|
31
|
+
@driver = FlexMock.new
|
32
|
+
@operation = Net::SFTP::Operations::Write.new( @log, @session, @driver )
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_perform_defaults
|
36
|
+
id = handle = offset = data = nil
|
37
|
+
@driver.mock_handle( :write ) { |i,h,o,d| id, handle, offset, data = i, h, o, d; 10 }
|
38
|
+
assert_equal 10, @operation.perform( "foo", "data" )
|
39
|
+
assert_nil id
|
40
|
+
assert_equal "foo", handle
|
41
|
+
assert_equal "data", data
|
42
|
+
assert_equal 0, offset
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_perform_explicit
|
46
|
+
id = handle = offset = data = nil
|
47
|
+
@driver.mock_handle( :write ) { |i,h,o,d| id, handle, offset, data = i, h, o, d; 10 }
|
48
|
+
assert_equal 10, @operation.perform( "foo", "data", 15 )
|
49
|
+
assert_nil id
|
50
|
+
assert_equal "foo", handle
|
51
|
+
assert_equal "data", data
|
52
|
+
assert_equal 15, offset
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_do_status_bad
|
56
|
+
assert_raise( Net::SFTP::Operations::StatusException ) do
|
57
|
+
@operation.do_status( 5, nil, nil )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_do_status_ok_more_chunks
|
62
|
+
@log.mock_handle :debug?
|
63
|
+
@log.mock_handle :debug
|
64
|
+
@session.mock_handle :register
|
65
|
+
@session.mock_handle :status=
|
66
|
+
@session.mock_handle :loop
|
67
|
+
@driver.mock_handle :write
|
68
|
+
|
69
|
+
@operation.execute( "foo", "1234567890" * 7000 )
|
70
|
+
@operation.do_status( 0, :a, :b )
|
71
|
+
assert_equal 2, @driver.mock_count( :write )
|
72
|
+
assert_equal 2, @session.mock_count( :register )
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_do_status_ok_done
|
76
|
+
@log.mock_handle :debug?
|
77
|
+
@log.mock_handle :debug
|
78
|
+
@session.mock_handle :register
|
79
|
+
@session.mock_handle :status=
|
80
|
+
@session.mock_handle :loop
|
81
|
+
@driver.mock_handle :write
|
82
|
+
|
83
|
+
called = false
|
84
|
+
@operation.execute( "foo", "1234567890" ) { called = true }
|
85
|
+
@operation.do_status( 0, :a, :b )
|
86
|
+
assert_equal 1, @driver.mock_count( :write )
|
87
|
+
assert_equal 1, @session.mock_count( :register )
|
88
|
+
assert called
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
#--
|
2
|
+
# =============================================================================
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# This source file is distributed as part of the Net::SFTP Secure FTP Client
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SFTP
|
10
|
+
# distribution for the texts of these licenses.
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
# net-sftp website: http://net-ssh.rubyforge.org/sftp
|
13
|
+
# project website : http://rubyforge.org/projects/net-ssh
|
14
|
+
# =============================================================================
|
15
|
+
#++
|
16
|
+
|
17
|
+
$:.unshift "../../../lib"
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'net/sftp/protocol/01/attributes'
|
21
|
+
|
22
|
+
require 'net/ssh'
|
23
|
+
require 'net/ssh/util/buffer'
|
24
|
+
|
25
|
+
class TC_01_Attributes < Test::Unit::TestCase
|
26
|
+
|
27
|
+
class Buffers
|
28
|
+
def writer
|
29
|
+
Net::SSH::Util::WriterBuffer.new
|
30
|
+
end
|
31
|
+
def reader( text )
|
32
|
+
Net::SSH::Util::ReaderBuffer.new( text )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def setup
|
37
|
+
@factory = Net::SFTP::Protocol::V_01::Attributes.init( Buffers.new )
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_empty
|
41
|
+
empty = @factory.empty
|
42
|
+
assert_nil empty.size
|
43
|
+
assert_nil empty.uid
|
44
|
+
assert_nil empty.gid
|
45
|
+
assert_nil empty.permissions
|
46
|
+
assert_nil empty.atime
|
47
|
+
assert_nil empty.mtime
|
48
|
+
assert_nil empty.extended
|
49
|
+
assert_equal "\0\0\0\0", empty.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_from_buffer_empty
|
53
|
+
buffer = @factory.buffers.reader( "\0\0\0\0" )
|
54
|
+
attrs = @factory.from_buffer( buffer )
|
55
|
+
assert_nil attrs.size
|
56
|
+
assert_nil attrs.uid
|
57
|
+
assert_nil attrs.gid
|
58
|
+
assert_nil attrs.permissions
|
59
|
+
assert_nil attrs.atime
|
60
|
+
assert_nil attrs.mtime
|
61
|
+
assert_nil attrs.extended
|
62
|
+
assert_equal "\0\0\0\0", attrs.to_s
|
63
|
+
end
|
64
|
+
|
65
|
+
ATTRIBUTES =
|
66
|
+
[ [ 1, "\1\2\3\4\5\6\7\10", :size, 0x0102030405060708 ],
|
67
|
+
[ 2, "\11\12\13\14\15\16\17\20", :uid, 0x090A0B0C ],
|
68
|
+
[ 2, "\11\12\13\14\15\16\17\20", :gid, 0x0D0E0F10 ],
|
69
|
+
[ 4, "\21\22\23\24", :permissions, 0x11121314 ],
|
70
|
+
[ 8, "\25\26\27\30\31\32\33\34", :atime, 0x15161718 ],
|
71
|
+
[ 8, "\25\26\27\30\31\32\33\34", :mtime, 0x191A1B1C ],
|
72
|
+
[ 0x80000000,
|
73
|
+
"\0\0\0\4" +
|
74
|
+
"\0\0\0\01a\0\0\0\01b" +
|
75
|
+
"\0\0\0\01c\0\0\0\01d" +
|
76
|
+
"\0\0\0\01e\0\0\0\01f" +
|
77
|
+
"\0\0\0\01g\0\0\0\01h",
|
78
|
+
:extended,
|
79
|
+
{ "a" => "b", "c" => "d", "e" => "f", "g" => "h" } ] ]
|
80
|
+
|
81
|
+
# find all possible combinations of the elements of ATTRIBUTES
|
82
|
+
# (i.e., 'n' choose k, for k in [1..ATTRIBUTES.length]).
|
83
|
+
def self.choose( from, k )
|
84
|
+
result = []
|
85
|
+
( from.length - k + 1 ).times do |i|
|
86
|
+
if i+1 < from.length && k > 1
|
87
|
+
choose( from[i+1..-1], k-1 ).each do |chosen|
|
88
|
+
result << [ from[i], *chosen ]
|
89
|
+
end
|
90
|
+
else
|
91
|
+
result << [ from[i] ]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
result
|
95
|
+
end
|
96
|
+
|
97
|
+
method_id = 0
|
98
|
+
ATTRIBUTES.length.times do |k|
|
99
|
+
choose( ATTRIBUTES, k+1 ).each do |attrs|
|
100
|
+
define_method( "test_attributes_%03d" % method_id ) do
|
101
|
+
flags = 0
|
102
|
+
buffer = ""
|
103
|
+
attrs.each do |a|
|
104
|
+
if ( flags & a[0] ) == 0
|
105
|
+
flags |= a[0]
|
106
|
+
buffer += a[1]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
buffer = [ flags, buffer ].pack( "NA*" )
|
110
|
+
input = @factory.buffers.reader( buffer )
|
111
|
+
obj = @factory.from_buffer( input )
|
112
|
+
attrs.each { |a| assert_equal a[3], obj.__send__( a[2] ) }
|
113
|
+
assert_equal buffer, obj.to_s
|
114
|
+
end
|
115
|
+
method_id += 1
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
require 'etc'
|
120
|
+
[
|
121
|
+
[ { :size => 1000 }, :size, 1000, :uid ],
|
122
|
+
[ { :uid => 1000 }, :uid, 1000 ],
|
123
|
+
[ { :gid => 1000 }, :gid, 1000 ],
|
124
|
+
[ { :permissions => 0600 }, :permissions, 0600 ],
|
125
|
+
[ { :atime => 123456 }, :atime, 123456 ],
|
126
|
+
[ { :mtime => 789012 }, :mtime, 789012 ],
|
127
|
+
[ { :extended => { "foo" => "bar" } }, :extended, { "foo" => "bar" } ],
|
128
|
+
[ { :owner => ENV['USER'] }, :uid, Etc.getpwnam(ENV['USER']).uid ],
|
129
|
+
[ { :group => 'root' }, :gid, Etc.getpwnam('root').uid ]
|
130
|
+
].each do |fixture|
|
131
|
+
define_method( "test_from_hash_#{fixture[1]}" ) do
|
132
|
+
attrs = @factory.from_hash( fixture[0] )
|
133
|
+
assert_equal fixture[2], attrs.__send__( fixture[1] )
|
134
|
+
assert_nil attrs.__send__( fixture[3] || :size )
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|