- pdftext/outline: resolve named destinations through the catalog /Dests and the /Names /Dests tree, resolve indirect /Dest, /A and /Title, and treat reader.Null (what Dict.Get returns for a missing key) as absent. Before this every LaTeX and Acrobat PDF had an empty outline. pdftest gains NamedDests; TestOutlineNamedDestinations. - api: pool() always goes through its Once (data race on concurrent first use); TestDefaultPoolConcurrentFirstUse. Revalidation of a stale cache entry counts against the caller/host limit. - pdftext/runner: output over MaxText kills the child at once instead of waiting for the deadline; TestRunnerTooMuchTextFailsFast. - fetch: Accept includes application/pdf;q=0.8. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
617 B
Go
31 lines
617 B
Go
package api
|
|
|
|
// Owner review (P5a): the default pool is built once, safely, when concurrent first requests
|
|
// arrive on a server with no pool configured (run under -race).
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestDefaultPoolConcurrentFirstUse(t *testing.T) {
|
|
s, _ := setupAPI(t, nil)
|
|
var wg sync.WaitGroup
|
|
got := make(chan any, 16)
|
|
for i := 0; i < 16; i++ {
|
|
wg.Add(1)
|
|
go func() { defer wg.Done(); got <- s.pool() }()
|
|
}
|
|
wg.Wait()
|
|
close(got)
|
|
var first any
|
|
for p := range got {
|
|
if first == nil {
|
|
first = p
|
|
}
|
|
if p != first || p == nil {
|
|
t.Fatal("pool() returned different or nil pools")
|
|
}
|
|
}
|
|
}
|