Add validator chain provenance
This commit is contained in:
@@ -887,8 +887,9 @@ func TestRunPassesChunkContentAndMediaTypeToExtractors(t *testing.T) {
|
||||
|
||||
func TestRunOmitsRejectedExtractOutputsFromMerge(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-extract", approved: []bool{false, true}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
validator := &runnerChainValidator{name: "chain-extract", approved: []bool{false, true}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
|
||||
output, err := New(newRunnerRegistries(t, modules)).Run(context.Background(), RunInput{Pipeline: resolvedPipeline()})
|
||||
if err != nil {
|
||||
@@ -909,8 +910,9 @@ func TestRunOmitsRejectedExtractOutputsFromMerge(t *testing.T) {
|
||||
|
||||
func TestRunOmitsLaneWithNoAcceptedExtractOutputs(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-extract", approved: []bool{false}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
validator := &runnerChainValidator{name: "chain-extract", approved: []bool{false}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
|
||||
output, err := New(newRunnerRegistries(t, modules)).Run(context.Background(), RunInput{Pipeline: resolvedPipeline()})
|
||||
if err != nil {
|
||||
@@ -933,8 +935,9 @@ func TestRunOmitsLaneWithNoAcceptedExtractOutputs(t *testing.T) {
|
||||
|
||||
func TestRunRejectedMergePreventsNormalizeForLane(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-merge", approved: []bool{false}, reason: "bad_merge", message: "merge rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageMerge, "merge", validator)
|
||||
validator := &runnerChainValidator{name: "chain-merge", approved: []bool{false}, reason: "bad_merge", message: "merge rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageMerge, "merge", validator)
|
||||
|
||||
output, err := New(newRunnerRegistries(t, modules)).Run(context.Background(), RunInput{Pipeline: resolvedPipeline()})
|
||||
if err != nil {
|
||||
@@ -954,8 +957,9 @@ func TestRunRejectedMergePreventsNormalizeForLane(t *testing.T) {
|
||||
|
||||
func TestRunRejectedNormalizePreventsOutputForLane(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-normalize", approved: []bool{false}, reason: "bad_normalize", message: "normalize rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageNormalize, "normalize", validator)
|
||||
validator := &runnerChainValidator{name: "chain-normalize", approved: []bool{false}, reason: "bad_normalize", message: "normalize rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageNormalize, "normalize", validator)
|
||||
|
||||
output, err := New(newRunnerRegistries(t, modules)).Run(context.Background(), RunInput{Pipeline: resolvedPipeline()})
|
||||
if err != nil {
|
||||
@@ -999,8 +1003,9 @@ func TestRunRetriesSameModuleInputAfterFrameworkError(t *testing.T) {
|
||||
|
||||
func TestRunRetriesSameModuleInputAfterValidatorRejection(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-extract", approved: []bool{false, true, true}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
validator := &runnerChainValidator{name: "chain-extract", approved: []bool{false, true, true}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
pipeline := resolvedPipeline()
|
||||
pipeline.ArtifactLanes[0].Extract.Retries = 1
|
||||
|
||||
@@ -1023,8 +1028,9 @@ func TestRunRetriesSameModuleInputAfterValidatorRejection(t *testing.T) {
|
||||
|
||||
func TestRunStopsRetryAfterConfiguredAttemptsAndRecordsAttemptCount(t *testing.T) {
|
||||
modules := defaultRunnerModules()
|
||||
validator := &runnerRawValidator{name: "raw-extract", approved: []bool{false}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.rawValidators = rawValidationRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
validator := &runnerChainValidator{name: "chain-extract", approved: []bool{false}, reason: "bad_extract", message: "extract rejected"}
|
||||
modules.validators[validator.name] = validator
|
||||
modules.validatorChains = validatorChainRegistry(t, StageExtract, "extract-alpha", validator)
|
||||
pipeline := resolvedPipeline()
|
||||
pipeline.ArtifactLanes[0].Extract.Retries = 1
|
||||
|
||||
@@ -1312,8 +1318,11 @@ func TestRunManifestIncludesPipelineAndLaneDetails(t *testing.T) {
|
||||
if lane.ID != "alpha" || lane.Extractor != "extract-alpha" || lane.Merger != "merge" || lane.Normalizer != "normalize" {
|
||||
t.Fatalf("ArtifactLanes[0] = %#v, want lane details", lane)
|
||||
}
|
||||
if len(lane.Validators) != 0 {
|
||||
t.Fatalf("lane validators = %#v, want none", lane.Validators)
|
||||
if len(manifest.ValidatorChains) != 4 {
|
||||
t.Fatalf("ValidatorChains = %#v, want four validation points", manifest.ValidatorChains)
|
||||
}
|
||||
if manifest.ValidatorChains[0].Stage != string(StageChunk) || manifest.ValidatorChains[0].ModuleKey != "chunk" || len(manifest.ValidatorChains[0].Validators) != 0 {
|
||||
t.Fatalf("chunk validator chain = %#v, want explicit empty chunk chain", manifest.ValidatorChains[0])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1454,6 +1463,12 @@ func resolvedPipeline() ResolvedPipeline {
|
||||
NormalizeReferences: referenceTarget(StageNormalize, "alpha", "normalize", nil),
|
||||
},
|
||||
},
|
||||
ValidatorChains: []ResolvedValidatorChain{
|
||||
{Stage: StageChunk, ModuleKey: "chunk"},
|
||||
{Stage: StageExtract, LaneID: "alpha", ModuleKey: "extract-alpha"},
|
||||
{Stage: StageMerge, LaneID: "alpha", ModuleKey: "merge"},
|
||||
{Stage: StageNormalize, LaneID: "alpha", ModuleKey: "normalize"},
|
||||
},
|
||||
Output: Binding("output"),
|
||||
}
|
||||
}
|
||||
@@ -1493,8 +1508,8 @@ type runnerModules struct {
|
||||
extractors map[string]*runnerExtractor
|
||||
mergers map[string]*runnerMerger
|
||||
normalizers map[string]*runnerNormalizer
|
||||
validators map[string]*runnerValidator
|
||||
rawValidators *RawValidationRegistry
|
||||
validators map[string]contracts.Validator
|
||||
validatorChains *ValidatorChainRegistry
|
||||
output *runnerOutputEncoder
|
||||
inputBuildErr error
|
||||
chunkerBuildErr error
|
||||
@@ -1513,9 +1528,9 @@ func defaultRunnerModules() *runnerModules {
|
||||
normalizers: map[string]*runnerNormalizer{
|
||||
"normalize": {key: "normalize"},
|
||||
},
|
||||
validators: map[string]*runnerValidator{
|
||||
"configured": {name: "configured"},
|
||||
"second-validator": {name: "second-validator"},
|
||||
validators: map[string]contracts.Validator{
|
||||
"configured": &runnerValidator{name: "configured"},
|
||||
"second-validator": &runnerValidator{name: "second-validator"},
|
||||
},
|
||||
output: &runnerOutputEncoder{
|
||||
key: "output",
|
||||
@@ -1533,14 +1548,14 @@ func newRunnerRegistries(t *testing.T, modules *runnerModules) Registries {
|
||||
}
|
||||
|
||||
registries := Registries{
|
||||
Inputs: NewInputAdapterRegistry(),
|
||||
Chunkers: NewChunkerRegistry(),
|
||||
Extractors: NewExtractorRegistry(),
|
||||
Mergers: NewMergerRegistry(),
|
||||
Normalizers: NewNormalizerRegistry(),
|
||||
Validators: NewValidatorRegistry(),
|
||||
RawValidators: modules.rawValidators,
|
||||
Outputs: NewOutputEncoderRegistry(),
|
||||
Inputs: NewInputAdapterRegistry(),
|
||||
Chunkers: NewChunkerRegistry(),
|
||||
Extractors: NewExtractorRegistry(),
|
||||
Mergers: NewMergerRegistry(),
|
||||
Normalizers: NewNormalizerRegistry(),
|
||||
Validators: NewValidatorRegistry(),
|
||||
ValidatorChains: modules.validatorChains,
|
||||
Outputs: NewOutputEncoderRegistry(),
|
||||
}
|
||||
if err := registries.Inputs.Register("input", func() (contracts.InputAdapter, error) {
|
||||
if modules.inputBuildErr != nil {
|
||||
@@ -1807,7 +1822,7 @@ type runnerValidator struct {
|
||||
requests []contracts.ValidationRequest
|
||||
}
|
||||
|
||||
type runnerRawValidator struct {
|
||||
type runnerChainValidator struct {
|
||||
name string
|
||||
approved []bool
|
||||
reason string
|
||||
@@ -1818,15 +1833,15 @@ type runnerRawValidator struct {
|
||||
requests []contracts.ValidationRequest
|
||||
}
|
||||
|
||||
func (validator *runnerRawValidator) Name() string {
|
||||
func (validator *runnerChainValidator) Name() string {
|
||||
return validator.name
|
||||
}
|
||||
|
||||
func (validator *runnerRawValidator) ExecutionClass() contracts.ExecutionClass {
|
||||
func (validator *runnerChainValidator) ExecutionClass() contracts.ExecutionClass {
|
||||
return contracts.ExecutionClassDeterministic
|
||||
}
|
||||
|
||||
func (validator *runnerRawValidator) Validate(ctx context.Context, req contracts.ValidationRequest) (contracts.ValidationResult, error) {
|
||||
func (validator *runnerChainValidator) Validate(ctx context.Context, req contracts.ValidationRequest) (contracts.ValidationResult, error) {
|
||||
validator.calls++
|
||||
validator.requests = append(validator.requests, req)
|
||||
if validator.err != nil {
|
||||
@@ -2037,12 +2052,16 @@ func assertRunError(t *testing.T, err error, want string) {
|
||||
}
|
||||
}
|
||||
|
||||
func rawValidationRegistry(t *testing.T, stage ModuleStage, module string, validators ...contracts.Validator) *RawValidationRegistry {
|
||||
func validatorChainRegistry(t *testing.T, stage ModuleStage, module string, validators ...contracts.Validator) *ValidatorChainRegistry {
|
||||
t.Helper()
|
||||
|
||||
registry := NewRawValidationRegistry()
|
||||
if err := registry.Register(stage, module, validators...); err != nil {
|
||||
t.Fatalf("register raw validators: %v", err)
|
||||
registry := NewValidatorChainRegistry()
|
||||
bindings := make([]ModuleBinding, 0, len(validators))
|
||||
for _, validator := range validators {
|
||||
bindings = append(bindings, Binding(validator.Name()))
|
||||
}
|
||||
if err := registry.Register(ValidatorChainMapping{Stage: stage, Module: module, Validators: bindings}); err != nil {
|
||||
t.Fatalf("register validator chain: %v", err)
|
||||
}
|
||||
return registry
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user