| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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()
- }
- }
|