44 lines
1.2 KiB
Go
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")
|
|
}
|
|
}
|