etcd/store/watcher_test.go
2013-08-04 23:10:16 -07:00

96 lines
1.7 KiB
Go

package store
import (
"math/rand"
"strconv"
"testing"
"time"
)
func TestWatch(t *testing.T) {
s := CreateStore(100)
watchers := make([]*Watcher, 10)
for i, _ := range watchers {
// create a new watcher
watchers[i] = NewWatcher()
// add to the watchers list
s.AddWatcher("foo", watchers[i], 0)
}
s.Set("/foo/foo", "bar", time.Unix(0, 0), 1)
for _, watcher := range watchers {
// wait for the notification for any changing
res := <-watcher.C
if res == nil {
t.Fatal("watcher is cleared")
}
}
for i, _ := range watchers {
// create a new watcher
watchers[i] = NewWatcher()
// add to the watchers list
s.AddWatcher("foo/foo/foo", watchers[i], 0)
}
s.watcher.stopWatchers()
for _, watcher := range watchers {
// wait for the notification for any changing
res := <-watcher.C
if res != nil {
t.Fatal("watcher is cleared")
}
}
}
// BenchmarkWatch creates 10K watchers watch at /foo/[paht] each time.
// Path is randomly chosen with max depth 10.
// It should take less than 15ms to wake up 10K watchers.
func BenchmarkWatch(b *testing.B) {
s := CreateStore(100)
key := make([]string, 10000)
for i := 0; i < 10000; i++ {
key[i] = "/foo/"
depth := rand.Intn(10)
for j := 0; j < depth; j++ {
key[i] += "/" + strconv.Itoa(rand.Int()%10)
}
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
watchers := make([]*Watcher, 10000)
for i := 0; i < 10000; i++ {
// create a new watcher
watchers[i] = NewWatcher()
// add to the watchers list
s.AddWatcher(key[i], watchers[i], 0)
}
s.watcher.stopWatchers()
for _, watcher := range watchers {
// wait for the notification for any changing
<-watcher.C
}
s.watcher = newWatcherHub()
}
}