Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 795c377e authored by Colin Cross's avatar Colin Cross
Browse files

Use a minimal set of mutators, module types, and singletons for tests

Calling android.NewContext() in tests results in a context that
contains all the mutators, module types, and singletons, which
causes unexpected interactions in unit tests.  Create an empty
context instead, and add in only the necessary mutators, module
types, and singletons.

Bug: 36366816
Test: soong tests
Change-Id: Ic61262c37e3436b3ad4ccaca18b737021c304be6
parent 4c48f724
Loading
Loading
Loading
Loading
+59 −23
Original line number Diff line number Diff line
@@ -14,7 +14,11 @@

package android

import "github.com/google/blueprint"
import (
	"sync"

	"github.com/google/blueprint"
)

// Mutator phases:
//   Pre-arch
@@ -23,8 +27,27 @@ import "github.com/google/blueprint"
//   Deps
//   PostDeps

func registerMutators() {
	ctx := registerMutatorsContext{}
var registerMutatorsOnce sync.Once
var registeredMutators []*mutator

func registerMutatorsToContext(ctx *blueprint.Context, mutators []*mutator) {
	for _, t := range mutators {
		var handle blueprint.MutatorHandle
		if t.bottomUpMutator != nil {
			handle = ctx.RegisterBottomUpMutator(t.name, t.bottomUpMutator)
		} else if t.topDownMutator != nil {
			handle = ctx.RegisterTopDownMutator(t.name, t.topDownMutator)
		}
		if t.parallel {
			handle.Parallel()
		}
	}
}

func registerMutators(ctx *blueprint.Context) {

	registerMutatorsOnce.Do(func() {
		ctx := &registerMutatorsContext{}

		register := func(funcs []RegisterMutatorFunc) {
			for _, f := range funcs {
@@ -50,9 +73,22 @@ func registerMutators() {
		ctx.BottomUp("prebuilt_replace", PrebuiltReplaceMutator).Parallel()

		register(postDeps)

		registeredMutators = ctx.mutators
	})

	registerMutatorsToContext(ctx, registeredMutators)
}

type registerMutatorsContext struct{}
func RegisterTestMutators(ctx *blueprint.Context) {
	mutators := registerMutatorsContext{}
	mutators.BottomUp("deps", depsMutator).Parallel()
	registerMutatorsToContext(ctx, mutators.mutators)
}

type registerMutatorsContext struct {
	mutators []*mutator
}

type RegisterMutatorsContext interface {
	TopDown(name string, m AndroidTopDownMutator) MutatorHandle
@@ -99,7 +135,7 @@ type androidBottomUpMutatorContext struct {
	androidBaseContextImpl
}

func (registerMutatorsContext) BottomUp(name string, m AndroidBottomUpMutator) MutatorHandle {
func (x *registerMutatorsContext) BottomUp(name string, m AndroidBottomUpMutator) MutatorHandle {
	f := func(ctx blueprint.BottomUpMutatorContext) {
		if a, ok := ctx.Module().(Module); ok {
			actx := &androidBottomUpMutatorContext{
@@ -110,11 +146,11 @@ func (registerMutatorsContext) BottomUp(name string, m AndroidBottomUpMutator) M
		}
	}
	mutator := &mutator{name: name, bottomUpMutator: f}
	mutators = append(mutators, mutator)
	x.mutators = append(x.mutators, mutator)
	return mutator
}

func (registerMutatorsContext) TopDown(name string, m AndroidTopDownMutator) MutatorHandle {
func (x *registerMutatorsContext) TopDown(name string, m AndroidTopDownMutator) MutatorHandle {
	f := func(ctx blueprint.TopDownMutatorContext) {
		if a, ok := ctx.Module().(Module); ok {
			actx := &androidTopDownMutatorContext{
@@ -125,7 +161,7 @@ func (registerMutatorsContext) TopDown(name string, m AndroidTopDownMutator) Mut
		}
	}
	mutator := &mutator{name: name, topDownMutator: f}
	mutators = append(mutators, mutator)
	x.mutators = append(x.mutators, mutator)
	return mutator
}

+2 −17
Original line number Diff line number Diff line
@@ -15,8 +15,6 @@
package android

import (
	"sync"

	"github.com/google/blueprint"
)

@@ -51,8 +49,6 @@ func RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
	singletons = append(singletons, singleton{name, factory})
}

var registerMutatorsOnce sync.Once

func NewContext() *blueprint.Context {
	ctx := blueprint.NewContext()

@@ -64,19 +60,8 @@ func NewContext() *blueprint.Context {
		ctx.RegisterSingletonType(t.name, t.factory)
	}

	registerMutatorsOnce.Do(registerMutators)
	registerMutators(ctx)

	for _, t := range mutators {
		var handle blueprint.MutatorHandle
		if t.bottomUpMutator != nil {
			handle = ctx.RegisterBottomUpMutator(t.name, t.bottomUpMutator)
		} else if t.topDownMutator != nil {
			handle = ctx.RegisterTopDownMutator(t.name, t.topDownMutator)
		}
		if t.parallel {
			handle.Parallel()
		}
	}
	ctx.RegisterSingletonType("env", EnvSingleton)

	return ctx
+5 −1
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import (
	"testing"

	"android/soong/android"
	"android/soong/genrule"

	"github.com/google/blueprint"
)

@@ -121,13 +123,15 @@ func TestDataTests(t *testing.T) {

	for _, test := range testDataTests {
		t.Run(test.name, func(t *testing.T) {
			ctx := android.NewContext()
			ctx := blueprint.NewContext()
			android.RegisterTestMutators(ctx)
			ctx.MockFileSystem(map[string][]byte{
				"Blueprints":     []byte(`subdirs = ["dir"]`),
				"dir/Blueprints": []byte(test.modules),
				"dir/baz":        nil,
				"dir/bar/baz":    nil,
			})
			ctx.RegisterModuleType("filegroup", genrule.FileGroupFactory)
			ctx.RegisterModuleType("test", newTest)

			_, errs := ctx.ParseBlueprintsFiles("Blueprints")
+2 −2
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import (
)

func init() {
	android.RegisterModuleType("filegroup", fileGroupFactory)
	android.RegisterModuleType("filegroup", FileGroupFactory)
}

type fileGroupProperties struct {
@@ -48,7 +48,7 @@ var _ android.SourceFileProducer = (*fileGroup)(nil)
// filegroup modules contain a list of files, and can be used to export files across package
// boundaries.  filegroups (and genrules) can be referenced from srcs properties of other modules
// using the syntax ":module".
func fileGroupFactory() (blueprint.Module, []interface{}) {
func FileGroupFactory() (blueprint.Module, []interface{}) {
	module := &fileGroup{}

	return android.InitAndroidModule(module, &module.properties)