github.com/deis/deis@v1.13.5-0.20170519182049-1d9e59fbdbfc/Godeps/_workspace/src/golang.org/x/crypto/ssh/transport_test.go (about)

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