Strengthen composition and import selection tests

This commit is contained in:
2026-10-25 22:21:51 +00:00
parent 6f6130fd12
commit 4fd3bee986
3 changed files with 62 additions and 10 deletions

View File

@@ -605,6 +605,14 @@ Focused check: `go test ./internal/engine -run 'Import|Directive|Directory|Glob|
Findings: **F10, F11**. Findings: **F10, F11**.
Owners: `internal/engine/composition_fuzz_test.go`, `import_selection_test.go`. Owners: `internal/engine/composition_fuzz_test.go`, `import_selection_test.go`.
Status: **complete** (F10, F11). Prior completed commits: `2736ddf`, `deb9aa5`,
`ae3408a`, `ea27f17`, `08a8c25`, `877c497`, `8aba43d`, `7bf2f0c`,
`0f9ecf1`, `119b42c`, `247a12b`, `4fcff5f`, `12d350a`, `08f2a8f`,
`826062a`, `e4a5ecb`, `3122e2f`, `6f6130f`. Validation passed:
`env GOTOOLCHAIN=local GOPROXY=off GOTELEMETRY=off go test ./internal/engine -run 'FuzzCompositionAndOverlay|SelectNamedImports' -count=1`
and `git diff --check`. The bounded composition campaign remains scheduled for
Stage 33.
In `FuzzCompositionAndOverlay`, mutate an existing retained descendant or in-length In `FuzzCompositionAndOverlay`, mutate an existing retained descendant or in-length
element before comparing both original inputs with their saved values. Handle element before comparing both original inputs with their saved values. Handle
empty containers without assuming append affects shared storage. Keep existing empty containers without assuming append affects shared storage. Keep existing

View File

@@ -43,9 +43,10 @@ func FuzzCompositionAndOverlay(f *testing.F) {
if differences := compareConfigurationValues(composed.root, reversed.root); len(differences) != 0 { if differences := compareConfigurationValues(composed.root, reversed.root); len(differences) != 0 {
t.Fatalf("composition order changed effective values: %#v", differences) t.Fatalf("composition order changed effective values: %#v", differences)
} }
composed.root.Mapping = append(composed.root.Mapping, document.Entry{Key: "fuzz-detachment"}) if mutateExistingDocumentDescendant(composed.root) {
if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) { if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) {
t.Fatal("composition result aliases an input document") t.Fatal("composition result aliases an input document")
}
} }
} }
@@ -60,9 +61,41 @@ func FuzzCompositionAndOverlay(f *testing.F) {
if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) { if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) {
t.Fatal("overlay mutated an input document") t.Fatal("overlay mutated an input document")
} }
overlaid.root.Mapping = append(overlaid.root.Mapping, document.Entry{Key: "fuzz-detachment"}) if mutateExistingDocumentDescendant(overlaid.root) {
if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) { if !reflect.DeepEqual(left, leftBefore) || !reflect.DeepEqual(right, rightBefore) {
t.Fatal("overlay result aliases an input document") t.Fatal("overlay result aliases an input document")
}
} }
}) })
} }
func mutateExistingDocumentDescendant(node *document.Node) bool {
if node == nil {
return false
}
// Empty containers have no existing element for the alias probe.
switch node.Kind {
case document.Mapping:
if len(node.Mapping) == 0 {
return false
}
entry := &node.Mapping[0]
if mutateExistingDocumentDescendant(entry.Value) {
return true
}
entry.Key += "-fuzz-detachment"
return true
case document.Sequence:
if len(node.Sequence) == 0 {
return false
}
if mutateExistingDocumentDescendant(node.Sequence[0]) {
return true
}
node.Sequence[0].Text += "fuzz-detachment"
return true
default:
node.Text += "fuzz-detachment"
return true
}
}

View File

@@ -161,8 +161,21 @@ func TestSelectNamedImportsChecksNormalizedPathsLexically(t *testing.T) {
if len(diagnostics) != 0 || len(selection.candidates) != 2 { if len(diagnostics) != 0 || len(selection.candidates) != 2 {
t.Fatalf("selection, diagnostics = %#v, %#v", selection, diagnostics) t.Fatalf("selection, diagnostics = %#v, %#v", selection, diagnostics)
} }
if strings.Join(filesystem.statPaths, ",") != "a.yaml,a.yaml,z.yaml,z.yaml" { if selection.candidates[0].path != "a.yaml" || selection.candidates[1].path != "z.yaml" {
t.Fatalf("target stat order = %#v", filesystem.statPaths) t.Fatalf("candidate order = %#v, want a.yaml then z.yaml", selection.candidates)
}
failingFilesystem := &statOnlyImportFilesystem{statErrors: map[string]error{
"a.yaml": fs.ErrPermission,
"z.yaml": fs.ErrPermission,
}}
failingAccess := newNativeAccess(failingFilesystem, ".", &namespaceToken{})
_, diagnostics = selectNamedImportCandidates(failingAccess, ".", specs[0], resolvedImportPolicy{})
if len(diagnostics) != 1 || diagnostics[0].Code != CodeImportInvalid || diagnostics[0].Path.String() != "/configkit/imports/0/path/1" {
t.Fatalf("first lexical failure = %#v, want /configkit/imports/0/path/1", diagnostics)
}
if diagnostics[0].Primary == nil || diagnostics[0].Primary.SourceID != "source-1" {
t.Fatalf("first lexical failure location = %#v", diagnostics[0].Primary)
} }
} }
@@ -226,7 +239,6 @@ type statOnlyImportFilesystem struct {
statErrors map[string]error statErrors map[string]error
openCalls int openCalls int
statCalls int statCalls int
statPaths []string
} }
func (filesystem *statOnlyImportFilesystem) Open(name string) (fs.File, error) { func (filesystem *statOnlyImportFilesystem) Open(name string) (fs.File, error) {
@@ -236,7 +248,6 @@ func (filesystem *statOnlyImportFilesystem) Open(name string) (fs.File, error) {
func (filesystem *statOnlyImportFilesystem) Stat(name string) (fs.FileInfo, error) { func (filesystem *statOnlyImportFilesystem) Stat(name string) (fs.FileInfo, error) {
filesystem.statCalls++ filesystem.statCalls++
filesystem.statPaths = append(filesystem.statPaths, name)
if err := filesystem.statErrors[name]; err != nil { if err := filesystem.statErrors[name]; err != nil {
return nil, err return nil, err
} }