index_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package diskv
  2. import (
  3. "bytes"
  4. "reflect"
  5. "testing"
  6. "time"
  7. )
  8. func strLess(a, b string) bool { return a < b }
  9. func cmpStrings(a, b []string) bool {
  10. if len(a) != len(b) {
  11. return false
  12. }
  13. for i := 0; i < len(a); i++ {
  14. if a[i] != b[i] {
  15. return false
  16. }
  17. }
  18. return true
  19. }
  20. func (d *Diskv) isIndexed(key string) bool {
  21. if d.Index == nil {
  22. return false
  23. }
  24. for _, got := range d.Index.Keys("", 1000) {
  25. if got == key {
  26. return true
  27. }
  28. }
  29. return false
  30. }
  31. func TestIndexOrder(t *testing.T) {
  32. d := New(Options{
  33. BasePath: "index-test",
  34. Transform: func(string) []string { return []string{} },
  35. CacheSizeMax: 1024,
  36. Index: &BTreeIndex{},
  37. IndexLess: strLess,
  38. })
  39. defer d.EraseAll()
  40. v := []byte{'1', '2', '3'}
  41. d.Write("a", v)
  42. if !d.isIndexed("a") {
  43. t.Fatalf("'a' not indexed after write")
  44. }
  45. d.Write("1", v)
  46. d.Write("m", v)
  47. d.Write("-", v)
  48. d.Write("A", v)
  49. expectedKeys := []string{"-", "1", "A", "a", "m"}
  50. keys := []string{}
  51. for _, key := range d.Index.Keys("", 100) {
  52. keys = append(keys, key)
  53. }
  54. if !cmpStrings(keys, expectedKeys) {
  55. t.Fatalf("got %s, expected %s", keys, expectedKeys)
  56. }
  57. }
  58. func TestIndexLoad(t *testing.T) {
  59. d1 := New(Options{
  60. BasePath: "index-test",
  61. Transform: func(string) []string { return []string{} },
  62. CacheSizeMax: 1024,
  63. })
  64. defer d1.EraseAll()
  65. val := []byte{'1', '2', '3'}
  66. keys := []string{"a", "b", "c", "d", "e", "f", "g"}
  67. for _, key := range keys {
  68. d1.Write(key, val)
  69. }
  70. d2 := New(Options{
  71. BasePath: "index-test",
  72. Transform: func(string) []string { return []string{} },
  73. CacheSizeMax: 1024,
  74. Index: &BTreeIndex{},
  75. IndexLess: strLess,
  76. })
  77. defer d2.EraseAll()
  78. // check d2 has properly loaded existing d1 data
  79. for _, key := range keys {
  80. if !d2.isIndexed(key) {
  81. t.Fatalf("key '%s' not indexed on secondary", key)
  82. }
  83. }
  84. // cache one
  85. if readValue, err := d2.Read(keys[0]); err != nil {
  86. t.Fatalf("%s", err)
  87. } else if bytes.Compare(val, readValue) != 0 {
  88. t.Fatalf("%s: got %s, expected %s", keys[0], readValue, val)
  89. }
  90. // make sure it got cached
  91. for i := 0; i < 10 && !d2.isCached(keys[0]); i++ {
  92. time.Sleep(10 * time.Millisecond)
  93. }
  94. if !d2.isCached(keys[0]) {
  95. t.Fatalf("key '%s' not cached", keys[0])
  96. }
  97. // kill the disk
  98. d1.EraseAll()
  99. // cached value should still be there in the second
  100. if readValue, err := d2.Read(keys[0]); err != nil {
  101. t.Fatalf("%s", err)
  102. } else if bytes.Compare(val, readValue) != 0 {
  103. t.Fatalf("%s: got %s, expected %s", keys[0], readValue, val)
  104. }
  105. // but not in the original
  106. if _, err := d1.Read(keys[0]); err == nil {
  107. t.Fatalf("expected error reading from flushed store")
  108. }
  109. }
  110. func TestIndexKeysEmptyFrom(t *testing.T) {
  111. d := New(Options{
  112. BasePath: "index-test",
  113. Transform: func(string) []string { return []string{} },
  114. CacheSizeMax: 1024,
  115. Index: &BTreeIndex{},
  116. IndexLess: strLess,
  117. })
  118. defer d.EraseAll()
  119. for _, k := range []string{"a", "c", "z", "b", "x", "b", "y"} {
  120. d.Write(k, []byte("1"))
  121. }
  122. want := []string{"a", "b", "c", "x", "y", "z"}
  123. have := d.Index.Keys("", 99)
  124. if !reflect.DeepEqual(want, have) {
  125. t.Errorf("want %v, have %v", want, have)
  126. }
  127. }