95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
package queue
|
|
|
|
import (
|
|
"testing"
|
|
|
|
scanner "atcr.io/scanner"
|
|
)
|
|
|
|
func TestTierToPriority(t *testing.T) {
|
|
tests := []struct {
|
|
tier string
|
|
expected int
|
|
}{
|
|
{"owner", PriorityOwner},
|
|
{"quartermaster", PriorityQuartermaster},
|
|
{"bosun", PriorityBosun},
|
|
{"deckhand", PriorityDeckhand},
|
|
{"unknown", PriorityDeckhand},
|
|
{"", PriorityDeckhand},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
if got := TierToPriority(tt.tier); got != tt.expected {
|
|
t.Errorf("TierToPriority(%q) = %d, want %d", tt.tier, got, tt.expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestJobQueue_PriorityOrder(t *testing.T) {
|
|
q := NewJobQueue(10)
|
|
|
|
// Enqueue jobs in reverse priority order
|
|
q.Enqueue(&scanner.ScanJob{Seq: 1, Tier: "deckhand", Repository: "free-1"})
|
|
q.Enqueue(&scanner.ScanJob{Seq: 2, Tier: "owner", Repository: "owner-1"})
|
|
q.Enqueue(&scanner.ScanJob{Seq: 3, Tier: "bosun", Repository: "bosun-1"})
|
|
q.Enqueue(&scanner.ScanJob{Seq: 4, Tier: "quartermaster", Repository: "qm-1"})
|
|
|
|
// Should dequeue in priority order: owner, quartermaster, bosun, deckhand
|
|
expected := []string{"owner-1", "qm-1", "bosun-1", "free-1"}
|
|
for _, exp := range expected {
|
|
job := q.Dequeue()
|
|
if job.Repository != exp {
|
|
t.Errorf("expected %q, got %q", exp, job.Repository)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestJobQueue_FIFOWithinSamePriority(t *testing.T) {
|
|
q := NewJobQueue(10)
|
|
|
|
q.Enqueue(&scanner.ScanJob{Seq: 10, Tier: "deckhand", Repository: "first"})
|
|
q.Enqueue(&scanner.ScanJob{Seq: 20, Tier: "deckhand", Repository: "second"})
|
|
q.Enqueue(&scanner.ScanJob{Seq: 30, Tier: "deckhand", Repository: "third"})
|
|
|
|
// Should dequeue in FIFO order within same priority
|
|
expected := []string{"first", "second", "third"}
|
|
for _, exp := range expected {
|
|
job := q.Dequeue()
|
|
if job.Repository != exp {
|
|
t.Errorf("expected %q, got %q", exp, job.Repository)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestJobQueue_Full(t *testing.T) {
|
|
q := NewJobQueue(2)
|
|
|
|
ok1 := q.Enqueue(&scanner.ScanJob{Seq: 1, Tier: "deckhand"})
|
|
ok2 := q.Enqueue(&scanner.ScanJob{Seq: 2, Tier: "deckhand"})
|
|
ok3 := q.Enqueue(&scanner.ScanJob{Seq: 3, Tier: "deckhand"})
|
|
|
|
if !ok1 || !ok2 {
|
|
t.Error("first two enqueues should succeed")
|
|
}
|
|
if ok3 {
|
|
t.Error("third enqueue should fail (queue full)")
|
|
}
|
|
}
|
|
|
|
func TestJobQueue_CloseUnblocks(t *testing.T) {
|
|
q := NewJobQueue(10)
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
job := q.Dequeue()
|
|
if job != nil {
|
|
t.Error("expected nil from closed queue")
|
|
}
|
|
close(done)
|
|
}()
|
|
|
|
q.Close()
|
|
<-done
|
|
}
|