feat(subscription): 有界队列执行维护并改进鉴权解析
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
//go:build unit
|
||||
|
||||
package service
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestSubscriptionMaintenanceQueue_TryEnqueue_QueueFull(t *testing.T) {
|
||||
q := NewSubscriptionMaintenanceQueue(1, 1)
|
||||
t.Cleanup(q.Stop)
|
||||
|
||||
block := make(chan struct{})
|
||||
var started atomic.Int32
|
||||
|
||||
require.NoError(t, q.TryEnqueue(func() {
|
||||
started.Store(1)
|
||||
<-block
|
||||
}))
|
||||
|
||||
// Wait until worker started consuming the first task.
|
||||
require.Eventually(t, func() bool { return started.Load() == 1 }, time.Second, 10*time.Millisecond)
|
||||
|
||||
// Queue size is 1; with the worker blocked, enqueueing one more should fill it.
|
||||
require.NoError(t, q.TryEnqueue(func() {}))
|
||||
|
||||
// Now the queue is full; next enqueue must fail.
|
||||
err := q.TryEnqueue(func() {})
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), "full")
|
||||
|
||||
close(block)
|
||||
}
|
||||
|
||||
func TestSubscriptionMaintenanceQueue_TryEnqueue_PanicDoesNotKillWorker(t *testing.T) {
|
||||
q := NewSubscriptionMaintenanceQueue(1, 8)
|
||||
t.Cleanup(q.Stop)
|
||||
|
||||
require.NoError(t, q.TryEnqueue(func() { panic("boom") }))
|
||||
|
||||
done := make(chan struct{})
|
||||
require.NoError(t, q.TryEnqueue(func() { close(done) }))
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
// ok
|
||||
case <-time.After(time.Second):
|
||||
t.Fatalf("worker did not continue after panic")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user