mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-22 22:40:30 +08:00
实现WAF
This commit is contained in:
214
internal/grids/cell_test.go
Normal file
214
internal/grids/cell_test.go
Normal file
@@ -0,0 +1,214 @@
|
||||
package grids
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestCell_List(t *testing.T) {
|
||||
cell := NewCell()
|
||||
cell.Write(1, &Item{
|
||||
ValueInt64: 1,
|
||||
})
|
||||
cell.Write(2, &Item{
|
||||
ValueInt64: 2,
|
||||
})
|
||||
cell.Write(3, &Item{
|
||||
ValueInt64: 3,
|
||||
})
|
||||
|
||||
{
|
||||
t.Log("====")
|
||||
l := cell.list
|
||||
for e := l.head; e != nil; e = e.Next {
|
||||
t.Log("element:", e.ValueInt64)
|
||||
}
|
||||
}
|
||||
|
||||
cell.Write(1, &Item{
|
||||
ValueInt64: 1,
|
||||
})
|
||||
cell.Write(3, &Item{
|
||||
ValueInt64: 3,
|
||||
})
|
||||
cell.Write(3, &Item{
|
||||
ValueInt64: 3,
|
||||
})
|
||||
cell.Write(2, &Item{
|
||||
ValueInt64: 2,
|
||||
})
|
||||
cell.Delete(2)
|
||||
|
||||
{
|
||||
t.Log("====")
|
||||
l := cell.list
|
||||
for e := l.head; e != nil; e = e.Next {
|
||||
t.Log("element:", e.ValueInt64)
|
||||
}
|
||||
}
|
||||
|
||||
for _, m := range cell.mapping {
|
||||
t.Log(m.ValueInt64)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCell_LimitSize(t *testing.T) {
|
||||
cell := NewCell()
|
||||
cell.LimitSize = 1024
|
||||
|
||||
for i := int64(0); i < 100; i ++ {
|
||||
key := []byte(fmt.Sprintf("%d", i))
|
||||
cell.Write(HashKey(key), &Item{
|
||||
Key: key,
|
||||
ValueInt64: i,
|
||||
Type: ItemInt64,
|
||||
})
|
||||
}
|
||||
|
||||
t.Log("totalBytes:", cell.totalBytes)
|
||||
|
||||
{
|
||||
t.Log("====")
|
||||
l := cell.list
|
||||
s := []string{}
|
||||
for e := l.head; e != nil; e = e.Next {
|
||||
s = append(s, fmt.Sprintf("%d", e.ValueInt64))
|
||||
}
|
||||
t.Log("{ " + strings.Join(s, ", ") + " }")
|
||||
}
|
||||
|
||||
t.Log("mapping:", len(cell.mapping))
|
||||
s := []string{}
|
||||
for _, item := range cell.mapping {
|
||||
s = append(s, fmt.Sprintf("%d", item.ValueInt64))
|
||||
}
|
||||
t.Log("{ " + strings.Join(s, ", ") + " }")
|
||||
}
|
||||
|
||||
func TestCell_MemoryUsage(t *testing.T) {
|
||||
//runtime.GOMAXPROCS(4)
|
||||
|
||||
cell := NewCell()
|
||||
cell.LimitSize = 1024 * 1024 * 1024 * 1
|
||||
|
||||
before := time.Now()
|
||||
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(4)
|
||||
|
||||
for j := 0; j < 4; j ++ {
|
||||
go func(j int) {
|
||||
start := j * 50 * 10000
|
||||
for i := start; i < start+50*10000; i ++ {
|
||||
key := []byte(strconv.Itoa(i) + "VERY_LONG_STRING")
|
||||
cell.Write(HashKey(key), &Item{
|
||||
Key: key,
|
||||
ValueInt64: int64(i),
|
||||
Type: ItemInt64,
|
||||
})
|
||||
}
|
||||
wg.Done()
|
||||
}(j)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
t.Log("items:", len(cell.mapping))
|
||||
t.Log(time.Since(before).Seconds(), "s", "totalBytes:", cell.totalBytes/1024/1024, "M")
|
||||
//time.Sleep(10 * time.Second)
|
||||
}
|
||||
|
||||
func BenchmarkCell_Write(b *testing.B) {
|
||||
runtime.GOMAXPROCS(1)
|
||||
|
||||
cell := NewCell()
|
||||
|
||||
for i := 0; i < b.N; i ++ {
|
||||
key := []byte(strconv.Itoa(i) + "_LONG_KEY_LONG_KEY_LONG_KEY_LONG_KEY")
|
||||
cell.Write(HashKey(key), &Item{
|
||||
Key: key,
|
||||
ValueInt64: int64(i),
|
||||
Type: ItemInt64,
|
||||
})
|
||||
}
|
||||
|
||||
b.Log("items:", len(cell.mapping))
|
||||
}
|
||||
|
||||
func TestCell_Read(t *testing.T) {
|
||||
cell := NewCell()
|
||||
|
||||
cell.Write(1, &Item{
|
||||
ValueInt64: 1,
|
||||
ExpireAt: time.Now().Unix() + 3600,
|
||||
})
|
||||
cell.Write(2, &Item{
|
||||
ValueInt64: 2,
|
||||
ExpireAt: time.Now().Unix() + 3600,
|
||||
})
|
||||
cell.Write(3, &Item{
|
||||
ValueInt64: 3,
|
||||
ExpireAt: time.Now().Unix() + 3600,
|
||||
})
|
||||
|
||||
{
|
||||
s := []string{}
|
||||
cell.list.Range(func(item *Item) (goNext bool) {
|
||||
s = append(s, fmt.Sprintf("%d", item.ValueInt64))
|
||||
return true
|
||||
})
|
||||
t.Log("before:", s)
|
||||
}
|
||||
|
||||
t.Log(cell.Read(1).ValueInt64)
|
||||
|
||||
{
|
||||
s := []string{}
|
||||
cell.list.Range(func(item *Item) (goNext bool) {
|
||||
s = append(s, fmt.Sprintf("%d", item.ValueInt64))
|
||||
return true
|
||||
})
|
||||
t.Log("after:", s)
|
||||
}
|
||||
|
||||
t.Log(cell.Read(2).ValueInt64)
|
||||
|
||||
{
|
||||
s := []string{}
|
||||
cell.list.Range(func(item *Item) (goNext bool) {
|
||||
s = append(s, fmt.Sprintf("%d", item.ValueInt64))
|
||||
return true
|
||||
})
|
||||
t.Log("after:", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCell_Recycle(t *testing.T) {
|
||||
cell := NewCell()
|
||||
cell.Write(1, &Item{
|
||||
ValueInt64: 1,
|
||||
ExpireAt: time.Now().Unix() - 1,
|
||||
})
|
||||
|
||||
cell.Write(2, &Item{
|
||||
ValueInt64: 2,
|
||||
ExpireAt: time.Now().Unix() + 1,
|
||||
})
|
||||
|
||||
cell.Recycle()
|
||||
|
||||
{
|
||||
s := []string{}
|
||||
cell.list.Range(func(item *Item) (goNext bool) {
|
||||
s = append(s, fmt.Sprintf("%d", item.ValueInt64))
|
||||
return true
|
||||
})
|
||||
t.Log("after:", s)
|
||||
}
|
||||
|
||||
t.Log(cell.list.Len(), cell.totalBytes)
|
||||
}
|
||||
Reference in New Issue
Block a user