telnet_test.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package cli
  2. import (
  3. "bytes"
  4. "io"
  5. "net"
  6. "testing"
  7. "time"
  8. )
  9. type fragmentConn struct {
  10. chunks [][]byte
  11. written bytes.Buffer
  12. }
  13. func (c *fragmentConn) Read(p []byte) (int, error) {
  14. if len(c.chunks) == 0 {
  15. return 0, io.EOF
  16. }
  17. b := c.chunks[0]
  18. n := copy(p, b)
  19. if n == len(b) {
  20. c.chunks = c.chunks[1:]
  21. } else {
  22. c.chunks[0] = b[n:]
  23. }
  24. return n, nil
  25. }
  26. func (c *fragmentConn) Write(p []byte) (int, error) { return c.written.Write(p) }
  27. func (c *fragmentConn) Close() error { return nil }
  28. func (c *fragmentConn) LocalAddr() net.Addr { return nil }
  29. func (c *fragmentConn) RemoteAddr() net.Addr { return nil }
  30. func (c *fragmentConn) SetDeadline(time.Time) error { return nil }
  31. func (c *fragmentConn) SetReadDeadline(time.Time) error { return nil }
  32. func (c *fragmentConn) SetWriteDeadline(time.Time) error { return nil }
  33. func TestTelnetFragmentedNegotiationAndNewline(t *testing.T) {
  34. c := &fragmentConn{chunks: [][]byte{{'a', iac}, {do}, {optEcho, '\r'}, {'\n', 'b'}}}
  35. tc := NewTelnetConn(c)
  36. got, err := io.ReadAll(tc)
  37. if err != nil || string(got) != "a\nb" {
  38. t.Fatalf("got %q, %v", got, err)
  39. }
  40. if !bytes.Contains(c.written.Bytes(), []byte{iac, will, optEcho}) {
  41. t.Fatal("missing option response")
  42. }
  43. n, err := tc.Write([]byte("a\nb"))
  44. if err != nil || n != 3 {
  45. t.Fatalf("write %d %v", n, err)
  46. }
  47. }