2
0
mirror of https://github.com/hibiken/asynq.git synced 2024-09-20 19:06:46 +08:00
asynq/internal/testbroker/testbroker.go

228 lines
5.0 KiB
Go
Raw Normal View History

// 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 (
2021-11-16 08:34:26 +08:00
"context"
"errors"
"sync"
2020-04-18 22:55:10 +08:00
"time"
2021-09-02 20:56:02 +08:00
"github.com/go-redis/redis/v8"
2020-04-18 22:55:10 +08:00
"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
2020-04-18 22:55:10 +08:00
// real broker
real base.Broker
}
2020-06-23 21:34:59 +08:00
// Make sure TestBroker implements Broker interface at compile time.
var _ base.Broker = (*TestBroker)(nil)
2020-04-18 22:55:10 +08:00
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
}
2021-11-16 08:34:26 +08:00
func (tb *TestBroker) Enqueue(ctx context.Context, msg *base.TaskMessage) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2021-11-16 08:34:26 +08:00
return tb.real.Enqueue(ctx, msg)
2020-04-18 22:55:10 +08:00
}
2021-11-16 08:34:26 +08:00
func (tb *TestBroker) EnqueueUnique(ctx context.Context, msg *base.TaskMessage, ttl time.Duration) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2021-11-16 08:34:26 +08:00
return tb.real.EnqueueUnique(ctx, msg, ttl)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) Dequeue(qnames ...string) (*base.TaskMessage, error) {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return nil, errRedisDown
2020-04-18 22:55:10 +08:00
}
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) MarkAsComplete(msg *base.TaskMessage) error {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.MarkAsComplete(msg)
}
2020-04-18 22:55:10 +08:00
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)
}
2021-11-16 08:34:26 +08:00
func (tb *TestBroker) Schedule(ctx context.Context, msg *base.TaskMessage, processAt time.Time) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2021-11-16 08:34:26 +08:00
return tb.real.Schedule(ctx, msg, processAt)
2020-04-18 22:55:10 +08:00
}
2021-11-16 08:34:26 +08:00
func (tb *TestBroker) ScheduleUnique(ctx context.Context, msg *base.TaskMessage, processAt time.Time, ttl time.Duration) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2021-11-16 08:34:26 +08:00
return tb.real.ScheduleUnique(ctx, msg, processAt, ttl)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) Retry(msg *base.TaskMessage, processAt time.Time, errMsg string, isFailure bool) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.Retry(msg, processAt, errMsg, isFailure)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) Archive(msg *base.TaskMessage, errMsg string) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.Archive(msg, errMsg)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) ForwardIfReady(qnames ...string) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.ForwardIfReady(qnames...)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) DeleteExpiredCompletedTasks(qname string) error {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.DeleteExpiredCompletedTasks(qname)
}
func (tb *TestBroker) ListLeaseExpired(cutoff time.Time, qnames ...string) ([]*base.TaskMessage, error) {
2020-06-21 22:05:57 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return nil, errRedisDown
}
return tb.real.ListLeaseExpired(cutoff, qnames...)
2020-06-21 22:05:57 +08:00
}
2020-05-19 11:47:35 +08:00
func (tb *TestBroker) WriteServerState(info *base.ServerInfo, workers []*base.WorkerInfo, ttl time.Duration) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2020-05-19 11:47:35 +08:00
return tb.real.WriteServerState(info, workers, ttl)
2020-04-18 22:55:10 +08:00
}
2020-05-19 11:47:35 +08:00
func (tb *TestBroker) ClearServerState(host string, pid int, serverID string) error {
2020-04-18 22:55:10 +08:00
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
2020-05-19 11:47:35 +08:00
return tb.real.ClearServerState(host, pid, serverID)
2020-04-18 22:55:10 +08:00
}
func (tb *TestBroker) CancelationPubSub() (*redis.PubSub, error) {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return nil, errRedisDown
}
2020-04-18 22:55:10 +08:00
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) WriteResult(qname, id string, data []byte) (int, error) {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return 0, errRedisDown
}
return tb.real.WriteResult(qname, id, data)
}
func (tb *TestBroker) Ping() error {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.Ping()
}
2020-04-18 22:55:10 +08:00
func (tb *TestBroker) Close() error {
tb.mu.Lock()
defer tb.mu.Unlock()
if tb.sleeping {
return errRedisDown
}
return tb.real.Close()
}