47 lines
2.4 KiB
Go
47 lines
2.4 KiB
Go
package cognitive_admission_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.cin.su/m/Assistant/contracts/capability"
|
|
)
|
|
|
|
func TestAdmitReturnsExplainableDecision(t *testing.T) {
|
|
policy := capability.AdmissionPolicy{ID: "local-v1", MaxConcurrent: 2, MaxAcceptedPerHour: 10, MaxInputBytes: 1000, MaxOutputBytes: 500}
|
|
request := capability.AdmissionRequest{Complexity: capability.AdmissionNormal, InputBytes: 100, MaxOutputBytes: 100, DeadlineMillis: 2000}
|
|
if decision := capability.Admit(request, policy, capability.AdmissionCounters{}, 1000); decision.State != capability.AdmissionAdmitted || decision.PolicyID != policy.ID {
|
|
t.Fatalf("admitted = %#v", decision)
|
|
}
|
|
checks := []struct {
|
|
counters capability.AdmissionCounters
|
|
reason capability.AdmissionReason
|
|
}{
|
|
{capability.AdmissionCounters{Concurrent: 2}, capability.AdmissionReasonConcurrency},
|
|
{capability.AdmissionCounters{AcceptedLastHour: 10}, capability.AdmissionReasonAcceptedHour},
|
|
}
|
|
for _, check := range checks {
|
|
if decision := capability.Admit(request, policy, check.counters, 1000); decision.State != capability.AdmissionRejected || decision.Reason != check.reason {
|
|
t.Fatalf("rejected = %#v want %s", decision, check.reason)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAdmissionRequestUsesStableWireFields(t *testing.T) {
|
|
raw, err := json.Marshal(capability.AdmissionRequest{Complexity: capability.AdmissionNormal, InputBytes: 10, MaxOutputBytes: 20, DeadlineMillis: 30})
|
|
if err != nil || !strings.Contains(string(raw), `"input_bytes":10`) || !strings.Contains(string(raw), `"max_output_bytes":20`) || !strings.Contains(string(raw), `"deadline_millis":30`) {
|
|
t.Fatalf("admission wire shape drifted: %s %v", raw, err)
|
|
}
|
|
}
|
|
|
|
func TestAdmitRejectsBudgetAndDeadline(t *testing.T) {
|
|
policy := capability.AdmissionPolicy{ID: "local-v1", MaxConcurrent: 1, MaxAcceptedPerHour: 1, MaxInputBytes: 10, MaxOutputBytes: 10}
|
|
if decision := capability.Admit(capability.AdmissionRequest{InputBytes: 11, MaxOutputBytes: 1}, policy, capability.AdmissionCounters{}, 1); decision.Reason != capability.AdmissionReasonInputBudget {
|
|
t.Fatalf("input decision = %#v", decision)
|
|
}
|
|
if decision := capability.Admit(capability.AdmissionRequest{InputBytes: 1, MaxOutputBytes: 1, DeadlineMillis: 1}, policy, capability.AdmissionCounters{}, 1); decision.Reason != capability.AdmissionReasonDeadline {
|
|
t.Fatalf("deadline decision = %#v", decision)
|
|
}
|
|
}
|