mirror of
https://github.com/gofiber/fiber.git
synced 2025-05-21 06:59:51 +00:00
* 🚀 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
60 lines
870 B
Go
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)
|
|
}
|
|
}
|