Convert cc_test targets with bp2build.
Starting with libutils_test, adb_test, libcutils_test, (and ~47 other host_supported tests).
Test: $ b build --config=android_x86_64 //system/core/libutils:libutils_test && adb push bazel-bin/system/core/libutils/. /data/tmp/libutils_test_files/ && adb shell /data/tmp/libutils_test_files/libutils_test
Test: presubmits with newly converted cc_test targets
Test: $ b test //system/... --config=linux_x86_64 --verbose_failures --test_output=errors --keep_going --build_tests_only
Fixes: 242038415
Change-Id: I10051aadb880c3aabeba6d7fb079523e6fb4ac43
diff --git a/cc/test.go b/cc/test.go
index f5abc45..3e85e2d 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -22,6 +22,7 @@
"github.com/google/blueprint/proptools"
"android/soong/android"
+ "android/soong/bazel"
"android/soong/tradefed"
)
@@ -133,7 +134,7 @@
// specific functionality on a device. The executable binary gets an implicit
// static_libs dependency on libgtests unless the gtest flag is set to false.
func TestFactory() android.Module {
- module := NewTest(android.HostAndDeviceSupported)
+ module := NewTest(android.HostAndDeviceSupported, true)
return module.Init()
}
@@ -156,7 +157,7 @@
// cc_test_host compiles a test host binary.
func TestHostFactory() android.Module {
- module := NewTest(android.HostSupported)
+ module := NewTest(android.HostSupported, true)
return module.Init()
}
@@ -204,6 +205,10 @@
test.binaryDecorator.Properties.Stem = StringPtr("")
}
+func (test *testBinary) testBinary() bool {
+ return true
+}
+
var _ testPerSrc = (*testBinary)(nil)
func TestPerSrcMutator(mctx android.BottomUpMutatorContext) {
@@ -257,16 +262,10 @@
}
func (test *testDecorator) isolated(ctx BaseModuleContext) bool {
- if !ctx.Windows() {
- return BoolDefault(test.LinkerProperties.Isolated, false)
- }
return BoolDefault(test.LinkerProperties.Isolated, false)
}
-func (test *testDecorator) testBinary() bool {
- return true
-}
-
+// NOTE: Keep this in sync with cc/cc_test.bzl#gtest_copts
func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
if !test.gtest() {
return flags
@@ -480,8 +479,8 @@
test.binaryDecorator.baseInstaller.install(ctx, file)
}
-func NewTest(hod android.HostOrDeviceSupported) *Module {
- module, binary := newBinary(hod, false)
+func NewTest(hod android.HostOrDeviceSupported, bazelable bool) *Module {
+ module, binary := newBinary(hod, bazelable)
module.multilib = android.MultilibBoth
binary.baseInstaller = NewTestInstaller()
@@ -504,6 +503,10 @@
*libraryDecorator
}
+func (test *testLibrary) testLibrary() bool {
+ return true
+}
+
func (test *testLibrary) linkerProps() []interface{} {
var props []interface{}
props = append(props, test.testDecorator.linkerProps()...)
@@ -543,6 +546,7 @@
}
module.linker = test
module.installer = test
+ module.bazelable = true
return module
}
@@ -632,3 +636,56 @@
module.installer = benchmark
return module
}
+
+// binaryAttributes contains Bazel attributes corresponding to a cc test
+type testBinaryAttributes struct {
+ binaryAttributes
+
+ Gtest bool
+ Isolated bool
+ Data bazel.LabelListAttribute
+}
+
+// testBinaryBp2build is the bp2build converter for cc_test modules. A cc_test's
+// dependency graph and compilation/linking steps are functionally similar to a
+// cc_binary, but has additional dependencies on test deps like gtest, and
+// produces additional runfiles like XML plans for Tradefed orchestration
+//
+// TODO(b/244432609): handle `isolated` property.
+// TODO(b/244432134): handle custom runpaths for tests that assume runfile layouts not
+// default to bazel. (see linkerInit function)
+// TODO(b/244432500): handle test.testConfig generation (see install function)
+func testBinaryBp2build(ctx android.TopDownMutatorContext, m *Module) {
+ var testBinaryAttrs testBinaryAttributes
+ testBinaryAttrs.binaryAttributes = binaryBp2buildAttrs(ctx, m)
+
+ testBinaryProps := m.GetArchVariantProperties(ctx, &TestBinaryProperties{})
+ for axis, configToProps := range testBinaryProps {
+ for config, props := range configToProps {
+ if p, ok := props.(*TestBinaryProperties); ok {
+ // Combine data, data_bins and data_libs into a single 'data' attribute.
+ var combinedData bazel.LabelList
+ combinedData.Append(android.BazelLabelForModuleSrc(ctx, p.Data))
+ combinedData.Append(android.BazelLabelForModuleDeps(ctx, p.Data_bins))
+ combinedData.Append(android.BazelLabelForModuleDeps(ctx, p.Data_libs))
+ testBinaryAttrs.Data.SetSelectValue(axis, config, combinedData)
+ }
+ }
+ }
+
+ for _, propIntf := range m.GetProperties() {
+ if testLinkerProps, ok := propIntf.(*TestLinkerProperties); ok {
+ testBinaryAttrs.Gtest = proptools.BoolDefault(testLinkerProps.Gtest, true)
+ testBinaryAttrs.Isolated = proptools.BoolDefault(testLinkerProps.Isolated, true)
+ break
+ }
+ }
+
+ ctx.CreateBazelTargetModule(
+ bazel.BazelTargetModuleProperties{
+ Rule_class: "cc_test",
+ Bzl_load_location: "//build/bazel/rules/cc:cc_test.bzl",
+ },
+ android.CommonAttributes{Name: m.Name()},
+ &testBinaryAttrs)
+}