Kyle: "Fold them into the plan." What changed and why is in docs/P6.md §14. In short:
- FetchFunc gets the *auth.Caller (the given api test could not compile, and a fetch with no
caller would bypass per-caller gates, the pool limit, the cache class and redaction);
- store reads never bump the lease (task 01's rule contradicted its own test); the API Touches;
- 1-2 workers round-robin over live jobs, so a batch holds at most 2 of the 8 global slots;
busy targets retry in the runner (bounded); batch PDFs use their own pool name; 210 s deadline;
- the api tests no longer touch the network or race the cancel; private names via fake DNS;
- failed/cancelled jobs are not reused; GET is a summary plus GET …/{idx} and ?results=1;
- the 256 KiB body cap moves into ServeHTTP; a fixed metrics label for /v1/batch/{id};
- guard.PreCheck (given verbatim) replaces guard.ParseURL at submit;
- 5 tasks became 8 (refactor, wiring, endpoints and serve/config split), each restating the
APIs it uses; every given test compiles against a panic-only skeleton and fails on it.
P6 starts after P5c: task 04 moves v1fetch, which P5b changes. Recheck the api given tests
against post-P5c master before the run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
package config
|
|
|
|
// P6 task 07: the [batch] block and ParseSize.
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestBatchBlock(t *testing.T) {
|
|
p := filepath.Join(t.TempDir(), "sift.toml")
|
|
body := "[batch]\ndisabled = false\ntargets_per_job = 16\njobs_per_caller = 2\njobs_total = 4\nworkers = 2\nttl = \"12h\"\nmax_bytes = \"32MiB\"\n"
|
|
if err := os.WriteFile(p, []byte(body), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
f, err := Load(p)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := f.Batch
|
|
if b.Disabled || b.TargetsPerJob != 16 || b.JobsPerCaller != 2 || b.JobsTotal != 4 || b.Workers != 2 || b.TTL != "12h" || b.MaxBytes != "32MiB" {
|
|
t.Fatalf("batch block %+v", b)
|
|
}
|
|
// No block: zero values, and batch is on (the runner applies its own defaults).
|
|
empty := filepath.Join(t.TempDir(), "empty.toml")
|
|
if err := os.WriteFile(empty, []byte("listen = \":8443\"\n"), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if f, err := Load(empty); err != nil || f.Batch != (Batch{}) {
|
|
t.Fatalf("no [batch] block: %+v %v", f.Batch, err)
|
|
}
|
|
}
|
|
|
|
func TestParseSize(t *testing.T) {
|
|
const def = 7
|
|
for _, c := range []struct {
|
|
in string
|
|
want int64
|
|
}{
|
|
{"64MiB", 64 << 20},
|
|
{"512KiB", 512 << 10},
|
|
{"1GiB", 1 << 30},
|
|
{"1000", 1000},
|
|
{" 2MiB ", 2 << 20},
|
|
{"", def},
|
|
{"junk", def},
|
|
{"-1MiB", def},
|
|
{"0", def},
|
|
{"12MB", def}, // decimal units are not accepted: say MiB
|
|
} {
|
|
if got := ParseSize(c.in, def); got != c.want {
|
|
t.Errorf("ParseSize(%q) = %d, want %d", c.in, got, c.want)
|
|
}
|
|
}
|
|
}
|