You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.6 KiB

  1. package db
  2. import (
  3. "fmt"
  4. "os"
  5. "testing"
  6. )
  7. // Empty iterator for empty db.
  8. func TestPrefixIteratorNoMatchNil(t *testing.T) {
  9. for backend := range backends {
  10. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  11. db, dir := newTempDB(t, backend)
  12. defer os.RemoveAll(dir)
  13. itr := IteratePrefix(db, []byte("2"))
  14. checkInvalid(t, itr)
  15. })
  16. }
  17. }
  18. // Empty iterator for db populated after iterator created.
  19. func TestPrefixIteratorNoMatch1(t *testing.T) {
  20. for backend := range backends {
  21. if backend == BoltDBBackend {
  22. t.Log("bolt does not support concurrent writes while iterating")
  23. continue
  24. }
  25. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  26. db, dir := newTempDB(t, backend)
  27. defer os.RemoveAll(dir)
  28. itr := IteratePrefix(db, []byte("2"))
  29. db.SetSync(bz("1"), bz("value_1"))
  30. checkInvalid(t, itr)
  31. })
  32. }
  33. }
  34. // Empty iterator for prefix starting after db entry.
  35. func TestPrefixIteratorNoMatch2(t *testing.T) {
  36. for backend := range backends {
  37. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  38. db, dir := newTempDB(t, backend)
  39. defer os.RemoveAll(dir)
  40. db.SetSync(bz("3"), bz("value_3"))
  41. itr := IteratePrefix(db, []byte("4"))
  42. checkInvalid(t, itr)
  43. })
  44. }
  45. }
  46. // Iterator with single val for db with single val, starting from that val.
  47. func TestPrefixIteratorMatch1(t *testing.T) {
  48. for backend := range backends {
  49. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  50. db, dir := newTempDB(t, backend)
  51. defer os.RemoveAll(dir)
  52. db.SetSync(bz("2"), bz("value_2"))
  53. itr := IteratePrefix(db, bz("2"))
  54. checkValid(t, itr, true)
  55. checkItem(t, itr, bz("2"), bz("value_2"))
  56. checkNext(t, itr, false)
  57. // Once invalid...
  58. checkInvalid(t, itr)
  59. })
  60. }
  61. }
  62. // Iterator with prefix iterates over everything with same prefix.
  63. func TestPrefixIteratorMatches1N(t *testing.T) {
  64. for backend := range backends {
  65. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  66. db, dir := newTempDB(t, backend)
  67. defer os.RemoveAll(dir)
  68. // prefixed
  69. db.SetSync(bz("a/1"), bz("value_1"))
  70. db.SetSync(bz("a/3"), bz("value_3"))
  71. // not
  72. db.SetSync(bz("b/3"), bz("value_3"))
  73. db.SetSync(bz("a-3"), bz("value_3"))
  74. db.SetSync(bz("a.3"), bz("value_3"))
  75. db.SetSync(bz("abcdefg"), bz("value_3"))
  76. itr := IteratePrefix(db, bz("a/"))
  77. checkValid(t, itr, true)
  78. checkItem(t, itr, bz("a/1"), bz("value_1"))
  79. checkNext(t, itr, true)
  80. checkItem(t, itr, bz("a/3"), bz("value_3"))
  81. // Bad!
  82. checkNext(t, itr, false)
  83. //Once invalid...
  84. checkInvalid(t, itr)
  85. })
  86. }
  87. }