tree_store_test.go 4.1 KB

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