mirror of
https://github.com/hibiken/asynq.git
synced 2024-12-27 08:12:19 +08:00
188 lines
3.8 KiB
Go
188 lines
3.8 KiB
Go
// Copyright 2020 Kentaro Hibino. All rights reserved.
|
|
// Use of this source code is governed by a MIT license
|
|
// that can be found in the LICENSE file.
|
|
|
|
// Package testbroker exports a broker implementation that should be used in package testing.
|
|
package testbroker
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/go-redis/redis/v7"
|
|
"github.com/hibiken/asynq/internal/base"
|
|
)
|
|
|
|
var errRedisDown = errors.New("asynqtest: redis is down")
|
|
|
|
// TestBroker is a broker implementation which enables
|
|
// to simulate Redis failure in tests.
|
|
type TestBroker struct {
|
|
mu sync.Mutex
|
|
sleeping bool
|
|
|
|
// real broker
|
|
real base.Broker
|
|
}
|
|
|
|
func NewTestBroker(b base.Broker) *TestBroker {
|
|
return &TestBroker{real: b}
|
|
}
|
|
|
|
func (tb *TestBroker) Sleep() {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
tb.sleeping = true
|
|
}
|
|
|
|
func (tb *TestBroker) Wakeup() {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
tb.sleeping = false
|
|
}
|
|
|
|
func (tb *TestBroker) Enqueue(msg *base.TaskMessage) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Enqueue(msg)
|
|
}
|
|
|
|
func (tb *TestBroker) EnqueueUnique(msg *base.TaskMessage, ttl time.Duration) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.EnqueueUnique(msg, ttl)
|
|
}
|
|
|
|
func (tb *TestBroker) Dequeue(qnames ...string) (*base.TaskMessage, error) {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return nil, errRedisDown
|
|
}
|
|
return tb.real.Dequeue(qnames...)
|
|
}
|
|
|
|
func (tb *TestBroker) Done(msg *base.TaskMessage) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Done(msg)
|
|
}
|
|
|
|
func (tb *TestBroker) Requeue(msg *base.TaskMessage) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Requeue(msg)
|
|
}
|
|
|
|
func (tb *TestBroker) Schedule(msg *base.TaskMessage, processAt time.Time) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Schedule(msg, processAt)
|
|
}
|
|
|
|
func (tb *TestBroker) ScheduleUnique(msg *base.TaskMessage, processAt time.Time, ttl time.Duration) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.ScheduleUnique(msg, processAt, ttl)
|
|
}
|
|
|
|
func (tb *TestBroker) Retry(msg *base.TaskMessage, processAt time.Time, errMsg string) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Retry(msg, processAt, errMsg)
|
|
}
|
|
|
|
func (tb *TestBroker) Kill(msg *base.TaskMessage, errMsg string) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Kill(msg, errMsg)
|
|
}
|
|
|
|
func (tb *TestBroker) RequeueAll() (int64, error) {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return 0, errRedisDown
|
|
}
|
|
return tb.real.RequeueAll()
|
|
}
|
|
|
|
func (tb *TestBroker) CheckAndEnqueue(qnames ...string) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.CheckAndEnqueue()
|
|
}
|
|
|
|
func (tb *TestBroker) WriteServerState(ss *base.ServerState, ttl time.Duration) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.WriteServerState(ss, ttl)
|
|
}
|
|
|
|
func (tb *TestBroker) ClearServerState(ss *base.ServerState) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.ClearServerState(ss)
|
|
}
|
|
|
|
func (tb *TestBroker) CancelationPubSub() (*redis.PubSub, error) {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return nil, errRedisDown
|
|
}
|
|
return tb.real.CancelationPubSub()
|
|
}
|
|
|
|
func (tb *TestBroker) PublishCancelation(id string) error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.PublishCancelation(id)
|
|
}
|
|
|
|
func (tb *TestBroker) Close() error {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
if tb.sleeping {
|
|
return errRedisDown
|
|
}
|
|
return tb.real.Close()
|
|
}
|