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