fiber/middleware/idempotency/locker_test.go
leonklingele adcf92dec1
🚀 Feature: Add idempotency middleware (v2 backport) (#2288)
* 🚀 Feature: Add idempotency middleware (#2253)

* middleware: add idempotency middleware

* middleware/idempotency: use fiber.Storage instead of custom storage

* middleware/idempotency: only allocate data if really required

* middleware/idempotency: marshal response using msgp

* middleware/idempotency: add msgp tests

* middleware/idempotency: do not export response

* middleware/idempotency: disable msgp's -io option to disable generating unused methods

* middleware/idempotency: switch to time.Duration based app.Test

* middleware/idempotency: only create closure once

* middleware/idempotency: add benchmarks

* middleware/idempotency: optimize strings.ToLower when making comparison

The real "strings.ToLower" still needs to be used when storing the data.

* middleware/idempotency: safe-copy body

* middleware/idempotency: backport to v2
2023-01-13 08:38:50 +01:00

60 lines
870 B
Go

package idempotency_test
import (
"testing"
"time"
"github.com/gofiber/fiber/v2/middleware/idempotency"
"github.com/gofiber/fiber/v2/utils"
)
// go test -run Test_MemoryLock
func Test_MemoryLock(t *testing.T) {
t.Parallel()
l := idempotency.NewMemoryLock()
{
err := l.Lock("a")
utils.AssertEqual(t, nil, err)
}
{
done := make(chan struct{})
go func() {
defer close(done)
err := l.Lock("a")
utils.AssertEqual(t, nil, err)
}()
select {
case <-done:
t.Fatal("lock acquired again")
case <-time.After(time.Second):
}
}
{
err := l.Lock("b")
utils.AssertEqual(t, nil, err)
}
{
err := l.Unlock("b")
utils.AssertEqual(t, nil, err)
}
{
err := l.Lock("b")
utils.AssertEqual(t, nil, err)
}
{
err := l.Unlock("c")
utils.AssertEqual(t, nil, err)
}
{
err := l.Lock("d")
utils.AssertEqual(t, nil, err)
}
}