Allow per test rules in neverallow_test.go

Makes testing individual rules easier by allowing them to be specified
per test rather than having to add them to the global defaults.

Bug: 138428610
Test: m nothing
Change-Id: Ic65a55dee2a02b6d33254753c047295dd5804408
This commit is contained in:
Paul Duffin
2019-08-07 15:31:07 +01:00
parent 91e3819335
commit 115445b5d6
2 changed files with 39 additions and 13 deletions

View File

@@ -177,7 +177,7 @@ func neverallowMutator(ctx BottomUpMutatorContext) {
osClass := ctx.Module().Target().Os.Class osClass := ctx.Module().Target().Os.Class
for _, r := range neverallows { for _, r := range neverallowRules(ctx.Config()) {
n := r.(*rule) n := r.(*rule)
if !n.appliesToPath(dir) { if !n.appliesToPath(dir) {
continue continue
@@ -551,3 +551,19 @@ func matchValue(value reflect.Value, check func(string) bool) bool {
panic("Can't handle type: " + value.Kind().String()) panic("Can't handle type: " + value.Kind().String())
} }
var neverallowRulesKey = NewOnceKey("neverallowRules")
func neverallowRules(config Config) []Rule {
return config.Once(neverallowRulesKey, func() interface{} {
// No test rules were set by setTestNeverallowRules, use the global rules
return neverallows
}).([]Rule)
}
// Overrides the default neverallow rules for the supplied config.
//
// For testing only.
func setTestNeverallowRules(config Config, testRules []Rule) {
config.Once(neverallowRulesKey, func() interface{} { return testRules })
}

View File

@@ -20,16 +20,19 @@ import (
"github.com/google/blueprint" "github.com/google/blueprint"
) )
func init() {
// Add extra rules needed for testing.
AddNeverAllowRules(
NeverAllow().InDirectDeps("not_allowed_in_direct_deps"),
)
}
var neverallowTests = []struct { var neverallowTests = []struct {
// The name of the test.
name string name string
// Optional test specific rules. If specified then they are used instead of the default rules.
rules []Rule
// Additional contents to add to the virtual filesystem used by the tests.
fs map[string][]byte fs map[string][]byte
// The expected error patterns. If empty then no errors are expected, otherwise each error
// reported must be matched by at least one of these patterns. A pattern matches if the error
// message contains the pattern. A pattern does not have to match the whole error message.
expectedErrors []string expectedErrors []string
}{ }{
// Test General Functionality // Test General Functionality
@@ -37,6 +40,9 @@ var neverallowTests = []struct {
// in direct deps tests // in direct deps tests
{ {
name: "not_allowed_in_direct_deps", name: "not_allowed_in_direct_deps",
rules: []Rule{
NeverAllow().InDirectDeps("not_allowed_in_direct_deps"),
},
fs: map[string][]byte{ fs: map[string][]byte{
"top/Blueprints": []byte(` "top/Blueprints": []byte(`
cc_library { cc_library {
@@ -53,7 +59,7 @@ var neverallowTests = []struct {
}, },
}, },
// Test specific rules // Test android specific rules
// include_dir rule tests // include_dir rule tests
{ {
@@ -247,11 +253,15 @@ var neverallowTests = []struct {
} }
func TestNeverallow(t *testing.T) { func TestNeverallow(t *testing.T) {
for _, test := range neverallowTests {
// Create a test per config to allow for test specific config, e.g. test rules.
config := TestConfig(buildDir, nil) config := TestConfig(buildDir, nil)
for _, test := range neverallowTests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
// If the test has its own rules then use them instead of the default ones.
if test.rules != nil {
setTestNeverallowRules(config, test.rules)
}
_, errs := testNeverallow(config, test.fs) _, errs := testNeverallow(config, test.fs)
CheckErrorsAgainstExpectations(t, errs, test.expectedErrors) CheckErrorsAgainstExpectations(t, errs, test.expectedErrors)
}) })