Support multiple expected errors in neverallow_test.go

Extracted some common code used by visibility_test.go and
neverallow_test.go into a new function CheckErrorsAgainstExpectations
in testing.go.

(cherry picked from f3fea09bd4c1cc71500726fb43a91a3b31ec5762)

Bug: 138428610
Test: m nothing
Change-Id: Iafbadf12c6ffdc4d9128fcfe7f15792df5cfd020
This commit is contained in:
Paul Duffin 2019-08-05 15:07:57 +01:00
parent f047b0b1c8
commit 8e47e8bc41
3 changed files with 58 additions and 39 deletions

View file

@ -30,7 +30,7 @@ func init() {
var neverallowTests = []struct {
name string
fs map[string][]byte
expectedError string
expectedErrors []string
}{
// Test General Functionality
@ -48,7 +48,9 @@ var neverallowTests = []struct {
static_libs: ["not_allowed_in_direct_deps"],
}`),
},
expectedError: `module "libother": violates neverallow deps:not_allowed_in_direct_deps`,
expectedErrors: []string{
`module "libother": violates neverallow deps:not_allowed_in_direct_deps`,
},
},
// Test specific rules
@ -63,7 +65,9 @@ var neverallowTests = []struct {
include_dirs: ["art/libdexfile/include"],
}`),
},
expectedError: "all usages of 'art' have been migrated",
expectedErrors: []string{
"all usages of 'art' have been migrated",
},
},
{
name: "include_dir can reference another location",
@ -88,7 +92,9 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "VNDK can never contain a library that is device dependent",
expectedErrors: []string{
"VNDK can never contain a library that is device dependent",
},
},
{
name: "no vndk.enabled under device directory",
@ -102,7 +108,9 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "VNDK can never contain a library that is device dependent",
expectedErrors: []string{
"VNDK can never contain a library that is device dependent",
},
},
{
name: "vndk-ext under vendor or device directory",
@ -124,7 +132,6 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "",
},
{
@ -140,7 +147,9 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "manifest enforcement should be independent",
expectedErrors: []string{
"manifest enforcement should be independent",
},
},
{
@ -156,7 +165,9 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "nothing should care if linker namespaces are enabled or not",
expectedErrors: []string{
"nothing should care if linker namespaces are enabled or not",
},
},
{
name: "libc_bionic_ndk treble_linker_namespaces.cflags",
@ -171,7 +182,6 @@ var neverallowTests = []struct {
},
}`),
},
expectedError: "",
},
{
name: "dependency on updatable-media",
@ -182,7 +192,9 @@ var neverallowTests = []struct {
libs: ["updatable-media"],
}`),
},
expectedError: "updatable-media includes private APIs. Use updatable_media_stubs instead.",
expectedErrors: []string{
"updatable-media includes private APIs. Use updatable_media_stubs instead.",
},
},
{
name: "java_device_for_host",
@ -193,7 +205,9 @@ var neverallowTests = []struct {
libs: ["core-libart"],
}`),
},
expectedError: "java_device_for_host can only be used in whitelisted projects",
expectedErrors: []string{
"java_device_for_host can only be used in whitelisted projects",
},
},
// Libcore rule tests
{
@ -215,7 +229,9 @@ var neverallowTests = []struct {
sdk_version: "none",
}`),
},
expectedError: "module \"outside_core_libraries\": violates neverallow",
expectedErrors: []string{
"module \"outside_core_libraries\": violates neverallow",
},
},
{
name: "sdk_version: \"current\"",
@ -233,19 +249,15 @@ func TestNeverallow(t *testing.T) {
config := TestConfig(buildDir, nil)
for _, test := range neverallowTests {
t.Run(test.name, func(t *testing.T) {
_, errs := testNeverallow(t, config, test.fs)
if test.expectedError == "" {
FailIfErrored(t, errs)
} else {
FailIfNoMatchingErrors(t, test.expectedError, errs)
}
t.Run(test.name, func(t *testing.T) {
_, errs := testNeverallow(config, test.fs)
CheckErrorsAgainstExpectations(t, errs, test.expectedErrors)
})
}
}
func testNeverallow(t *testing.T, config Config, fs map[string][]byte) (*TestContext, []error) {
func testNeverallow(config Config, fs map[string][]byte) (*TestContext, []error) {
ctx := NewTestContext()
ctx.RegisterModuleType("cc_library", ModuleFactoryAdaptor(newMockCcLibraryModule))
ctx.RegisterModuleType("java_library", ModuleFactoryAdaptor(newMockJavaLibraryModule))

View file

@ -372,6 +372,29 @@ func FailIfNoMatchingErrors(t *testing.T, pattern string, errs []error) {
}
}
func CheckErrorsAgainstExpectations(t *testing.T, errs []error, expectedErrorPatterns []string) {
t.Helper()
if expectedErrorPatterns == nil {
FailIfErrored(t, errs)
} else {
for _, expectedError := range expectedErrorPatterns {
FailIfNoMatchingErrors(t, expectedError, errs)
}
if len(errs) > len(expectedErrorPatterns) {
t.Errorf("additional errors found, expected %d, found %d",
len(expectedErrorPatterns), len(errs))
for i, expectedError := range expectedErrorPatterns {
t.Errorf("expectedErrors[%d] = %s", i, expectedError)
}
for i, err := range errs {
t.Errorf("errs[%d] = %s", i, err)
}
}
}
}
func AndroidMkEntriesForTest(t *testing.T, config Config, bpPath string, mod blueprint.Module) AndroidMkEntries {
var p AndroidMkEntriesProvider
var ok bool

View file

@ -860,23 +860,7 @@ func TestVisibility(t *testing.T) {
t.Run(test.name, func(t *testing.T) {
_, errs := testVisibility(buildDir, test.fs)
expectedErrors := test.expectedErrors
if expectedErrors == nil {
FailIfErrored(t, errs)
} else {
for _, expectedError := range expectedErrors {
FailIfNoMatchingErrors(t, expectedError, errs)
}
if len(errs) > len(expectedErrors) {
t.Errorf("additional errors found, expected %d, found %d", len(expectedErrors), len(errs))
for i, expectedError := range expectedErrors {
t.Errorf("expectedErrors[%d] = %s", i, expectedError)
}
for i, err := range errs {
t.Errorf("errs[%d] = %s", i, err)
}
}
}
CheckErrorsAgainstExpectations(t, errs, test.expectedErrors)
})
}
}