Merge changes Ib2c6ac28,I7c76ed6d,I00415f10,I4be2a16c,I6f269c9c, ... am: 67e848ab04
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1625385 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ic13069217603fb937f20712dd67fe03ecd52ea97
This commit is contained in:
@@ -199,6 +199,24 @@ type FixtureFactory interface {
|
||||
//
|
||||
// Shorthand for RunTest(t, android.FixtureWithRootAndroidBp(bp))
|
||||
RunTestWithBp(t *testing.T, bp string) *TestResult
|
||||
|
||||
// RunTestWithConfig is a temporary method added to help ease the migration of existing tests to
|
||||
// the test fixture.
|
||||
//
|
||||
// In order to allow the Config object to be customized separately to the TestContext a lot of
|
||||
// existing test code has `test...WithConfig` funcs that allow the Config object to be supplied
|
||||
// from the test and then have the TestContext created and configured automatically. e.g.
|
||||
// testCcWithConfig, testCcErrorWithConfig, testJavaWithConfig, etc.
|
||||
//
|
||||
// This method allows those methods to be migrated to use the test fixture pattern without
|
||||
// requiring that every test that uses those methods be migrated at the same time. That allows
|
||||
// those tests to benefit from correctness in the order of registration quickly.
|
||||
//
|
||||
// This method discards the config (along with its mock file system, product variables,
|
||||
// environment, etc.) that may have been set up by FixturePreparers.
|
||||
//
|
||||
// deprecated
|
||||
RunTestWithConfig(t *testing.T, config Config) *TestResult
|
||||
}
|
||||
|
||||
// Create a new FixtureFactory that will apply the supplied preparers.
|
||||
@@ -687,6 +705,28 @@ func (f *fixtureFactory) RunTestWithBp(t *testing.T, bp string) *TestResult {
|
||||
return f.RunTest(t, FixtureWithRootAndroidBp(bp))
|
||||
}
|
||||
|
||||
func (f *fixtureFactory) RunTestWithConfig(t *testing.T, config Config) *TestResult {
|
||||
t.Helper()
|
||||
// Create the fixture as normal.
|
||||
fixture := f.Fixture(t).(*fixture)
|
||||
|
||||
// Discard the mock filesystem as otherwise that will override the one in the config.
|
||||
fixture.mockFS = nil
|
||||
|
||||
// Replace the config with the supplied one in the fixture.
|
||||
fixture.config = config
|
||||
|
||||
// Ditto with config derived information in the TestContext.
|
||||
ctx := fixture.ctx
|
||||
ctx.config = config
|
||||
ctx.SetFs(ctx.config.fs)
|
||||
if ctx.config.mockBpList != "" {
|
||||
ctx.SetModuleListFile(ctx.config.mockBpList)
|
||||
}
|
||||
|
||||
return fixture.RunTest()
|
||||
}
|
||||
|
||||
type fixture struct {
|
||||
// The factory used to create this fixture.
|
||||
factory *fixtureFactory
|
||||
@@ -712,17 +752,22 @@ func (f *fixture) RunTest() *TestResult {
|
||||
|
||||
ctx := f.ctx
|
||||
|
||||
// The TestConfig() method assumes that the mock filesystem is available when creating so creates
|
||||
// the mock file system immediately. Similarly, the NewTestContext(Config) method assumes that the
|
||||
// supplied Config's FileSystem has been properly initialized before it is called and so it takes
|
||||
// its own reference to the filesystem. However, fixtures create the Config and TestContext early
|
||||
// so they can be modified by preparers at which time the mockFS has not been populated (because
|
||||
// it too is modified by preparers). So, this reinitializes the Config and TestContext's
|
||||
// FileSystem using the now populated mockFS.
|
||||
f.config.mockFileSystem("", f.mockFS)
|
||||
ctx.SetFs(ctx.config.fs)
|
||||
if ctx.config.mockBpList != "" {
|
||||
ctx.SetModuleListFile(ctx.config.mockBpList)
|
||||
// Do not use the fixture's mockFS to initialize the config's mock file system if it has been
|
||||
// cleared by RunTestWithConfig.
|
||||
if f.mockFS != nil {
|
||||
// The TestConfig() method assumes that the mock filesystem is available when creating so
|
||||
// creates the mock file system immediately. Similarly, the NewTestContext(Config) method
|
||||
// assumes that the supplied Config's FileSystem has been properly initialized before it is
|
||||
// called and so it takes its own reference to the filesystem. However, fixtures create the
|
||||
// Config and TestContext early so they can be modified by preparers at which time the mockFS
|
||||
// has not been populated (because it too is modified by preparers). So, this reinitializes the
|
||||
// Config and TestContext's FileSystem using the now populated mockFS.
|
||||
f.config.mockFileSystem("", f.mockFS)
|
||||
|
||||
ctx.SetFs(ctx.config.fs)
|
||||
if ctx.config.mockBpList != "" {
|
||||
ctx.SetModuleListFile(ctx.config.mockBpList)
|
||||
}
|
||||
}
|
||||
|
||||
ctx.Register()
|
||||
|
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
var licenseKindTests = []struct {
|
||||
name string
|
||||
fs map[string][]byte
|
||||
fs MockFS
|
||||
expectedErrors []string
|
||||
}{
|
||||
{
|
||||
@@ -97,48 +97,18 @@ var licenseKindTests = []struct {
|
||||
func TestLicenseKind(t *testing.T) {
|
||||
for _, test := range licenseKindTests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
_, errs := testLicenseKind(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)
|
||||
}
|
||||
}
|
||||
}
|
||||
licenseTestFixtureFactory.
|
||||
Extend(
|
||||
FixtureRegisterWithContext(func(ctx RegistrationContext) {
|
||||
ctx.RegisterModuleType("mock_license", newMockLicenseModule)
|
||||
}),
|
||||
test.fs.AddToFixture(),
|
||||
).ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
|
||||
RunTest(t)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func testLicenseKind(fs map[string][]byte) (*TestContext, []error) {
|
||||
|
||||
// Create a new config per test as license_kind information is stored in the config.
|
||||
config := TestArchConfig(buildDir, nil, "", fs)
|
||||
|
||||
ctx := NewTestArchContext(config)
|
||||
RegisterLicenseKindBuildComponents(ctx)
|
||||
ctx.RegisterModuleType("mock_license", newMockLicenseModule)
|
||||
ctx.Register()
|
||||
|
||||
_, errs := ctx.ParseBlueprintsFiles(".")
|
||||
if len(errs) > 0 {
|
||||
return ctx, errs
|
||||
}
|
||||
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
return ctx, errs
|
||||
}
|
||||
|
||||
type mockLicenseProperties struct {
|
||||
License_kinds []string
|
||||
}
|
||||
|
@@ -4,9 +4,24 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Common test set up for license tests.
|
||||
var licenseTestFixtureFactory = emptyTestFixtureFactory.Extend(
|
||||
// General preparers in alphabetical order.
|
||||
PrepareForTestWithDefaults,
|
||||
prepareForTestWithLicenses,
|
||||
PrepareForTestWithOverrides,
|
||||
PrepareForTestWithPackageModule,
|
||||
PrepareForTestWithPrebuilts,
|
||||
PrepareForTestWithVisibility,
|
||||
|
||||
// Additional test specific stuff
|
||||
prepareForTestWithFakePrebuiltModules,
|
||||
FixtureMergeEnv(map[string]string{"ANDROID_REQUIRE_LICENSES": "1"}),
|
||||
)
|
||||
|
||||
var licenseTests = []struct {
|
||||
name string
|
||||
fs map[string][]byte
|
||||
fs MockFS
|
||||
expectedErrors []string
|
||||
}{
|
||||
{
|
||||
@@ -163,58 +178,20 @@ var licenseTests = []struct {
|
||||
func TestLicense(t *testing.T) {
|
||||
for _, test := range licenseTests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
_, errs := testLicense(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)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Customize the common license text fixture factory.
|
||||
licenseTestFixtureFactory.Extend(
|
||||
FixtureRegisterWithContext(func(ctx RegistrationContext) {
|
||||
ctx.RegisterModuleType("rule", newMockRuleModule)
|
||||
}),
|
||||
test.fs.AddToFixture(),
|
||||
).
|
||||
ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
|
||||
RunTest(t)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func testLicense(fs map[string][]byte) (*TestContext, []error) {
|
||||
|
||||
// Create a new config per test as visibility information is stored in the config.
|
||||
env := make(map[string]string)
|
||||
env["ANDROID_REQUIRE_LICENSES"] = "1"
|
||||
config := TestArchConfig(buildDir, env, "", fs)
|
||||
|
||||
ctx := NewTestArchContext(config)
|
||||
RegisterPackageBuildComponents(ctx)
|
||||
registerTestPrebuiltBuildComponents(ctx)
|
||||
RegisterLicenseKindBuildComponents(ctx)
|
||||
RegisterLicenseBuildComponents(ctx)
|
||||
ctx.RegisterModuleType("rule", newMockRuleModule)
|
||||
ctx.PreArchMutators(RegisterVisibilityRuleChecker)
|
||||
ctx.PreArchMutators(RegisterLicensesPackageMapper)
|
||||
ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
|
||||
ctx.PreArchMutators(RegisterLicensesPropertyGatherer)
|
||||
ctx.PreArchMutators(RegisterVisibilityRuleGatherer)
|
||||
ctx.PostDepsMutators(RegisterVisibilityRuleEnforcer)
|
||||
ctx.PostDepsMutators(RegisterLicensesDependencyChecker)
|
||||
ctx.Register()
|
||||
|
||||
_, errs := ctx.ParseBlueprintsFiles(".")
|
||||
if len(errs) > 0 {
|
||||
return ctx, errs
|
||||
}
|
||||
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
return ctx, errs
|
||||
func testLicense(t *testing.T, fs MockFS, expectedErrors []string) {
|
||||
}
|
||||
|
||||
type mockRuleModule struct {
|
||||
|
@@ -6,9 +6,21 @@ import (
|
||||
"github.com/google/blueprint"
|
||||
)
|
||||
|
||||
var prepareForTestWithLicenses = GroupFixturePreparers(
|
||||
FixtureRegisterWithContext(RegisterLicenseKindBuildComponents),
|
||||
FixtureRegisterWithContext(RegisterLicenseBuildComponents),
|
||||
FixtureRegisterWithContext(registerLicenseMutators),
|
||||
)
|
||||
|
||||
func registerLicenseMutators(ctx RegistrationContext) {
|
||||
ctx.PreArchMutators(RegisterLicensesPackageMapper)
|
||||
ctx.PreArchMutators(RegisterLicensesPropertyGatherer)
|
||||
ctx.PostDepsMutators(RegisterLicensesDependencyChecker)
|
||||
}
|
||||
|
||||
var licensesTests = []struct {
|
||||
name string
|
||||
fs map[string][]byte
|
||||
fs MockFS
|
||||
expectedErrors []string
|
||||
effectiveLicenses map[string][]string
|
||||
effectiveInheritedLicenses map[string][]string
|
||||
@@ -457,40 +469,48 @@ var licensesTests = []struct {
|
||||
func TestLicenses(t *testing.T) {
|
||||
for _, test := range licensesTests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
ctx, errs := testLicenses(buildDir, test.fs)
|
||||
|
||||
CheckErrorsAgainstExpectations(t, errs, test.expectedErrors)
|
||||
// Customize the common license text fixture factory.
|
||||
result := licenseTestFixtureFactory.Extend(
|
||||
FixtureRegisterWithContext(func(ctx RegistrationContext) {
|
||||
ctx.RegisterModuleType("mock_bad_module", newMockLicensesBadModule)
|
||||
ctx.RegisterModuleType("mock_library", newMockLicensesLibraryModule)
|
||||
ctx.RegisterModuleType("mock_defaults", defaultsLicensesFactory)
|
||||
}),
|
||||
test.fs.AddToFixture(),
|
||||
).
|
||||
ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
|
||||
RunTest(t)
|
||||
|
||||
if test.effectiveLicenses != nil {
|
||||
checkEffectiveLicenses(t, ctx, test.effectiveLicenses)
|
||||
checkEffectiveLicenses(result, test.effectiveLicenses)
|
||||
}
|
||||
|
||||
if test.effectivePackage != nil {
|
||||
checkEffectivePackage(t, ctx, test.effectivePackage)
|
||||
checkEffectivePackage(result, test.effectivePackage)
|
||||
}
|
||||
|
||||
if test.effectiveNotices != nil {
|
||||
checkEffectiveNotices(t, ctx, test.effectiveNotices)
|
||||
checkEffectiveNotices(result, test.effectiveNotices)
|
||||
}
|
||||
|
||||
if test.effectiveKinds != nil {
|
||||
checkEffectiveKinds(t, ctx, test.effectiveKinds)
|
||||
checkEffectiveKinds(result, test.effectiveKinds)
|
||||
}
|
||||
|
||||
if test.effectiveConditions != nil {
|
||||
checkEffectiveConditions(t, ctx, test.effectiveConditions)
|
||||
checkEffectiveConditions(result, test.effectiveConditions)
|
||||
}
|
||||
|
||||
if test.effectiveInheritedLicenses != nil {
|
||||
checkEffectiveInheritedLicenses(t, ctx, test.effectiveInheritedLicenses)
|
||||
checkEffectiveInheritedLicenses(result, test.effectiveInheritedLicenses)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectiveLicenses(t *testing.T, ctx *TestContext, effectiveLicenses map[string][]string) {
|
||||
func checkEffectiveLicenses(result *TestResult, effectiveLicenses map[string][]string) {
|
||||
actualLicenses := make(map[string][]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -502,7 +522,7 @@ func checkEffectiveLicenses(t *testing.T, ctx *TestContext, effectiveLicenses ma
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -518,14 +538,14 @@ func checkEffectiveLicenses(t *testing.T, ctx *TestContext, effectiveLicenses ma
|
||||
licenses = []string{}
|
||||
}
|
||||
if !compareUnorderedStringArrays(expectedLicenses, licenses) {
|
||||
t.Errorf("effective licenses mismatch for module %q: expected %q, found %q", moduleName, expectedLicenses, licenses)
|
||||
result.Errorf("effective licenses mismatch for module %q: expected %q, found %q", moduleName, expectedLicenses, licenses)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectiveInheritedLicenses(t *testing.T, ctx *TestContext, effectiveInheritedLicenses map[string][]string) {
|
||||
func checkEffectiveInheritedLicenses(result *TestResult, effectiveInheritedLicenses map[string][]string) {
|
||||
actualLicenses := make(map[string][]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -537,7 +557,7 @@ func checkEffectiveInheritedLicenses(t *testing.T, ctx *TestContext, effectiveIn
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -548,7 +568,7 @@ func checkEffectiveInheritedLicenses(t *testing.T, ctx *TestContext, effectiveIn
|
||||
for _, l := range base.commonProperties.Effective_licenses {
|
||||
inherited[l] = true
|
||||
}
|
||||
ctx.Context.Context.VisitDepsDepthFirst(m, func(c blueprint.Module) {
|
||||
result.Context.Context.VisitDepsDepthFirst(m, func(c blueprint.Module) {
|
||||
if _, ok := c.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -560,7 +580,7 @@ func checkEffectiveInheritedLicenses(t *testing.T, ctx *TestContext, effectiveIn
|
||||
}
|
||||
cmodule, ok := c.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", c.Name())
|
||||
result.Errorf("%q not a module", c.Name())
|
||||
return
|
||||
}
|
||||
cbase := cmodule.base()
|
||||
@@ -583,14 +603,14 @@ func checkEffectiveInheritedLicenses(t *testing.T, ctx *TestContext, effectiveIn
|
||||
licenses = []string{}
|
||||
}
|
||||
if !compareUnorderedStringArrays(expectedInheritedLicenses, licenses) {
|
||||
t.Errorf("effective inherited licenses mismatch for module %q: expected %q, found %q", moduleName, expectedInheritedLicenses, licenses)
|
||||
result.Errorf("effective inherited licenses mismatch for module %q: expected %q, found %q", moduleName, expectedInheritedLicenses, licenses)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectivePackage(t *testing.T, ctx *TestContext, effectivePackage map[string]string) {
|
||||
func checkEffectivePackage(result *TestResult, effectivePackage map[string]string) {
|
||||
actualPackage := make(map[string]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -602,7 +622,7 @@ func checkEffectivePackage(t *testing.T, ctx *TestContext, effectivePackage map[
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -623,14 +643,14 @@ func checkEffectivePackage(t *testing.T, ctx *TestContext, effectivePackage map[
|
||||
packageName = ""
|
||||
}
|
||||
if expectedPackage != packageName {
|
||||
t.Errorf("effective package mismatch for module %q: expected %q, found %q", moduleName, expectedPackage, packageName)
|
||||
result.Errorf("effective package mismatch for module %q: expected %q, found %q", moduleName, expectedPackage, packageName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectiveNotices(t *testing.T, ctx *TestContext, effectiveNotices map[string][]string) {
|
||||
func checkEffectiveNotices(result *TestResult, effectiveNotices map[string][]string) {
|
||||
actualNotices := make(map[string][]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -642,7 +662,7 @@ func checkEffectiveNotices(t *testing.T, ctx *TestContext, effectiveNotices map[
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -658,14 +678,14 @@ func checkEffectiveNotices(t *testing.T, ctx *TestContext, effectiveNotices map[
|
||||
notices = []string{}
|
||||
}
|
||||
if !compareUnorderedStringArrays(expectedNotices, notices) {
|
||||
t.Errorf("effective notice files mismatch for module %q: expected %q, found %q", moduleName, expectedNotices, notices)
|
||||
result.Errorf("effective notice files mismatch for module %q: expected %q, found %q", moduleName, expectedNotices, notices)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectiveKinds(t *testing.T, ctx *TestContext, effectiveKinds map[string][]string) {
|
||||
func checkEffectiveKinds(result *TestResult, effectiveKinds map[string][]string) {
|
||||
actualKinds := make(map[string][]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -677,7 +697,7 @@ func checkEffectiveKinds(t *testing.T, ctx *TestContext, effectiveKinds map[stri
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -693,14 +713,14 @@ func checkEffectiveKinds(t *testing.T, ctx *TestContext, effectiveKinds map[stri
|
||||
kinds = []string{}
|
||||
}
|
||||
if !compareUnorderedStringArrays(expectedKinds, kinds) {
|
||||
t.Errorf("effective license kinds mismatch for module %q: expected %q, found %q", moduleName, expectedKinds, kinds)
|
||||
result.Errorf("effective license kinds mismatch for module %q: expected %q, found %q", moduleName, expectedKinds, kinds)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func checkEffectiveConditions(t *testing.T, ctx *TestContext, effectiveConditions map[string][]string) {
|
||||
func checkEffectiveConditions(result *TestResult, effectiveConditions map[string][]string) {
|
||||
actualConditions := make(map[string][]string)
|
||||
ctx.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
result.Context.Context.VisitAllModules(func(m blueprint.Module) {
|
||||
if _, ok := m.(*licenseModule); ok {
|
||||
return
|
||||
}
|
||||
@@ -712,7 +732,7 @@ func checkEffectiveConditions(t *testing.T, ctx *TestContext, effectiveCondition
|
||||
}
|
||||
module, ok := m.(Module)
|
||||
if !ok {
|
||||
t.Errorf("%q not a module", m.Name())
|
||||
result.Errorf("%q not a module", m.Name())
|
||||
return
|
||||
}
|
||||
base := module.base()
|
||||
@@ -728,7 +748,7 @@ func checkEffectiveConditions(t *testing.T, ctx *TestContext, effectiveCondition
|
||||
conditions = []string{}
|
||||
}
|
||||
if !compareUnorderedStringArrays(expectedConditions, conditions) {
|
||||
t.Errorf("effective license conditions mismatch for module %q: expected %q, found %q", moduleName, expectedConditions, conditions)
|
||||
result.Errorf("effective license conditions mismatch for module %q: expected %q, found %q", moduleName, expectedConditions, conditions)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -754,41 +774,6 @@ func compareUnorderedStringArrays(expected, actual []string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func testLicenses(buildDir string, fs map[string][]byte) (*TestContext, []error) {
|
||||
|
||||
// Create a new config per test as licenses information is stored in the config.
|
||||
env := make(map[string]string)
|
||||
env["ANDROID_REQUIRE_LICENSES"] = "1"
|
||||
config := TestArchConfig(buildDir, env, "", fs)
|
||||
|
||||
ctx := NewTestArchContext(config)
|
||||
ctx.RegisterModuleType("mock_bad_module", newMockLicensesBadModule)
|
||||
ctx.RegisterModuleType("mock_library", newMockLicensesLibraryModule)
|
||||
ctx.RegisterModuleType("mock_defaults", defaultsLicensesFactory)
|
||||
|
||||
// Order of the following method calls is significant.
|
||||
RegisterPackageBuildComponents(ctx)
|
||||
registerTestPrebuiltBuildComponents(ctx)
|
||||
RegisterLicenseKindBuildComponents(ctx)
|
||||
RegisterLicenseBuildComponents(ctx)
|
||||
ctx.PreArchMutators(RegisterVisibilityRuleChecker)
|
||||
ctx.PreArchMutators(RegisterLicensesPackageMapper)
|
||||
ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
|
||||
ctx.PreArchMutators(RegisterLicensesPropertyGatherer)
|
||||
ctx.PreArchMutators(RegisterVisibilityRuleGatherer)
|
||||
ctx.PostDepsMutators(RegisterVisibilityRuleEnforcer)
|
||||
ctx.PostDepsMutators(RegisterLicensesDependencyChecker)
|
||||
ctx.Register()
|
||||
|
||||
_, errs := ctx.ParseBlueprintsFiles(".")
|
||||
if len(errs) > 0 {
|
||||
return ctx, errs
|
||||
}
|
||||
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
return ctx, errs
|
||||
}
|
||||
|
||||
type mockLicensesBadProperties struct {
|
||||
Visibility []string
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
android.RegisterModuleType("bpf", BpfFactory)
|
||||
registerBpfBuildComponents(android.InitRegistrationContext)
|
||||
pctx.Import("android/soong/cc/config")
|
||||
}
|
||||
|
||||
@@ -43,6 +43,12 @@ var (
|
||||
"ccCmd", "cFlags")
|
||||
)
|
||||
|
||||
func registerBpfBuildComponents(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("bpf", BpfFactory)
|
||||
}
|
||||
|
||||
var PrepareForTestWithBpf = android.FixtureRegisterWithContext(registerBpfBuildComponents)
|
||||
|
||||
// BpfModule interface is used by the apex package to gather information from a bpf module.
|
||||
type BpfModule interface {
|
||||
android.Module
|
||||
|
@@ -46,24 +46,20 @@ func TestMain(m *testing.M) {
|
||||
}
|
||||
|
||||
os.Exit(run())
|
||||
|
||||
}
|
||||
|
||||
func testConfig(buildDir string, env map[string]string, bp string) android.Config {
|
||||
mockFS := map[string][]byte{
|
||||
"bpf.c": nil,
|
||||
"BpfTest.cpp": nil,
|
||||
}
|
||||
|
||||
return cc.TestConfig(buildDir, android.Android, env, bp, mockFS)
|
||||
}
|
||||
|
||||
func testContext(config android.Config) *android.TestContext {
|
||||
ctx := cc.CreateTestContext(config)
|
||||
ctx.RegisterModuleType("bpf", BpfFactory)
|
||||
ctx.Register()
|
||||
|
||||
return ctx
|
||||
}
|
||||
var bpfFactory = android.NewFixtureFactory(
|
||||
&buildDir,
|
||||
cc.PrepareForTestWithCcDefaultModules,
|
||||
android.FixtureMergeMockFs(
|
||||
map[string][]byte{
|
||||
"bpf.c": nil,
|
||||
"BpfTest.cpp": nil,
|
||||
},
|
||||
),
|
||||
PrepareForTestWithBpf,
|
||||
)
|
||||
|
||||
func TestBpfDataDependency(t *testing.T) {
|
||||
bp := `
|
||||
@@ -80,16 +76,7 @@ func TestBpfDataDependency(t *testing.T) {
|
||||
}
|
||||
`
|
||||
|
||||
config := testConfig(buildDir, nil, bp)
|
||||
ctx := testContext(config)
|
||||
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
if errs == nil {
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
}
|
||||
if errs != nil {
|
||||
t.Fatal(errs)
|
||||
}
|
||||
bpfFactory.RunTestWithBp(t, bp)
|
||||
|
||||
// We only verify the above BP configuration is processed successfully since the data property
|
||||
// value is not available for testing from this package.
|
||||
|
@@ -52,29 +52,50 @@ func TestMain(m *testing.M) {
|
||||
os.Exit(run())
|
||||
}
|
||||
|
||||
var ccFixtureFactory = android.NewFixtureFactory(
|
||||
&buildDir,
|
||||
PrepareForTestWithCcIncludeVndk,
|
||||
|
||||
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
|
||||
variables.DeviceVndkVersion = StringPtr("current")
|
||||
variables.ProductVndkVersion = StringPtr("current")
|
||||
variables.Platform_vndk_version = StringPtr("VER")
|
||||
}),
|
||||
)
|
||||
|
||||
// testCcWithConfig runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcWithConfig(t *testing.T, config android.Config) *android.TestContext {
|
||||
t.Helper()
|
||||
ctx := CreateTestContext(config)
|
||||
ctx.Register()
|
||||
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
android.FailIfErrored(t, errs)
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
android.FailIfErrored(t, errs)
|
||||
|
||||
return ctx
|
||||
result := ccFixtureFactory.RunTestWithConfig(t, config)
|
||||
return result.TestContext
|
||||
}
|
||||
|
||||
// testCc runs tests using the ccFixtureFactory
|
||||
//
|
||||
// Do not add any new usages of this, instead use the ccFixtureFactory directly as it makes it much
|
||||
// easier to customize the test behavior.
|
||||
//
|
||||
// If it is necessary to customize the behavior of an existing test that uses this then please first
|
||||
// convert the test to using ccFixtureFactory first and then in a following change add the
|
||||
// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
|
||||
// that it did not change the test behavior unexpectedly.
|
||||
//
|
||||
// deprecated
|
||||
func testCc(t *testing.T, bp string) *android.TestContext {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.ProductVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||
|
||||
return testCcWithConfig(t, config)
|
||||
result := ccFixtureFactory.RunTestWithBp(t, bp)
|
||||
return result.TestContext
|
||||
}
|
||||
|
||||
// testCcNoVndk runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcNoVndk(t *testing.T, bp string) *android.TestContext {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
@@ -83,6 +104,11 @@ func testCcNoVndk(t *testing.T, bp string) *android.TestContext {
|
||||
return testCcWithConfig(t, config)
|
||||
}
|
||||
|
||||
// testCcNoProductVndk runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcNoProductVndk(t *testing.T, bp string) *android.TestContext {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
@@ -92,27 +118,24 @@ func testCcNoProductVndk(t *testing.T, bp string) *android.TestContext {
|
||||
return testCcWithConfig(t, config)
|
||||
}
|
||||
|
||||
// testCcErrorWithConfig runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) {
|
||||
t.Helper()
|
||||
|
||||
ctx := CreateTestContext(config)
|
||||
ctx.Register()
|
||||
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
if len(errs) > 0 {
|
||||
android.FailIfNoMatchingErrors(t, pattern, errs)
|
||||
return
|
||||
}
|
||||
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
if len(errs) > 0 {
|
||||
android.FailIfNoMatchingErrors(t, pattern, errs)
|
||||
return
|
||||
}
|
||||
|
||||
t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
|
||||
ccFixtureFactory.Extend().
|
||||
ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
|
||||
RunTestWithConfig(t, config)
|
||||
}
|
||||
|
||||
// testCcError runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcError(t *testing.T, pattern string, bp string) {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
@@ -122,6 +145,11 @@ func testCcError(t *testing.T, pattern string, bp string) {
|
||||
return
|
||||
}
|
||||
|
||||
// testCcErrorProductVndk runs tests using the ccFixtureFactory
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func testCcErrorProductVndk(t *testing.T, pattern string, bp string) {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
|
168
cc/testing.go
168
cc/testing.go
@@ -37,7 +37,31 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
|
||||
}
|
||||
|
||||
func GatherRequiredDepsForTest(oses ...android.OsType) string {
|
||||
ret := `
|
||||
ret := commonDefaultModules()
|
||||
|
||||
supportLinuxBionic := false
|
||||
for _, os := range oses {
|
||||
if os == android.Fuchsia {
|
||||
ret += withFuchsiaModules()
|
||||
}
|
||||
if os == android.Windows {
|
||||
ret += withWindowsModules()
|
||||
}
|
||||
if os == android.LinuxBionic {
|
||||
supportLinuxBionic = true
|
||||
ret += withLinuxBionic()
|
||||
}
|
||||
}
|
||||
|
||||
if !supportLinuxBionic {
|
||||
ret += withoutLinuxBionic()
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func commonDefaultModules() string {
|
||||
return `
|
||||
toolchain_library {
|
||||
name: "libatomic",
|
||||
defaults: ["linux_bionic_supported"],
|
||||
@@ -475,23 +499,10 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string {
|
||||
name: "note_memtag_heap_sync",
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
supportLinuxBionic := false
|
||||
for _, os := range oses {
|
||||
if os == android.Fuchsia {
|
||||
ret += `
|
||||
cc_library {
|
||||
name: "libbioniccompat",
|
||||
stl: "none",
|
||||
}
|
||||
cc_library {
|
||||
name: "libcompiler_rt",
|
||||
stl: "none",
|
||||
}
|
||||
`
|
||||
}
|
||||
if os == android.Windows {
|
||||
ret += `
|
||||
func withWindowsModules() string {
|
||||
return `
|
||||
toolchain_library {
|
||||
name: "libwinpthread",
|
||||
host_supported: true,
|
||||
@@ -504,10 +515,23 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string {
|
||||
src: "",
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
func withFuchsiaModules() string {
|
||||
return `
|
||||
cc_library {
|
||||
name: "libbioniccompat",
|
||||
stl: "none",
|
||||
}
|
||||
if os == android.LinuxBionic {
|
||||
supportLinuxBionic = true
|
||||
ret += `
|
||||
cc_library {
|
||||
name: "libcompiler_rt",
|
||||
stl: "none",
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
func withLinuxBionic() string {
|
||||
return `
|
||||
cc_binary {
|
||||
name: "linker",
|
||||
defaults: ["linux_bionic_supported"],
|
||||
@@ -547,23 +571,104 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string {
|
||||
},
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !supportLinuxBionic {
|
||||
ret += `
|
||||
func withoutLinuxBionic() string {
|
||||
return `
|
||||
cc_defaults {
|
||||
name: "linux_bionic_supported",
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func GatherRequiredFilesForTest(fs map[string][]byte) {
|
||||
}
|
||||
|
||||
// The directory in which cc linux bionic default modules will be defined.
|
||||
//
|
||||
// Placing them here ensures that their location does not conflict with default test modules
|
||||
// defined by other packages.
|
||||
const linuxBionicDefaultsPath = "defaults/cc/linux-bionic/Android.bp"
|
||||
|
||||
// The directory in which the default cc common test modules will be defined.
|
||||
//
|
||||
// Placing them here ensures that their location does not conflict with default test modules
|
||||
// defined by other packages.
|
||||
const DefaultCcCommonTestModulesDir = "defaults/cc/common/"
|
||||
|
||||
// Test fixture preparer that will register most cc build components.
|
||||
//
|
||||
// Singletons and mutators should only be added here if they are needed for a majority of cc
|
||||
// module types, otherwise they should be added under a separate preparer to allow them to be
|
||||
// selected only when needed to reduce test execution time.
|
||||
//
|
||||
// Module types do not have much of an overhead unless they are used so this should include as many
|
||||
// module types as possible. The exceptions are those module types that require mutators and/or
|
||||
// singletons in order to function in which case they should be kept together in a separate
|
||||
// preparer.
|
||||
var PrepareForTestWithCcBuildComponents = android.GroupFixturePreparers(
|
||||
android.PrepareForTestWithAndroidBuildComponents,
|
||||
android.FixtureRegisterWithContext(RegisterRequiredBuildComponentsForTest),
|
||||
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("cc_fuzz", FuzzFactory)
|
||||
ctx.RegisterModuleType("cc_test", TestFactory)
|
||||
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
||||
ctx.RegisterModuleType("llndk_headers", llndkHeadersFactory)
|
||||
ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
|
||||
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||
|
||||
RegisterVndkLibraryTxtTypes(ctx)
|
||||
}),
|
||||
)
|
||||
|
||||
// Preparer that will define default cc modules, e.g. standard prebuilt modules.
|
||||
var PrepareForTestWithCcDefaultModules = android.GroupFixturePreparers(
|
||||
PrepareForTestWithCcBuildComponents,
|
||||
// Place the default cc test modules that are common to all platforms in a location that will not
|
||||
// conflict with default test modules defined by other packages.
|
||||
android.FixtureAddTextFile(DefaultCcCommonTestModulesDir+"Android.bp", commonDefaultModules()),
|
||||
// Disable linux bionic by default.
|
||||
android.FixtureAddTextFile(linuxBionicDefaultsPath, withoutLinuxBionic()),
|
||||
)
|
||||
|
||||
// Prepare a fixture to use all cc module types, mutators and singletons fully.
|
||||
//
|
||||
// This should only be used by tests that want to run with as much of the build enabled as possible.
|
||||
var PrepareForIntegrationTestWithCc = android.GroupFixturePreparers(
|
||||
android.PrepareForIntegrationTestWithAndroid,
|
||||
genrule.PrepareForIntegrationTestWithGenrule,
|
||||
PrepareForTestWithCcDefaultModules,
|
||||
)
|
||||
|
||||
// The preparer to include if running a cc related test for windows.
|
||||
var PrepareForTestOnWindows = android.GroupFixturePreparers(
|
||||
// Place the default cc test modules for windows platforms in a location that will not conflict
|
||||
// with default test modules defined by other packages.
|
||||
android.FixtureAddTextFile("defaults/cc/windows/Android.bp", withWindowsModules()),
|
||||
)
|
||||
|
||||
// The preparer to include if running a cc related test for linux bionic.
|
||||
var PrepareForTestOnLinuxBionic = android.GroupFixturePreparers(
|
||||
// Enable linux bionic.
|
||||
android.FixtureAddTextFile(linuxBionicDefaultsPath, withLinuxBionic()),
|
||||
)
|
||||
|
||||
// This adds some additional modules and singletons which might negatively impact the performance
|
||||
// of tests so they are not included in the PrepareForIntegrationTestWithCc.
|
||||
var PrepareForTestWithCcIncludeVndk = android.GroupFixturePreparers(
|
||||
PrepareForIntegrationTestWithCc,
|
||||
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
|
||||
vendorSnapshotImageSingleton.init(ctx)
|
||||
recoverySnapshotImageSingleton.init(ctx)
|
||||
ctx.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
|
||||
}),
|
||||
)
|
||||
|
||||
// TestConfig is the legacy way of creating a test Config for testing cc modules.
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func TestConfig(buildDir string, os android.OsType, env map[string]string,
|
||||
bp string, fs map[string][]byte) android.Config {
|
||||
|
||||
@@ -588,6 +693,11 @@ func TestConfig(buildDir string, os android.OsType, env map[string]string,
|
||||
return config
|
||||
}
|
||||
|
||||
// CreateTestContext is the legacy way of creating a TestContext for testing cc modules.
|
||||
//
|
||||
// See testCc for an explanation as to how to stop using this deprecated method.
|
||||
//
|
||||
// deprecated
|
||||
func CreateTestContext(config android.Config) *android.TestContext {
|
||||
ctx := android.NewTestArchContext(config)
|
||||
genrule.RegisterGenruleBuildComponents(ctx)
|
||||
@@ -598,13 +708,15 @@ func CreateTestContext(config android.Config) *android.TestContext {
|
||||
ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
|
||||
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
||||
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||
|
||||
vendorSnapshotImageSingleton.init(ctx)
|
||||
recoverySnapshotImageSingleton.init(ctx)
|
||||
ctx.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
|
||||
RegisterVndkLibraryTxtTypes(ctx)
|
||||
|
||||
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
|
||||
android.RegisterPrebuiltMutators(ctx)
|
||||
RegisterRequiredBuildComponentsForTest(ctx)
|
||||
ctx.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
|
||||
|
||||
return ctx
|
||||
}
|
||||
|
@@ -54,6 +54,8 @@ func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory)
|
||||
}
|
||||
|
||||
var PrepareForTestWithPrebuiltEtc = android.FixtureRegisterWithContext(RegisterPrebuiltEtcBuildComponents)
|
||||
|
||||
type prebuiltEtcProperties struct {
|
||||
// Source file of this prebuilt. Can reference a genrule type module with the ":module" syntax.
|
||||
Src *string `android:"path,arch_variant"`
|
||||
|
@@ -49,58 +49,34 @@ func TestMain(m *testing.M) {
|
||||
os.Exit(run())
|
||||
}
|
||||
|
||||
func testPrebuiltEtcContext(t *testing.T, bp string) (*android.TestContext, android.Config) {
|
||||
fs := map[string][]byte{
|
||||
var prebuiltEtcFixtureFactory = android.NewFixtureFactory(
|
||||
&buildDir,
|
||||
android.PrepareForTestWithArchMutator,
|
||||
PrepareForTestWithPrebuiltEtc,
|
||||
android.FixtureMergeMockFs(android.MockFS{
|
||||
"foo.conf": nil,
|
||||
"bar.conf": nil,
|
||||
"baz.conf": nil,
|
||||
}
|
||||
|
||||
config := android.TestArchConfig(buildDir, nil, bp, fs)
|
||||
|
||||
ctx := android.NewTestArchContext(config)
|
||||
ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory)
|
||||
ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory)
|
||||
ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory)
|
||||
ctx.RegisterModuleType("prebuilt_usr_share_host", PrebuiltUserShareHostFactory)
|
||||
ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory)
|
||||
ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory)
|
||||
ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory)
|
||||
ctx.Register()
|
||||
|
||||
return ctx, config
|
||||
}
|
||||
}),
|
||||
)
|
||||
|
||||
// testPrebuiltEtc runs tests using the prebuiltEtcFixtureFactory
|
||||
//
|
||||
// Do not add any new usages of this, instead use the prebuiltEtcFixtureFactory directly as it
|
||||
// makes it much easier to customize the test behavior.
|
||||
//
|
||||
// If it is necessary to customize the behavior of an existing test that uses this then please first
|
||||
// convert the test to using prebuiltEtcFixtureFactory first and then in a following change add the
|
||||
// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
|
||||
// that it did not change the test behavior unexpectedly.
|
||||
//
|
||||
// deprecated
|
||||
func testPrebuiltEtc(t *testing.T, bp string) (*android.TestContext, android.Config) {
|
||||
t.Helper()
|
||||
|
||||
ctx, config := testPrebuiltEtcContext(t, bp)
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
android.FailIfErrored(t, errs)
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
android.FailIfErrored(t, errs)
|
||||
|
||||
return ctx, config
|
||||
result := prebuiltEtcFixtureFactory.RunTestWithBp(t, bp)
|
||||
return result.TestContext, result.Config
|
||||
}
|
||||
|
||||
func testPrebuiltEtcError(t *testing.T, pattern, bp string) {
|
||||
t.Helper()
|
||||
|
||||
ctx, config := testPrebuiltEtcContext(t, bp)
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
if len(errs) > 0 {
|
||||
android.FailIfNoMatchingErrors(t, pattern, errs)
|
||||
return
|
||||
}
|
||||
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
if len(errs) > 0 {
|
||||
android.FailIfNoMatchingErrors(t, pattern, errs)
|
||||
return
|
||||
}
|
||||
|
||||
t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
|
||||
}
|
||||
func TestPrebuiltEtcVariants(t *testing.T) {
|
||||
ctx, _ := testPrebuiltEtc(t, `
|
||||
prebuilt_etc {
|
||||
@@ -227,14 +203,16 @@ func TestPrebuiltEtcRelativeInstallPathInstallDirPath(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPrebuiltEtcCannotSetRelativeInstallPathAndSubDir(t *testing.T) {
|
||||
testPrebuiltEtcError(t, "relative_install_path is set. Cannot set sub_dir", `
|
||||
prebuilt_etc {
|
||||
name: "foo.conf",
|
||||
src: "foo.conf",
|
||||
sub_dir: "bar",
|
||||
relative_install_path: "bar",
|
||||
}
|
||||
`)
|
||||
prebuiltEtcFixtureFactory.
|
||||
ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("relative_install_path is set. Cannot set sub_dir")).
|
||||
RunTestWithBp(t, `
|
||||
prebuilt_etc {
|
||||
name: "foo.conf",
|
||||
src: "foo.conf",
|
||||
sub_dir: "bar",
|
||||
relative_install_path: "bar",
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
||||
func TestPrebuiltEtcHost(t *testing.T) {
|
||||
|
@@ -40,14 +40,32 @@ var pctx = android.NewPackageContext("android/soong/sh")
|
||||
func init() {
|
||||
pctx.Import("android/soong/android")
|
||||
|
||||
android.RegisterModuleType("sh_binary", ShBinaryFactory)
|
||||
android.RegisterModuleType("sh_binary_host", ShBinaryHostFactory)
|
||||
android.RegisterModuleType("sh_test", ShTestFactory)
|
||||
android.RegisterModuleType("sh_test_host", ShTestHostFactory)
|
||||
registerShBuildComponents(android.InitRegistrationContext)
|
||||
|
||||
android.RegisterBp2BuildMutator("sh_binary", ShBinaryBp2Build)
|
||||
}
|
||||
|
||||
func registerShBuildComponents(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("sh_binary", ShBinaryFactory)
|
||||
ctx.RegisterModuleType("sh_binary_host", ShBinaryHostFactory)
|
||||
ctx.RegisterModuleType("sh_test", ShTestFactory)
|
||||
ctx.RegisterModuleType("sh_test_host", ShTestHostFactory)
|
||||
}
|
||||
|
||||
// Test fixture preparer that will register most sh build components.
|
||||
//
|
||||
// Singletons and mutators should only be added here if they are needed for a majority of sh
|
||||
// module types, otherwise they should be added under a separate preparer to allow them to be
|
||||
// selected only when needed to reduce test execution time.
|
||||
//
|
||||
// Module types do not have much of an overhead unless they are used so this should include as many
|
||||
// module types as possible. The exceptions are those module types that require mutators and/or
|
||||
// singletons in order to function in which case they should be kept together in a separate
|
||||
// preparer.
|
||||
var PrepareForTestWithShBuildComponents = android.GroupFixturePreparers(
|
||||
android.FixtureRegisterWithContext(registerShBuildComponents),
|
||||
)
|
||||
|
||||
type shBinaryProperties struct {
|
||||
// Source file of this prebuilt.
|
||||
Src *string `android:"path,arch_variant"`
|
||||
|
@@ -37,28 +37,32 @@ func TestMain(m *testing.M) {
|
||||
os.Exit(run())
|
||||
}
|
||||
|
||||
func testShBinary(t *testing.T, bp string) (*android.TestContext, android.Config) {
|
||||
fs := map[string][]byte{
|
||||
var shFixtureFactory = android.NewFixtureFactory(
|
||||
&buildDir,
|
||||
cc.PrepareForTestWithCcBuildComponents,
|
||||
PrepareForTestWithShBuildComponents,
|
||||
android.FixtureMergeMockFs(android.MockFS{
|
||||
"test.sh": nil,
|
||||
"testdata/data1": nil,
|
||||
"testdata/sub/data2": nil,
|
||||
}
|
||||
}),
|
||||
)
|
||||
|
||||
config := android.TestArchConfig(buildDir, nil, bp, fs)
|
||||
// testShBinary runs tests using the shFixtureFactory
|
||||
//
|
||||
// Do not add any new usages of this, instead use the shFixtureFactory directly as it makes it much
|
||||
// easier to customize the test behavior.
|
||||
//
|
||||
// If it is necessary to customize the behavior of an existing test that uses this then please first
|
||||
// convert the test to using shFixtureFactory first and then in a following change add the
|
||||
// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
|
||||
// that it did not change the test behavior unexpectedly.
|
||||
//
|
||||
// deprecated
|
||||
func testShBinary(t *testing.T, bp string) (*android.TestContext, android.Config) {
|
||||
result := shFixtureFactory.RunTestWithBp(t, bp)
|
||||
|
||||
ctx := android.NewTestArchContext(config)
|
||||
ctx.RegisterModuleType("sh_test", ShTestFactory)
|
||||
ctx.RegisterModuleType("sh_test_host", ShTestHostFactory)
|
||||
|
||||
cc.RegisterRequiredBuildComponentsForTest(ctx)
|
||||
|
||||
ctx.Register()
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
android.FailIfErrored(t, errs)
|
||||
_, errs = ctx.PrepareBuildActions(config)
|
||||
android.FailIfErrored(t, errs)
|
||||
|
||||
return ctx, config
|
||||
return result.TestContext, result.Config
|
||||
}
|
||||
|
||||
func TestShTestSubDir(t *testing.T) {
|
||||
|
Reference in New Issue
Block a user