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.

99 lines
2.5 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. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  22. db, dir := newTempDB(t, backend)
  23. defer os.RemoveAll(dir)
  24. itr := IteratePrefix(db, []byte("2"))
  25. db.SetSync(bz("1"), bz("value_1"))
  26. checkInvalid(t, itr)
  27. })
  28. }
  29. }
  30. // Empty iterator for prefix starting after db entry.
  31. func TestPrefixIteratorNoMatch2(t *testing.T) {
  32. for backend := range backends {
  33. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  34. db, dir := newTempDB(t, backend)
  35. defer os.RemoveAll(dir)
  36. db.SetSync(bz("3"), bz("value_3"))
  37. itr := IteratePrefix(db, []byte("4"))
  38. checkInvalid(t, itr)
  39. })
  40. }
  41. }
  42. // Iterator with single val for db with single val, starting from that val.
  43. func TestPrefixIteratorMatch1(t *testing.T) {
  44. for backend := range backends {
  45. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  46. db, dir := newTempDB(t, backend)
  47. defer os.RemoveAll(dir)
  48. db.SetSync(bz("2"), bz("value_2"))
  49. itr := IteratePrefix(db, bz("2"))
  50. checkValid(t, itr, true)
  51. checkItem(t, itr, bz("2"), bz("value_2"))
  52. checkNext(t, itr, false)
  53. // Once invalid...
  54. checkInvalid(t, itr)
  55. })
  56. }
  57. }
  58. // Iterator with prefix iterates over everything with same prefix.
  59. func TestPrefixIteratorMatches1N(t *testing.T) {
  60. for backend := range backends {
  61. t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
  62. db, dir := newTempDB(t, backend)
  63. defer os.RemoveAll(dir)
  64. // prefixed
  65. db.SetSync(bz("a/1"), bz("value_1"))
  66. db.SetSync(bz("a/3"), bz("value_3"))
  67. // not
  68. db.SetSync(bz("b/3"), bz("value_3"))
  69. db.SetSync(bz("a-3"), bz("value_3"))
  70. db.SetSync(bz("a.3"), bz("value_3"))
  71. db.SetSync(bz("abcdefg"), bz("value_3"))
  72. itr := IteratePrefix(db, bz("a/"))
  73. checkValid(t, itr, true)
  74. checkItem(t, itr, bz("a/1"), bz("value_1"))
  75. checkNext(t, itr, true)
  76. checkItem(t, itr, bz("a/3"), bz("value_3"))
  77. // Bad!
  78. checkNext(t, itr, false)
  79. //Once invalid...
  80. checkInvalid(t, itr)
  81. })
  82. }
  83. }