Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

114 linhas
2.7 KiB

  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ssh
  5. import (
  6. "bytes"
  7. "crypto/rand"
  8. "encoding/binary"
  9. "strings"
  10. "testing"
  11. )
  12. func TestReadVersion(t *testing.T) {
  13. longVersion := strings.Repeat("SSH-2.0-bla", 50)[:253]
  14. multiLineVersion := strings.Repeat("ignored\r\n", 20) + "SSH-2.0-bla\r\n"
  15. cases := map[string]string{
  16. "SSH-2.0-bla\r\n": "SSH-2.0-bla",
  17. "SSH-2.0-bla\n": "SSH-2.0-bla",
  18. multiLineVersion: "SSH-2.0-bla",
  19. longVersion + "\r\n": longVersion,
  20. }
  21. for in, want := range cases {
  22. result, err := readVersion(bytes.NewBufferString(in))
  23. if err != nil {
  24. t.Errorf("readVersion(%q): %s", in, err)
  25. }
  26. got := string(result)
  27. if got != want {
  28. t.Errorf("got %q, want %q", got, want)
  29. }
  30. }
  31. }
  32. func TestReadVersionError(t *testing.T) {
  33. longVersion := strings.Repeat("SSH-2.0-bla", 50)[:253]
  34. multiLineVersion := strings.Repeat("ignored\r\n", 50) + "SSH-2.0-bla\r\n"
  35. cases := []string{
  36. longVersion + "too-long\r\n",
  37. multiLineVersion,
  38. }
  39. for _, in := range cases {
  40. if _, err := readVersion(bytes.NewBufferString(in)); err == nil {
  41. t.Errorf("readVersion(%q) should have failed", in)
  42. }
  43. }
  44. }
  45. func TestExchangeVersionsBasic(t *testing.T) {
  46. v := "SSH-2.0-bla"
  47. buf := bytes.NewBufferString(v + "\r\n")
  48. them, err := exchangeVersions(buf, []byte("xyz"))
  49. if err != nil {
  50. t.Errorf("exchangeVersions: %v", err)
  51. }
  52. if want := "SSH-2.0-bla"; string(them) != want {
  53. t.Errorf("got %q want %q for our version", them, want)
  54. }
  55. }
  56. func TestExchangeVersions(t *testing.T) {
  57. cases := []string{
  58. "not\x000allowed",
  59. "not allowed\x01\r\n",
  60. }
  61. for _, c := range cases {
  62. buf := bytes.NewBufferString("SSH-2.0-bla\r\n")
  63. if _, err := exchangeVersions(buf, []byte(c)); err == nil {
  64. t.Errorf("exchangeVersions(%q): should have failed", c)
  65. }
  66. }
  67. }
  68. type closerBuffer struct {
  69. bytes.Buffer
  70. }
  71. func (b *closerBuffer) Close() error {
  72. return nil
  73. }
  74. func TestTransportMaxPacketWrite(t *testing.T) {
  75. buf := &closerBuffer{}
  76. tr := newTransport(buf, rand.Reader, true)
  77. huge := make([]byte, maxPacket+1)
  78. err := tr.writePacket(huge)
  79. if err == nil {
  80. t.Errorf("transport accepted write for a huge packet.")
  81. }
  82. }
  83. func TestTransportMaxPacketReader(t *testing.T) {
  84. var header [5]byte
  85. huge := make([]byte, maxPacket+128)
  86. binary.BigEndian.PutUint32(header[0:], uint32(len(huge)))
  87. // padding.
  88. header[4] = 0
  89. buf := &closerBuffer{}
  90. buf.Write(header[:])
  91. buf.Write(huge)
  92. tr := newTransport(buf, rand.Reader, true)
  93. _, err := tr.readPacket()
  94. if err == nil {
  95. t.Errorf("transport succeeded reading huge packet.")
  96. } else if !strings.Contains(err.Error(), "large") {
  97. t.Errorf("got %q, should mention %q", err.Error(), "large")
  98. }
  99. }