Files
CLIProxyAPI/internal/util/gjson_test.go
sususu ea8882bf26 Add a no-copy GJSON parse helper
gjson.ParseBytes copies the entire document before returning a result, which
is prohibitive for multi-megabyte requests. ParseGJSONBytesNoCopy mirrors the
existing GetGJSONBytesNoCopy contract: the returned result references the
caller's bytes, so callers must neither retain it nor mutate the buffer while
it is in use.
2026-08-09 00:40:57 +08:00

46 lines
1.4 KiB
Go

package util
import (
"testing"
"unsafe"
)
func TestGetGJSONBytesNoCopy(t *testing.T) {
input := []byte(`{"request":{"contents":[{"role":"user"}]}}`)
contents := GetGJSONBytesNoCopy(input, "request.contents")
if !contents.IsArray() || contents.Get("0.role").String() != "user" {
t.Fatalf("request.contents = %s, want user content array", contents.Raw)
}
}
func TestGetGJSONBytesNoCopyEmptyInput(t *testing.T) {
if result := GetGJSONBytesNoCopy(nil, "contents"); result.Exists() {
t.Fatalf("empty input result = %s, want missing", result.Raw)
}
}
func TestParseGJSONBytesNoCopy(t *testing.T) {
input := []byte(`{"request":{"contents":[{"role":"user"}]}}`)
root := ParseGJSONBytesNoCopy(input)
if !root.IsObject() || root.Get("request.contents.0.role").String() != "user" {
t.Fatalf("parsed root = %s, want user content array", root.Raw)
}
}
func TestParseGJSONBytesNoCopyReferencesInput(t *testing.T) {
input := []byte(`{"contents":[{"role":"user"}]}`)
root := ParseGJSONBytesNoCopy(input)
if len(root.Raw) != len(input) {
t.Fatalf("raw length = %d, want %d", len(root.Raw), len(input))
}
if unsafe.StringData(root.Raw) != unsafe.SliceData(input) {
t.Fatal("parsed result copied the input instead of referencing it")
}
}
func TestParseGJSONBytesNoCopyEmptyInput(t *testing.T) {
if result := ParseGJSONBytesNoCopy(nil); result.Exists() {
t.Fatalf("empty input result = %s, want missing", result.Raw)
}
}