Ensure test/runtime order of singletons/pre-singletons is consistent
Bug: 181953909
Test: m nothing
Change-Id: I77e0106ceb04b44b6559630f4a8a510f1a66378b
diff --git a/android/testing.go b/android/testing.go
index dab7e92..042fa2b 100644
--- a/android/testing.go
+++ b/android/testing.go
@@ -101,8 +101,9 @@
// The list of pre-singletons and singletons registered for the test.
preSingletons, singletons sortableComponents
- // The order in which the mutators will be run in this test context; for debugging.
- mutatorOrder []string
+ // The order in which the pre-singletons, mutators and singletons will be run in this test
+ // context; for debugging.
+ preSingletonOrder, mutatorOrder, singletonOrder []string
}
func (ctx *TestContext) PreArchMutators(f RegisterMutatorFunc) {
@@ -315,8 +316,14 @@
// Used to ensure that this is only created once.
once sync.Once
+ // The order of pre-singletons
+ preSingletonOrder registeredComponentOrder
+
// The order of mutators
mutatorOrder registeredComponentOrder
+
+ // The order of singletons
+ singletonOrder registeredComponentOrder
}
// populate initializes this structure from globally registered build components.
@@ -324,9 +331,16 @@
// Only the first call has any effect.
func (s *registrationSorter) populate() {
s.once.Do(func() {
+ // Create an ordering from the globally registered pre-singletons.
+ s.preSingletonOrder = registeredComponentOrderFromExistingOrder("pre-singleton", preSingletons)
+
// Created an ordering from the globally registered mutators.
globallyRegisteredMutators := collateGloballyRegisteredMutators()
s.mutatorOrder = registeredComponentOrderFromExistingOrder("mutator", globallyRegisteredMutators)
+
+ // Create an ordering from the globally registered singletons.
+ globallyRegisteredSingletons := collateGloballyRegisteredSingletons()
+ s.singletonOrder = registeredComponentOrderFromExistingOrder("singleton", globallyRegisteredSingletons)
})
}
@@ -346,6 +360,9 @@
func (ctx *TestContext) Register() {
globalOrder := globallyRegisteredComponentsOrder()
+ // Ensure that the pre-singletons used in the test are in the same order as they are used at
+ // runtime.
+ globalOrder.preSingletonOrder.enforceOrdering(ctx.preSingletons)
ctx.preSingletons.registerAll(ctx.Context)
mutators := collateRegisteredMutators(ctx.preArch, ctx.preDeps, ctx.postDeps, ctx.finalDeps)
@@ -356,10 +373,14 @@
// Register the env singleton with this context before sorting.
ctx.RegisterSingletonType("env", EnvSingleton)
+ // Ensure that the singletons used in the test are in the same order as they are used at runtime.
+ globalOrder.singletonOrder.enforceOrdering(ctx.singletons)
ctx.singletons.registerAll(ctx.Context)
- // Save the mutator order away to make it easy to access while debugging.
+ // Save the sorted components order away to make them easy to access while debugging.
+ ctx.preSingletonOrder = globalOrder.preSingletonOrder.namesInOrder
ctx.mutatorOrder = globalOrder.mutatorOrder.namesInOrder
+ ctx.singletonOrder = globalOrder.singletonOrder.namesInOrder
}
// RegisterForBazelConversion prepares a test context for bp2build conversion.