tree_store_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /*
  2. Copyright 2013 CoreOS Inc.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package store
  14. import (
  15. "fmt"
  16. "math/rand"
  17. "strconv"
  18. "testing"
  19. "time"
  20. )
  21. func TestStoreGet(t *testing.T) {
  22. ts := &tree{
  23. &treeNode{
  24. NewTestNode("/"),
  25. true,
  26. make(map[string]*treeNode),
  27. },
  28. }
  29. // create key
  30. ts.set("/foo", NewTestNode("bar"))
  31. // change value
  32. ts.set("/foo", NewTestNode("barbar"))
  33. // create key
  34. ts.set("/hello/foo", NewTestNode("barbarbar"))
  35. treeNode, ok := ts.get("/foo")
  36. if !ok {
  37. t.Fatalf("Expect to get node, but not")
  38. }
  39. if treeNode.Value != "barbar" {
  40. t.Fatalf("Expect value barbar, but got %s", treeNode.Value)
  41. }
  42. // create key
  43. treeNode, ok = ts.get("/hello/foo")
  44. if !ok {
  45. t.Fatalf("Expect to get node, but not")
  46. }
  47. if treeNode.Value != "barbarbar" {
  48. t.Fatalf("Expect value barbarbar, but got %s", treeNode.Value)
  49. }
  50. // create a key under other key
  51. ok = ts.set("/foo/foo", NewTestNode("bar"))
  52. if ok {
  53. t.Fatalf("shoud not add key under a exisiting key")
  54. }
  55. // delete a key
  56. ok = ts.delete("/foo")
  57. if !ok {
  58. t.Fatalf("cannot delete key")
  59. }
  60. // delete a directory
  61. ok = ts.delete("/hello")
  62. if ok {
  63. t.Fatalf("Expect cannot delet /hello, but deleted! ")
  64. }
  65. // test list
  66. ts.set("/hello/fooo", NewTestNode("barbarbar"))
  67. ts.set("/hello/foooo/foo", NewTestNode("barbarbar"))
  68. nodes, keys, ok := ts.list("/hello")
  69. if !ok {
  70. t.Fatalf("cannot list!")
  71. } else {
  72. nodes, _ := nodes.([]*Node)
  73. length := len(nodes)
  74. for i := 0; i < length; i++ {
  75. fmt.Println(keys[i], "=", nodes[i].Value)
  76. }
  77. }
  78. keys = GenKeys(100, 10)
  79. for i := 0; i < 100; i++ {
  80. value := strconv.Itoa(rand.Int())
  81. ts.set(keys[i], NewTestNode(value))
  82. treeNode, ok := ts.get(keys[i])
  83. if !ok {
  84. continue
  85. }
  86. if treeNode.Value != value {
  87. t.Fatalf("Expect value %s, but got %s", value, treeNode.Value)
  88. }
  89. }
  90. ts.traverse(f, true)
  91. }
  92. func TestTreeClone(t *testing.T) {
  93. keys := GenKeys(10000, 10)
  94. ts := &tree{
  95. &treeNode{
  96. NewTestNode("/"),
  97. true,
  98. make(map[string]*treeNode),
  99. },
  100. }
  101. backTs := &tree{
  102. &treeNode{
  103. NewTestNode("/"),
  104. true,
  105. make(map[string]*treeNode),
  106. },
  107. }
  108. // generate the first tree
  109. for _, key := range keys {
  110. value := strconv.Itoa(rand.Int())
  111. ts.set(key, NewTestNode(value))
  112. backTs.set(key, NewTestNode(value))
  113. }
  114. copyTs := ts.clone()
  115. // test if they are identical
  116. copyTs.traverse(ts.contain, false)
  117. // remove all the keys from first tree
  118. for _, key := range keys {
  119. ts.delete(key)
  120. }
  121. // test if they are identical
  122. // make sure changes in the first tree will affect the copy one
  123. copyTs.traverse(backTs.contain, false)
  124. }
  125. func BenchmarkTreeStoreSet(b *testing.B) {
  126. keys := GenKeys(10000, 10)
  127. b.ResetTimer()
  128. for i := 0; i < b.N; i++ {
  129. ts := &tree{
  130. &treeNode{
  131. NewTestNode("/"),
  132. true,
  133. make(map[string]*treeNode),
  134. },
  135. }
  136. for _, key := range keys {
  137. value := strconv.Itoa(rand.Int())
  138. ts.set(key, NewTestNode(value))
  139. }
  140. }
  141. }
  142. func BenchmarkTreeStoreGet(b *testing.B) {
  143. keys := GenKeys(10000, 10)
  144. ts := &tree{
  145. &treeNode{
  146. NewTestNode("/"),
  147. true,
  148. make(map[string]*treeNode),
  149. },
  150. }
  151. for _, key := range keys {
  152. value := strconv.Itoa(rand.Int())
  153. ts.set(key, NewTestNode(value))
  154. }
  155. b.ResetTimer()
  156. for i := 0; i < b.N; i++ {
  157. for _, key := range keys {
  158. ts.get(key)
  159. }
  160. }
  161. }
  162. func BenchmarkTreeStoreCopy(b *testing.B) {
  163. keys := GenKeys(10000, 10)
  164. ts := &tree{
  165. &treeNode{
  166. NewTestNode("/"),
  167. true,
  168. make(map[string]*treeNode),
  169. },
  170. }
  171. for _, key := range keys {
  172. value := strconv.Itoa(rand.Int())
  173. ts.set(key, NewTestNode(value))
  174. }
  175. b.ResetTimer()
  176. for i := 0; i < b.N; i++ {
  177. ts.clone()
  178. }
  179. }
  180. func BenchmarkTreeStoreList(b *testing.B) {
  181. keys := GenKeys(10000, 10)
  182. ts := &tree{
  183. &treeNode{
  184. NewTestNode("/"),
  185. true,
  186. make(map[string]*treeNode),
  187. },
  188. }
  189. for _, key := range keys {
  190. value := strconv.Itoa(rand.Int())
  191. ts.set(key, NewTestNode(value))
  192. }
  193. b.ResetTimer()
  194. for i := 0; i < b.N; i++ {
  195. for _, key := range keys {
  196. ts.list(key)
  197. }
  198. }
  199. }
  200. func (t *tree) contain(key string, node *Node) {
  201. _, ok := t.get(key)
  202. if !ok {
  203. panic("tree do not contain the given key")
  204. }
  205. }
  206. func f(key string, n *Node) {
  207. return
  208. }
  209. func NewTestNode(value string) Node {
  210. return Node{value, time.Unix(0, 0), nil}
  211. }