storetest.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package storetest
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "testing"
  7. "time"
  8. "github.com/TecharoHQ/anubis/lib/store"
  9. )
  10. func Common(t *testing.T, f store.Factory, config json.RawMessage) {
  11. if err := f.Valid(config); err != nil {
  12. t.Fatal(err)
  13. }
  14. s, err := f.Build(t.Context(), config)
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. for _, tt := range []struct {
  19. err error
  20. doer func(t *testing.T, s store.Interface) error
  21. name string
  22. }{
  23. {
  24. name: "basic get set delete",
  25. doer: func(t *testing.T, s store.Interface) error {
  26. if _, err := s.Get(t.Context(), t.Name()); !errors.Is(err, store.ErrNotFound) {
  27. t.Errorf("wanted %s to not exist in store but it exists anyways", t.Name())
  28. }
  29. if err := s.Set(t.Context(), t.Name(), []byte(t.Name()), 5*time.Minute); err != nil {
  30. return err
  31. }
  32. val, err := s.Get(t.Context(), t.Name())
  33. if errors.Is(err, store.ErrNotFound) {
  34. t.Errorf("wanted %s to exist in store but it does not: %v", t.Name(), err)
  35. } else if err != nil {
  36. t.Error(err)
  37. }
  38. if !bytes.Equal(val, []byte(t.Name())) {
  39. t.Logf("want: %q", t.Name())
  40. t.Logf("got: %q", string(val))
  41. t.Error("wrong value returned")
  42. }
  43. if err := s.Delete(t.Context(), t.Name()); err != nil {
  44. return err
  45. }
  46. if _, err := s.Get(t.Context(), t.Name()); !errors.Is(err, store.ErrNotFound) {
  47. t.Error("wanted test to not exist in store but it exists anyways")
  48. }
  49. if err := s.Delete(t.Context(), t.Name()); err == nil {
  50. t.Errorf("key %q does not exist and Delete did not return non-nil", t.Name())
  51. }
  52. return nil
  53. },
  54. },
  55. {
  56. name: "expires",
  57. doer: func(t *testing.T, s store.Interface) error {
  58. if err := s.Set(t.Context(), t.Name(), []byte(t.Name()), 150*time.Millisecond); err != nil {
  59. return err
  60. }
  61. //nosleep:bypass XXX(Xe): use Go's time faking thing in Go 1.25 when that is released.
  62. time.Sleep(155 * time.Millisecond)
  63. if _, err := s.Get(t.Context(), t.Name()); !errors.Is(err, store.ErrNotFound) {
  64. t.Errorf("wanted %s to not exist in store but it exists anyways", t.Name())
  65. }
  66. return nil
  67. },
  68. },
  69. } {
  70. t.Run(tt.name, func(t *testing.T) {
  71. t.Parallel()
  72. if err := tt.doer(t, s); !errors.Is(err, tt.err) {
  73. t.Logf("want: %v", tt.err)
  74. t.Logf("got: %v", err)
  75. t.Error("wrong error")
  76. }
  77. })
  78. }
  79. }