74 lines
2.1 KiB
Go
74 lines
2.1 KiB
Go
package outcome
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
domain "proxy-pool/internal/domain/outcome"
|
|
)
|
|
|
|
type metricsRecorder struct {
|
|
events []domain.Event
|
|
dropped int
|
|
}
|
|
|
|
func (recorder *metricsRecorder) Observe(event domain.Event) {
|
|
recorder.events = append(recorder.events, event)
|
|
}
|
|
|
|
func (recorder *metricsRecorder) ObserveDropped() {
|
|
recorder.dropped++
|
|
}
|
|
|
|
func TestQueueBatchesWithoutBlockingAndCountsOverflow(t *testing.T) {
|
|
queue, err := NewQueue(QueueOptions{Capacity: 2, MaxBatch: 2})
|
|
if err != nil {
|
|
t.Fatalf("NewQueue() = %v", err)
|
|
}
|
|
queue.Record(domain.Event{ProxyID: "proxy-a"})
|
|
queue.Record(domain.Event{ProxyID: "proxy-b"})
|
|
queue.Record(domain.Event{ProxyID: "proxy-c"})
|
|
if queue.Dropped() != 1 {
|
|
t.Fatalf("Dropped() = %d, want 1", queue.Dropped())
|
|
}
|
|
batch, err := queue.Next(context.Background())
|
|
if err != nil || len(batch) != 2 || batch[0].ProxyID != "proxy-a" || batch[1].ProxyID != "proxy-b" {
|
|
t.Fatalf("Next() = %+v, %v", batch, err)
|
|
}
|
|
if batch, ok := queue.TryNext(); ok || batch != nil {
|
|
t.Fatalf("TryNext() = %+v, %t; want nil, false", batch, ok)
|
|
}
|
|
}
|
|
|
|
func TestQueueHonorsCanceledContext(t *testing.T) {
|
|
queue, err := NewQueue(QueueOptions{Capacity: 1, MaxBatch: 1})
|
|
if err != nil {
|
|
t.Fatalf("NewQueue() = %v", err)
|
|
}
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
if _, err := queue.Next(ctx); !errors.Is(err, context.Canceled) {
|
|
t.Fatalf("Next(canceled) = %v, want context canceled", err)
|
|
}
|
|
}
|
|
|
|
func TestQueueReportsAttemptedOutcomesAndOverflow(t *testing.T) {
|
|
metrics := &metricsRecorder{}
|
|
queue, err := NewQueue(QueueOptions{Capacity: 1, MaxBatch: 1, Metrics: metrics})
|
|
if err != nil {
|
|
t.Fatalf("NewQueue() = %v", err)
|
|
}
|
|
first := domain.Event{ProxyID: "proxy-a", Stage: domain.StageDial, Success: true}
|
|
second := domain.Event{ProxyID: "proxy-b", Stage: domain.StageTunnel, Success: false}
|
|
queue.Record(first)
|
|
queue.Record(second)
|
|
|
|
if len(metrics.events) != 2 || metrics.events[0] != first || metrics.events[1] != second {
|
|
t.Fatalf("observed events = %+v, want both attempts", metrics.events)
|
|
}
|
|
if metrics.dropped != 1 {
|
|
t.Fatalf("observed dropped = %d, want 1", metrics.dropped)
|
|
}
|
|
}
|