package node
import (
"bytes"
"encoding/json"
"sync"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// --- bufpool.go tests ---
func TestGetBuffer_ReturnsResetBuffer(t *testing.T) {
t.Run("buffer is initially empty", func(t *testing.T) {
buf := getBuffer()
defer putBuffer(buf)
assert.Equal(t, 0, buf.Len(), "buffer from pool should have zero length")
})
t.Run("buffer is reset after reuse", func(t *testing.T) {
buf := getBuffer()
buf.WriteString("stale data that should be cleared")
putBuffer(buf)
buf2 := getBuffer()
defer putBuffer(buf2)
assert.Equal(t, 0, buf2.Len(),
"reused buffer should be reset (no stale data)")
})
}
func TestPutBuffer_DiscardsOversizedBuffers(t *testing.T) {
t.Run("buffer at 64KB limit is pooled", func(t *testing.T) {
buf := getBuffer()
buf.Grow(65536)
putBuffer(buf)
buf2 := getBuffer()
defer putBuffer(buf2)
assert.Equal(t, 0, buf2.Len())
})
t.Run("buffer exceeding 64KB is discarded", func(t *testing.T) {
buf := getBuffer()
large := make([]byte, 65537)
buf.Write(large)
assert.Greater(t, buf.Cap(), 65536, "buffer should have grown past 64KB")
putBuffer(buf)
buf2 := getBuffer()
defer putBuffer(buf2)
assert.LessOrEqual(t, buf2.Cap(), 65536,
"pool should not return an oversized buffer")
})
}
func TestBufPool_BufferIndependence(t *testing.T) {
buf1 := getBuffer()
buf2 := getBuffer()
buf1.WriteString("buffer-one")
buf2.WriteString("buffer-two")
assert.Equal(t, "buffer-one", buf1.String())
assert.Equal(t, "buffer-two", buf2.String())
buf1.WriteString("-extra")
assert.Equal(t, "buffer-one-extra", buf1.String())
assert.Equal(t, "buffer-two", buf2.String())
putBuffer(buf1)
putBuffer(buf2)
}
func TestMarshalJSON_BasicTypes(t *testing.T) {
tests := []struct {
name string
input interface{}
}{
{
name: "string value",
input: "hello",
},
{
name: "integer value",
input: 42,
},
{
name: "float value",
input: 3.14,
},
{
name: "boolean value",
input: true,
},
{
name: "nil value",
input: nil,
},
{
name: "struct value",
input: PingPayload{SentAt: 1234567890},
},
{
name: "map value",
input: map[string]interface{}{"key": "value", "num": 42},
},
{
name: "slice value",
input: []int{1, 2, 3},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := MarshalJSON(tt.input)
require.NoError(t, err)
expected, err := json.Marshal(tt.input)
require.NoError(t, err)
assert.JSONEq(t, string(expected), string(got),
"MarshalJSON output should match json.Marshal")
})
}
}
func TestMarshalJSON_NoTrailingNewline(t *testing.T) {
data, err := MarshalJSON(map[string]string{"key": "value"})
require.NoError(t, err)
assert.NotEqual(t, byte('\n'), data[len(data)-1],
"MarshalJSON should strip the trailing newline added by json.Encoder")
}
func TestMarshalJSON_HTMLEscaping(t *testing.T) {
input := map[string]string{"html": ""}
data, err := MarshalJSON(input)
require.NoError(t, err)
assert.Contains(t, string(data), "