Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2d6e500 authored by Satish Yalla's avatar Satish Yalla Committed by Gerrit Code Review
Browse files

Merge "Revert "Implement detecting container violations."" into main

parents 26f071db b2b1ef63
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ package android

import (
	"fmt"
	"reflect"
	"slices"
	"sort"
	"strconv"
@@ -146,17 +145,6 @@ func (i ApexInfo) InApexModule(apexModuleName string) bool {
	return false
}

// To satisfy the comparable interface
func (i ApexInfo) Equal(other any) bool {
	otherApexInfo, ok := other.(ApexInfo)
	return ok && i.ApexVariationName == otherApexInfo.ApexVariationName &&
		i.MinSdkVersion == otherApexInfo.MinSdkVersion &&
		i.Updatable == otherApexInfo.Updatable &&
		i.UsePlatformApis == otherApexInfo.UsePlatformApis &&
		reflect.DeepEqual(i.InApexVariants, otherApexInfo.InApexVariants) &&
		reflect.DeepEqual(i.InApexModules, otherApexInfo.InApexModules)
}

// ApexTestForInfo stores the contents of APEXes for which this module is a test - although this
// module is not part of the APEX - and thus has access to APEX internals.
type ApexTestForInfo struct {
+0 −65
Original line number Diff line number Diff line
@@ -15,10 +15,8 @@
package android

import (
	"fmt"
	"reflect"
	"slices"
	"strings"

	"github.com/google/blueprint"
)
@@ -397,40 +395,6 @@ func (c *ContainersInfo) UpdatableApex() bool {

var ContainersInfoProvider = blueprint.NewProvider[ContainersInfo]()

func satisfyAllowedExceptions(ctx ModuleContext, allowedExceptionLabels []exceptionHandleFuncLabel, m, dep Module) bool {
	for _, label := range allowedExceptionLabels {
		if exceptionHandleFunctionsTable[label](ctx, m, dep) {
			return true
		}
	}
	return false
}

func (c *ContainersInfo) GetViolations(mctx ModuleContext, m, dep Module, depInfo ContainersInfo) []string {
	var violations []string

	// Any containers that the module belongs to but the dependency does not belong to must be examined.
	_, containersUniqueToModule, _ := ListSetDifference(c.belongingContainers, depInfo.belongingContainers)

	// Apex container should be examined even if both the module and the dependency belong to
	// the apex container to check that the two modules belong to the same apex.
	if InList(ApexContainer, c.belongingContainers) && !InList(ApexContainer, containersUniqueToModule) {
		containersUniqueToModule = append(containersUniqueToModule, ApexContainer)
	}

	for _, containerUniqueToModule := range containersUniqueToModule {
		for _, restriction := range containerUniqueToModule.restricted {
			if InList(restriction.dependency, depInfo.belongingContainers) {
				if !satisfyAllowedExceptions(mctx, restriction.allowedExceptions, m, dep) {
					violations = append(violations, restriction.errorMessage)
				}
			}
		}
	}

	return violations
}

func generateContainerInfo(ctx ModuleContext) ContainersInfo {
	var containers []*container

@@ -472,32 +436,3 @@ func setContainerInfo(ctx ModuleContext) {
		SetProvider(ctx, ContainersInfoProvider, containersInfo)
	}
}

func checkContainerViolations(ctx ModuleContext) {
	if _, ok := ctx.Module().(InstallableModule); ok {
		containersInfo, _ := getContainerModuleInfo(ctx, ctx.Module())
		ctx.VisitDirectDepsIgnoreBlueprint(func(dep Module) {
			if !dep.Enabled(ctx) {
				return
			}

			// Pre-existing violating dependencies are tracked in containerDependencyViolationAllowlist.
			// If this dependency is allowlisted, do not check for violation.
			// If not, check if this dependency matches any restricted dependency and
			// satisfies any exception functions, which allows bypassing the
			// restriction. If all of the exceptions are not satisfied, throw an error.
			if depContainersInfo, ok := getContainerModuleInfo(ctx, dep); ok {
				if allowedViolations, ok := ContainerDependencyViolationAllowlist[ctx.ModuleName()]; ok && InList(dep.Name(), allowedViolations) {
					return
				} else {
					violations := containersInfo.GetViolations(ctx, ctx.Module(), dep, depContainersInfo)
					if len(violations) > 0 {
						errorMessage := fmt.Sprintf("%s cannot depend on %s. ", ctx.ModuleName(), dep.Name())
						errorMessage += strings.Join(violations, " ")
						ctx.ModuleErrorf(errorMessage)
					}
				}
			}
		})
	}
}
+0 −3
Original line number Diff line number Diff line
@@ -1778,9 +1778,6 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
	}

	setContainerInfo(ctx)
	if ctx.Config().Getenv("DISABLE_CONTAINER_CHECK") != "true" {
		checkContainerViolations(ctx)
	}

	ctx.licenseMetadataFile = PathForModuleOut(ctx, "meta_lic")

+0 −12
Original line number Diff line number Diff line
@@ -74,8 +74,6 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
		},
		{
@@ -124,8 +122,6 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
		},
		{
@@ -349,8 +345,6 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
			expectedError: `.*my_java_library_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
		},
@@ -398,8 +392,6 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
			expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
		},
@@ -701,8 +693,6 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
			expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
		},
@@ -779,8 +769,6 @@ func TestValidationNotPropagateAcrossShared(t *testing.T) {
					apex_available: [
						"myapex",
					],
					sdk_version: "none",
					system_modules: "none",
				}`,
		},
	}
