diff options
Diffstat (limited to 'apex')
-rw-r--r-- | apex/apex.go | 24 | ||||
-rw-r--r-- | apex/apex_test.go | 114 | ||||
-rw-r--r-- | apex/builder.go | 13 |
3 files changed, 83 insertions, 68 deletions
diff --git a/apex/apex.go b/apex/apex.go index aff69c12f..79f1ad610 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -68,8 +68,6 @@ func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) { ctx.Transition("apex", &apexTransitionMutator{}) ctx.BottomUp("apex_directly_in_any", apexDirectlyInAnyMutator).Parallel() ctx.BottomUp("apex_dcla_deps", apexDCLADepsMutator).Parallel() - // Register after apex_info mutator so that it can use ApexVariationName - ctx.TopDown("apex_strict_updatability_lint", apexStrictUpdatibilityLintMutator).Parallel() } type apexBundleProperties struct { @@ -1115,26 +1113,6 @@ func apexInfoMutator(mctx android.TopDownMutatorContext) { enforceAppUpdatability(mctx) } -// apexStrictUpdatibilityLintMutator propagates strict_updatability_linting to transitive deps of a mainline module -// This check is enforced for updatable modules -func apexStrictUpdatibilityLintMutator(mctx android.TopDownMutatorContext) { - if !mctx.Module().Enabled(mctx) { - return - } - if apex, ok := mctx.Module().(*apexBundle); ok && apex.checkStrictUpdatabilityLinting(mctx) { - apex.WalkPayloadDeps(mctx, func(mctx android.BaseModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) bool { - if externalDep { - return false - } - if lintable, ok := to.(java.LintDepSetsIntf); ok { - lintable.SetStrictUpdatabilityLinting(true) - } - // visit transitive deps - return true - }) - } -} - // enforceAppUpdatability propagates updatable=true to apps of updatable apexes func enforceAppUpdatability(mctx android.TopDownMutatorContext) { if !mctx.Module().Enabled(mctx) { @@ -1197,7 +1175,7 @@ var ( } ) -func (a *apexBundle) checkStrictUpdatabilityLinting(mctx android.TopDownMutatorContext) bool { +func (a *apexBundle) checkStrictUpdatabilityLinting(mctx android.ModuleContext) bool { // The allowlist contains the base apex name, so use that instead of the ApexVariationName return a.Updatable() && !android.InList(mctx.ModuleName(), skipStrictUpdatabilityLintAllowlist) } diff --git a/apex/apex_test.go b/apex/apex_test.go index 8cb8a9132..c3c9b7c35 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -9693,59 +9693,84 @@ func TestApexStrictUpdtabilityLint(t *testing.T) { } testCases := []struct { - testCaseName string - apexUpdatable bool - javaStrictUpdtabilityLint bool - lintFileExists bool - disallowedFlagExpected bool + testCaseName string + apexUpdatable bool + javaStrictUpdtabilityLint bool + lintFileExists bool + disallowedFlagExpectedOnApex bool + disallowedFlagExpectedOnJavalib bool }{ { - testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd", - apexUpdatable: true, - javaStrictUpdtabilityLint: true, - lintFileExists: false, - disallowedFlagExpected: false, + testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd", + apexUpdatable: true, + javaStrictUpdtabilityLint: true, + lintFileExists: false, + disallowedFlagExpectedOnApex: false, + disallowedFlagExpectedOnJavalib: false, }, { - testCaseName: "non-updatable apex respects strict_updatability of javalib", - apexUpdatable: false, - javaStrictUpdtabilityLint: false, - lintFileExists: true, - disallowedFlagExpected: false, + testCaseName: "non-updatable apex respects strict_updatability of javalib", + apexUpdatable: false, + javaStrictUpdtabilityLint: false, + lintFileExists: true, + disallowedFlagExpectedOnApex: false, + disallowedFlagExpectedOnJavalib: false, }, { - testCaseName: "non-updatable apex respects strict updatability of javalib", - apexUpdatable: false, - javaStrictUpdtabilityLint: true, - lintFileExists: true, - disallowedFlagExpected: true, + testCaseName: "non-updatable apex respects strict updatability of javalib", + apexUpdatable: false, + javaStrictUpdtabilityLint: true, + lintFileExists: true, + disallowedFlagExpectedOnApex: false, + disallowedFlagExpectedOnJavalib: true, }, { - testCaseName: "updatable apex sets strict updatability of javalib to true", - apexUpdatable: true, - javaStrictUpdtabilityLint: false, // will be set to true by mutator - lintFileExists: true, - disallowedFlagExpected: true, + testCaseName: "updatable apex checks strict updatability of javalib", + apexUpdatable: true, + javaStrictUpdtabilityLint: false, + lintFileExists: true, + disallowedFlagExpectedOnApex: true, + disallowedFlagExpectedOnJavalib: false, }, } for _, testCase := range testCases { - fixtures := []android.FixturePreparer{} - baselineProperty := "" - if testCase.lintFileExists { - fixtures = append(fixtures, fs.AddToFixture()) - baselineProperty = "baseline_filename: \"lint-baseline.xml\"" - } - bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty) + t.Run(testCase.testCaseName, func(t *testing.T) { + fixtures := []android.FixturePreparer{} + baselineProperty := "" + if testCase.lintFileExists { + fixtures = append(fixtures, fs.AddToFixture()) + baselineProperty = "baseline_filename: \"lint-baseline.xml\"" + } + bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty) - result := testApex(t, bp, fixtures...) - myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29") - sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto")) - disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") + result := testApex(t, bp, fixtures...) - if disallowedFlagActual != testCase.disallowedFlagExpected { - t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command) - } + checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) { + if expectStrictUpdatability { + if m.Rule == nil { + t.Errorf("expected strict updatability check rule on %s", name) + } else { + android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name), + m.RuleParams.Command, "--disallowed_issues NewApi") + android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name), + m.Inputs.Strings(), "lint-baseline.xml") + } + } else { + if m.Rule != nil { + t.Errorf("expected no strict updatability check rule on %s", name) + } + } + } + + myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29") + apex := result.ModuleForTests("myapex", "android_common_myapex") + apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp") + javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp") + + checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex) + checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib) + }) } } @@ -9787,11 +9812,12 @@ func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) { } result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture()) - myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29") - sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto")) - if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") { - t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command) - } + apex := result.ModuleForTests("myapex", "android_common_myapex") + apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp") + android.AssertStringDoesContain(t, "strict updatability check rule for myapex", + apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi") + android.AssertStringListContains(t, "strict updatability check baselines for myapex", + apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml") } func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) { diff --git a/apex/builder.go b/apex/builder.go index 244119bdd..bf3ba9f99 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -1164,7 +1164,18 @@ func (a *apexBundle) buildLintReports(ctx android.ModuleContext) { } } - a.lintReports = java.BuildModuleLintReportZips(ctx, depSetsBuilder.Build()) + depSets := depSetsBuilder.Build() + var validations android.Paths + + if a.checkStrictUpdatabilityLinting(ctx) { + baselines := depSets.Baseline.ToList() + if len(baselines) > 0 { + outputFile := java.VerifyStrictUpdatabilityChecks(ctx, baselines) + validations = append(validations, outputFile) + } + } + + a.lintReports = java.BuildModuleLintReportZips(ctx, depSets, validations) } func (a *apexBundle) buildCannedFsConfig(ctx android.ModuleContext) android.OutputPath { |