aboutsummaryrefslogtreecommitdiff
path: root/internal/net/conn_bound_test.go
blob: 45b0f904b047a33050e4fe11885501800867a65f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package net

import (
	"bufio"
	"strings"
	"testing"
)

// Regression: the oversized-line handler drains the rest of the line before
// returning. ReadSlice returns a slice into a reusable buffer, so the
// truncated prefix must be copied out before draining or it gets overwritten
// by the remainder of the client's input.
func TestOversizedLineKeepsTruncatedPrefix(t *testing.T) {
	oversized := strings.Repeat("A", maxLineLength*2) + strings.Repeat("Z", maxLineLength*3) + "\n"
	c := &tcpConn{reader: bufio.NewReaderSize(strings.NewReader(oversized+"look\n"), maxLineLength*4)}

	got, err := c.ReadMessage()
	if err != nil {
		t.Fatalf("oversized line produced an error: %v", err)
	}
	if got != strings.Repeat("A", maxLineLength) {
		t.Fatalf("truncated prefix corrupted by buffer reuse: got %q...", got[:20])
	}

	next, err := c.ReadMessage()
	if err != nil {
		t.Fatalf("reader did not recover after an oversized line: %v", err)
	}
	if next != "look" {
		t.Fatalf("subsequent line lost: got %q", next)
	}
}

func TestNormalLinesUnaffected(t *testing.T) {
	c := &tcpConn{reader: bufio.NewReaderSize(strings.NewReader("look\nsay hi\r\n"), maxLineLength*4)}
	for _, want := range []string{"look", "say hi"} {
		got, err := c.ReadMessage()
		if err != nil || got != want {
			t.Fatalf("ReadMessage()=(%q,%v), want (%q,nil)", got, err, want)
		}
	}
}