diff options
Diffstat (limited to 'java/robolectric.go')
-rw-r--r-- | java/robolectric.go | 121 |
1 files changed, 81 insertions, 40 deletions
diff --git a/java/robolectric.go b/java/robolectric.go index 5f46267f9..43e17f9ea 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -21,6 +21,7 @@ import ( "android/soong/java/config" "android/soong/tradefed" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -28,6 +29,23 @@ func init() { RegisterRobolectricBuildComponents(android.InitRegistrationContext) } +type RobolectricRuntimesInfo struct { + Runtimes []android.InstallPath +} + +var RobolectricRuntimesInfoProvider = blueprint.NewProvider[RobolectricRuntimesInfo]() + +type roboRuntimeOnlyDependencyTag struct { + blueprint.BaseDependencyTag +} + +var roboRuntimeOnlyDepTag roboRuntimeOnlyDependencyTag + +// Mark this tag so dependencies that use it are excluded from visibility enforcement. +func (t roboRuntimeOnlyDependencyTag) ExcludeFromVisibilityEnforcement() {} + +var _ android.ExcludeFromVisibilityEnforcementTag = roboRuntimeOnlyDepTag + func RegisterRobolectricBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("android_robolectric_test", RobolectricTestFactory) ctx.RegisterModuleType("android_robolectric_runtimes", robolectricRuntimesFactory) @@ -41,12 +59,12 @@ var robolectricDefaultLibs = []string{ } const robolectricCurrentLib = "Robolectric_all-target" +const clearcutJunitLib = "ClearcutJunitListenerAar" const robolectricPrebuiltLibPattern = "platform-robolectric-%s-prebuilt" var ( roboCoverageLibsTag = dependencyTag{name: "roboCoverageLibs"} roboRuntimesTag = dependencyTag{name: "roboRuntimes"} - roboRuntimeOnlyTag = dependencyTag{name: "roboRuntimeOnlyTag"} ) type robolectricProperties struct { @@ -64,10 +82,6 @@ type robolectricProperties struct { Shards *int64 } - // The version number of a robolectric prebuilt to use from prebuilts/misc/common/robolectric - // instead of the one built from source in external/robolectric-shadows. - Robolectric_prebuilt_version *string - // Use /external/robolectric rather than /external/robolectric-shadows as the version of robolectric // to use. /external/robolectric closely tracks github's master, and will fully replace /external/robolectric-shadows Upstream *bool @@ -106,21 +120,12 @@ func (r *robolectricTest) DepsMutator(ctx android.BottomUpMutatorContext) { ctx.PropertyErrorf("instrumentation_for", "missing required instrumented module") } - if v := String(r.robolectricProperties.Robolectric_prebuilt_version); v != "" { - ctx.AddVariationDependencies(nil, staticLibTag, fmt.Sprintf(robolectricPrebuiltLibPattern, v)) - } else if !proptools.BoolDefault(r.robolectricProperties.Strict_mode, true) { - if proptools.Bool(r.robolectricProperties.Upstream) { - ctx.AddVariationDependencies(nil, staticLibTag, robolectricCurrentLib+"_upstream") - } else { - ctx.AddVariationDependencies(nil, staticLibTag, robolectricCurrentLib) - } - } + ctx.AddVariationDependencies(nil, roboRuntimeOnlyDepTag, clearcutJunitLib) if proptools.BoolDefault(r.robolectricProperties.Strict_mode, true) { - ctx.AddVariationDependencies(nil, roboRuntimeOnlyTag, robolectricCurrentLib+"_upstream") + ctx.AddVariationDependencies(nil, roboRuntimeOnlyDepTag, robolectricCurrentLib) } else { - // opting out from strict mode, robolectric_non_strict_mode_permission lib should be added - ctx.AddVariationDependencies(nil, staticLibTag, "robolectric_non_strict_mode_permission") + ctx.AddVariationDependencies(nil, staticLibTag, robolectricCurrentLib) } ctx.AddVariationDependencies(nil, staticLibTag, robolectricDefaultLibs...) @@ -139,13 +144,25 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) r.forceOSType = ctx.Config().BuildOS r.forceArchType = ctx.Config().BuildArch + var extraTestRunnerOptions []tradefed.Option + extraTestRunnerOptions = append(extraTestRunnerOptions, tradefed.Option{Name: "java-flags", Value: "-Drobolectric=true"}) + if proptools.BoolDefault(r.robolectricProperties.Strict_mode, true) { + extraTestRunnerOptions = append(extraTestRunnerOptions, tradefed.Option{Name: "java-flags", Value: "-Drobolectric.strict.mode=true"}) + } + + var extraOptions []tradefed.Option + var javaHome = ctx.Config().Getenv("ANDROID_JAVA_HOME") + extraOptions = append(extraOptions, tradefed.Option{Name: "java-folder", Value: javaHome}) + r.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{ - TestConfigProp: r.testProperties.Test_config, - TestConfigTemplateProp: r.testProperties.Test_config_template, - TestSuites: r.testProperties.Test_suites, - AutoGenConfig: r.testProperties.Auto_gen_config, - DeviceTemplate: "${RobolectricTestConfigTemplate}", - HostTemplate: "${RobolectricTestConfigTemplate}", + TestConfigProp: r.testProperties.Test_config, + TestConfigTemplateProp: r.testProperties.Test_config_template, + TestSuites: r.testProperties.Test_suites, + OptionsForAutogenerated: extraOptions, + TestRunnerOptions: extraTestRunnerOptions, + AutoGenConfig: r.testProperties.Auto_gen_config, + DeviceTemplate: "${RobolectricTestConfigTemplate}", + HostTemplate: "${RobolectricTestConfigTemplate}", }) r.data = android.PathsForModuleSrc(ctx, r.testProperties.Data) r.data = append(r.data, android.PathsForModuleSrc(ctx, r.testProperties.Device_common_data)...) @@ -153,25 +170,27 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) r.data = append(r.data, android.PathsForModuleSrc(ctx, r.testProperties.Device_first_prefer32_data)...) var ok bool - var instrumentedApp *AndroidApp + var instrumentedApp *JavaInfo + var appInfo *AppInfo // TODO: this inserts paths to built files into the test, it should really be inserting the contents. - instrumented := ctx.GetDirectDepsWithTag(instrumentationForTag) + instrumented := ctx.GetDirectDepsProxyWithTag(instrumentationForTag) if len(instrumented) == 1 { - instrumentedApp, ok = instrumented[0].(*AndroidApp) + appInfo, ok = android.OtherModuleProvider(ctx, instrumented[0], AppInfoProvider) if !ok { ctx.PropertyErrorf("instrumentation_for", "dependency must be an android_app") } + instrumentedApp = android.OtherModuleProviderOrDefault(ctx, instrumented[0], JavaInfoProvider) } else if !ctx.Config().AllowMissingDependencies() { panic(fmt.Errorf("expected exactly 1 instrumented dependency, got %d", len(instrumented))) } var resourceApk android.Path var manifest android.Path - if instrumentedApp != nil { - manifest = instrumentedApp.mergedManifestFile - resourceApk = instrumentedApp.outputFile + if appInfo != nil { + manifest = appInfo.MergedManifestFile + resourceApk = instrumentedApp.OutputFile } roboTestConfigJar := android.PathForModuleOut(ctx, "robolectric_samedir", "samedir_config.jar") @@ -179,7 +198,7 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) extraCombinedJars := android.Paths{roboTestConfigJar} - handleLibDeps := func(dep android.Module) { + handleLibDeps := func(dep android.ModuleProxy) { if !android.InList(ctx.OtherModuleName(dep), config.FrameworkLibraries) { if m, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok { extraCombinedJars = append(extraCombinedJars, m.ImplementationAndResourcesJars...) @@ -187,25 +206,25 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) } } - for _, dep := range ctx.GetDirectDepsWithTag(libTag) { + for _, dep := range ctx.GetDirectDepsProxyWithTag(libTag) { handleLibDeps(dep) } - for _, dep := range ctx.GetDirectDepsWithTag(sdkLibTag) { + for _, dep := range ctx.GetDirectDepsProxyWithTag(sdkLibTag) { handleLibDeps(dep) } // handle the runtimeOnly tag for strict_mode - for _, dep := range ctx.GetDirectDepsWithTag(roboRuntimeOnlyTag) { + for _, dep := range ctx.GetDirectDepsProxyWithTag(roboRuntimeOnlyDepTag) { handleLibDeps(dep) } - if instrumentedApp != nil { - extraCombinedJars = append(extraCombinedJars, instrumentedApp.implementationAndResourcesJar) + if appInfo != nil { + extraCombinedJars = append(extraCombinedJars, instrumentedApp.ImplementationAndResourcesJars...) } r.stem = proptools.StringDefault(r.overridableProperties.Stem, ctx.ModuleName()) r.classLoaderContexts = r.usesLibrary.classLoaderContextForUsesLibDeps(ctx) r.dexpreopter.disableDexpreopt() - r.compile(ctx, nil, nil, nil, extraCombinedJars) + javaInfo := r.compile(ctx, nil, nil, nil, extraCombinedJars) installPath := android.PathForModuleInstall(ctx, r.BaseModuleName()) var installDeps android.InstallPaths @@ -227,8 +246,8 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) installDeps = append(installDeps, installedResourceApk) } - runtimes := ctx.GetDirectDepWithTag("robolectric-android-all-prebuilts", roboRuntimesTag) - for _, runtime := range runtimes.(*robolectricRuntimes).runtimes { + runtimes := ctx.GetDirectDepProxyWithTag("robolectric-android-all-prebuilts", roboRuntimesTag) + for _, runtime := range android.OtherModuleProviderOrDefault(ctx, runtimes, RobolectricRuntimesInfoProvider).Runtimes { installDeps = append(installDeps, runtime) } @@ -242,6 +261,24 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) } r.installFile = ctx.InstallFile(installPath, ctx.ModuleName()+".jar", r.outputFile, installDeps...) + + if javaInfo != nil { + setExtraJavaInfo(ctx, r, javaInfo) + android.SetProvider(ctx, JavaInfoProvider, javaInfo) + } + + moduleInfoJSON := r.javaLibraryModuleInfoJSON(ctx) + if _, ok := r.testConfig.(android.WritablePath); ok { + moduleInfoJSON.AutoTestConfig = []string{"true"} + } + if r.testConfig != nil { + moduleInfoJSON.TestConfig = append(moduleInfoJSON.TestConfig, r.testConfig.String()) + } + if len(r.testProperties.Test_suites) > 0 { + moduleInfoJSON.CompatibilitySuites = append(moduleInfoJSON.CompatibilitySuites, r.testProperties.Test_suites...) + } else { + moduleInfoJSON.CompatibilitySuites = append(moduleInfoJSON.CompatibilitySuites, "null-suite") + } } func generateSameDirRoboTestConfigJar(ctx android.ModuleContext, outputFile android.ModuleOutPath) { @@ -292,7 +329,7 @@ func RobolectricTestFactory() android.Module { &module.testProperties) module.Module.dexpreopter.isTest = true - module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true) + module.Module.linter.properties.Lint.Test_module_type = proptools.BoolPtr(true) module.testProperties.Test_suites = []string{"robolectric-tests"} @@ -357,7 +394,7 @@ func (r *robolectricRuntimes) GenerateAndroidBuildActions(ctx android.ModuleCont } if !ctx.Config().AlwaysUsePrebuiltSdks() && r.props.Lib != nil { - runtimeFromSourceModule := ctx.GetDirectDepWithTag(String(r.props.Lib), libTag) + runtimeFromSourceModule := ctx.GetDirectDepProxyWithTag(String(r.props.Lib), libTag) if runtimeFromSourceModule == nil { if ctx.Config().AllowMissingDependencies() { ctx.AddMissingDependencies([]string{String(r.props.Lib)}) @@ -375,6 +412,10 @@ func (r *robolectricRuntimes) GenerateAndroidBuildActions(ctx android.ModuleCont installedRuntime := ctx.InstallFile(androidAllDir, runtimeName, runtimeFromSourceJar) r.runtimes = append(r.runtimes, installedRuntime) } + + android.SetProvider(ctx, RobolectricRuntimesInfoProvider, RobolectricRuntimesInfo{ + Runtimes: r.runtimes, + }) } func (r *robolectricRuntimes) InstallInTestcases() bool { return true } |