kvstore_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package storage
  2. import (
  3. "crypto/rand"
  4. "os"
  5. "testing"
  6. )
  7. func TestRange(t *testing.T) {
  8. s := newStore("test")
  9. defer os.Remove("test")
  10. s.Put([]byte("foo"), []byte("bar"))
  11. s.Put([]byte("foo1"), []byte("bar1"))
  12. s.Put([]byte("foo2"), []byte("bar2"))
  13. tests := []struct {
  14. key, end []byte
  15. rev int64
  16. wrev int64
  17. // TODO: change this to the actual kv
  18. wN int64
  19. }{
  20. {
  21. []byte("foo"), []byte("foo3"), 0,
  22. 3, 3,
  23. },
  24. {
  25. []byte("foo"), []byte("foo1"), 0,
  26. 3, 1,
  27. },
  28. {
  29. []byte("foo"), []byte("foo3"), 1,
  30. 1, 1,
  31. },
  32. {
  33. []byte("foo"), []byte("foo3"), 2,
  34. 2, 2,
  35. },
  36. }
  37. for i, tt := range tests {
  38. kvs, rev := s.Range(tt.key, tt.end, 0, tt.rev)
  39. if len(kvs) != int(tt.wN) {
  40. t.Errorf("#%d: len(kvs) = %d, want %d", i, len(kvs), tt.wN)
  41. }
  42. if rev != tt.wrev {
  43. t.Errorf("#%d: rev = %d, want %d", i, tt.rev, tt.wrev)
  44. }
  45. }
  46. }
  47. func TestSimpleDeleteRange(t *testing.T) {
  48. tests := []struct {
  49. key, end []byte
  50. wrev int64
  51. wN int64
  52. }{
  53. {
  54. []byte("foo"), []byte("foo1"),
  55. 4, 1,
  56. },
  57. {
  58. []byte("foo"), []byte("foo2"),
  59. 4, 2,
  60. },
  61. {
  62. []byte("foo"), []byte("foo3"),
  63. 4, 3,
  64. },
  65. {
  66. []byte("foo3"), []byte("foo8"),
  67. 3, 0,
  68. },
  69. }
  70. for i, tt := range tests {
  71. s := newStore("test")
  72. s.Put([]byte("foo"), []byte("bar"))
  73. s.Put([]byte("foo1"), []byte("bar1"))
  74. s.Put([]byte("foo2"), []byte("bar2"))
  75. n, rev := s.DeleteRange(tt.key, tt.end)
  76. if n != tt.wN {
  77. t.Errorf("#%d: n = %d, want %d", i, n, tt.wN)
  78. }
  79. if rev != tt.wrev {
  80. t.Errorf("#%d: rev = %d, wang %d", i, rev, tt.wrev)
  81. }
  82. os.Remove("test")
  83. }
  84. }
  85. func TestRangeInSequence(t *testing.T) {
  86. s := newStore("test")
  87. defer os.Remove("test")
  88. s.Put([]byte("foo"), []byte("bar"))
  89. s.Put([]byte("foo1"), []byte("bar1"))
  90. s.Put([]byte("foo2"), []byte("bar2"))
  91. // remove foo
  92. n, rev := s.DeleteRange([]byte("foo"), nil)
  93. if n != 1 || rev != 4 {
  94. t.Fatalf("n = %d, index = %d, want (%d, %d)", n, rev, 1, 4)
  95. }
  96. // before removal foo
  97. kvs, rev := s.Range([]byte("foo"), []byte("foo3"), 0, 3)
  98. if len(kvs) != 3 {
  99. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 3)
  100. }
  101. // after removal foo
  102. kvs, rev = s.Range([]byte("foo"), []byte("foo3"), 0, 4)
  103. if len(kvs) != 2 {
  104. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 2)
  105. }
  106. // remove again -> expect nothing
  107. n, rev = s.DeleteRange([]byte("foo"), nil)
  108. if n != 0 || rev != 4 {
  109. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 0, 4)
  110. }
  111. // remove foo1
  112. n, rev = s.DeleteRange([]byte("foo"), []byte("foo2"))
  113. if n != 1 || rev != 5 {
  114. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 5)
  115. }
  116. // after removal foo1
  117. kvs, rev = s.Range([]byte("foo"), []byte("foo3"), 0, 5)
  118. if len(kvs) != 1 {
  119. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 1)
  120. }
  121. // remove foo2
  122. n, rev = s.DeleteRange([]byte("foo2"), []byte("foo3"))
  123. if n != 1 || rev != 6 {
  124. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 6)
  125. }
  126. // after removal foo2
  127. kvs, rev = s.Range([]byte("foo"), []byte("foo3"), 0, 6)
  128. if len(kvs) != 0 {
  129. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  130. }
  131. }
  132. func TestOneTnx(t *testing.T) {
  133. s := newStore("test")
  134. defer os.Remove("test")
  135. id := s.TnxBegin()
  136. for i := 0; i < 3; i++ {
  137. s.TnxPut(id, []byte("foo"), []byte("bar"))
  138. s.TnxPut(id, []byte("foo1"), []byte("bar1"))
  139. s.TnxPut(id, []byte("foo2"), []byte("bar2"))
  140. // remove foo
  141. n, rev, err := s.TnxDeleteRange(id, []byte("foo"), nil)
  142. if err != nil {
  143. t.Fatal(err)
  144. }
  145. if n != 1 || rev != 1 {
  146. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  147. }
  148. kvs, rev, err := s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  149. if err != nil {
  150. t.Fatal(err)
  151. }
  152. if len(kvs) != 2 {
  153. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 2)
  154. }
  155. // remove again -> expect nothing
  156. n, rev, err = s.TnxDeleteRange(id, []byte("foo"), nil)
  157. if err != nil {
  158. t.Fatal(err)
  159. }
  160. if n != 0 || rev != 1 {
  161. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 0, 1)
  162. }
  163. // remove foo1
  164. n, rev, err = s.TnxDeleteRange(id, []byte("foo"), []byte("foo2"))
  165. if err != nil {
  166. t.Fatal(err)
  167. }
  168. if n != 1 || rev != 1 {
  169. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  170. }
  171. // after removal foo1
  172. kvs, rev, err = s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  173. if err != nil {
  174. t.Fatal(err)
  175. }
  176. if len(kvs) != 1 {
  177. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 1)
  178. }
  179. // remove foo2
  180. n, rev, err = s.TnxDeleteRange(id, []byte("foo2"), []byte("foo3"))
  181. if err != nil {
  182. t.Fatal(err)
  183. }
  184. if n != 1 || rev != 1 {
  185. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  186. }
  187. // after removal foo2
  188. kvs, rev, err = s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  189. if err != nil {
  190. t.Fatal(err)
  191. }
  192. if len(kvs) != 0 {
  193. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  194. }
  195. }
  196. err := s.TnxEnd(id)
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. // After tnx
  201. kvs, rev := s.Range([]byte("foo"), []byte("foo3"), 0, 1)
  202. if len(kvs) != 0 {
  203. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  204. }
  205. if rev != 1 {
  206. t.Fatalf("rev = %d, want %d", rev, 1)
  207. }
  208. }
  209. func BenchmarkStorePut(b *testing.B) {
  210. s := newStore("test")
  211. defer os.Remove("test")
  212. // prepare keys
  213. keys := make([][]byte, b.N)
  214. for i := 0; i < b.N; i++ {
  215. keys[i] = make([]byte, 64)
  216. rand.Read(keys[i])
  217. }
  218. b.ResetTimer()
  219. for i := 0; i < b.N; i++ {
  220. s.Put(keys[i], []byte("foo"))
  221. }
  222. }