Files
go-sip/internal/store/reservation_control_test.go
T

47 lines
1.4 KiB
Go

package store
import (
"errors"
"testing"
"git.ipao.vip/rogee/go-sip/internal/testfixture"
)
func TestReservationCannotBypassTaskControlBarrier(t *testing.T) {
s := testStore(t)
raw, err := testfixture.Execute()
if err != nil {
t.Fatal(err)
}
if _, err := s.IngestCommand(raw, testfixture.InboundKey("tenant-demo-key")); err != nil {
t.Fatal(err)
}
if err := s.SetQuota("global", 2); err != nil {
t.Fatal(err)
}
for _, state := range []string{"paused", "draining", "stopped", "unknown", "finished"} {
if _, err := s.DB().Exec(`UPDATE tasks SET status=?`, state); err != nil {
t.Fatal(err)
}
if err := s.Reserve("reservation-"+state, "exec_demo_001", "tenant-demo-key", []string{"global"}); !errors.Is(err, ErrCASConflict) {
t.Fatalf("%s task reserved: %v", state, err)
}
}
if _, err := s.DB().Exec(`UPDATE tasks SET status='accepted'`); err != nil {
t.Fatal(err)
}
if err := s.Reserve("wrong-tenant", "exec_demo_001", "other-tenant", []string{"global"}); !errors.Is(err, ErrCASConflict) {
t.Fatalf("foreign tenant reserved task: %v", err)
}
if err := s.Reserve("valid", "exec_demo_001", "tenant-demo-key", []string{"global"}); err != nil {
t.Fatal(err)
}
var state string
if err := s.DB().QueryRow(`SELECT status FROM tasks`).Scan(&state); err != nil {
t.Fatal(err)
}
if state != "reserved" {
t.Fatal("quota and reserved state were not committed together")
}
}