mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 15:51:54 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			470 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			470 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
						|
 | 
						|
package kvstore_test
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/TeaOSLab/EdgeNode/internal/utils/kvstore"
 | 
						|
	"github.com/iwind/TeaGo/assert"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestStringValueEncoder_Encode(t *testing.T) {
 | 
						|
	var a = assert.NewAssertion(t)
 | 
						|
 | 
						|
	var encoder = kvstore.NewStringValueEncoder[string]()
 | 
						|
	data, err := encoder.Encode("abcdefg")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	value, err := encoder.Decode(data)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	a.IsTrue(value == "abcdefg")
 | 
						|
}
 | 
						|
 | 
						|
func TestIntValueEncoder_Encode(t *testing.T) {
 | 
						|
	var a = assert.NewAssertion(t)
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int8]()
 | 
						|
		data, err := encoder.Encode(1)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 1)
 | 
						|
		t.Log("int8", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int8]()
 | 
						|
		data, err := encoder.Encode(-1)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == -1)
 | 
						|
		t.Log("int8", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int16]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("int16", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int16]()
 | 
						|
		data, err := encoder.Encode(-123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == -123)
 | 
						|
		t.Log("int16", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int32]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("int32", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int32]()
 | 
						|
		data, err := encoder.Encode(-123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == -123)
 | 
						|
		t.Log("int32", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int64]()
 | 
						|
		data, err := encoder.Encode(123456)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123456)
 | 
						|
		t.Log("int64", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int64]()
 | 
						|
		data, err := encoder.Encode(1234567890)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 1234567890)
 | 
						|
		t.Log("int64", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int64]()
 | 
						|
		data, err := encoder.Encode(-123456)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == -123456)
 | 
						|
		t.Log("int64", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("int", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int]()
 | 
						|
		data, err := encoder.Encode(-123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == -123)
 | 
						|
		t.Log("int", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("uint", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint8]()
 | 
						|
		data, err := encoder.Encode(97)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 97)
 | 
						|
		t.Log("uint8", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint16]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("uint16", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint32]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("uint32", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint64]()
 | 
						|
		data, err := encoder.Encode(123)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 123)
 | 
						|
		t.Log("uint64", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint64]()
 | 
						|
		data, err := encoder.Encode(1234567890)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		a.IsTrue(v == 1234567890)
 | 
						|
		t.Log("uint64", string(data), "=>", data, "=>", v)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestBytesValueEncoder_Encode(t *testing.T) {
 | 
						|
	var encoder = kvstore.NewBytesValueEncoder[[]byte]()
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode(nil)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		value, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log(data, "=>", value)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode([]byte("ABC"))
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		value, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log(data, "=>", value)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestBytesValueEncoder_Bool(t *testing.T) {
 | 
						|
	var encoder = kvstore.NewBoolValueEncoder[bool]()
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode(true)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		value, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log(data, "=>", value)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode(false)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		value, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log(data, "=>", value)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		value, err := encoder.Decode(nil)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log("nil", "=>", value)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		value, err := encoder.Decode([]byte{1, 2, 3, 4})
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log("nil", "=>", value)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type objectType struct {
 | 
						|
	Name string `json:"1"`
 | 
						|
	Age  int    `json:"2"`
 | 
						|
}
 | 
						|
 | 
						|
type objectTypeEncoder[T objectType] struct {
 | 
						|
	kvstore.BaseObjectEncoder[T]
 | 
						|
}
 | 
						|
 | 
						|
func (this *objectTypeEncoder[T]) EncodeField(value T, fieldName string) ([]byte, error) {
 | 
						|
	return nil, nil
 | 
						|
}
 | 
						|
 | 
						|
func TestBaseObjectEncoder_Encode(t *testing.T) {
 | 
						|
	var encoder = &objectTypeEncoder[objectType]{}
 | 
						|
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode(objectType{
 | 
						|
			Name: "lily",
 | 
						|
			Age:  20,
 | 
						|
		})
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log("encoded:", string(data))
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		value, err := encoder.Decode([]byte(`{"1":"lily","2":20}`))
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Logf("decoded: %+v", value)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type objectType2 struct {
 | 
						|
	Name string `json:"1"`
 | 
						|
	Age  int    `json:"2"`
 | 
						|
}
 | 
						|
 | 
						|
type objectTypeEncoder2[T interface{ *objectType2 }] struct {
 | 
						|
	kvstore.BaseObjectEncoder[T]
 | 
						|
}
 | 
						|
 | 
						|
func (this *objectTypeEncoder2[T]) EncodeField(value T, fieldName string) ([]byte, error) {
 | 
						|
	switch fieldName {
 | 
						|
	case "Name":
 | 
						|
		return []byte(any(value).(*objectType2).Name), nil
 | 
						|
	}
 | 
						|
	return nil, nil
 | 
						|
}
 | 
						|
 | 
						|
func TestBaseObjectEncoder_Encode2(t *testing.T) {
 | 
						|
	var encoder = &objectTypeEncoder2[*objectType2]{}
 | 
						|
 | 
						|
	{
 | 
						|
		data, err := encoder.Encode(&objectType2{
 | 
						|
			Name: "lily",
 | 
						|
			Age:  20,
 | 
						|
		})
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log("encoded:", string(data))
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		value, err := encoder.Decode([]byte(`{"1":"lily","2":20}`))
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Logf("decoded: %+v", value)
 | 
						|
	}
 | 
						|
 | 
						|
	{
 | 
						|
		field, err := encoder.EncodeField(&objectType2{
 | 
						|
			Name: "lily",
 | 
						|
			Age:  20,
 | 
						|
		}, "Name")
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		t.Log("encoded field:", string(field))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func BenchmarkStringValueEncoder_Encode(b *testing.B) {
 | 
						|
	for i := 0; i < b.N; i++ {
 | 
						|
		var encoder = kvstore.NewStringValueEncoder[string]()
 | 
						|
		data, err := encoder.Encode("1234567890")
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		_ = v
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func BenchmarkIntValueEncoder_Encode(b *testing.B) {
 | 
						|
	for i := 0; i < b.N; i++ {
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[int64]()
 | 
						|
		data, err := encoder.Encode(1234567890)
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		_ = v
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func BenchmarkUIntValueEncoder_Encode(b *testing.B) {
 | 
						|
	for i := 0; i < b.N; i++ {
 | 
						|
		var encoder = kvstore.NewIntValueEncoder[uint64]()
 | 
						|
		data, err := encoder.Encode(1234567890)
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		v, err := encoder.Decode(data)
 | 
						|
		if err != nil {
 | 
						|
			b.Fatal(err)
 | 
						|
		}
 | 
						|
		_ = v
 | 
						|
	}
 | 
						|
}
 |