poolparty 1.3.4 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/Rakefile +2 -2
  2. data/VERSION.yml +1 -1
  3. data/bin/cloud-bootstrap +1 -0
  4. data/bin/cloud-configure +1 -0
  5. data/bin/cloud-contract +1 -0
  6. data/bin/cloud-misc +34 -0
  7. data/bin/cloud-setup +36 -0
  8. data/bin/cloud-ssh +4 -1
  9. data/config/jeweler.rb +4 -3
  10. data/examples/monitored_cloud.rb +1 -1
  11. data/examples/thrift/thrift_example.rb +5 -3
  12. data/examples/vmware.rb +28 -0
  13. data/lib/cloud_providers/cloud_provider_instance.rb +14 -5
  14. data/lib/cloud_providers/connections.rb +1 -1
  15. data/lib/core/file.rb +12 -0
  16. data/lib/core/object.rb +2 -2
  17. data/lib/dependency_resolvers/base.rb +1 -1
  18. data/lib/dependency_resolvers/chef.rb +9 -7
  19. data/lib/dependency_resolvers/proxy_object.rb +11 -3
  20. data/lib/mixins/askable.rb +16 -7
  21. data/lib/poolparty/base.rb +8 -7
  22. data/lib/poolparty/cloud.rb +77 -7
  23. data/lib/poolparty/default.rb +1 -0
  24. data/lib/poolparty/installer.rb +8 -4
  25. data/lib/poolparty/installers/ec2.rb +75 -5
  26. data/lib/poolparty/installers/vmware.rb +17 -5
  27. data/lib/poolparty/plugin.rb +1 -5
  28. data/lib/poolparty/plugins/apache.rb +10 -7
  29. data/lib/poolparty/plugins/apache2/base.conf.erb +2 -2
  30. data/lib/poolparty/plugins/apache2/browser_fixes.conf.erb +1 -1
  31. data/lib/poolparty/plugins/apache2/passenger_site.rb +2 -2
  32. data/lib/poolparty/plugins/collectd/templates/collectd.conf.erb +369 -0
  33. data/lib/poolparty/plugins/collectd.rb +24 -0
  34. data/lib/poolparty/plugins/hermes.rb +89 -0
  35. data/lib/poolparty/pool.rb +33 -3
  36. data/lib/poolparty/resource.rb +32 -18
  37. data/lib/poolparty/resources/directory.rb +5 -1
  38. data/lib/poolparty/resources/exec.rb +2 -2
  39. data/lib/poolparty/resources/file.rb +8 -2
  40. data/lib/poolparty/resources/gem_package.rb +2 -2
  41. data/lib/poolparty/resources/line.rb +23 -6
  42. data/lib/poolparty/resources/mount.rb +2 -2
  43. data/lib/poolparty/resources/package.rb +2 -2
  44. data/lib/poolparty/resources/service.rb +2 -2
  45. data/lib/poolparty/resources/user.rb +2 -2
  46. data/lib/poolparty/resources/variable.rb +4 -3
  47. data/lib/poolparty.rb +5 -3
  48. data/lib/proto/command_interface_handler.rb +17 -1
  49. data/lib/proto/gen-py/cloudthrift/CommandInterface.pyc +0 -0
  50. data/lib/proto/gen-py/cloudthrift/__init__.pyc +0 -0
  51. data/lib/proto/gen-py/cloudthrift/constants.pyc +0 -0
  52. data/lib/proto/gen-py/cloudthrift/ttypes.pyc +0 -0
  53. data/lib/proto/gen-py/thrift/Thrift.pyc +0 -0
  54. data/lib/proto/gen-py/thrift/__init__.pyc +0 -0
  55. data/lib/proto/gen-py/thrift/protocol/TBinaryProtocol.pyc +0 -0
  56. data/lib/proto/gen-py/thrift/protocol/TProtocol.pyc +0 -0
  57. data/lib/proto/gen-py/thrift/protocol/__init__.pyc +0 -0
  58. data/lib/proto/gen-py/thrift/transport/TSocket.pyc +0 -0
  59. data/lib/proto/gen-py/thrift/transport/TTransport.pyc +0 -0
  60. data/lib/proto/gen-py/thrift/transport/__init__.pyc +0 -0
  61. data/test/lib/dependency_resolvers/chef_test.rb +92 -100
  62. data/test/lib/poolparty/base_test.rb +13 -0
  63. data/test/lib/poolparty/cloud_test.rb +50 -2
  64. data/test/lib/poolparty/monitor_test.rb +2 -2
  65. data/test/lib/poolparty/resource_test.rb +5 -0
  66. data/test/lib/poolparty/resources/line_test.rb +3 -3
  67. data/test/lib/poolparty/resources/service_test.rb +1 -1
  68. data/test/lib/poolparty/resources/variable_test.rb +33 -10
  69. data/vendor/gems/net-ssh/CHANGELOG.rdoc +127 -0
  70. data/vendor/gems/net-ssh/Manifest +104 -0
  71. data/vendor/gems/net-ssh/README.rdoc +110 -0
  72. data/vendor/gems/net-ssh/Rakefile +26 -0
  73. data/vendor/gems/net-ssh/THANKS.rdoc +16 -0
  74. data/vendor/gems/net-ssh/lib/net/ssh/authentication/agent.rb +176 -0
  75. data/vendor/gems/net-ssh/lib/net/ssh/authentication/constants.rb +18 -0
  76. data/vendor/gems/net-ssh/lib/net/ssh/authentication/key_manager.rb +193 -0
  77. data/vendor/gems/net-ssh/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  78. data/vendor/gems/net-ssh/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  79. data/vendor/gems/net-ssh/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  80. data/vendor/gems/net-ssh/lib/net/ssh/authentication/methods/password.rb +39 -0
  81. data/vendor/gems/net-ssh/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  82. data/vendor/gems/net-ssh/lib/net/ssh/authentication/pageant.rb +183 -0
  83. data/vendor/gems/net-ssh/lib/net/ssh/authentication/session.rb +134 -0
  84. data/vendor/gems/net-ssh/lib/net/ssh/buffer.rb +340 -0
  85. data/vendor/gems/net-ssh/lib/net/ssh/buffered_io.rb +149 -0
  86. data/vendor/gems/net-ssh/lib/net/ssh/config.rb +181 -0
  87. data/vendor/gems/net-ssh/lib/net/ssh/connection/channel.rb +625 -0
  88. data/vendor/gems/net-ssh/lib/net/ssh/connection/constants.rb +33 -0
  89. data/vendor/gems/net-ssh/lib/net/ssh/connection/session.rb +596 -0
  90. data/vendor/gems/net-ssh/lib/net/ssh/connection/term.rb +178 -0
  91. data/vendor/gems/net-ssh/lib/net/ssh/errors.rb +85 -0
  92. data/vendor/gems/net-ssh/lib/net/ssh/key_factory.rb +102 -0
  93. data/vendor/gems/net-ssh/lib/net/ssh/known_hosts.rb +129 -0
  94. data/vendor/gems/net-ssh/lib/net/ssh/loggable.rb +61 -0
  95. data/vendor/gems/net-ssh/lib/net/ssh/packet.rb +102 -0
  96. data/vendor/gems/net-ssh/lib/net/ssh/prompt.rb +93 -0
  97. data/vendor/gems/net-ssh/lib/net/ssh/proxy/errors.rb +14 -0
  98. data/vendor/gems/net-ssh/lib/net/ssh/proxy/http.rb +94 -0
  99. data/vendor/gems/net-ssh/lib/net/ssh/proxy/socks4.rb +70 -0
  100. data/vendor/gems/net-ssh/lib/net/ssh/proxy/socks5.rb +129 -0
  101. data/vendor/gems/net-ssh/lib/net/ssh/ruby_compat.rb +7 -0
  102. data/vendor/gems/net-ssh/lib/net/ssh/service/forward.rb +267 -0
  103. data/vendor/gems/net-ssh/lib/net/ssh/test/channel.rb +129 -0
  104. data/vendor/gems/net-ssh/lib/net/ssh/test/extensions.rb +152 -0
  105. data/vendor/gems/net-ssh/lib/net/ssh/test/kex.rb +44 -0
  106. data/vendor/gems/net-ssh/lib/net/ssh/test/local_packet.rb +51 -0
  107. data/vendor/gems/net-ssh/lib/net/ssh/test/packet.rb +81 -0
  108. data/vendor/gems/net-ssh/lib/net/ssh/test/remote_packet.rb +38 -0
  109. data/vendor/gems/net-ssh/lib/net/ssh/test/script.rb +157 -0
  110. data/vendor/gems/net-ssh/lib/net/ssh/test/socket.rb +59 -0
  111. data/vendor/gems/net-ssh/lib/net/ssh/test.rb +89 -0
  112. data/vendor/gems/net-ssh/lib/net/ssh/transport/algorithms.rb +384 -0
  113. data/vendor/gems/net-ssh/lib/net/ssh/transport/cipher_factory.rb +80 -0
  114. data/vendor/gems/net-ssh/lib/net/ssh/transport/constants.rb +30 -0
  115. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/abstract.rb +78 -0
  116. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/md5.rb +12 -0
  117. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  118. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/none.rb +15 -0
  119. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  120. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  121. data/vendor/gems/net-ssh/lib/net/ssh/transport/hmac.rb +31 -0
  122. data/vendor/gems/net-ssh/lib/net/ssh/transport/identity_cipher.rb +55 -0
  123. data/vendor/gems/net-ssh/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  124. data/vendor/gems/net-ssh/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  125. data/vendor/gems/net-ssh/lib/net/ssh/transport/kex.rb +13 -0
  126. data/vendor/gems/net-ssh/lib/net/ssh/transport/openssl.rb +128 -0
  127. data/vendor/gems/net-ssh/lib/net/ssh/transport/packet_stream.rb +230 -0
  128. data/vendor/gems/net-ssh/lib/net/ssh/transport/server_version.rb +60 -0
  129. data/vendor/gems/net-ssh/lib/net/ssh/transport/session.rb +276 -0
  130. data/vendor/gems/net-ssh/lib/net/ssh/transport/state.rb +201 -0
  131. data/vendor/gems/net-ssh/lib/net/ssh/verifiers/lenient.rb +30 -0
  132. data/vendor/gems/net-ssh/lib/net/ssh/verifiers/null.rb +12 -0
  133. data/vendor/gems/net-ssh/lib/net/ssh/verifiers/strict.rb +53 -0
  134. data/vendor/gems/net-ssh/lib/net/ssh/version.rb +62 -0
  135. data/vendor/gems/net-ssh/lib/net/ssh.rb +215 -0
  136. data/vendor/gems/net-ssh/net-ssh.gemspec +33 -0
  137. data/vendor/gems/net-ssh/setup.rb +1585 -0
  138. data/vendor/gems/net-ssh/test/authentication/methods/common.rb +28 -0
  139. data/vendor/gems/net-ssh/test/authentication/methods/test_abstract.rb +51 -0
  140. data/vendor/gems/net-ssh/test/authentication/methods/test_hostbased.rb +114 -0
  141. data/vendor/gems/net-ssh/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  142. data/vendor/gems/net-ssh/test/authentication/methods/test_password.rb +50 -0
  143. data/vendor/gems/net-ssh/test/authentication/methods/test_publickey.rb +127 -0
  144. data/vendor/gems/net-ssh/test/authentication/test_agent.rb +205 -0
  145. data/vendor/gems/net-ssh/test/authentication/test_key_manager.rb +105 -0
  146. data/vendor/gems/net-ssh/test/authentication/test_session.rb +93 -0
  147. data/vendor/gems/net-ssh/test/common.rb +106 -0
  148. data/vendor/gems/net-ssh/test/configs/eqsign +3 -0
  149. data/vendor/gems/net-ssh/test/configs/exact_match +8 -0
  150. data/vendor/gems/net-ssh/test/configs/wild_cards +14 -0
  151. data/vendor/gems/net-ssh/test/connection/test_channel.rb +452 -0
  152. data/vendor/gems/net-ssh/test/connection/test_session.rb +488 -0
  153. data/vendor/gems/net-ssh/test/test_all.rb +6 -0
  154. data/vendor/gems/net-ssh/test/test_buffer.rb +336 -0
  155. data/vendor/gems/net-ssh/test/test_buffered_io.rb +63 -0
  156. data/vendor/gems/net-ssh/test/test_config.rb +84 -0
  157. data/vendor/gems/net-ssh/test/test_key_factory.rb +67 -0
  158. data/vendor/gems/net-ssh/test/transport/hmac/test_md5.rb +39 -0
  159. data/vendor/gems/net-ssh/test/transport/hmac/test_md5_96.rb +25 -0
  160. data/vendor/gems/net-ssh/test/transport/hmac/test_none.rb +34 -0
  161. data/vendor/gems/net-ssh/test/transport/hmac/test_sha1.rb +34 -0
  162. data/vendor/gems/net-ssh/test/transport/hmac/test_sha1_96.rb +25 -0
  163. data/vendor/gems/net-ssh/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  164. data/vendor/gems/net-ssh/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  165. data/vendor/gems/net-ssh/test/transport/test_algorithms.rb +302 -0
  166. data/vendor/gems/net-ssh/test/transport/test_cipher_factory.rb +171 -0
  167. data/vendor/gems/net-ssh/test/transport/test_hmac.rb +34 -0
  168. data/vendor/gems/net-ssh/test/transport/test_identity_cipher.rb +40 -0
  169. data/vendor/gems/net-ssh/test/transport/test_packet_stream.rb +435 -0
  170. data/vendor/gems/net-ssh/test/transport/test_server_version.rb +57 -0
  171. data/vendor/gems/net-ssh/test/transport/test_session.rb +315 -0
  172. data/vendor/gems/net-ssh/test/transport/test_state.rb +173 -0
  173. metadata +116 -4
  174. data/bin/install-poolparty +0 -20
