mirror of https://github.com/tidwall/tile38.git
99 lines
1.8 KiB
Go
99 lines
1.8 KiB
Go
|
package expire
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/rand"
|
||
|
"sort"
|
||
|
"sync"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type testItem struct {
|
||
|
str string
|
||
|
exp time.Time
|
||
|
}
|
||
|
|
||
|
func (item *testItem) Expires() time.Time {
|
||
|
return item.exp
|
||
|
}
|
||
|
|
||
|
func TestBasic(t *testing.T) {
|
||
|
var list List
|
||
|
now := time.Now()
|
||
|
list.Push(&testItem{"13", now.Add(13)})
|
||
|
list.Push(&testItem{"11", now.Add(11)})
|
||
|
list.Push(&testItem{"14", now.Add(14)})
|
||
|
list.Push(&testItem{"10", now.Add(10)})
|
||
|
list.Push(&testItem{"15", now.Add(15)})
|
||
|
list.Push(&testItem{"12", now.Add(12)})
|
||
|
|
||
|
var lunix int64
|
||
|
for list.queue.len > 0 {
|
||
|
n2 := list.queue.pop()
|
||
|
if n2.unix < lunix {
|
||
|
t.Fatal("out of order")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestRandomQueue(t *testing.T) {
|
||
|
N := 100000
|
||
|
now := time.Now()
|
||
|
var list List
|
||
|
for i := 0; i < N; i++ {
|
||
|
list.Push(&testItem{fmt.Sprintf("%d", i),
|
||
|
now.Add(time.Duration(rand.Float64() * float64(time.Second)))})
|
||
|
}
|
||
|
// var wg sync.WaitGroup
|
||
|
// wg.Add(N)
|
||
|
// var items []Item
|
||
|
// list.Expired = func(item Item) {
|
||
|
// items = append(items, item)
|
||
|
// wg.Done()
|
||
|
// }
|
||
|
|
||
|
// wg.Wait()
|
||
|
|
||
|
var items []Item
|
||
|
for list.queue.len > 0 {
|
||
|
n1 := list.queue.peek()
|
||
|
n2 := list.queue.pop()
|
||
|
if n1 != n2 {
|
||
|
t.Fatal("mismatch")
|
||
|
}
|
||
|
if n1.unix > n2.unix {
|
||
|
t.Fatal("out of order")
|
||
|
}
|
||
|
items = append(items, n2.item)
|
||
|
}
|
||
|
|
||
|
if !sort.SliceIsSorted(items, func(i, j int) bool {
|
||
|
return items[i].Expires().Before(items[j].Expires())
|
||
|
}) {
|
||
|
t.Fatal("out of order")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func TestExpires(t *testing.T) {
|
||
|
N := 100000
|
||
|
now := time.Now()
|
||
|
var list List
|
||
|
for i := 0; i < N; i++ {
|
||
|
list.Push(&testItem{fmt.Sprintf("%d", i),
|
||
|
now.Add(time.Duration(rand.Float64() * float64(time.Second)))})
|
||
|
}
|
||
|
var wg sync.WaitGroup
|
||
|
wg.Add(N)
|
||
|
var items []Item
|
||
|
list.Expired = func(item Item) {
|
||
|
items = append(items, item)
|
||
|
wg.Done()
|
||
|
}
|
||
|
wg.Wait()
|
||
|
if len(items) != N {
|
||
|
t.Fatal("wrong result")
|
||
|
}
|
||
|
}
|