github.com/alpe/etcd@v0.1.2-0.20130915230056-09f31af88aeb/store/tree_store_test.go (about) 1 package store 2 3 import ( 4 "fmt" 5 "math/rand" 6 "strconv" 7 "testing" 8 "time" 9 ) 10 11 func TestStoreGet(t *testing.T) { 12 13 ts := &tree{ 14 &treeNode{ 15 NewTestNode("/"), 16 true, 17 make(map[string]*treeNode), 18 }, 19 } 20 21 // create key 22 ts.set("/foo", NewTestNode("bar")) 23 // change value 24 ts.set("/foo", NewTestNode("barbar")) 25 // create key 26 ts.set("/hello/foo", NewTestNode("barbarbar")) 27 treeNode, ok := ts.get("/foo") 28 29 if !ok { 30 t.Fatalf("Expect to get node, but not") 31 } 32 if treeNode.Value != "barbar" { 33 t.Fatalf("Expect value barbar, but got %s", treeNode.Value) 34 } 35 36 // create key 37 treeNode, ok = ts.get("/hello/foo") 38 if !ok { 39 t.Fatalf("Expect to get node, but not") 40 } 41 if treeNode.Value != "barbarbar" { 42 t.Fatalf("Expect value barbarbar, but got %s", treeNode.Value) 43 } 44 45 // create a key under other key 46 ok = ts.set("/foo/foo", NewTestNode("bar")) 47 if ok { 48 t.Fatalf("shoud not add key under a exisiting key") 49 } 50 51 // delete a key 52 ok = ts.delete("/foo") 53 if !ok { 54 t.Fatalf("cannot delete key") 55 } 56 57 // delete a directory 58 ok = ts.delete("/hello") 59 if ok { 60 t.Fatalf("Expect cannot delet /hello, but deleted! ") 61 } 62 63 // test list 64 ts.set("/hello/fooo", NewTestNode("barbarbar")) 65 ts.set("/hello/foooo/foo", NewTestNode("barbarbar")) 66 67 nodes, keys, ok := ts.list("/hello") 68 69 if !ok { 70 t.Fatalf("cannot list!") 71 } else { 72 nodes, _ := nodes.([]*Node) 73 length := len(nodes) 74 75 for i := 0; i < length; i++ { 76 fmt.Println(keys[i], "=", nodes[i].Value) 77 } 78 } 79 80 keys = GenKeys(100, 10) 81 82 for i := 0; i < 100; i++ { 83 value := strconv.Itoa(rand.Int()) 84 ts.set(keys[i], NewTestNode(value)) 85 treeNode, ok := ts.get(keys[i]) 86 87 if !ok { 88 continue 89 } 90 if treeNode.Value != value { 91 t.Fatalf("Expect value %s, but got %s", value, treeNode.Value) 92 } 93 94 } 95 ts.traverse(f, true) 96 } 97 98 func TestTreeClone(t *testing.T) { 99 keys := GenKeys(10000, 10) 100 101 ts := &tree{ 102 &treeNode{ 103 NewTestNode("/"), 104 true, 105 make(map[string]*treeNode), 106 }, 107 } 108 109 backTs := &tree{ 110 &treeNode{ 111 NewTestNode("/"), 112 true, 113 make(map[string]*treeNode), 114 }, 115 } 116 117 // generate the first tree 118 for _, key := range keys { 119 value := strconv.Itoa(rand.Int()) 120 ts.set(key, NewTestNode(value)) 121 backTs.set(key, NewTestNode(value)) 122 } 123 124 copyTs := ts.clone() 125 126 // test if they are identical 127 copyTs.traverse(ts.contain, false) 128 129 // remove all the keys from first tree 130 for _, key := range keys { 131 ts.delete(key) 132 } 133 134 // test if they are identical 135 // make sure changes in the first tree will affect the copy one 136 copyTs.traverse(backTs.contain, false) 137 138 } 139 140 func BenchmarkTreeStoreSet(b *testing.B) { 141 142 keys := GenKeys(10000, 10) 143 144 b.ResetTimer() 145 for i := 0; i < b.N; i++ { 146 147 ts := &tree{ 148 &treeNode{ 149 NewTestNode("/"), 150 true, 151 make(map[string]*treeNode), 152 }, 153 } 154 155 for _, key := range keys { 156 value := strconv.Itoa(rand.Int()) 157 ts.set(key, NewTestNode(value)) 158 } 159 } 160 } 161 162 func BenchmarkTreeStoreGet(b *testing.B) { 163 164 keys := GenKeys(10000, 10) 165 166 ts := &tree{ 167 &treeNode{ 168 NewTestNode("/"), 169 true, 170 make(map[string]*treeNode), 171 }, 172 } 173 174 for _, key := range keys { 175 value := strconv.Itoa(rand.Int()) 176 ts.set(key, NewTestNode(value)) 177 } 178 179 b.ResetTimer() 180 for i := 0; i < b.N; i++ { 181 for _, key := range keys { 182 ts.get(key) 183 } 184 } 185 } 186 187 func BenchmarkTreeStoreCopy(b *testing.B) { 188 keys := GenKeys(10000, 10) 189 190 ts := &tree{ 191 &treeNode{ 192 NewTestNode("/"), 193 true, 194 make(map[string]*treeNode), 195 }, 196 } 197 198 for _, key := range keys { 199 value := strconv.Itoa(rand.Int()) 200 ts.set(key, NewTestNode(value)) 201 } 202 203 b.ResetTimer() 204 for i := 0; i < b.N; i++ { 205 ts.clone() 206 } 207 } 208 209 func BenchmarkTreeStoreList(b *testing.B) { 210 211 keys := GenKeys(10000, 10) 212 213 ts := &tree{ 214 &treeNode{ 215 NewTestNode("/"), 216 true, 217 make(map[string]*treeNode), 218 }, 219 } 220 221 for _, key := range keys { 222 value := strconv.Itoa(rand.Int()) 223 ts.set(key, NewTestNode(value)) 224 } 225 226 b.ResetTimer() 227 for i := 0; i < b.N; i++ { 228 for _, key := range keys { 229 ts.list(key) 230 } 231 } 232 } 233 234 func (t *tree) contain(key string, node *Node) { 235 _, ok := t.get(key) 236 if !ok { 237 panic("tree do not contain the given key") 238 } 239 } 240 241 func f(key string, n *Node) { 242 return 243 } 244 245 func NewTestNode(value string) Node { 246 return Node{value, time.Unix(0, 0), nil} 247 }