47 lines
1.4 KiB
Go
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")
|
|
}
|
|
}
|