|
@@ -0,0 +1,111 @@
|
|
|
+package redriver
|
|
|
+
|
|
|
+import (
|
|
|
+ "log"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "testing"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func TestMessageStore_TTL(t *testing.T) {
|
|
|
+ const (
|
|
|
+ rh = "foo"
|
|
|
+ ttl = 1 * time.Millisecond
|
|
|
+ )
|
|
|
+ m1 := Message{ReceiptHandle: rh}
|
|
|
+ actual := newMessageStore(ttl)
|
|
|
+
|
|
|
+ _, ok := actual.Get(rh)
|
|
|
+ if ok {
|
|
|
+ t.Errorf("message found, but not yet stored")
|
|
|
+ }
|
|
|
+
|
|
|
+ actual.Set(m1)
|
|
|
+ m2, ok := actual.Get(rh)
|
|
|
+ if !ok {
|
|
|
+ t.Errorf("message not found, but expected to find it")
|
|
|
+ }
|
|
|
+ if m2.ReceiptHandle != rh {
|
|
|
+ t.Errorf("message RH is %q but key is %q", m2.ReceiptHandle, rh)
|
|
|
+ }
|
|
|
+ time.Sleep(3 * ttl)
|
|
|
+ _, ok = actual.Get(rh)
|
|
|
+ if ok {
|
|
|
+ t.Errorf("message found, but expected it to be expired")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestMessageStore_Flush(t *testing.T) {
|
|
|
+ len := func(ms *messageStore) int {
|
|
|
+ count := 0
|
|
|
+ ms.Range(func(_, _ any) bool {
|
|
|
+ count++
|
|
|
+ return true
|
|
|
+ })
|
|
|
+ return count
|
|
|
+ }
|
|
|
+ const limit = 10
|
|
|
+ ms := newMessageStore(1 * time.Minute)
|
|
|
+ defer ms.Close()
|
|
|
+ for i := 0; i < limit; i++ {
|
|
|
+ ms.Set(Message{ReceiptHandle: strconv.Itoa(i)})
|
|
|
+ }
|
|
|
+ if actualLen := len(ms); actualLen != limit {
|
|
|
+ t.Fatalf("expected %d items, got %d", len(ms), actualLen)
|
|
|
+ }
|
|
|
+ ms.Flush()
|
|
|
+ if actualLen := len(ms); actualLen != 0 {
|
|
|
+ t.Fatalf("expected no items, got %d", actualLen)
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func TestMessageStore_Set(t *testing.T) {
|
|
|
+ for _, test := range [...]struct {
|
|
|
+ name string
|
|
|
+ input string
|
|
|
+ expectErr bool
|
|
|
+ }{
|
|
|
+ {"valid RH", "foo", false},
|
|
|
+ {"empty RH", "", true},
|
|
|
+ } {
|
|
|
+ t.Run(test.name, func(t *testing.T) {
|
|
|
+ ms := newMessageStore(time.Minute)
|
|
|
+ defer ms.Close()
|
|
|
+ actual := ms.Set(Message{ReceiptHandle: test.input})
|
|
|
+ if actual != nil != test.expectErr {
|
|
|
+ t.Errorf("expected error %t, but got error %t", test.expectErr, actual)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestMessageStore_Get_sad(t *testing.T) {
|
|
|
+ ms := newMessageStore(time.Minute)
|
|
|
+ defer ms.Close()
|
|
|
+ ms.Map.Store("foo", "sad")
|
|
|
+ _, ok := ms.Get("foo")
|
|
|
+ if ok {
|
|
|
+ t.Fatalf("expected failure, but got success")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestMessageStore_expire(t *testing.T) {
|
|
|
+ const ttl = 1 * time.Millisecond
|
|
|
+ ms := newMessageStore(ttl)
|
|
|
+ w := &strings.Builder{}
|
|
|
+ log.SetOutput(w)
|
|
|
+ ms.Map.Store(13, Message{ReceiptHandle: "13"})
|
|
|
+ ms.Map.Store("13", "vendredi")
|
|
|
+ time.Sleep(3 * ttl)
|
|
|
+ ms.Close()
|
|
|
+ s := w.String()
|
|
|
+ if !strings.Contains(s, "map contains a non-string key") {
|
|
|
+ t.Errorf("expected expiry to have logged a key warning, but found none")
|
|
|
+ }
|
|
|
+ if !strings.Contains(s, "map contains a non-Messsage entry") {
|
|
|
+ t.Errorf("expected expiry to have logged a data warning, but found none")
|
|
|
+ }
|
|
|
+
|
|
|
+}
|