mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-09-03 06:35:00 +08:00
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.
46 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|