@@ -0,0 +1,435 @@
1
+ require 'common'
2
+ require 'net/ssh/transport/packet_stream'
3
+
4
+ module Transport
5
+
6
+ class TestPacketStream < Test::Unit::TestCase
7
+ include Net::SSH::Transport::Constants
8
+
9
+ def test_client_name_when_getnameinfo_works
10
+ stream.expects(:getsockname).returns(:sockaddr)
11
+ Socket.expects(:getnameinfo).with(:sockaddr, Socket::NI_NAMEREQD).returns(["net.ssh.test"])
12
+ assert_equal "net.ssh.test", stream.client_name
13
+ end
14
+
15
+ def test_client_name_when_getnameinfo_fails_first_and_then_works
16
+ stream.expects(:getsockname).returns(:sockaddr)
17
+ Socket.expects(:getnameinfo).with(:sockaddr, Socket::NI_NAMEREQD).raises(SocketError)
18
+ Socket.expects(:getnameinfo).with(:sockaddr).returns(["1.2.3.4"])
19
+ assert_equal "1.2.3.4", stream.client_name
20
+ end
21
+
22
+ def test_client_name_when_getnameinfo_fails_but_gethostbyname_works
23
+ stream.expects(:getsockname).returns(:sockaddr)
24
+ Socket.expects(:getnameinfo).with(:sockaddr, Socket::NI_NAMEREQD).raises(SocketError)
25
+ Socket.expects(:getnameinfo).with(:sockaddr).raises(SocketError)
26
+ Socket.expects(:gethostname).returns(:hostname)
27
+ Socket.expects(:gethostbyname).with(:hostname).returns(["net.ssh.test"])
28
+ assert_equal "net.ssh.test", stream.client_name
29
+ end
30
+
31
+ def test_client_name_when_getnameinfo_and_gethostbyname_all_fail
32
+ stream.expects(:getsockname).returns(:sockaddr)
33
+ Socket.expects(:getnameinfo).with(:sockaddr, Socket::NI_NAMEREQD).raises(SocketError)
34
+ Socket.expects(:getnameinfo).with(:sockaddr).raises(SocketError)
35
+ Socket.expects(:gethostname).returns(:hostname)
36
+ Socket.expects(:gethostbyname).with(:hostname).raises(SocketError)
37
+ assert_equal "unknown", stream.client_name
38
+ end
39
+
40
+ def test_peer_ip_should_query_socket_for_info_about_peer
41
+ stream.expects(:getpeername).returns(:sockaddr)
42
+ Socket.expects(:getnameinfo).with(:sockaddr, Socket::NI_NUMERICHOST | Socket::NI_NUMERICSERV).returns(["1.2.3.4"])
43
+ assert_equal "1.2.3.4", stream.peer_ip
44
+ end
45
+
46
+ def test_available_for_read_should_return_nontrue_when_select_fails
47
+ IO.expects(:select).returns(nil)
48
+ assert !stream.available_for_read?
49
+ end
50
+
51
+ def test_available_for_read_should_return_nontrue_when_self_is_not_ready
52
+ IO.expects(:select).with([stream], nil, nil, 0).returns([[],[],[]])
53
+ assert !stream.available_for_read?
54
+ end
55
+
56
+ def test_available_for_read_should_return_true_when_self_is_ready
57
+ IO.expects(:select).with([stream], nil, nil, 0).returns([[self],[],[]])
58
+ assert stream.available_for_read?
59
+ end
60
+
61
+ def test_cleanup_should_delegate_cleanup_to_client_and_server_states
62
+ stream.client.expects(:cleanup)
63
+ stream.server.expects(:cleanup)
64
+ stream.cleanup
65
+ end
66
+
67
+ def test_if_needs_rekey_should_not_yield_if_neither_client_nor_server_states_need_rekey
68
+ stream.if_needs_rekey? { flunk "shouldn't need rekey" }
69
+ assert(true)
70
+ end
71
+
72
+ def test_if_needs_rekey_should_yield_and_cleanup_if_client_needs_rekey
73
+ stream.client.stubs(:needs_rekey?).returns(true)
74
+ stream.client.expects(:reset!)
75
+ stream.server.expects(:reset!).never
76
+ rekeyed = false
77
+ stream.if_needs_rekey? { rekeyed = true }
78
+ assert(rekeyed)
79
+ end
80
+
81
+ def test_if_needs_rekey_should_yield_and_cleanup_if_server_needs_rekey
82
+ stream.server.stubs(:needs_rekey?).returns(true)
83
+ stream.server.expects(:reset!)
84
+ stream.client.expects(:reset!).never
85
+ rekeyed = false
86
+ stream.if_needs_rekey? { rekeyed = true }
87
+ assert(rekeyed)
88
+ end
89
+
90
+ def test_if_needs_rekey_should_yield_and_cleanup_if_both_need_rekey
91
+ stream.server.stubs(:needs_rekey?).returns(true)
92
+ stream.client.stubs(:needs_rekey?).returns(true)
93
+ stream.server.expects(:reset!)
94
+ stream.client.expects(:reset!)
95
+ rekeyed = false
96
+ stream.if_needs_rekey? { rekeyed = true }
97
+ assert(rekeyed)
98
+ end
99
+
100
+ def test_next_packet_should_not_block_by_default
101
+ IO.expects(:select).returns(nil)
102
+ assert_nothing_raised do
103
+ timeout(1) { stream.next_packet }
104
+ end
105
+ end
106
+
107
+ def test_next_packet_should_return_nil_when_non_blocking_and_not_ready
108
+ IO.expects(:select).returns(nil)
109
+ assert_nil stream.next_packet(:nonblock)
110
+ end
111
+
112
+ def test_next_packet_should_return_nil_when_non_blocking_and_partial_read
113
+ IO.expects(:select).returns([[stream]])
114
+ stream.expects(:recv).returns([8].pack("N"))
115
+ assert_nil stream.next_packet(:nonblock)
116
+ assert !stream.read_buffer.empty?
117
+ end
118
+
119
+ def test_next_packet_should_return_packet_when_non_blocking_and_full_read
120
+ IO.expects(:select).returns([[stream]])
121
+ stream.expects(:recv).returns(packet)
122
+ packet = stream.next_packet(:nonblock)
123
+ assert_not_nil packet
124
+ assert_equal DEBUG, packet.type
125
+ end
126
+
127
+ def test_next_packet_should_eventually_return_packet_when_non_blocking_and_partial_read
128
+ IO.stubs(:select).returns([[stream]])
129
+ stream.stubs(:recv).returns(packet[0,10], packet[10..-1])
130
+ assert_nil stream.next_packet(:nonblock)
131
+ packet = stream.next_packet(:nonblock)
132
+ assert_not_nil packet
133
+ assert_equal DEBUG, packet.type
134
+ end
135
+
136
+ def test_next_packet_should_block_when_requested_until_entire_packet_is_available
137
+ IO.stubs(:select).returns([[stream]])
138
+ stream.stubs(:recv).returns(packet[0,10], packet[10,20], packet[20..-1])
139
+ packet = stream.next_packet(:block)
140
+ assert_not_nil packet
141
+ assert_equal DEBUG, packet.type
142
+ end
143
+
144
+ def test_next_packet_when_blocking_should_fail_when_fill_could_not_read_any_data
145
+ IO.stubs(:select).returns([[stream]])
146
+ stream.stubs(:recv).returns("")
147
+ assert_raises(Net::SSH::Disconnect) { stream.next_packet(:block) }
148
+ end
149
+
150
+ def test_next_packet_fails_with_invalid_argument
151
+ assert_raises(ArgumentError) { stream.next_packet("invalid") }
152
+ end
153
+
154
+ def test_send_packet_should_enqueue_and_send_data_immediately
155
+ stream.expects(:send).times(3).with { |a,b| a == stream.write_buffer && b == 0 }.returns(15)
156
+ IO.expects(:select).times(2).returns([[], [stream]])
157
+ stream.send_packet(ssh_packet)
158
+ assert !stream.pending_write?
159
+ end
160
+
161
+ def test_enqueue_short_packet_should_ensure_packet_is_at_least_16_bytes_long
162
+ packet = Net::SSH::Buffer.from(:byte, 0)
163
+ stream.enqueue_packet(packet)
164
+ # 12 originally, plus the block-size (8), plus the 4-byte length field
165
+ assert_equal 24, stream.write_buffer.length
166
+ end
167
+
168
+ PACKETS = {
169
+ "3des-cbc" => {
170
+ "hmac-md5" => {
171
+ false => "\003\352\031\261k\243\200\204\301\203]!\a\306\217\201\a[^\304\317\322\264\265~\361\017\n\205\272, #[\343\200Sb\377\265\322\003=S\255N\2654",
172
+ :standard => "\317\222v\316\234<\310\377\310\034\346\351\020:\025{\372PDS\246\344\312J\364\301\n\262\r<\037\231Mu\031\240\255\026\362\200A\305\027\341\261\331x\353\0372\3643h`\177\202",
173
+ },
174
+ "hmac-md5-96" => {
175
+ false => "\003\352\031\261k\243\200\204\301\203]!\a\306\217\201\a[^\304\317\322\264\265~\361\017\n\205\272, #[\343\200Sb\377\265\322\003=S",
176
+ :standard => "\317\222v\316\234<\310\377\310\034\346\351\020:\025{\372PDS\246\344\312J\364\301\n\262\r<\037\231Mu\031\240\255\026\362\200A\305\027\341\261\331x\353\0372\3643",
177
+ },
178
+ "hmac-sha1" => {
179
+ false => "\003\352\031\261k\243\200\204\301\203]!\a\306\217\201\a[^\304\317\322\264\265~\361\017\n\205\272, \235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
180
+ :standard => "\317\222v\316\234<\310\377\310\034\346\351\020:\025{\372PDS\246\344\312J\364\301\n\262\r<\037\231Mu\031\240\255\026\362\200\345\a{|\0367\355\2735\310'\n\342\250\246\030*1\353\330",
181
+ },
182
+ "hmac-sha1-96" => {
183
+ false => "\003\352\031\261k\243\200\204\301\203]!\a\306\217\201\a[^\304\317\322\264\265~\361\017\n\205\272, \235J\004f\262\3730t\376\273\323n",
184
+ :standard => "\317\222v\316\234<\310\377\310\034\346\351\020:\025{\372PDS\246\344\312J\364\301\n\262\r<\037\231Mu\031\240\255\026\362\200\345\a{|\0367\355\2735\310'\n",
185
+ },
186
+ "none" => {
187
+ false => "\003\352\031\261k\243\200\204\301\203]!\a\306\217\201\a[^\304\317\322\264\265~\361\017\n\205\272, ",
188
+ :standard => "\317\222v\316\234<\310\377\310\034\346\351\020:\025{\372PDS\246\344\312J\364\301\n\262\r<\037\231Mu\031\240\255\026\362\200",
189
+ },
190
+ },
191
+ "aes128-cbc" => {
192
+ "hmac-md5" => {
193
+ false => "\240\016\243k]0\330\253\030\320\334\261(\034E\211\230#\326\374\267\311O\211E(\234\325n\306NY#[\343\200Sb\377\265\322\003=S\255N\2654",
194
+ :standard => "\273\367\324\032\3762\334\026\r\246\342\022\016\325\024\270.\273\005\314\036\312\211\261\037A\361\362:W\316\352K\204\216b\2124>A\265g\331\177\233dK\251\337\227`9L\324[bPd\253XY\205\241\310",
195
+ },
196
+ "hmac-md5-96" => {
197
+ false => "\240\016\243k]0\330\253\030\320\334\261(\034E\211\230#\326\374\267\311O\211E(\234\325n\306NY#[\343\200Sb\377\265\322\003=S",
198
+ :standard => "\273\367\324\032\3762\334\026\r\246\342\022\016\325\024\270.\273\005\314\036\312\211\261\037A\361\362:W\316\352K\204\216b\2124>A\265g\331\177\233dK\251\337\227`9L\324[bPd\253X",
199
+ },
200
+ "hmac-sha1" => {
201
+ false => "\240\016\243k]0\330\253\030\320\334\261(\034E\211\230#\326\374\267\311O\211E(\234\325n\306NY\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
202
+ :standard => "\273\367\324\032\3762\334\026\r\246\342\022\016\325\024\270.\273\005\314\036\312\211\261\037A\361\362:W\316\352K\204\216b\2124>A\265g\331\177\233dK\251\314\r\224%\316I\370t\251\372]\031\322pH%\267\337r\247",
203
+ },
204
+ "hmac-sha1-96" => {
205
+ false => "\240\016\243k]0\330\253\030\320\334\261(\034E\211\230#\326\374\267\311O\211E(\234\325n\306NY\235J\004f\262\3730t\376\273\323n",
206
+ :standard => "\273\367\324\032\3762\334\026\r\246\342\022\016\325\024\270.\273\005\314\036\312\211\261\037A\361\362:W\316\352K\204\216b\2124>A\265g\331\177\233dK\251\314\r\224%\316I\370t\251\372]\031",
207
+ },
208
+ "none" => {
209
+ false => "\240\016\243k]0\330\253\030\320\334\261(\034E\211\230#\326\374\267\311O\211E(\234\325n\306NY",
210
+ :standard => "\273\367\324\032\3762\334\026\r\246\342\022\016\325\024\270.\273\005\314\036\312\211\261\037A\361\362:W\316\352K\204\216b\2124>A\265g\331\177\233dK\251",
211
+ },
212
+ },
213
+ "aes192-cbc" => {
214
+ "hmac-md5" => {
215
+ false => "P$\377\302\326\262\276\215\206\343&\257#\315>Mp\232P\345o\215\330\213\t\027\300\360\300\037\267\003#[\343\200Sb\377\265\322\003=S\255N\2654",
216
+ :standard => "se\347\230\026\311\212\250yH\241\302n\364:\276\270M=H1\317\222^\362\237D\225N\354:\343\205M\006[\313$U/yZ\330\235\032\307\320D\337\227`9L\324[bPd\253XY\205\241\310",
217
+ },
218
+ "hmac-md5-96" => {
219
+ false => "P$\377\302\326\262\276\215\206\343&\257#\315>Mp\232P\345o\215\330\213\t\027\300\360\300\037\267\003#[\343\200Sb\377\265\322\003=S",
220
+ :standard => "se\347\230\026\311\212\250yH\241\302n\364:\276\270M=H1\317\222^\362\237D\225N\354:\343\205M\006[\313$U/yZ\330\235\032\307\320D\337\227`9L\324[bPd\253X",
221
+ },
222
+ "hmac-sha1" => {
223
+ false => "P$\377\302\326\262\276\215\206\343&\257#\315>Mp\232P\345o\215\330\213\t\027\300\360\300\037\267\003\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
224
+ :standard => "se\347\230\026\311\212\250yH\241\302n\364:\276\270M=H1\317\222^\362\237D\225N\354:\343\205M\006[\313$U/yZ\330\235\032\307\320D\314\r\224%\316I\370t\251\372]\031\322pH%\267\337r\247",
225
+ },
226
+ "hmac-sha1-96" => {
227
+ false => "P$\377\302\326\262\276\215\206\343&\257#\315>Mp\232P\345o\215\330\213\t\027\300\360\300\037\267\003\235J\004f\262\3730t\376\273\323n",
228
+ :standard => "se\347\230\026\311\212\250yH\241\302n\364:\276\270M=H1\317\222^\362\237D\225N\354:\343\205M\006[\313$U/yZ\330\235\032\307\320D\314\r\224%\316I\370t\251\372]\031",
229
+ },
230
+ "none" => {
231
+ false => "P$\377\302\326\262\276\215\206\343&\257#\315>Mp\232P\345o\215\330\213\t\027\300\360\300\037\267\003",
232
+ :standard => "se\347\230\026\311\212\250yH\241\302n\364:\276\270M=H1\317\222^\362\237D\225N\354:\343\205M\006[\313$U/yZ\330\235\032\307\320D",
233
+ },
234
+ },
235
+ "aes256-cbc" => {
236
+ "hmac-md5" => {
237
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340#[\343\200Sb\377\265\322\003=S\255N\2654",
238
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\337\227`9L\324[bPd\253XY\205\241\310",
239
+ },
240
+ "hmac-md5-96" => {
241
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340#[\343\200Sb\377\265\322\003=S",
242
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\337\227`9L\324[bPd\253X",
243
+ },
244
+ "hmac-sha1" => {
245
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
246
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\314\r\224%\316I\370t\251\372]\031\322pH%\267\337r\247",
247
+ },
248
+ "hmac-sha1-96" => {
249
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340\235J\004f\262\3730t\376\273\323n",
250
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\314\r\224%\316I\370t\251\372]\031",
251
+ },
252
+ "none" => {
253
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340",
254
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365",
255
+ },
256
+ },
257
+ "blowfish-cbc" => {
258
+ "hmac-md5" => {
259
+ false => "vT\353\203\247\206L\255e\371\001 6B/\234g\332\371\224l\227\257\346\373E\237C2\212u)#[\343\200Sb\377\265\322\003=S\255N\2654",
260
+ :standard => "U\257\231e\347\274\bh\016X\232h\334\v\005\316e1G$-\367##\256$rW\000\210\335_\360\f\000\205#\370\201\006A\305\027\341\261\331x\353\0372\3643h`\177\202",
261
+ },
262
+ "hmac-md5-96" => {
263
+ false => "vT\353\203\247\206L\255e\371\001 6B/\234g\332\371\224l\227\257\346\373E\237C2\212u)#[\343\200Sb\377\265\322\003=S",
264
+ :standard => "U\257\231e\347\274\bh\016X\232h\334\v\005\316e1G$-\367##\256$rW\000\210\335_\360\f\000\205#\370\201\006A\305\027\341\261\331x\353\0372\3643",
265
+ },
266
+ "hmac-sha1" => {
267
+ false => "vT\353\203\247\206L\255e\371\001 6B/\234g\332\371\224l\227\257\346\373E\237C2\212u)\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
268
+ :standard => "U\257\231e\347\274\bh\016X\232h\334\v\005\316e1G$-\367##\256$rW\000\210\335_\360\f\000\205#\370\201\006\345\a{|\0367\355\2735\310'\n\342\250\246\030*1\353\330",
269
+ },
270
+ "hmac-sha1-96" => {
271
+ false => "vT\353\203\247\206L\255e\371\001 6B/\234g\332\371\224l\227\257\346\373E\237C2\212u)\235J\004f\262\3730t\376\273\323n",
272
+ :standard => "U\257\231e\347\274\bh\016X\232h\334\v\005\316e1G$-\367##\256$rW\000\210\335_\360\f\000\205#\370\201\006\345\a{|\0367\355\2735\310'\n",
273
+ },
274
+ "none" => {
275
+ false => "vT\353\203\247\206L\255e\371\001 6B/\234g\332\371\224l\227\257\346\373E\237C2\212u)",
276
+ :standard => "U\257\231e\347\274\bh\016X\232h\334\v\005\316e1G$-\367##\256$rW\000\210\335_\360\f\000\205#\370\201\006",
277
+ },
278
+ },
279
+ "cast128-cbc" => {
280
+ "hmac-md5" => {
281
+ false => "\361\026\313!\31235|w~\n\261\257\277\e\277b\246b\342\333\eE\021N\345\343m\314\272\315\376#[\343\200Sb\377\265\322\003=S\255N\2654",
282
+ :standard => "\375i\253\004\311E\2011)\220$\251A\245\f(\371\263\314\242\353\260\272\367\276\"\031\224$\244\311W\307Oe\224\0017\336\325A\305\027\341\261\331x\353\0372\3643h`\177\202",
283
+ },
284
+ "hmac-md5-96" => {
285
+ false => "\361\026\313!\31235|w~\n\261\257\277\e\277b\246b\342\333\eE\021N\345\343m\314\272\315\376#[\343\200Sb\377\265\322\003=S",
286
+ :standard => "\375i\253\004\311E\2011)\220$\251A\245\f(\371\263\314\242\353\260\272\367\276\"\031\224$\244\311W\307Oe\224\0017\336\325A\305\027\341\261\331x\353\0372\3643",
287
+ },
288
+ "hmac-sha1" => {
289
+ false => "\361\026\313!\31235|w~\n\261\257\277\e\277b\246b\342\333\eE\021N\345\343m\314\272\315\376\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
290
+ :standard => "\375i\253\004\311E\2011)\220$\251A\245\f(\371\263\314\242\353\260\272\367\276\"\031\224$\244\311W\307Oe\224\0017\336\325\345\a{|\0367\355\2735\310'\n\342\250\246\030*1\353\330",
291
+ },
292
+ "hmac-sha1-96" => {
293
+ false => "\361\026\313!\31235|w~\n\261\257\277\e\277b\246b\342\333\eE\021N\345\343m\314\272\315\376\235J\004f\262\3730t\376\273\323n",
294
+ :standard => "\375i\253\004\311E\2011)\220$\251A\245\f(\371\263\314\242\353\260\272\367\276\"\031\224$\244\311W\307Oe\224\0017\336\325\345\a{|\0367\355\2735\310'\n",
295
+ },
296
+ "none" => {
297
+ false => "\361\026\313!\31235|w~\n\261\257\277\e\277b\246b\342\333\eE\021N\345\343m\314\272\315\376",
298
+ :standard => "\375i\253\004\311E\2011)\220$\251A\245\f(\371\263\314\242\353\260\272\367\276\"\031\224$\244\311W\307Oe\224\0017\336\325",
299
+ },
300
+ },
301
+ "idea-cbc" => {
302
+ "hmac-md5" => {
303
+ false => "\342\255\202$\273\201\025#\245\2341F\263\005@{\000<\266&s\016\251NH=J\322/\220 H#[\343\200Sb\377\265\322\003=S\255N\2654",
304
+ :standard => "F\3048\360\357\265\215I\021)\a\254/\315%\354M\004\330\006\356\vFr\250K\225\223x\277+Q)\022\327\311K\025\322\317A\305\027\341\261\331x\353\0372\3643h`\177\202",
305
+ },
306
+ "hmac-md5-96" => {
307
+ false => "\342\255\202$\273\201\025#\245\2341F\263\005@{\000<\266&s\016\251NH=J\322/\220 H#[\343\200Sb\377\265\322\003=S",
308
+ :standard => "F\3048\360\357\265\215I\021)\a\254/\315%\354M\004\330\006\356\vFr\250K\225\223x\277+Q)\022\327\311K\025\322\317A\305\027\341\261\331x\353\0372\3643",
309
+ },
310
+ "hmac-sha1" => {
311
+ false => "\342\255\202$\273\201\025#\245\2341F\263\005@{\000<\266&s\016\251NH=J\322/\220 H\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
312
+ :standard => "F\3048\360\357\265\215I\021)\a\254/\315%\354M\004\330\006\356\vFr\250K\225\223x\277+Q)\022\327\311K\025\322\317\345\a{|\0367\355\2735\310'\n\342\250\246\030*1\353\330",
313
+ },
314
+ "hmac-sha1-96" => {
315
+ false => "\342\255\202$\273\201\025#\245\2341F\263\005@{\000<\266&s\016\251NH=J\322/\220 H\235J\004f\262\3730t\376\273\323n",
316
+ :standard => "F\3048\360\357\265\215I\021)\a\254/\315%\354M\004\330\006\356\vFr\250K\225\223x\277+Q)\022\327\311K\025\322\317\345\a{|\0367\355\2735\310'\n",
317
+ },
318
+ "none" => {
319
+ false => "\342\255\202$\273\201\025#\245\2341F\263\005@{\000<\266&s\016\251NH=J\322/\220 H",
320
+ :standard => "F\3048\360\357\265\215I\021)\a\254/\315%\354M\004\330\006\356\vFr\250K\225\223x\277+Q)\022\327\311K\025\322\317",
321
+ },
322
+ },
323
+ "none" => {
324
+ "hmac-md5" => {
325
+ false => "\000\000\000\034\b\004\001\000\000\000\tdebugging\000\000\000\000\b\030CgWO\260\212#[\343\200Sb\377\265\322\003=S\255N\2654",
326
+ :standard => "\000\000\000$\tx\234bad``\340LIM*MO\317\314K\ar\030\000\000\000\000\377\377\b\030CgWO\260\212^A\305\027\341\261\331x\353\0372\3643h`\177\202",
327
+ },
328
+ "hmac-md5-96" => {
329
+ false => "\000\000\000\034\b\004\001\000\000\000\tdebugging\000\000\000\000\b\030CgWO\260\212#[\343\200Sb\377\265\322\003=S",
330
+ :standard => "\000\000\000$\tx\234bad``\340LIM*MO\317\314K\ar\030\000\000\000\000\377\377\b\030CgWO\260\212^A\305\027\341\261\331x\353\0372\3643",
331
+ },
332
+ "hmac-sha1" => {
333
+ false => "\000\000\000\034\b\004\001\000\000\000\tdebugging\000\000\000\000\b\030CgWO\260\212\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
334
+ :standard => "\000\000\000$\tx\234bad``\340LIM*MO\317\314K\ar\030\000\000\000\000\377\377\b\030CgWO\260\212^\345\a{|\0367\355\2735\310'\n\342\250\246\030*1\353\330",
335
+ },
336
+ "hmac-sha1-96" => {
337
+ false => "\000\000\000\034\b\004\001\000\000\000\tdebugging\000\000\000\000\b\030CgWO\260\212\235J\004f\262\3730t\376\273\323n",
338
+ :standard => "\000\000\000$\tx\234bad``\340LIM*MO\317\314K\ar\030\000\000\000\000\377\377\b\030CgWO\260\212^\345\a{|\0367\355\2735\310'\n",
339
+ },
340
+ "none" => {
341
+ false => "\000\000\000\034\b\004\001\000\000\000\tdebugging\000\000\000\000\b\030CgWO\260\212",
342
+ :standard => "\000\000\000$\tx\234bad``\340LIM*MO\317\314K\ar\030\000\000\000\000\377\377\b\030CgWO\260\212^",
343
+ },
344
+ },
345
+ "rijndael-cbc@lysator.liu.se" => {
346
+ "hmac-md5" => {
347
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340#[\343\200Sb\377\265\322\003=S\255N\2654",
348
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\337\227`9L\324[bPd\253XY\205\241\310",
349
+ },
350
+ "hmac-md5-96" => {
351
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340#[\343\200Sb\377\265\322\003=S",
352
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\337\227`9L\324[bPd\253X",
353
+ },
354
+ "hmac-sha1" => {
355
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340\235J\004f\262\3730t\376\273\323n\260\275\202\223\214\370D\204",
356
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\314\r\224%\316I\370t\251\372]\031\322pH%\267\337r\247",
357
+ },
358
+ "hmac-sha1-96" => {
359
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340\235J\004f\262\3730t\376\273\323n",
360
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365\314\r\224%\316I\370t\251\372]\031",
361
+ },
362
+ "none" => {
363
+ false => "\266\001oG(\201s\255[\202j\031-\354\353]\022\374\367j2\257\b#\273r\275\341\232\264\255\340",
364
+ :standard => "\251!O/_\253\321\217e\225\202\202W\261p\r\357\357\375\231\264Y,nZ/\366\225G\256\3000\036\223\237\353\265vG\231\215cvY\236%\315\365",
365
+ },
366
+ },
367
+ }
368
+
369
+ ciphers = Net::SSH::Transport::CipherFactory::SSH_TO_OSSL.keys
370
+ hmacs = Net::SSH::Transport::HMAC::MAP.keys
371
+
372
+ ciphers.each do |cipher_name|
373
+ next unless Net::SSH::Transport::CipherFactory.supported?(cipher_name)
374
+
375
+ hmacs.each do |hmac_name|
376
+ [false, :standard].each do |compress|
377
+ cipher_method_name = cipher_name.gsub(/\W/, "_")
378
+ hmac_method_name = hmac_name.gsub(/\W/, "_")
379
+
380
+ define_method("test_next_packet_with_#{cipher_method_name}_and_#{hmac_method_name}_and_#{compress}_compression") do
381
+ cipher = Net::SSH::Transport::CipherFactory.get(cipher_name, :key => "ABC", :iv => "abc", :shared => "123", :digester => OpenSSL::Digest::SHA1, :hash => "^&*", :decrypt => true)
382
+ hmac = Net::SSH::Transport::HMAC.get(hmac_name, "{}|")
383
+
384
+ stream.server.set :cipher => cipher, :hmac => hmac, :compression => compress
385
+ stream.stubs(:recv).returns(PACKETS[cipher_name][hmac_name][compress])
386
+ IO.stubs(:select).returns([[stream]])
387
+ packet = stream.next_packet(:nonblock)
388
+ assert_not_nil packet
389
+ assert_equal DEBUG, packet.type
390
+ assert packet[:always_display]
391
+ assert_equal "debugging", packet[:message]
392
+ assert_equal "", packet[:language]
393
+ stream.cleanup
394
+ end
395
+
396
+ define_method("test_enqueue_packet_with_#{cipher_method_name}_and_#{hmac_method_name}_and_#{compress}_compression") do
397
+ cipher = Net::SSH::Transport::CipherFactory.get(cipher_name, :key => "ABC", :iv => "abc", :shared => "123", :digester => OpenSSL::Digest::SHA1, :hash => "^&*", :encrypt => true)
398
+ hmac = Net::SSH::Transport::HMAC.get(hmac_name, "{}|")
399
+
400
+ srand(100)
401
+ stream.client.set :cipher => cipher, :hmac => hmac, :compression => compress
402
+ stream.enqueue_packet(ssh_packet)
403
+ assert_equal stream.write_buffer, PACKETS[cipher_name][hmac_name][compress]
404
+ stream.cleanup
405
+ end
406
+ end
407
+ end
408
+ end
409
+
410
+ private
411
+
412
+ def stream
413
+ @stream ||= begin
414
+ stream = mock("packet_stream")
415
+ stream.extend(Net::SSH::Transport::PacketStream)
416
+ stream
417
+ end
418
+ end
419
+
420
+ def ssh_packet
421
+ Net::SSH::Buffer.from(:byte, DEBUG, :bool, true, :string, "debugging", :string, "")
422
+ end
423
+
424
+ def packet
425
+ @packet ||= begin
426
+ data = ssh_packet
427
+ length = data.length + 4 + 1 # length + padding length
428
+ padding = stream.server.cipher.block_size - (length % stream.server.cipher.block_size)
429
+ padding += stream.server.cipher.block_size if padding < 4
430
+ Net::SSH::Buffer.from(:long, length + padding - 4, :byte, padding, :raw, data, :raw, "\0" * padding).to_s
431
+ end
432
+ end
433
+ end
434
+
435
+ end
@@ -0,0 +1,57 @@
1
+ require 'common'
2
+ require 'net/ssh/transport/server_version'
3
+
4
+ module Transport
5
+
6
+ class TestServerVersion < Test::Unit::TestCase
7
+
8
+ def test_1_99_server_version_should_be_acceptible
9
+ s = subject(socket(true, "SSH-1.99-Testing_1.0\r\n"))
10
+ assert s.header.empty?
11
+ assert_equal "SSH-1.99-Testing_1.0", s.version
12
+ end
13
+
14
+ def test_2_0_server_version_should_be_acceptible
15
+ s = subject(socket(true, "SSH-2.0-Testing_1.0\r\n"))
16
+ assert s.header.empty?
17
+ assert_equal "SSH-2.0-Testing_1.0", s.version
18
+ end
19
+
20
+ def test_trailing_whitespace_should_be_preserved
21
+ # some servers, like Mocana, send a version string with trailing
22
+ # spaces, which are significant when exchanging keys later.
23
+ s = subject(socket(true, "SSH-2.0-Testing_1.0 \r\n"))
24
+ assert_equal "SSH-2.0-Testing_1.0 ", s.version
25
+ end
26
+
27
+ def test_unacceptible_server_version_should_raise_exception
28
+ assert_raises(Net::SSH::Exception) { subject(socket(false, "SSH-1.4-Testing_1.0\r\n")) }
29
+ end
30
+
31
+ def test_header_lines_should_be_accumulated
32
+ s = subject(socket(true, "Welcome\r\n", "Another line\r\n", "SSH-2.0-Testing_1.0\r\n"))
33
+ assert_equal "Welcome\r\nAnother line\r\n", s.header
34
+ assert_equal "SSH-2.0-Testing_1.0", s.version
35
+ end
36
+
37
+ private
38
+
39
+ def socket(good, *lines)
40
+ socket = mock("socket")
41
+ socket.expects(:readline).times(lines.length).returns(*lines)
42
+
43
+ if good
44
+ socket.expects(:write).with("#{Net::SSH::Transport::ServerVersion::PROTO_VERSION}\r\n")
45
+ else
46
+ socket.expects(:write).never
47
+ end
48
+
49
+ socket
50
+ end
51
+
52
+ def subject(socket)
53
+ Net::SSH::Transport::ServerVersion.new(socket, nil)
54
+ end
55
+ end
56
+
57
+ end