Allow building non-gtest tests with cc_test

That way we get the other special cc_test features (test_per_src,
multilib-both default, nativetest install path).

Restrict test_per_src to CCTest instead of allowing all CCBinaries to
use it.

Change-Id: I767540841fe5d1f9755883ee7c3d1f24004f9631
This commit is contained in:
Dan Willemsen
2015-12-21 15:25:58 -08:00
parent 496e3952ea
commit 10d52fd9eb

View File

@@ -1443,10 +1443,6 @@ type CCBinaryProperties struct {
// if set, add an extra objcopy --prefix-symbols= step // if set, add an extra objcopy --prefix-symbols= step
Prefix_symbols string Prefix_symbols string
// Create a separate binary for each source file. Useful when there is
// global state that can not be torn down and reset between each test suite.
Test_per_src *bool
} }
type CCBinary struct { type CCBinary struct {
@@ -1509,17 +1505,18 @@ func (c *CCBinary) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDe
} }
func NewCCBinary(binary *CCBinary, module CCModuleType, func NewCCBinary(binary *CCBinary, module CCModuleType,
hod common.HostOrDeviceSupported, props ...interface{}) (blueprint.Module, []interface{}) { hod common.HostOrDeviceSupported, multilib common.Multilib,
props ...interface{}) (blueprint.Module, []interface{}) {
props = append(props, &binary.BinaryProperties) props = append(props, &binary.BinaryProperties)
return newCCDynamic(&binary.CCLinked, module, hod, common.MultilibFirst, props...) return newCCDynamic(&binary.CCLinked, module, hod, multilib, props...)
} }
func CCBinaryFactory() (blueprint.Module, []interface{}) { func CCBinaryFactory() (blueprint.Module, []interface{}) {
module := &CCBinary{} module := &CCBinary{}
return NewCCBinary(module, module, common.HostAndDeviceSupported) return NewCCBinary(module, module, common.HostAndDeviceSupported, common.MultilibFirst)
} }
func (c *CCBinary) ModifyProperties(ctx CCModuleContext) { func (c *CCBinary) ModifyProperties(ctx CCModuleContext) {
@@ -1621,10 +1618,6 @@ func (c *CCBinary) HostToolPath() common.OptionalPath {
return common.OptionalPath{} return common.OptionalPath{}
} }
func (c *CCBinary) testPerSrc() bool {
return Bool(c.BinaryProperties.Test_per_src)
}
func (c *CCBinary) binary() *CCBinary { func (c *CCBinary) binary() *CCBinary {
return c return c
} }
@@ -1634,7 +1627,7 @@ type testPerSrc interface {
testPerSrc() bool testPerSrc() bool
} }
var _ testPerSrc = (*CCBinary)(nil) var _ testPerSrc = (*CCTest)(nil)
func testPerSrcMutator(mctx common.AndroidBottomUpMutatorContext) { func testPerSrcMutator(mctx common.AndroidBottomUpMutatorContext) {
if test, ok := mctx.Module().(testPerSrc); ok { if test, ok := mctx.Module().(testPerSrc); ok {
@@ -1646,23 +1639,45 @@ func testPerSrcMutator(mctx common.AndroidBottomUpMutatorContext) {
tests := mctx.CreateLocalVariations(testNames...) tests := mctx.CreateLocalVariations(testNames...)
for i, src := range test.binary().Properties.Srcs { for i, src := range test.binary().Properties.Srcs {
tests[i].(testPerSrc).binary().Properties.Srcs = []string{src} tests[i].(testPerSrc).binary().Properties.Srcs = []string{src}
tests[i].(testPerSrc).binary().BinaryProperties.Stem = mctx.ModuleName() + "_" + testNames[i] tests[i].(testPerSrc).binary().BinaryProperties.Stem = testNames[i]
} }
} }
} }
} }
type CCTestProperties struct {
// if set, build against the gtest library. Defaults to true.
Gtest bool
// Create a separate binary for each source file. Useful when there is
// global state that can not be torn down and reset between each test suite.
Test_per_src *bool
}
type CCTest struct { type CCTest struct {
CCBinary CCBinary
TestProperties CCTestProperties
} }
func (c *CCTest) flags(ctx common.AndroidModuleContext, flags CCFlags) CCFlags { func (c *CCTest) flags(ctx common.AndroidModuleContext, flags CCFlags) CCFlags {
flags = c.CCBinary.flags(ctx, flags) flags = c.CCBinary.flags(ctx, flags)
if !c.TestProperties.Gtest {
return flags
}
flags.CFlags = append(flags.CFlags, "-DGTEST_HAS_STD_STRING") flags.CFlags = append(flags.CFlags, "-DGTEST_HAS_STD_STRING")
if ctx.Host() { if ctx.Host() {
flags.CFlags = append(flags.CFlags, "-O0", "-g") flags.CFlags = append(flags.CFlags, "-O0", "-g")
flags.LdFlags = append(flags.LdFlags, "-lpthread")
if ctx.HostType() == common.Windows {
flags.CFlags = append(flags.CFlags, "-DGTEST_OS_WINDOWS")
} else {
flags.CFlags = append(flags.CFlags, "-DGTEST_OS_LINUX")
flags.LdFlags = append(flags.LdFlags, "-lpthread")
}
} else {
flags.CFlags = append(flags.CFlags, "-DGTEST_OS_LINUX_ANDROID")
} }
// TODO(danalbert): Make gtest export its dependencies. // TODO(danalbert): Make gtest export its dependencies.
@@ -1673,7 +1688,9 @@ func (c *CCTest) flags(ctx common.AndroidModuleContext, flags CCFlags) CCFlags {
} }
func (c *CCTest) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { func (c *CCTest) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
depNames.StaticLibs = append(depNames.StaticLibs, "libgtest_main", "libgtest") if c.TestProperties.Gtest {
depNames.StaticLibs = append(depNames.StaticLibs, "libgtest_main", "libgtest")
}
depNames = c.CCBinary.depNames(ctx, depNames) depNames = c.CCBinary.depNames(ctx, depNames)
return depNames return depNames
} }
@@ -1683,25 +1700,28 @@ func (c *CCTest) InstallInData() bool {
} }
func (c *CCTest) installModule(ctx common.AndroidModuleContext, flags CCFlags) { func (c *CCTest) installModule(ctx common.AndroidModuleContext, flags CCFlags) {
if ctx.Device() { installDir := "nativetest"
installDir := "nativetest" if flags.Toolchain.Is64Bit() {
if flags.Toolchain.Is64Bit() { installDir = "nativetest64"
installDir = "nativetest64"
}
ctx.InstallFile(common.PathForModuleInstall(ctx, installDir, ctx.ModuleName()), c.out)
} else {
c.CCBinary.installModule(ctx, flags)
} }
ctx.InstallFile(common.PathForModuleInstall(ctx, installDir, ctx.ModuleName()), c.out)
}
func (c *CCTest) testPerSrc() bool {
return Bool(c.TestProperties.Test_per_src)
} }
func NewCCTest(test *CCTest, module CCModuleType, func NewCCTest(test *CCTest, module CCModuleType,
hod common.HostOrDeviceSupported, props ...interface{}) (blueprint.Module, []interface{}) { hod common.HostOrDeviceSupported, props ...interface{}) (blueprint.Module, []interface{}) {
return NewCCBinary(&test.CCBinary, module, hod, props...) props = append(props, &test.TestProperties)
return NewCCBinary(&test.CCBinary, module, hod, common.MultilibBoth, props...)
} }
func CCTestFactory() (blueprint.Module, []interface{}) { func CCTestFactory() (blueprint.Module, []interface{}) {
module := &CCTest{} module := &CCTest{}
module.TestProperties.Gtest = true
return NewCCTest(module, module, common.HostAndDeviceSupported) return NewCCTest(module, module, common.HostAndDeviceSupported)
} }
@@ -1735,7 +1755,7 @@ func (c *CCBenchmark) installModule(ctx common.AndroidModuleContext, flags CCFla
func NewCCBenchmark(test *CCBenchmark, module CCModuleType, func NewCCBenchmark(test *CCBenchmark, module CCModuleType,
hod common.HostOrDeviceSupported, props ...interface{}) (blueprint.Module, []interface{}) { hod common.HostOrDeviceSupported, props ...interface{}) (blueprint.Module, []interface{}) {
return NewCCBinary(&test.CCBinary, module, hod, props...) return NewCCBinary(&test.CCBinary, module, hod, common.MultilibFirst, props...)
} }
func CCBenchmarkFactory() (blueprint.Module, []interface{}) { func CCBenchmarkFactory() (blueprint.Module, []interface{}) {
@@ -1795,7 +1815,7 @@ func CCLibraryHostSharedFactory() (blueprint.Module, []interface{}) {
func CCBinaryHostFactory() (blueprint.Module, []interface{}) { func CCBinaryHostFactory() (blueprint.Module, []interface{}) {
module := &CCBinary{} module := &CCBinary{}
return NewCCBinary(module, module, common.HostSupported) return NewCCBinary(module, module, common.HostSupported, common.MultilibFirst)
} }
// //
@@ -1804,7 +1824,7 @@ func CCBinaryHostFactory() (blueprint.Module, []interface{}) {
func CCTestHostFactory() (blueprint.Module, []interface{}) { func CCTestHostFactory() (blueprint.Module, []interface{}) {
module := &CCTest{} module := &CCTest{}
return NewCCBinary(&module.CCBinary, module, common.HostSupported) return NewCCTest(module, module, common.HostSupported)
} }
// //
@@ -1813,7 +1833,7 @@ func CCTestHostFactory() (blueprint.Module, []interface{}) {
func CCBenchmarkHostFactory() (blueprint.Module, []interface{}) { func CCBenchmarkHostFactory() (blueprint.Module, []interface{}) {
module := &CCBenchmark{} module := &CCBenchmark{}
return NewCCBinary(&module.CCBinary, module, common.HostSupported) return NewCCBinary(&module.CCBinary, module, common.HostSupported, common.MultilibFirst)
} }
// //
@@ -1834,6 +1854,7 @@ func CCDefaultsFactory() (blueprint.Module, []interface{}) {
&CCBaseProperties{}, &CCBaseProperties{},
&CCLibraryProperties{}, &CCLibraryProperties{},
&CCBinaryProperties{}, &CCBinaryProperties{},
&CCTestProperties{},
&CCUnusedProperties{}, &CCUnusedProperties{},
} }