diff options
Diffstat (limited to 'android/variable_test.go')
-rw-r--r-- | android/variable_test.go | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/android/variable_test.go b/android/variable_test.go index ce9ba5485..c1910fe03 100644 --- a/android/variable_test.go +++ b/android/variable_test.go @@ -16,7 +16,10 @@ package android import ( "reflect" + "strconv" "testing" + + "github.com/google/blueprint/proptools" ) type printfIntoPropertyTestCase struct { @@ -122,3 +125,111 @@ func TestPrintfIntoProperty(t *testing.T) { } } } + +type testProductVariableModule struct { + ModuleBase +} + +func (m *testProductVariableModule) GenerateAndroidBuildActions(ctx ModuleContext) { +} + +var testProductVariableProperties = struct { + Product_variables struct { + Eng struct { + Srcs []string + Cflags []string + } + } +}{} + +func testProductVariableModuleFactoryFactory(props interface{}) func() Module { + return func() Module { + m := &testProductVariableModule{} + clonedProps := proptools.CloneProperties(reflect.ValueOf(props)).Interface() + m.AddProperties(clonedProps) + + // Set a default variableProperties, this will be used as the input to the property struct filter + // for this test module. + m.variableProperties = testProductVariableProperties + InitAndroidModule(m) + return m + } +} + +func TestProductVariables(t *testing.T) { + ctx := NewTestContext() + // A module type that has a srcs property but not a cflags property. + ctx.RegisterModuleType("module1", ModuleFactoryAdaptor(testProductVariableModuleFactoryFactory(struct { + Srcs []string + }{}))) + // A module type that has a cflags property but not a srcs property. + ctx.RegisterModuleType("module2", ModuleFactoryAdaptor(testProductVariableModuleFactoryFactory(struct { + Cflags []string + }{}))) + // A module type that does not have any properties that match product_variables. + ctx.RegisterModuleType("module3", ModuleFactoryAdaptor(testProductVariableModuleFactoryFactory(struct { + Foo []string + }{}))) + ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { + ctx.BottomUp("variable", variableMutator).Parallel() + }) + + // Test that a module can use one product variable even if it doesn't have all the properties + // supported by that product variable. + bp := ` + module1 { + name: "foo", + product_variables: { + eng: { + srcs: ["foo.c"], + }, + }, + } + module2 { + name: "bar", + product_variables: { + eng: { + cflags: ["-DBAR"], + }, + }, + } + + module3 { + name: "baz", + } + ` + + mockFS := map[string][]byte{ + "Android.bp": []byte(bp), + } + + ctx.MockFileSystem(mockFS) + + ctx.Register() + + config := TestConfig(buildDir, nil) + config.TestProductVariables.Eng = proptools.BoolPtr(true) + + _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) + FailIfErrored(t, errs) + _, errs = ctx.PrepareBuildActions(config) + FailIfErrored(t, errs) +} + +func BenchmarkSliceToTypeArray(b *testing.B) { + for _, n := range []int{1, 2, 4, 8, 100} { + var propStructs []interface{} + for i := 0; i < n; i++ { + propStructs = append(propStructs, &struct { + A *string + B string + }{}) + + } + b.Run(strconv.Itoa(n), func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = sliceToTypeArray(propStructs) + } + }) + } +} |