net-ssh 0.5.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 (179) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +13 -0
  5. data/doc/manual-html/chapter-1.html +333 -0
  6. data/doc/manual-html/chapter-2.html +455 -0
  7. data/doc/manual-html/chapter-3.html +413 -0
  8. data/doc/manual-html/chapter-4.html +353 -0
  9. data/doc/manual-html/chapter-5.html +393 -0
  10. data/doc/manual-html/chapter-6.html +296 -0
  11. data/doc/manual-html/index.html +217 -0
  12. data/doc/manual-html/manual.css +192 -0
  13. data/doc/manual/chapter.erb +18 -0
  14. data/doc/manual/example.erb +18 -0
  15. data/doc/manual/index.erb +29 -0
  16. data/doc/manual/manual.css +192 -0
  17. data/doc/manual/manual.rb +240 -0
  18. data/doc/manual/manual.yml +67 -0
  19. data/doc/manual/page.erb +87 -0
  20. data/doc/manual/parts/channels_callbacks.txt +32 -0
  21. data/doc/manual/parts/channels_loop.txt +14 -0
  22. data/doc/manual/parts/channels_open.txt +20 -0
  23. data/doc/manual/parts/channels_operations.txt +15 -0
  24. data/doc/manual/parts/channels_types.txt +3 -0
  25. data/doc/manual/parts/channels_what_are.txt +7 -0
  26. data/doc/manual/parts/exec_channels.txt +28 -0
  27. data/doc/manual/parts/exec_open.txt +51 -0
  28. data/doc/manual/parts/exec_popen3.txt +35 -0
  29. data/doc/manual/parts/forward_direct.txt +37 -0
  30. data/doc/manual/parts/forward_handlers.txt +16 -0
  31. data/doc/manual/parts/forward_intro.txt +18 -0
  32. data/doc/manual/parts/forward_local.txt +18 -0
  33. data/doc/manual/parts/forward_remote.txt +14 -0
  34. data/doc/manual/parts/intro_author.txt +1 -0
  35. data/doc/manual/parts/intro_getting.txt +39 -0
  36. data/doc/manual/parts/intro_license.txt +6 -0
  37. data/doc/manual/parts/intro_support.txt +7 -0
  38. data/doc/manual/parts/intro_what_is.txt +7 -0
  39. data/doc/manual/parts/intro_what_is_not.txt +3 -0
  40. data/doc/manual/parts/proxy_http.txt +52 -0
  41. data/doc/manual/parts/proxy_intro.txt +1 -0
  42. data/doc/manual/parts/proxy_socks.txt +23 -0
  43. data/doc/manual/parts/session_key.txt +66 -0
  44. data/doc/manual/parts/session_options.txt +42 -0
  45. data/doc/manual/parts/session_session.txt +14 -0
  46. data/doc/manual/parts/session_start.txt +49 -0
  47. data/doc/manual/tutorial.erb +30 -0
  48. data/examples/channel-demo.rb +81 -0
  49. data/examples/port-forward.rb +51 -0
  50. data/examples/process-demo.rb +91 -0
  51. data/examples/remote-net-port-forward.rb +45 -0
  52. data/examples/remote-port-forward.rb +80 -0
  53. data/examples/tail-demo.rb +49 -0
  54. data/lib/net/ssh.rb +52 -0
  55. data/lib/net/ssh/connection/channel.rb +411 -0
  56. data/lib/net/ssh/connection/constants.rb +47 -0
  57. data/lib/net/ssh/connection/driver.rb +343 -0
  58. data/lib/net/ssh/connection/services.rb +72 -0
  59. data/lib/net/ssh/connection/term.rb +90 -0
  60. data/lib/net/ssh/errors.rb +27 -0
  61. data/lib/net/ssh/proxy/errors.rb +34 -0
  62. data/lib/net/ssh/proxy/http.rb +126 -0
  63. data/lib/net/ssh/proxy/socks4.rb +83 -0
  64. data/lib/net/ssh/proxy/socks5.rb +160 -0
  65. data/lib/net/ssh/service/forward/driver.rb +319 -0
  66. data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
  67. data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
  68. data/lib/net/ssh/service/forward/services.rb +76 -0
  69. data/lib/net/ssh/service/process/driver.rb +153 -0
  70. data/lib/net/ssh/service/process/open.rb +193 -0
  71. data/lib/net/ssh/service/process/popen3.rb +160 -0
  72. data/lib/net/ssh/service/process/services.rb +66 -0
  73. data/lib/net/ssh/service/services.rb +44 -0
  74. data/lib/net/ssh/session.rb +242 -0
  75. data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
  76. data/lib/net/ssh/transport/compress/compressor.rb +53 -0
  77. data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
  78. data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
  79. data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
  80. data/lib/net/ssh/transport/compress/services.rb +68 -0
  81. data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
  82. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
  83. data/lib/net/ssh/transport/constants.rb +66 -0
  84. data/lib/net/ssh/transport/errors.rb +47 -0
  85. data/lib/net/ssh/transport/identity-cipher.rb +61 -0
  86. data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
  87. data/lib/net/ssh/transport/kex/dh.rb +231 -0
  88. data/lib/net/ssh/transport/kex/services.rb +60 -0
  89. data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
  90. data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
  91. data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
  92. data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
  93. data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
  94. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
  95. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
  96. data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
  97. data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
  98. data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
  99. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
  100. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
  101. data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
  102. data/lib/net/ssh/transport/ossl/services.rb +149 -0
  103. data/lib/net/ssh/transport/packet-stream.rb +210 -0
  104. data/lib/net/ssh/transport/services.rb +146 -0
  105. data/lib/net/ssh/transport/session.rb +296 -0
  106. data/lib/net/ssh/transport/version-negotiator.rb +73 -0
  107. data/lib/net/ssh/userauth/agent.rb +218 -0
  108. data/lib/net/ssh/userauth/constants.rb +35 -0
  109. data/lib/net/ssh/userauth/driver.rb +176 -0
  110. data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
  111. data/lib/net/ssh/userauth/methods/password.rb +70 -0
  112. data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
  113. data/lib/net/ssh/userauth/methods/services.rb +63 -0
  114. data/lib/net/ssh/userauth/services.rb +126 -0
  115. data/lib/net/ssh/userauth/userkeys.rb +258 -0
  116. data/lib/net/ssh/util/buffer.rb +274 -0
  117. data/lib/net/ssh/util/openssl.rb +146 -0
  118. data/lib/net/ssh/util/prompter.rb +73 -0
  119. data/lib/net/ssh/version.rb +29 -0
  120. data/test/ALL-TESTS.rb +21 -0
  121. data/test/connection/tc_channel.rb +136 -0
  122. data/test/connection/tc_driver.rb +287 -0
  123. data/test/connection/tc_integration.rb +85 -0
  124. data/test/proxy/tc_http.rb +209 -0
  125. data/test/proxy/tc_socks4.rb +148 -0
  126. data/test/proxy/tc_socks5.rb +214 -0
  127. data/test/service/forward/tc_driver.rb +289 -0
  128. data/test/service/forward/tc_local_network_handler.rb +123 -0
  129. data/test/service/forward/tc_remote_network_handler.rb +108 -0
  130. data/test/service/process/tc_driver.rb +79 -0
  131. data/test/service/process/tc_integration.rb +117 -0
  132. data/test/service/process/tc_open.rb +179 -0
  133. data/test/service/process/tc_popen3.rb +164 -0
  134. data/test/tc_integration.rb +79 -0
  135. data/test/transport/compress/tc_none_compress.rb +41 -0
  136. data/test/transport/compress/tc_none_decompress.rb +45 -0
  137. data/test/transport/compress/tc_zlib_compress.rb +61 -0
  138. data/test/transport/compress/tc_zlib_decompress.rb +48 -0
  139. data/test/transport/kex/tc_dh.rb +304 -0
  140. data/test/transport/kex/tc_dh_gex.rb +70 -0
  141. data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
  142. data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
  143. data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
  144. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
  145. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
  146. data/test/transport/ossl/fixtures/not-a-private-key +4 -0
  147. data/test/transport/ossl/fixtures/not-supported +2 -0
  148. data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
  149. data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
  150. data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
  151. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
  152. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
  153. data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
  154. data/test/transport/ossl/hmac/tc_md5.rb +50 -0
  155. data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
  156. data/test/transport/ossl/hmac/tc_none.rb +50 -0
  157. data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
  158. data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
  159. data/test/transport/ossl/tc_buffer.rb +97 -0
  160. data/test/transport/ossl/tc_buffer_factory.rb +67 -0
  161. data/test/transport/ossl/tc_cipher_factory.rb +84 -0
  162. data/test/transport/ossl/tc_digest_factory.rb +39 -0
  163. data/test/transport/ossl/tc_hmac_factory.rb +72 -0
  164. data/test/transport/ossl/tc_key_factory.rb +199 -0
  165. data/test/transport/tc_algorithm_negotiator.rb +169 -0
  166. data/test/transport/tc_identity_cipher.rb +52 -0
  167. data/test/transport/tc_integration.rb +110 -0
  168. data/test/transport/tc_packet_stream.rb +183 -0
  169. data/test/transport/tc_session.rb +283 -0
  170. data/test/transport/tc_version_negotiator.rb +86 -0
  171. data/test/userauth/methods/tc_hostbased.rb +136 -0
  172. data/test/userauth/methods/tc_password.rb +89 -0
  173. data/test/userauth/methods/tc_publickey.rb +167 -0
  174. data/test/userauth/tc_agent.rb +223 -0
  175. data/test/userauth/tc_driver.rb +190 -0
  176. data/test/userauth/tc_integration.rb +81 -0
  177. data/test/userauth/tc_userkeys.rb +265 -0
  178. data/test/util/tc_buffer.rb +217 -0
  179. metadata +256 -0
