Loading android/apex.go +10 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,11 @@ type ApexModule interface { // Tests if the module comes from an updatable APEX. Updatable() bool // List of APEXes that this module tests. The module has access to // the private part of the listed APEXes even when it is not included in the // APEXes. TestFor() []string } type ApexProperties struct { Loading Loading @@ -151,6 +156,11 @@ func (m *ApexModuleBase) ApexAvailable() []string { return m.ApexProperties.Apex_available } func (m *ApexModuleBase) TestFor() []string { // To be implemented by concrete types inheriting ApexModuleBase return nil } func (m *ApexModuleBase) BuildForApexes(apexes []ApexInfo) { m.apexVariationsLock.Lock() defer m.apexVariationsLock.Unlock() Loading apex/apex_test.go +52 −0 Original line number Diff line number Diff line Loading @@ -4533,6 +4533,58 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { testNoUpdatableJarsInBootImage(t, "", bp, transform) } func TestTestFor(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib", "myprivlib"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", stubs: { versions: ["1"], }, apex_available: ["myapex"], } cc_library { name: "myprivlib", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", apex_available: ["myapex"], } cc_test { name: "mytest", gtest: false, srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", shared_libs: ["mylib", "myprivlib"], test_for: ["myapex"] } `) // the test 'mytest' is a test for the apex, therefore is linked to the // actual implementation of mylib instead of its stub. ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"] ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so") ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so") } func TestMain(m *testing.M) { run := func() int { setUp() Loading cc/cc.go +19 −0 Original line number Diff line number Diff line Loading @@ -2338,6 +2338,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // always link to non-stub variant useThisDep = !depIsStubs } for _, testFor := range c.TestFor() { // Another exception: if this module is bundled with an APEX, then // it is linked with the non-stub variant of a module in the APEX // as if this is part of the APEX. if android.DirectlyInApex(testFor, depName) { useThisDep = !depIsStubs break } } } else { // If building for APEX, use stubs only when it is not from // the same APEX Loading Loading @@ -2764,6 +2773,16 @@ func (c *Module) AvailableFor(what string) bool { } } func (c *Module) TestFor() []string { if test, ok := c.linker.(interface { testFor() []string }); ok { return test.testFor() } else { return c.ApexModuleBase.TestFor() } } // Return true if the module is ever installable. func (c *Module) EverInstallable() bool { return c.installer != nil && Loading cc/test.go +9 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ type TestProperties struct { // if set, use the isolated gtest runner. Defaults to false. Isolated *bool // List of APEXes that this module tests. The module has access to // the private part of the listed APEXes even when it is not included in the // APEXes. Test_for []string } // Test option struct. Loading Loading @@ -215,6 +220,10 @@ func (test *testDecorator) gtest() bool { return BoolDefault(test.Properties.Gtest, true) } func (test *testDecorator) testFor() []string { return test.Properties.Test_for } func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags { if !test.gtest() { return flags Loading Loading
android/apex.go +10 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,11 @@ type ApexModule interface { // Tests if the module comes from an updatable APEX. Updatable() bool // List of APEXes that this module tests. The module has access to // the private part of the listed APEXes even when it is not included in the // APEXes. TestFor() []string } type ApexProperties struct { Loading Loading @@ -151,6 +156,11 @@ func (m *ApexModuleBase) ApexAvailable() []string { return m.ApexProperties.Apex_available } func (m *ApexModuleBase) TestFor() []string { // To be implemented by concrete types inheriting ApexModuleBase return nil } func (m *ApexModuleBase) BuildForApexes(apexes []ApexInfo) { m.apexVariationsLock.Lock() defer m.apexVariationsLock.Unlock() Loading
apex/apex_test.go +52 −0 Original line number Diff line number Diff line Loading @@ -4533,6 +4533,58 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { testNoUpdatableJarsInBootImage(t, "", bp, transform) } func TestTestFor(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib", "myprivlib"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", stubs: { versions: ["1"], }, apex_available: ["myapex"], } cc_library { name: "myprivlib", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", apex_available: ["myapex"], } cc_test { name: "mytest", gtest: false, srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", shared_libs: ["mylib", "myprivlib"], test_for: ["myapex"] } `) // the test 'mytest' is a test for the apex, therefore is linked to the // actual implementation of mylib instead of its stub. ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"] ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so") ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so") } func TestMain(m *testing.M) { run := func() int { setUp() Loading
cc/cc.go +19 −0 Original line number Diff line number Diff line Loading @@ -2338,6 +2338,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // always link to non-stub variant useThisDep = !depIsStubs } for _, testFor := range c.TestFor() { // Another exception: if this module is bundled with an APEX, then // it is linked with the non-stub variant of a module in the APEX // as if this is part of the APEX. if android.DirectlyInApex(testFor, depName) { useThisDep = !depIsStubs break } } } else { // If building for APEX, use stubs only when it is not from // the same APEX Loading Loading @@ -2764,6 +2773,16 @@ func (c *Module) AvailableFor(what string) bool { } } func (c *Module) TestFor() []string { if test, ok := c.linker.(interface { testFor() []string }); ok { return test.testFor() } else { return c.ApexModuleBase.TestFor() } } // Return true if the module is ever installable. func (c *Module) EverInstallable() bool { return c.installer != nil && Loading
cc/test.go +9 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ type TestProperties struct { // if set, use the isolated gtest runner. Defaults to false. Isolated *bool // List of APEXes that this module tests. The module has access to // the private part of the listed APEXes even when it is not included in the // APEXes. Test_for []string } // Test option struct. Loading Loading @@ -215,6 +220,10 @@ func (test *testDecorator) gtest() bool { return BoolDefault(test.Properties.Gtest, true) } func (test *testDecorator) testFor() []string { return test.Properties.Test_for } func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags { if !test.gtest() { return flags Loading