+4 −59
Original line number Diff line number Diff line
@@ -4929,7 +4929,6 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
		java_import {
			name: "libfoo",
			jars: ["libfoo.jar"],
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -4970,22 +4969,6 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
	t.Run("prebuilt with source preferred", func(t *testing.T) {

		bp := `
		apex {
			name: "myapex",
			key: "myapex.key",
			updatable: false,
			java_libs: [
				"libfoo",
				"libbar",
			],
		}

		apex_key {
			name: "myapex.key",
			public_key: "testkey.avbpubkey",
			private_key: "testkey.pem",
		}

		prebuilt_apex {
			name: "myapex",
			arch: {
@@ -5002,21 +4985,10 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
		java_import {
			name: "libfoo",
			jars: ["libfoo.jar"],
			apex_available: [
				"myapex",
			],
			compile_dex: true,
			sdk_version: "core_current",
		}

		java_library {
			name: "libfoo",
			srcs: ["foo/bar/MyClass.java"],
			apex_available: [
				"myapex",
			],
			compile_dex: true,
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5024,21 +4996,12 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
			public: {
				jars: ["libbar.jar"],
			},
			apex_available: [
				"myapex",
			],
			compile_dex: true,
		}

		java_sdk_library {
			name: "libbar",
			srcs: ["foo/bar/MyClass.java"],
			unsafe_ignore_missing_latest_api: true,
			apex_available: [
				"myapex",
			],
			compile_dex: true,
			sdk_version: "core_current",
		}
	`

@@ -5047,9 +5010,11 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {

		checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
		checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
		ensureNoSourceVariant(t, ctx, "libfoo")

		checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
		checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
		ensureNoSourceVariant(t, ctx, "libbar")
	})

	t.Run("prebuilt preferred with source", func(t *testing.T) {
@@ -5075,7 +5040,6 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {

		java_library {
			name: "libfoo",
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5202,7 +5166,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			jars: ["libfoo.jar"],
			apex_available: ["myapex"],
			permitted_packages: ["foo"],
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5357,14 +5320,12 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			name: "libfoo",
			jars: ["libfoo.jar"],
			apex_available: ["myapex"],
			sdk_version: "core_current",
		}

		java_library {
			name: "libfoo",
			srcs: ["foo/bar/MyClass.java"],
			apex_available: ["myapex"],
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5456,7 +5417,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			jars: ["libfoo.jar"],
			apex_available: ["myapex"],
			permitted_packages: ["foo"],
			sdk_version: "core_current",
		}

		java_library {
@@ -5464,7 +5424,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			srcs: ["foo/bar/MyClass.java"],
			apex_available: ["myapex"],
			installable: true,
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5555,7 +5514,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			name: "libfoo",
			jars: ["libfoo.jar"],
			apex_available: ["myapex"],
			sdk_version: "core_current",
		}

		java_library {
@@ -5564,7 +5522,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			apex_available: ["myapex"],
			permitted_packages: ["foo"],
			installable: true,
			sdk_version: "core_current",
		}

		java_sdk_library_import {
@@ -5583,7 +5540,6 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
			apex_available: ["myapex"],
			permitted_packages: ["bar"],
			compile_dex: true,
			sdk_version: "core_current",
		}
	`

@@ -6178,7 +6134,6 @@ func TestApexWithTestHelperApp(t *testing.T) {
			name: "TesterHelpAppFoo",
			srcs: ["foo/bar/MyClass.java"],
			apex_available: [ "myapex" ],
			sdk_version: "test_current",
		}

	`)
@@ -7781,7 +7736,7 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
			srcs: ["foo/bar/MyClass.java"],
			sdk_version: "none",
			system_modules: "none",
			static_libs: ["myotherjar"],
			libs: ["myotherjar"],
			apex_available: [
				"myapex",
				"myapex.updatable",
@@ -8442,7 +8397,6 @@ func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
			apex_available: [
				"myapex",
			],
			sdk_version: "current",
		}

		systemserverclasspath_fragment {
@@ -9485,7 +9439,6 @@ func TestApexJavaCoverage(t *testing.T) {
			srcs: ["mybootclasspathlib.java"],
			apex_available: ["myapex"],
			compile_dex: true,
			sdk_version: "current",
		}

		systemserverclasspath_fragment {
@@ -9801,7 +9754,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
				unsafe_ignore_missing_latest_api: true,
				min_sdk_version: "31",
				static_libs: ["util"],
				sdk_version: "core_current",
			}

			java_library {
@@ -9810,7 +9762,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
				apex_available: ["myapex"],
				min_sdk_version: "31",
				static_libs: ["another_util"],
				sdk_version: "core_current",
			}

			java_library {
@@ -9818,7 +9769,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
                srcs: ["a.java"],
				min_sdk_version: "31",
				apex_available: ["myapex"],
				sdk_version: "core_current",
			}
		`)
	})
@@ -9874,7 +9824,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
	})

	t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
		preparer.
		preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
			RunTestWithBp(t, `
				apex {
					name: "myapex",
@@ -9905,8 +9855,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
					apex_available: ["myapex"],
					compile_dex: true,
					unsafe_ignore_missing_latest_api: true,
					sdk_version: "current",
					min_sdk_version: "30",
				}
		`)
	})
@@ -10159,9 +10107,6 @@ func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
			key: "myapex.key",
			bootclasspath_fragments: ["mybootclasspathfragment"],
			min_sdk_version: "29",
			java_libs: [
				"jacocoagent",
			],
		}
		apex_key {
			name: "myapex.key",
Loading