blob: 13f3ce7da8dc60068d3f385639a92842e669f2be [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package testsharder
import (
"fmt"
"strings"
"go.fuchsia.dev/fuchsia/tools/build"
)
// ValidateTests validates a list of test specs against a list of available test platforms.
func ValidateTests(specs []build.TestSpec, platforms []build.DimensionSet) error {
var errMsgs []string
for _, spec := range specs {
if err := validateAgainst(spec, platforms); err != nil {
errMsgs = append(errMsgs, err.Error())
}
}
if len(errMsgs) > 0 {
return fmt.Errorf(strings.Join(errMsgs, "\n"))
}
return nil
}
func validateAgainst(spec build.TestSpec, platforms []build.DimensionSet) error {
if spec.Test.Name == "" {
return fmt.Errorf("A test spec's test must have a non-empty name")
}
if spec.Test.Path == "" && spec.PackageURL == "" {
return fmt.Errorf("A test spec must have its path or package URL set")
}
if spec.Test.OS == "" {
return fmt.Errorf("A test spec's test must have a non-empty OS")
}
resolvesToOneOf := func(env build.Environment, platforms []build.DimensionSet) bool {
for _, platform := range platforms {
if resolvesTo(env.Dimensions, platform) {
return true
}
}
return false
}
var badEnvs []build.Environment
for _, env := range spec.Envs {
if !resolvesToOneOf(env, platforms) {
badEnvs = append(badEnvs, env)
}
}
if len(badEnvs) > 0 {
return fmt.Errorf(
`the following environments of test\n%+v were malformed
or did not match any available test platforms:\n%+v`,
spec.Test, badEnvs)
}
return nil
}
// resolvesTo gives a partial ordering on DimensionSets in which one resolves to
// another if the former's dimensions are given the latter.
func resolvesTo(this, that build.DimensionSet) bool {
for k, v := range this {
if v != "" && v != that[k] {
return false
}
}
return true
}