Files
qing c4154d4db9 feat(gomsg): pymsg/libmsg 协议的 Go 实现,waf logclient 抽取接入
- 新增 gomsg/:帧协议(4B 大端长度 + UTF-8,64MiB 上限)、MsgClient/MsgServer、
  RpcClient/RpcServer(_route 分发、错误脱敏、panic 恢复、json.Number 保精度)、
  AsyncQueue[T]、LogClient(集中式日志,级别过滤 + fail-safe),线协议与 Python/C++ 字节级兼容
- waf/internal/logclient 改为 gomsg 薄适配层(336→20 行),main/engine/proxy 零改动
- gomsg 26 项单测全绿(-race);waf 编译通过
2026-08-23 11:21:40 +00:00

67 lines
1.6 KiB
Go

package gomsg
import (
"bytes"
"encoding/binary"
"errors"
"io"
"testing"
)
func TestEncodeRoundTrip(t *testing.T) {
payload := []byte(`{"hello":"世界"}`)
frame, err := Encode(payload)
if err != nil {
t.Fatal(err)
}
if len(frame) != 4+len(payload) {
t.Fatalf("frame length = %d, want %d", len(frame), 4+len(payload))
}
if got := binary.BigEndian.Uint32(frame[:4]); got != uint32(len(payload)) {
t.Fatalf("header = %d, want %d", got, len(payload))
}
got, err := ReadFrame(bytes.NewReader(frame), 0)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(got, payload) {
t.Fatalf("payload mismatch: %q", got)
}
}
func TestEncodeTooLarge(t *testing.T) {
payload := make([]byte, MaxMsgSize+1)
if _, err := Encode(payload); err == nil {
t.Fatal("expected error for oversized payload")
}
}
func TestReadFrameTooLarge(t *testing.T) {
header := make([]byte, 4)
binary.BigEndian.PutUint32(header, MaxMsgSize+1)
_, err := ReadFrame(bytes.NewReader(header), 0)
if err == nil {
t.Fatal("expected error for oversized header")
}
}
func TestReadFrameTruncated(t *testing.T) {
frame, _ := Encode([]byte("abcdef"))
if _, err := ReadFrame(bytes.NewReader(frame[:len(frame)-3]), 0); err == nil {
t.Fatal("expected error for truncated payload")
}
}
func TestReadFrameMaxParam(t *testing.T) {
frame, _ := Encode([]byte("hello"))
if _, err := ReadFrame(bytes.NewReader(frame), 4); err == nil {
t.Fatal("expected error when max < payload length")
}
}
func TestReadFrameEOF(t *testing.T) {
if _, err := ReadFrame(bytes.NewReader(nil), 0); !errors.Is(err, io.EOF) {
t.Fatalf("expected EOF, got %v", err)
}
}