store_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package store
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "time"
  6. )
  7. func TestStoreGetDelete(t *testing.T) {
  8. s := CreateStore(100)
  9. s.Set("foo", "bar", time.Unix(0, 0), 1)
  10. res, err := s.Get("foo")
  11. if err != nil {
  12. t.Fatalf("Unknown error")
  13. }
  14. var result Response
  15. json.Unmarshal(res, &result)
  16. if result.Value != "bar" {
  17. t.Fatalf("Cannot get stored value")
  18. }
  19. s.Delete("foo", 2)
  20. _, err = s.Get("foo")
  21. if err == nil {
  22. t.Fatalf("Got deleted value")
  23. }
  24. }
  25. func TestTestAndSet(t *testing.T) {
  26. s := CreateStore(100)
  27. s.Set("foo", "bar", time.Unix(0, 0), 1)
  28. _, err := s.TestAndSet("foo", "barbar", "barbar", time.Unix(0, 0), 2)
  29. if err == nil {
  30. t.Fatalf("test bar == barbar should fail")
  31. }
  32. _, err = s.TestAndSet("foo", "bar", "barbar", time.Unix(0, 0), 3)
  33. if err != nil {
  34. t.Fatalf("test bar == bar should succeed")
  35. }
  36. _, err = s.TestAndSet("foo", "", "barbar", time.Unix(0, 0), 4)
  37. if err == nil {
  38. t.Fatalf("test empty == bar should fail")
  39. }
  40. _, err = s.TestAndSet("fooo", "bar", "barbar", time.Unix(0, 0), 5)
  41. if err == nil {
  42. t.Fatalf("test bar == non-existing key should fail")
  43. }
  44. _, err = s.TestAndSet("fooo", "", "bar", time.Unix(0, 0), 6)
  45. if err != nil {
  46. t.Fatalf("test empty == non-existing key should succeed")
  47. }
  48. }
  49. func TestSaveAndRecovery(t *testing.T) {
  50. s := CreateStore(100)
  51. s.Set("foo", "bar", time.Unix(0, 0), 1)
  52. s.Set("foo2", "bar2", time.Now().Add(time.Second*5), 2)
  53. state, err := s.Save()
  54. if err != nil {
  55. t.Fatalf("Cannot Save %s", err)
  56. }
  57. newStore := CreateStore(100)
  58. // wait for foo2 expires
  59. time.Sleep(time.Second * 6)
  60. newStore.Recovery(state)
  61. res, err := newStore.Get("foo")
  62. var result Response
  63. json.Unmarshal(res, &result)
  64. if result.Value != "bar" {
  65. t.Fatalf("Recovery Fail")
  66. }
  67. res, err = newStore.Get("foo2")
  68. if err == nil {
  69. t.Fatalf("Get expired value")
  70. }
  71. s.Delete("foo", 3)
  72. }
  73. func TestExpire(t *testing.T) {
  74. // test expire
  75. s := CreateStore(100)
  76. s.Set("foo", "bar", time.Now().Add(time.Second*1), 0)
  77. time.Sleep(2 * time.Second)
  78. _, err := s.Get("foo")
  79. if err == nil {
  80. t.Fatalf("Got expired value")
  81. }
  82. //test change expire time
  83. s.Set("foo", "bar", time.Now().Add(time.Second*10), 1)
  84. _, err = s.Get("foo")
  85. if err != nil {
  86. t.Fatalf("Cannot get Value")
  87. }
  88. s.Set("foo", "barbar", time.Now().Add(time.Second*1), 2)
  89. time.Sleep(2 * time.Second)
  90. _, err = s.Get("foo")
  91. if err == nil {
  92. t.Fatalf("Got expired value")
  93. }
  94. // test change expire to stable
  95. s.Set("foo", "bar", time.Now().Add(time.Second*1), 3)
  96. s.Set("foo", "bar", time.Unix(0, 0), 4)
  97. time.Sleep(2 * time.Second)
  98. _, err = s.Get("foo")
  99. if err != nil {
  100. t.Fatalf("Cannot get Value")
  101. }
  102. // test stable to expire
  103. s.Set("foo", "bar", time.Now().Add(time.Second*1), 5)
  104. time.Sleep(2 * time.Second)
  105. _, err = s.Get("foo")
  106. if err == nil {
  107. t.Fatalf("Got expired value")
  108. }
  109. // test set older node
  110. s.Set("foo", "bar", time.Now().Add(-time.Second*1), 6)
  111. _, err = s.Get("foo")
  112. if err == nil {
  113. t.Fatalf("Got expired value")
  114. }
  115. }
  116. func BenchmarkStoreSet(b *testing.B) {
  117. s := CreateStore(100)
  118. keys := GenKeys(10000, 5)
  119. b.ResetTimer()
  120. for i := 0; i < b.N; i++ {
  121. for i, key := range keys {
  122. s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
  123. }
  124. s = CreateStore(100)
  125. }
  126. }
  127. func BenchmarkStoreGet(b *testing.B) {
  128. s := CreateStore(100)
  129. keys := GenKeys(10000, 5)
  130. for i, key := range keys {
  131. s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
  132. }
  133. b.ResetTimer()
  134. for i := 0; i < b.N; i++ {
  135. for _, key := range keys {
  136. s.Get(key)
  137. }
  138. }
  139. }
  140. func BenchmarkStoreSnapshotCopy(b *testing.B) {
  141. s := CreateStore(100)
  142. keys := GenKeys(10000, 5)
  143. for i, key := range keys {
  144. s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
  145. }
  146. var state []byte
  147. b.ResetTimer()
  148. for i := 0; i < b.N; i++ {
  149. s.clone()
  150. }
  151. b.SetBytes(int64(len(state)))
  152. }
  153. func BenchmarkSnapshotSaveJson(b *testing.B) {
  154. s := CreateStore(100)
  155. keys := GenKeys(10000, 5)
  156. for i, key := range keys {
  157. s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
  158. }
  159. var state []byte
  160. b.ResetTimer()
  161. for i := 0; i < b.N; i++ {
  162. state, _ = s.Save()
  163. }
  164. b.SetBytes(int64(len(state)))
  165. }
  166. func BenchmarkSnapshotRecovery(b *testing.B) {
  167. s := CreateStore(100)
  168. keys := GenKeys(10000, 5)
  169. for i, key := range keys {
  170. s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
  171. }
  172. state, _ := s.Save()
  173. b.ResetTimer()
  174. for i := 0; i < b.N; i++ {
  175. newStore := CreateStore(100)
  176. newStore.Recovery(state)
  177. }
  178. b.SetBytes(int64(len(state)))
  179. }