@@ -0,0 +1,79 @@
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::SSH Secure Shell 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::SSH
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # net-ssh website : http://net-ssh.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/net-ssh
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/service/process/driver'
21
+
22
+ class TC_Process_Driver < Test::Unit::TestCase
23
+
24
+ class MockObject
25
+ attr_reader :events
26
+
27
+ def initialize
28
+ @events = []
29
+ end
30
+
31
+ def method_missing( sym, *args, &block )
32
+ token = [ sym, *args ]
33
+ token << :with_block if block
34
+ @events << token
35
+ :return_value
36
+ end
37
+
38
+ undef_method :loop
39
+ end
40
+
41
+ def setup
42
+ @connection = MockObject.new
43
+ @log = MockObject.new
44
+ @handlers = { :open => MockObject.new, :popen3 => MockObject.new }
45
+ @driver = Net::SSH::Service::Process::Driver.new(
46
+ @connection, @log, @handlers )
47
+ end
48
+
49
+ def test_open_no_block
50
+ result = @driver.open( "foo" )
51
+ assert_equal :return_value, result
52
+ assert_equal [ [ :call, "foo" ] ], @handlers[:open].events
53
+ assert_equal [], @connection.events
54
+ end
55
+
56
+ def test_open_block
57
+ result = @driver.open( "foo" ) do |r|
58
+ assert_equal :return_value, r
59
+ end
60
+ assert_nil result
61
+ assert_equal [ [ :call, "foo" ] ], @handlers[:open].events
62
+ assert_equal [ [ :loop ] ], @connection.events
63
+ end
64
+
65
+ def test_popen3_no_block
66
+ result = @driver.popen3( "foo" )
67
+ assert_equal :return_value, result
68
+ assert_equal [ [ :popen3, "foo" ] ], @handlers[:popen3].events
69
+ assert_equal [], @connection.events
70
+ end
71
+
72
+ def test_popen3_no_block
73
+ result = @driver.popen3( "foo" ) { |f| }
74
+ assert_equal :return_value, result
75
+ assert_equal [ [ :popen3, "foo", :with_block ] ], @handlers[:popen3].events
76
+ assert_equal [], @connection.events
77
+ end
78
+
79
+ end
@@ -0,0 +1,117 @@
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::SSH Secure Shell 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::SSH
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # net-ssh website : http://net-ssh.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/net-ssh
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../../lib"
18
+
19
+ if $run_integration_tests || __FILE__ == $0
20
+
21
+ require 'needle'
22
+ require 'test/unit'
23
+
24
+ class TC_Process_Integration < Test::Unit::TestCase
25
+
26
+ HOST = "test.host"
27
+ USER = "test"
28
+ PASSWORD = "test/unit"
29
+
30
+ def setup
31
+ @registry = Needle::Registry.define(
32
+ :logs => { :device => STDOUT, :default_level => :warn }
33
+ ) do |b|
34
+ b.require 'net/ssh/transport/services', "Net::SSH::Transport"
35
+ b.require 'net/ssh/userauth/services', "Net::SSH::UserAuth"
36
+ b.require 'net/ssh/connection/services', "Net::SSH::Connection"
37
+ b.require 'net/ssh/service/process/services',
38
+ "Net::SSH::Service::Process"
39
+
40
+ b.crypto_backend { :ossl }
41
+ b.transport_host { HOST }
42
+ end
43
+
44
+ @registry.userauth.driver.authenticate( "ssh-connection", USER, PASSWORD )
45
+
46
+ @driver = @registry.process.driver
47
+ end
48
+
49
+ def teardown
50
+ @registry.transport.session.close
51
+ end
52
+
53
+ def test_open_no_block
54
+ script = [ "2+2", "3+2*5", "quit" ]
55
+ expect = [ "4\n", "13\n", :exit ]
56
+ results = []
57
+
58
+ process = @driver.open( "bc" )
59
+ process.on_success { |p| p.puts script.shift }
60
+ process.on_stdout do |p,d|
61
+ results << d
62
+ if script.empty?
63
+ p.close_input
64
+ else
65
+ p.puts script.shift
66
+ end
67
+ end
68
+ process.on_exit { results << :exit }
69
+
70
+ @registry.connection.driver.loop
71
+
72
+ assert_equal expect, results
73
+ end
74
+
75
+ def test_open_block
76
+ script = [ "2+2", "3+2*5", "quit" ]
77
+ expect = [ "4\n", "13\n", :exit ]
78
+ results = []
79
+
80
+ @driver.open( "bc" ) do |process|
81
+ process.on_success { |p| p.puts script.shift }
82
+ process.on_stdout do |p,d|
83
+ results << d
84
+ if script.empty?
85
+ p.close_input
86
+ else
87
+ p.puts script.shift
88
+ end
89
+ end
90
+ process.on_exit { results << :exit }
91
+ end
92
+
93
+ assert_equal expect, results
94
+ end
95
+
96
+ def test_popen3_no_block
97
+ stdin, stdout, stderr = @driver.popen3( "bc" )
98
+ stdin.puts "2+2"
99
+ assert_equal "4\n", stdout.read
100
+ stdin.puts "3+2*5"
101
+ assert_equal "13\n", stdout.read
102
+ stdin.puts "quit"
103
+ end
104
+
105
+ def test_popen3_block
106
+ @driver.popen3( "bc" ) do |stdin,stdout,stderr|
107
+ stdin.puts "2+2"
108
+ assert_equal "4\n", stdout.read
109
+ stdin.puts "3+2*5"
110
+ assert_equal "13\n", stdout.read
111
+ stdin.puts "quit"
112
+ end
113
+ end
114
+
115
+ end
116
+
117
+ end
@@ -0,0 +1,179 @@
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::SSH Secure Shell 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::SSH
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # net-ssh website : http://net-ssh.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/net-ssh
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/service/process/open'
21
+
22
+ class TC_Process_Open < Test::Unit::TestCase
23
+
24
+ class Log
25
+ def debug?
26
+ true
27
+ end
28
+
29
+ def debug(msg)
30
+ end
31
+ end
32
+
33
+ class MockObject
34
+ attr_reader :events
35
+
36
+ def initialize
37
+ @events = []
38
+ end
39
+
40
+ def method_missing( sym, *args, &block )
41
+ token = [ sym, *args ]
42
+ token << true if block
43
+ @events << token
44
+ end
45
+ end
46
+
47
+ class Connection < MockObject
48
+ attr_reader :channel
49
+
50
+ def open_channel( *args, &block )
51
+ @events << [ :open_channel, *args ] + [ block ? true : false ]
52
+ @channel = MockObject.new
53
+ end
54
+ end
55
+
56
+ def create_manager( &block )
57
+ connection = Connection.new
58
+ mgr = Net::SSH::Service::Process::OpenManager.new( connection,
59
+ Log.new, "test", &block )
60
+ [ mgr, connection ]
61
+ end
62
+
63
+ def test_no_block
64
+ mgr, conn = create_manager
65
+ assert_equal [ [ :open_channel, "session", true ] ], conn.events
66
+ end
67
+
68
+ def test_with_block
69
+ yielded = false
70
+ mgr, conn = create_manager { |mgr| yielded = true }
71
+ assert_equal [ [ :open_channel, "session", true ],
72
+ [ :loop ] ], conn.events
73
+ assert yielded
74
+ end
75
+
76
+ def test_write
77
+ mgr, conn = create_manager
78
+ mgr.write "foo"
79
+ assert_equal [ [ :send_data, "foo" ] ], conn.channel.events
80
+ end
81
+
82
+ def test_puts_nonl
83
+ mgr, conn = create_manager
84
+ mgr.puts "foo"
85
+ assert_equal [ [ :send_data, "foo\n" ] ], conn.channel.events
86
+ end
87
+
88
+ def test_puts_nl
89
+ mgr, conn = create_manager
90
+ mgr.puts "foo\n"
91
+ assert_equal [ [ :send_data, "foo\n" ] ], conn.channel.events
92
+ end
93
+
94
+ def test_close_input
95
+ mgr, conn = create_manager
96
+ mgr.close_input
97
+ assert_equal [ [ :send_eof ] ], conn.channel.events
98
+ end
99
+
100
+ def test_close
101
+ mgr, conn = create_manager
102
+ mgr.close
103
+ assert_equal [ [ :close ] ], conn.channel.events
104
+ end
105
+
106
+ def test_confirm
107
+ mgr, conn = create_manager
108
+ chan = MockObject.new
109
+ mgr.do_confirm chan
110
+ assert_equal [ [ :on_success, true ], [ :on_failure, true ],
111
+ [ :exec, "test", true ] ], chan.events
112
+ end
113
+
114
+ def test_exec_success
115
+ mgr, conn = create_manager
116
+ chan = MockObject.new
117
+ called = false
118
+ mgr.on_success { |ch| called = true }
119
+ mgr.do_exec_success chan
120
+ assert_equal [ [ :on_data, true ], [ :on_extended_data, true ],
121
+ [ :on_close, true ], [ :on_request, true ] ], chan.events
122
+ assert called
123
+ end
124
+
125
+ def test_exec_failure_no_callback
126
+ mgr, conn = create_manager
127
+ chan = MockObject.new
128
+ assert_raise( Net::SSH::Exception ) do
129
+ mgr.do_exec_failure chan
130
+ end
131
+ end
132
+
133
+ def test_exec_failure_callback
134
+ mgr, conn = create_manager
135
+ chan = MockObject.new
136
+ called = false
137
+ mgr.on_failure { |ch,msg| called = true }
138
+ mgr.do_exec_failure chan
139
+ assert called
140
+ end
141
+
142
+ def test_stdout
143
+ mgr, conn = create_manager
144
+ chan = MockObject.new
145
+ data = ""
146
+ mgr.on_stdout { |ch,d| data = d }
147
+ mgr.do_data chan, "foo"
148
+ assert_equal "foo", data
149
+ end
150
+
151
+ def test_extended_data_not_stderr
152
+ mgr, conn = create_manager
153
+ chan = MockObject.new
154
+ data = ""
155
+ mgr.on_stderr { |ch,d| data = d }
156
+ mgr.do_extended_data chan, 0, "foo"
157
+ assert_equal "", data
158
+ end
159
+
160
+ def test_extended_data_stderr
161
+ mgr, conn = create_manager
162
+ chan = MockObject.new
163
+ data = ""
164
+ mgr.on_stderr { |ch,d| data = d }
165
+ mgr.do_extended_data chan, 1, "foo"
166
+ assert_equal "foo", data
167
+ end
168
+
169
+ def test_close
170
+ mgr, conn = create_manager
171
+ chan = MockObject.new
172
+ called = false
173
+ mgr.on_exit { |ch,status| called = true }
174
+ mgr.do_close chan
175
+ assert called
176
+ assert_equal [], chan.events
177
+ end
178
+
179
+ end
@@ -0,0 +1,164 @@
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::SSH Secure Shell 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::SSH
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # net-ssh website : http://net-ssh.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/net-ssh
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/service/process/popen3'
21
+
22
+ class TC_Process_POpen3 < Test::Unit::TestCase
23
+
24
+ class MockObject
25
+ attr_reader :events
26
+
27
+ def initialize
28
+ @events = []
29
+ end
30
+
31
+ def method_missing( sym, *args, &block )
32
+ token = [ sym, *args ]
33
+ token << :with_block if block
34
+ @events << token
35
+ end
36
+
37
+ undef_method :loop
38
+ end
39
+
40
+ class Channel < MockObject
41
+ attr_reader :connection
42
+
43
+ def connection
44
+ @connection ||= MockObject.new
45
+ end
46
+ end
47
+
48
+ class TC_SSHStdinPipe < Test::Unit::TestCase
49
+ def setup
50
+ @channel = MockObject.new
51
+ @pipe = Net::SSH::Service::Process::POpen3Manager::SSHStdinPipe.new(
52
+ @channel )
53
+ end
54
+
55
+ def test_write
56
+ @pipe.write "foo"
57
+ assert_equal [ [ :send_data, "foo" ] ], @channel.events
58
+ end
59
+
60
+ def test_puts_nonl
61
+ @pipe.puts "foo"
62
+ assert_equal [ [ :send_data, "foo\n" ] ], @channel.events
63
+ end
64
+
65
+ def test_puts_nl
66
+ @pipe.puts "foo\n"
67
+ assert_equal [ [ :send_data, "foo\n" ] ], @channel.events
68
+ end
69
+ end
70
+
71
+ class TC_SSHStdoutPipe < Test::Unit::TestCase
72
+ def setup
73
+ @channel = Channel.new
74
+ @pipe = Net::SSH::Service::Process::POpen3Manager::SSHStdoutPipe.new(
75
+ @channel )
76
+ end
77
+
78
+ def test_read_empty
79
+ s = @pipe.read
80
+ assert_equal "", s
81
+ assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
82
+ end
83
+
84
+ def test_read_full
85
+ @pipe.do_data @channel, "foo"
86
+ s = @pipe.read
87
+ assert_equal "foo", s
88
+ assert_equal [], @channel.connection.events
89
+ end
90
+ end
91
+
92
+ class TC_SSHStderrPipe < Test::Unit::TestCase
93
+ def setup
94
+ @channel = Channel.new
95
+ @pipe = Net::SSH::Service::Process::POpen3Manager::SSHStderrPipe.new(
96
+ @channel )
97
+ end
98
+
99
+ def test_read_empty
100
+ s = @pipe.read
101
+ assert_equal "", s
102
+ assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
103
+ end
104
+
105
+ def test_read_non_stderr
106
+ @pipe.do_data @channel, 0, "foo"
107
+ s = @pipe.read
108
+ assert_equal "", s
109
+ assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
110
+ end
111
+
112
+ def test_read_stderr
113
+ @pipe.do_data @channel, 1, "foo"
114
+ s = @pipe.read
115
+ assert_equal "foo", s
116
+ assert_equal [], @channel.connection.events
117
+ end
118
+ end
119
+
120
+ class Connection < MockObject
121
+ class Channel < MockObject
122
+ attr_reader :success
123
+ attr_reader :failure
124
+
125
+ def on_success( &block )
126
+ super
127
+ @success = block
128
+ end
129
+
130
+ def on_failure( &block )
131
+ super
132
+ @failure = block
133
+ end
134
+ end
135
+
136
+ attr_reader :channel
137
+ def open_channel( type )
138
+ super
139
+ yield @channel = Channel.new
140
+ end
141
+ end
142
+
143
+ def test_popen3
144
+ conn = Connection.new
145
+ mgr = Net::SSH::Service::Process::POpen3Manager.new( conn, nil )
146
+ mgr.popen3( "foo" ) do |a,b,c|
147
+ assert_instance_of(
148
+ Net::SSH::Service::Process::POpen3Manager::SSHStdinPipe, a )
149
+ assert_instance_of(
150
+ Net::SSH::Service::Process::POpen3Manager::SSHStdoutPipe, b )
151
+ assert_instance_of(
152
+ Net::SSH::Service::Process::POpen3Manager::SSHStderrPipe, c )
153
+ end
154
+
155
+ assert_equal [ [ :open_channel, "session", :with_block ],
156
+ [ :loop ] ], conn.events
157
+ chan = conn.channel
158
+ assert_equal [ [ :on_success, :with_block ],
159
+ [ :on_failure, :with_block ], [ :exec, "foo", true ] ], chan.events
160
+
161
+ chan.success.call( chan )
162
+ end
163
+
164
+ end