aboutsummaryrefslogtreecommitdiff
path: root/pktline/pktline_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-01-30 10:24:26 +0100
committerGravatar Runxi Yu2026-01-30 10:24:26 +0100
commit063179e197b341db541b367ebfdf2c7cbd8bf5f9 (patch)
treec277868ea5f945bd4efc4449d272748dcef22977 /pktline/pktline_test.go
parentconfig: Add package-level doc-comment (diff)
signatureNo signature
pktline: Move out of internal; fix package-level doc-comment
Diffstat (limited to 'pktline/pktline_test.go')
-rw-r--r--pktline/pktline_test.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/pktline/pktline_test.go b/pktline/pktline_test.go
new file mode 100644
index 00000000..4dae708b
--- /dev/null
+++ b/pktline/pktline_test.go
@@ -0,0 +1,88 @@
+package pktline
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "testing"
+)
+
+func TestWriteReadLineRoundtrip(t *testing.T) {
+ var buf bytes.Buffer
+ payload := []byte("hello\n")
+ if err := WriteLine(&buf, payload); err != nil {
+ t.Fatalf("WriteLine: %v", err)
+ }
+
+ dst := make([]byte, 64)
+ line, n, status, err := ReadLine(&buf, dst)
+ if err != nil {
+ t.Fatalf("ReadLine: %v", err)
+ }
+ if status != StatusData {
+ t.Fatalf("status: got %v, want %v", status, StatusData)
+ }
+ if n != len(payload) {
+ t.Fatalf("n: got %d, want %d", n, len(payload))
+ }
+ if !bytes.Equal(line, payload) {
+ t.Fatalf("payload: got %q, want %q", line, payload)
+ }
+}
+
+func TestReadLineSpecialPackets(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ status Status
+ }{
+ {"flush", "0000", StatusFlush},
+ {"delim", "0001", StatusDelim},
+ {"response_end", "0002", StatusResponseEnd},
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ r := bytes.NewBufferString(tt.input)
+ dst := make([]byte, 16)
+ line, n, status, err := ReadLine(r, dst)
+ if err != nil {
+ t.Fatalf("ReadLine: %v", err)
+ }
+ if status != tt.status {
+ t.Fatalf("status: got %v, want %v", status, tt.status)
+ }
+ if n != 0 || len(line) != 0 {
+ t.Fatalf("expected empty payload, got %d bytes", n)
+ }
+ })
+ }
+}
+
+func TestReadLineInvalidHeader(t *testing.T) {
+ r := bytes.NewBufferString("zzzz")
+ dst := make([]byte, 16)
+ _, _, _, err := ReadLine(r, dst)
+ if !errors.Is(err, ErrInvalidHeader) {
+ t.Fatalf("expected ErrInvalidHeader, got %v", err)
+ }
+}
+
+func TestReadLineBufferTooSmall(t *testing.T) {
+ var buf bytes.Buffer
+ payload := []byte("abcd")
+ if err := WriteLine(&buf, payload); err != nil {
+ t.Fatalf("WriteLine: %v", err)
+ }
+ dst := make([]byte, 2)
+ _, _, _, err := ReadLine(&buf, dst)
+ if !errors.Is(err, ErrBufferTooSmall) {
+ t.Fatalf("expected ErrBufferTooSmall, got %v", err)
+ }
+}
+
+func TestWriteLineTooLarge(t *testing.T) {
+ payload := make([]byte, maxPacketDataLen+1)
+ if err := WriteLine(io.Discard, payload); !errors.Is(err, ErrPacketTooLarge) {
+ t.Fatalf("expected ErrPacketTooLarge, got %v", err)
+ }
+}