blob: ad1402f9516fef18082401ec2e61d6896c70ddfe [file] [log] [blame]
Matt Rosencrantz94502cf2015-03-18 09:43:44 -07001package rpc
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -07002
3import (
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -07004 "sort"
5 "sync"
6 "testing"
Jiri Simsa870ddd62014-06-27 14:56:58 -07007
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -07008 "v.io/x/ref/test/testutil"
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -07009)
10
11func randomKeys() []uint64 {
Cosmos Nicolaoua18a1eb2015-03-12 13:15:01 -070012 n := (testutil.Intn(256*10) / 10) + 256
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -070013 k := make([]uint64, n)
14 for i := 0; i < n; i++ {
Cosmos Nicolaoua18a1eb2015-03-12 13:15:01 -070015 k[i] = uint64(testutil.Int63())
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -070016 }
17 return k
18}
19
20type keySlice []uint64
21
22func (p keySlice) Len() int { return len(p) }
23func (p keySlice) Less(i, j int) bool { return p[i] < p[j] }
24func (p keySlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
25func (p keySlice) Sort() { sort.Sort(p) }
26
27func TestStoreRandom(t *testing.T) {
28 store := newStore()
29 keys := randomKeys()
30
31 for i := 0; i < len(keys); i++ {
32 r := []interface{}{i}
33 store.addEntry(keys[i], r)
34 }
35 if len(store.store) != len(keys) {
36 t.Errorf("num stored entries: got %d, want %d", len(store.store), len(keys))
37 }
38 for i := 0; i < len(keys); i++ {
39 // Each call to removeEntries will remove an unknown number of entries
40 // depending on the original randomised value of the ints.
41 store.removeEntriesTo(keys[i])
42 }
43 if len(store.store) != 0 {
44 t.Errorf("store is not empty: %d", len(store.store))
45 }
46}
47
48func TestStoreOrdered(t *testing.T) {
49 store := newStore()
50 keys := randomKeys()
51
52 for i := 0; i < len(keys); i++ {
53 r := []interface{}{i}
54 store.addEntry(keys[i], r)
55 }
56 if len(store.store) != len(keys) {
57 t.Errorf("num stored entries: got %d, want %d", len(store.store), len(keys))
58 }
59
60 (keySlice(keys)).Sort()
61 l := len(keys)
62 for i := 0; i < len(keys); i++ {
63 store.removeEntriesTo(keys[i])
64 l--
65 if len(store.store) != l {
66 t.Errorf("failed to remove a single item(%d): %d != %d", keys[i], len(store.store), l)
67 }
68 }
69 if len(store.store) != 0 {
70 t.Errorf("store is not empty: %d", len(store.store))
71 }
72}
73
74func TestStoreWaitForEntry(t *testing.T) {
75 store := newStore()
76 store.addEntry(1, []interface{}{"1"})
77 r := store.waitForEntry(1)
78 if r[0].(string) != "1" {
79 t.Errorf("Got: %q, Want: %q", r[0], "1")
80 }
81 ch := make(chan string)
82 go func(ch chan string) {
83 r := store.waitForEntry(2)
84 ch <- r[0].(string)
85 }(ch)
86 store.addEntry(2, []interface{}{"2"})
87 if result := <-ch; result != "2" {
88 t.Errorf("Got: %q, Want: %q", r[0], "2")
89 }
90}
91
92func TestStoreWaitForEntryRandom(t *testing.T) {
93 store := newStore()
94 keys := randomKeys()
95 var wg sync.WaitGroup
96 for _, k := range keys {
97 wg.Add(1)
98 go func(t *testing.T, id uint64) {
99 r := store.waitForEntry(id)
100 if r[0].(uint64) != id {
101 t.Errorf("Got: %d, Want: %d", r[0].(uint64), id)
102 }
103 wg.Done()
104 }(t, k)
105 }
106 (keySlice(keys)).Sort()
107 for _, k := range keys {
108 store.addEntry(k, []interface{}{k})
109 }
110 wg.Wait()
111}
112
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -0700113func TestStoreWaitForRemovedEntry(t *testing.T) {
114 store := newStore()
115 keys := randomKeys()
116 var wg sync.WaitGroup
117 for _, k := range keys {
118 wg.Add(1)
119 go func(t *testing.T, id uint64) {
Asim Shankarc14225c2014-05-23 17:18:36 -0700120 if r := store.waitForEntry(id); r != nil {
121 t.Errorf("Got %v, want nil", r)
Cosmos Nicolaou174a44e2014-05-16 13:59:30 -0700122 }
123 wg.Done()
124 }(t, k)
125 }
126 (keySlice(keys)).Sort()
127 for _, k := range keys {
128 store.removeEntriesTo(k)
129 }
130 wg.Wait()
131}
Asim Shankarc14225c2014-05-23 17:18:36 -0700132
133func TestStoreWaitForOldEntry(t *testing.T) {
134 store := newStore()
135 store.addEntry(1, []interface{}{"result"})
136 store.removeEntriesTo(1)
137 if got := store.waitForEntry(1); got != nil {
138 t.Errorf("Got %T=%v, want nil", got, got)
139 }
140}