- Fix 314 errcheck violations (blank identifier for unrecoverable errors) - Fix errorlint violation (errors.Is for io.EOF) - Remove unused serveL7Route test helper - Simplify Duration.Seconds() selectors in tests - Remove unnecessary fmt.Sprintf in test - Migrate exclusion rules from issues.exclusions to linters.exclusions (v2 schema) - Add gosec test exclusions (G115, G304, G402, G705) - Disable fieldalignment govet analyzer (optimization, not correctness) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
155 lines
3.2 KiB
Go
155 lines
3.2 KiB
Go
package l7
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestPrefixConnRead(t *testing.T) {
|
|
// Create a TCP pair.
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen: %v", err)
|
|
}
|
|
defer func() { _ = ln.Close() }()
|
|
|
|
go func() {
|
|
conn, err := ln.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
_, _ = conn.Write([]byte("WORLD"))
|
|
}()
|
|
|
|
conn, err := net.Dial("tcp", ln.Addr().String())
|
|
if err != nil {
|
|
t.Fatalf("dial: %v", err)
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
|
|
pc := NewPrefixConn(conn, []byte("HELLO"))
|
|
|
|
// Read all data: should get "HELLOWORLD".
|
|
_ = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
all, err := io.ReadAll(pc)
|
|
if err != nil {
|
|
t.Fatalf("ReadAll: %v", err)
|
|
}
|
|
if string(all) != "HELLOWORLD" {
|
|
t.Fatalf("got %q, want %q", all, "HELLOWORLD")
|
|
}
|
|
}
|
|
|
|
func TestPrefixConnSmallReads(t *testing.T) {
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen: %v", err)
|
|
}
|
|
defer func() { _ = ln.Close() }()
|
|
|
|
go func() {
|
|
conn, err := ln.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
_, _ = conn.Write([]byte("CD"))
|
|
}()
|
|
|
|
conn, err := net.Dial("tcp", ln.Addr().String())
|
|
if err != nil {
|
|
t.Fatalf("dial: %v", err)
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
|
|
pc := NewPrefixConn(conn, []byte("AB"))
|
|
|
|
// Read 1 byte at a time from the prefix.
|
|
buf := make([]byte, 1)
|
|
n, err := pc.Read(buf)
|
|
if err != nil || n != 1 || buf[0] != 'A' {
|
|
t.Fatalf("first read: n=%d, err=%v, buf=%q", n, err, buf[:n])
|
|
}
|
|
n, err = pc.Read(buf)
|
|
if err != nil || n != 1 || buf[0] != 'B' {
|
|
t.Fatalf("second read: n=%d, err=%v, buf=%q", n, err, buf[:n])
|
|
}
|
|
|
|
// Now reads come from the underlying conn.
|
|
_ = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
rest, err := io.ReadAll(pc)
|
|
if err != nil {
|
|
t.Fatalf("ReadAll: %v", err)
|
|
}
|
|
if string(rest) != "CD" {
|
|
t.Fatalf("got %q, want %q", rest, "CD")
|
|
}
|
|
}
|
|
|
|
func TestPrefixConnEmptyPrefix(t *testing.T) {
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen: %v", err)
|
|
}
|
|
defer func() { _ = ln.Close() }()
|
|
|
|
go func() {
|
|
conn, err := ln.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
_, _ = conn.Write([]byte("DATA"))
|
|
}()
|
|
|
|
conn, err := net.Dial("tcp", ln.Addr().String())
|
|
if err != nil {
|
|
t.Fatalf("dial: %v", err)
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
|
|
pc := NewPrefixConn(conn, nil)
|
|
_ = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
all, err := io.ReadAll(pc)
|
|
if err != nil {
|
|
t.Fatalf("ReadAll: %v", err)
|
|
}
|
|
if string(all) != "DATA" {
|
|
t.Fatalf("got %q, want %q", all, "DATA")
|
|
}
|
|
}
|
|
|
|
func TestPrefixConnDelegates(t *testing.T) {
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen: %v", err)
|
|
}
|
|
defer func() { _ = ln.Close() }()
|
|
|
|
go func() {
|
|
conn, _ := ln.Accept()
|
|
if conn != nil {
|
|
_ = conn.Close()
|
|
}
|
|
}()
|
|
|
|
conn, err := net.Dial("tcp", ln.Addr().String())
|
|
if err != nil {
|
|
t.Fatalf("dial: %v", err)
|
|
}
|
|
defer func() { _ = conn.Close() }()
|
|
|
|
pc := NewPrefixConn(conn, []byte("X"))
|
|
|
|
// RemoteAddr, LocalAddr should delegate.
|
|
if pc.RemoteAddr() == nil {
|
|
t.Fatal("RemoteAddr returned nil")
|
|
}
|
|
if pc.LocalAddr() == nil {
|
|
t.Fatal("LocalAddr returned nil")
|
|
}
|
|
}
|