release gate / check (push) Failing after 6m43s
High severity: - wire TRUSTED_PROXY through Compose/deploy/docs and warn at web startup - bucket public rate limits on effective client IP, add per-bookmark budget, and forward the signed browser identity from the share page - disable first-run bootstrap in server deployments and document seeding - serialize last-admin demotion in one advisory-locked transaction Medium/low: - cap and batch share recipient inserts - add a shared outbound budget for preview/CardDAV/IMAP/signal work - pin CardDAV dials to 443 and bound IMAP logout - fix rightward kanban column drags and normalize cards on column delete - classify backend outages in auth guards, add request timeouts and an error boundary, remove the dead login route, surface throttling - enforce pinned/unpinned page reorder grouping server-side - avoid preview work for stale bookmark versions; drop duplicate dialog fetch - sequence-guard collection/tag/calendar/quick-find loads - validate property config and fix MULTI_SELECT/DATE filter inputs - document index maintenance; apply same-origin check to sign-out - trim signup names, unique shared dates and kanban keys (migration 010), reset reference cache on identity changes, hide OIDC issuer, return 413 for oversized direct bodies, escape Markdown link destinations - remove dead template files and duplicate test helper Verified with go build/vet, full PostgreSQL race suite, db convergence, tsc, both ESLint configs and a Next production build.
43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
package outbound
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// Review M-2: outbound work is bounded per identity and globally, and a
|
|
// released slot is reusable.
|
|
func TestReserveBoundsPerKeyAndGlobally(t *testing.T) {
|
|
releaseA, retry, ok := Reserve("test-a", 1, time.Minute)
|
|
if !ok || releaseA == nil {
|
|
t.Fatalf("first reservation rejected (retry %v)", retry)
|
|
}
|
|
if _, _, ok := Reserve("test-a", 1, time.Minute); ok {
|
|
t.Fatal("per-key limit did not reject the second reservation")
|
|
}
|
|
|
|
// Fill the remaining global slots on distinct keys.
|
|
releases := []func(){releaseA}
|
|
for i := 0; i < defaultConcurrent-1; i++ {
|
|
release, _, ok := Reserve("test-global-"+string(rune('a'+i)), 10, time.Minute)
|
|
if !ok {
|
|
t.Fatalf("global slot %d rejected below the cap", i)
|
|
}
|
|
releases = append(releases, release)
|
|
}
|
|
if _, _, ok := Reserve("test-overflow", 10, time.Minute); ok {
|
|
t.Fatal("global concurrency cap did not reject an extra reservation")
|
|
}
|
|
|
|
// Release one slot and verify the global capacity is usable again.
|
|
releases[0]()
|
|
release, _, ok := Reserve("test-after-release", 1, time.Minute)
|
|
if !ok {
|
|
t.Fatal("released slot was not reusable")
|
|
}
|
|
release()
|
|
for _, r := range releases[1:] {
|
|
r()
|
|
}
|
|
}
|