Reuse frozen inspection mapping lookups
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
@@ -566,3 +567,49 @@ func TestExplanationReplayDescriptorsRemainDetachedAcrossQueries(t *testing.T) {
|
||||
}
|
||||
t.Fatalf("resolution change missing from repeated explanation: %#v", second.History)
|
||||
}
|
||||
|
||||
func TestConcurrentReadOnlyInspectionQueries(t *testing.T) {
|
||||
type config struct {
|
||||
Group struct {
|
||||
Value string `yaml:"value"`
|
||||
} `yaml:"group"`
|
||||
}
|
||||
result, err := testLoad(Bytes("concurrent-inspection.yml", []byte("group: {value: input}\n")), Options[config]{
|
||||
Definition: Definition[config]{Resolve: func(value *config, resolution *Resolution) error {
|
||||
value.Group.Value = "resolved"
|
||||
resolution.Record(Keys("group", "value"), ChangeNormalization, "normalized", Keys("group", "value"))
|
||||
return nil
|
||||
}},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
paths := []Path{Keys("group"), Keys("group", "value")}
|
||||
var wait sync.WaitGroup
|
||||
errors := make(chan string, 8)
|
||||
for worker := 0; worker < cap(errors); worker++ {
|
||||
wait.Add(1)
|
||||
go func() {
|
||||
defer wait.Done()
|
||||
for iteration := 0; iteration < 8; iteration++ {
|
||||
for _, path := range paths {
|
||||
explanation, found := result.Explain(path)
|
||||
if !found || !explanation.Effective.Present {
|
||||
errors <- "missing effective explanation for " + path.String()
|
||||
return
|
||||
}
|
||||
metadata := result.Metadata()
|
||||
if _, found := metadata.Lookup(path); !found || len(metadata.History(path)) == 0 {
|
||||
errors <- "missing metadata for " + path.String()
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
wait.Wait()
|
||||
close(errors)
|
||||
for message := range errors {
|
||||
t.Error(message)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user