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) } } }