An engine that answers at once and the gateway in front of it, in one process on loopback, given the same load straight and through the gateway: bare, with authentication and accounting, and with the guardrails' pattern checks. It reports p50 and p99, what the gateway added, and a rough CPU per thousand requests. On an Apple M5 at 100 to 2,000 requests a second (10 s a step, 72,000 requests, none failed), the gateway added 0.05–0.42 ms at p50 and at most 0.49 ms at p99. That is now in the README, with how it was measured and why the CPU figure is rough. CI runs a one-second version. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
34 lines
944 B
Go
34 lines
944 B
Go
package cli
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// The short version, so CI sees the gateway's overhead on every change: every
|
|
// mode answers every request, and what the gateway adds is measured, not
|
|
// guessed. No bound is asserted on it, as CI's machines vary; the table is
|
|
// in the test's log.
|
|
func TestTheGatewaysOverheadIsMeasured(t *testing.T) {
|
|
steps, err := runOverhead(t.Context(), []int{50}, time.Second)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(steps) != len(overheadModes) {
|
|
t.Fatalf("%d steps for %d modes", len(steps), len(overheadModes))
|
|
}
|
|
for _, s := range steps {
|
|
if s.Sent == 0 || s.Failed > 0 || s.P50 <= 0 || s.P99 < s.P50 {
|
|
t.Errorf("%s: sent %d failed %d p50 %s p99 %s", s.Mode, s.Sent, s.Failed, s.P50, s.P99)
|
|
}
|
|
}
|
|
var b bytes.Buffer
|
|
printOverhead(&b, steps)
|
|
if !strings.Contains(b.String(), "gateway+auth+guard") {
|
|
t.Errorf("table:\n%s", b.String())
|
|
}
|
|
t.Logf("\n%s", b.String())
|
|
}
|