Files

44 lines
1.2 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package i3ipc
import (
"bytes"
"encoding/binary"
"io"
"testing"
)
type fragments struct{ io.Reader }
func (r fragments) Read(b []byte) (int, error) { return r.Reader.Read(b[:min(1, len(b))]) }
func TestFraming(t *testing.T) {
var wire bytes.Buffer
body := []byte(`{"change":"résumé"}`)
if err := writeMessage(&wire, modeEvent, body); err != nil {
t.Fatal(err)
}
frame := bytes.Clone(wire.Bytes())
got, err := readMessage(fragments{&wire})
if err != nil || got.kind != modeEvent || !bytes.Equal(got.body, body) {
t.Fatalf("%+v %v", got, err)
}
for name, bad := range map[string][]byte{
"header": frame[:12], "body": frame[:len(frame)-1],
"magic": append([]byte("no-ipc"), frame[6:]...),
"json": append(bytes.Clone(frame[:14]), bytes.Repeat([]byte("x"), len(body))...),
} {
t.Run(name, func(t *testing.T) {
if _, err := readMessage(bytes.NewReader(bad)); err == nil {
t.Fatal("accepted malformed frame")
}
})
}
huge := bytes.Clone(frame[:14])
binary.NativeEndian.PutUint32(huge[6:10], maxPayload+1)
if _, err := readMessage(bytes.NewReader(huge)); err == nil {
t.Fatal("accepted oversized frame")
}
}