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:
@@ -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 })
|
||||||
|
}
|
||||||
|
@@ -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)
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user