- 新增 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 编译通过
67 lines
1.6 KiB
Go
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)
|
|
}
|
|
}
|