Files
EdgeNode/internal/caches/storage_memory_test.go

307 lines
6.6 KiB
Go
Raw Normal View History

2020-10-05 19:15:35 +08:00
package caches
import (
2021-10-17 20:23:10 +08:00
"bytes"
2020-10-05 19:15:35 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/rands"
2021-10-17 20:23:10 +08:00
"runtime"
"runtime/debug"
2020-10-05 19:15:35 +08:00
"strconv"
"testing"
"time"
)
2021-01-13 12:02:50 +08:00
func TestMemoryStorage_OpenWriter(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2020-10-05 19:15:35 +08:00
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc", time.Now().Unix()+60, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
2021-01-13 12:02:50 +08:00
_, _ = writer.WriteHeader([]byte("Header"))
2020-10-05 19:15:35 +08:00
_, _ = writer.Write([]byte("Hello"))
_, _ = writer.Write([]byte(", World"))
t.Log(storage.valuesMap)
{
reader, err := storage.OpenReader("abc", false)
2020-10-05 19:15:35 +08:00
if err != nil {
if err == ErrNotFound {
t.Log("not found: abc")
} else {
t.Fatal(err)
}
}
2021-01-13 12:02:50 +08:00
buf := make([]byte, 1024)
t.Log("status:", reader.Status())
err = reader.ReadHeader(buf, func(n int) (goNext bool, err error) {
t.Log("header:", string(buf[:n]))
return true, nil
})
if err != nil {
t.Fatal(err)
}
err = reader.ReadBody(buf, func(n int) (goNext bool, err error) {
t.Log("body:", string(buf[:n]))
return true, nil
})
if err != nil {
t.Fatal(err)
}
2020-10-05 19:15:35 +08:00
}
{
_, err := storage.OpenReader("abc 2", false)
2020-10-05 19:15:35 +08:00
if err != nil {
if err == ErrNotFound {
t.Log("not found: abc2")
} else {
t.Fatal(err)
}
}
}
2022-02-15 16:44:39 +08:00
writer, err = storage.OpenWriter("abc", time.Now().Unix()+60, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello123"))
{
reader, err := storage.OpenReader("abc", false)
2020-10-05 19:15:35 +08:00
if err != nil {
if err == ErrNotFound {
t.Log("not found: abc")
} else {
t.Fatal(err)
}
}
2021-01-13 12:02:50 +08:00
buf := make([]byte, 1024)
err = reader.ReadBody(buf, func(n int) (goNext bool, err error) {
t.Log("abc:", string(buf[:n]))
return true, nil
})
if err != nil {
t.Fatal(err)
}
2020-10-05 19:15:35 +08:00
}
}
2021-06-17 18:04:56 +08:00
func TestMemoryStorage_OpenReaderLock(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2021-06-17 18:04:56 +08:00
_ = storage.Init()
var h = storage.hash("test")
storage.valuesMap = map[uint64]*MemoryItem{
h: {
IsDone: true,
},
}
_, _ = storage.OpenReader("test", false)
2021-06-17 18:04:56 +08:00
}
2020-10-05 19:15:35 +08:00
func TestMemoryStorage_Delete(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2020-10-05 19:15:35 +08:00
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc", time.Now().Unix()+60, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
t.Log(len(storage.valuesMap))
}
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc1", time.Now().Unix()+60, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
t.Log(len(storage.valuesMap))
}
_ = storage.Delete("abc1")
t.Log(len(storage.valuesMap))
}
func TestMemoryStorage_Stat(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2020-10-05 19:15:35 +08:00
expiredAt := time.Now().Unix() + 60
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
t.Log(len(storage.valuesMap))
storage.AddToList(&Item{
Key: "abc",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc1", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
t.Log(len(storage.valuesMap))
storage.AddToList(&Item{
Key: "abc1",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
stat, err := storage.Stat()
if err != nil {
t.Fatal(err)
}
t.Log("===stat===")
logs.PrintAsJSON(stat, t)
}
func TestMemoryStorage_CleanAll(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2020-10-05 19:15:35 +08:00
expiredAt := time.Now().Unix() + 60
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
storage.AddToList(&Item{
Key: "abc",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc1", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
storage.AddToList(&Item{
Key: "abc1",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
err := storage.CleanAll()
if err != nil {
t.Fatal(err)
}
2021-05-19 12:07:35 +08:00
total, _ := storage.list.Count()
t.Log(total, len(storage.valuesMap))
2020-10-05 19:15:35 +08:00
}
func TestMemoryStorage_Purge(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2020-10-05 19:15:35 +08:00
expiredAt := time.Now().Unix() + 60
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
storage.AddToList(&Item{
Key: "abc",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
{
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter("abc1", expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
storage.AddToList(&Item{
Key: "abc1",
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
2020-12-23 21:28:50 +08:00
err := storage.Purge([]string{"abc", "abc1"}, "")
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
2021-05-19 12:07:35 +08:00
total, _ := storage.list.Count()
t.Log(total, len(storage.valuesMap))
2020-10-05 19:15:35 +08:00
}
func TestMemoryStorage_Expire(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{
MemoryAutoPurgeInterval: 5,
}, nil)
2020-10-05 19:15:35 +08:00
err := storage.Init()
if err != nil {
t.Fatal(err)
}
for i := 0; i < 1000; i++ {
expiredAt := time.Now().Unix() + int64(rands.Int(0, 60))
key := "abc" + strconv.Itoa(i)
2022-02-15 16:44:39 +08:00
writer, err := storage.OpenWriter(key, expiredAt, 200, -1)
2020-10-05 19:15:35 +08:00
if err != nil {
t.Fatal(err)
}
_, _ = writer.Write([]byte("Hello"))
storage.AddToList(&Item{
Key: key,
2021-01-13 12:02:50 +08:00
BodySize: 5,
2020-10-05 19:15:35 +08:00
ExpiredAt: expiredAt,
})
}
time.Sleep(70 * time.Second)
}
2021-06-17 18:04:56 +08:00
func TestMemoryStorage_Locker(t *testing.T) {
storage := NewMemoryStorage(&serverconfigs.HTTPCachePolicy{}, nil)
2021-06-17 18:04:56 +08:00
err := storage.Init()
if err != nil {
t.Fatal(err)
}
storage.locker.Lock()
err = storage.deleteWithoutLocker("a")
storage.locker.Unlock()
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
2021-10-17 20:23:10 +08:00
func TestMemoryStorage_Stop(t *testing.T) {
var stat1 = &runtime.MemStats{}
runtime.ReadMemStats(stat1)
var m = map[uint64]*MemoryItem{}
for i := 0; i < 1_000_000; i++ {
m[uint64(i)] = &MemoryItem{
HeaderValue: []byte("Hello, World"),
BodyValue: bytes.Repeat([]byte("Hello"), 1024),
}
}
m = map[uint64]*MemoryItem{}
var before = time.Now()
//runtime.GC()
debug.FreeOSMemory()
/**go func() {
time.Sleep(10 * time.Second)
runtime.GC()
}()**/
t.Log(time.Since(before).Seconds()*1000, "ms")
var stat2 = &runtime.MemStats{}
runtime.ReadMemStats(stat2)
if stat2.HeapInuse > stat1.HeapInuse {
t.Log(stat2.HeapInuse, stat1.HeapInuse, (stat2.HeapInuse-stat1.HeapInuse)/1024/1024, "MB")
} else {
t.Log("0 MB")
}
t.Log(len(m))
}