Files
at-container-registry/scanner/internal/queue/priority_queue_test.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
}