diff --git a/android/neverallow.go b/android/neverallow.go index 8355bb3b8..3d1454ef2 100644 --- a/android/neverallow.go +++ b/android/neverallow.go @@ -177,7 +177,7 @@ func neverallowMutator(ctx BottomUpMutatorContext) { osClass := ctx.Module().Target().Os.Class - for _, r := range neverallows { + for _, r := range neverallowRules(ctx.Config()) { n := r.(*rule) if !n.appliesToPath(dir) { continue @@ -551,3 +551,19 @@ func matchValue(value reflect.Value, check func(string) bool) bool { 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 }) +} diff --git a/android/neverallow_test.go b/android/neverallow_test.go index 1a75e3d25..458458597 100644 --- a/android/neverallow_test.go +++ b/android/neverallow_test.go @@ -20,16 +20,19 @@ import ( "github.com/google/blueprint" ) -func init() { - // Add extra rules needed for testing. - AddNeverAllowRules( - NeverAllow().InDirectDeps("not_allowed_in_direct_deps"), - ) -} - var neverallowTests = []struct { - name string - fs map[string][]byte + // The name of the test. + 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 + + // 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 }{ // Test General Functionality @@ -37,6 +40,9 @@ var neverallowTests = []struct { // in direct deps tests { name: "not_allowed_in_direct_deps", + rules: []Rule{ + NeverAllow().InDirectDeps("not_allowed_in_direct_deps"), + }, fs: map[string][]byte{ "top/Blueprints": []byte(` cc_library { @@ -53,7 +59,7 @@ var neverallowTests = []struct { }, }, - // Test specific rules + // Test android specific rules // include_dir rule tests { @@ -247,11 +253,15 @@ var neverallowTests = []struct { } func TestNeverallow(t *testing.T) { - config := TestConfig(buildDir, nil) - for _, test := range neverallowTests { + // Create a test per config to allow for test specific config, e.g. test rules. + config := TestConfig(buildDir, nil) 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) CheckErrorsAgainstExpectations(t, errs, test.expectedErrors) })