diff options
author | Paul Duffin <paulduffin@google.com> | 2022-01-24 14:06:31 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-01-24 14:06:31 +0000 |
commit | 86ef162110dafa5756dd15ddf25c2b45caa54959 (patch) | |
tree | 74fa09294ca6d204a5eb2989c828d27aa7791f7c | |
parent | d2b40e75501328181dc1e37f534bf2e417482d0a (diff) | |
parent | f5245ce53daa2255cd39b7664379368044da80f6 (diff) | |
download | common-86ef162110dafa5756dd15ddf25c2b45caa54959.tar.gz |
Extract logic for building the snapshots to improve testability am: f5245ce53d
Original change: https://android-review.googlesource.com/c/platform/packages/modules/common/+/1954695
Change-Id: Ia8be7376929a0cc29074b31562c7e888fce371d5
-rwxr-xr-x | build/mainline_modules_sdks.py | 134 | ||||
-rw-r--r-- | build/mainline_modules_sdks_test.py | 49 |
2 files changed, 116 insertions, 67 deletions
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py index a1d89c80..8a0645c4 100755 --- a/build/mainline_modules_sdks.py +++ b/build/mainline_modules_sdks.py @@ -195,6 +195,67 @@ class SubprocessRunner: *args, check=True, stdout=self.stdout, stderr=self.stderr, **kwargs) +@dataclasses.dataclass() +class SnapshotBuilder: + """Builds sdk snapshots""" + + # Used to run subprocesses for building snapshots. + subprocess_runner: SubprocessRunner + + # The OUT_DIR environment variable. + out_dir: str + + def get_mainline_sdks_path(self): + """Get the path to the Soong mainline-sdks directory""" + return os.path.join(self.out_dir, "soong/mainline-sdks") + + def get_sdk_path(self, sdk_name, sdk_version): + """Get the path to the sdk snapshot zip file produced by soong""" + return os.path.join(self.get_mainline_sdks_path(), + f"{sdk_name}-{sdk_version}.zip") + + def build_snapshots(self, sdk_versions, modules): + # Build the SDKs once for each version. + for sdk_version in sdk_versions: + # Compute the paths to all the Soong generated sdk snapshot files + # required by this script. + paths = [ + self.get_sdk_path(sdk, sdk_version) + for module in modules + for sdk in module.sdks + ] + + # TODO(ngeoffray): remove SOONG_ALLOW_MISSING_DEPENDENCIES, but we + # currently break without it. + # + # Set SOONG_SDK_SNAPSHOT_USE_SRCJAR to generate .srcjars inside sdk + # zip files as expected by prebuilt drop. + extraEnv = { + "SOONG_ALLOW_MISSING_DEPENDENCIES": "true", + "SOONG_SDK_SNAPSHOT_USE_SRCJAR": "true", + "SOONG_SDK_SNAPSHOT_VERSION": sdk_version, + } + # Unless explicitly specified in the calling environment set + # TARGET_BUILD_VARIANT=user. + # This MUST be identical to the TARGET_BUILD_VARIANT used to build + # the corresponding APEXes otherwise it could result in different + # hidden API flags, see http://b/202398851#comment29 for more info. + targetBuildVariant = os.environ.get("TARGET_BUILD_VARIANT", "user") + cmd = [ + "build/soong/soong_ui.bash", + "--make-mode", + "--soong-only", + f"TARGET_BUILD_VARIANT={targetBuildVariant}", + "TARGET_PRODUCT=mainline_sdk", + "MODULE_BUILD_FROM_SOURCE=true", + "out/soong/apex/depsinfo/new-allowed-deps.txt.check", + ] + paths + print_command(extraEnv, cmd) + env = os.environ.copy() + env.update(extraEnv) + self.subprocess_runner.run(cmd, env=env) + + @dataclasses.dataclass(frozen=True) class MainlineModule: """Represents a mainline module""" @@ -315,10 +376,10 @@ class SdkDistProducer: """ # Used to run subprocesses for this. - subprocess_runner: SubprocessRunner = SubprocessRunner() + subprocess_runner: SubprocessRunner - # The OUT_DIR environment variable. - out_dir: str = "uninitialized-out" + # Builds sdk snapshots + snapshot_builder: SnapshotBuilder # The DIST_DIR environment variable. dist_dir: str = "uninitialized-dist" @@ -327,60 +388,17 @@ class SdkDistProducer: # transformed to document where the changes came from. script: str = sys.argv[0] - def get_sdk_path(self, sdk_name, sdk_version): - """Get the path to the sdk snapshot zip file produced by soong""" - return os.path.join(self.out_dir, "soong/mainline-sdks", - f"{sdk_name}-{sdk_version}.zip") - def produce_dist(self, modules): sdk_versions = SDK_VERSIONS self.build_sdks(sdk_versions, modules) self.populate_dist(sdk_versions, modules) def build_sdks(self, sdk_versions, modules): - # Build the SDKs once for each version. - for sdk_version in sdk_versions: - # Compute the paths to all the Soong generated sdk snapshot files - # required by this script. - paths = [ - self.get_sdk_path(sdk, sdk_version) - for module in modules - for sdk in module.sdks - ] - - # TODO(ngeoffray): remove SOONG_ALLOW_MISSING_DEPENDENCIES, but we - # currently break without it. - # - # Set SOONG_SDK_SNAPSHOT_USE_SRCJAR to generate .srcjars inside sdk - # zip files as expected by prebuilt drop. - extraEnv = { - "SOONG_ALLOW_MISSING_DEPENDENCIES": "true", - "SOONG_SDK_SNAPSHOT_USE_SRCJAR": "true", - "SOONG_SDK_SNAPSHOT_VERSION": sdk_version, - } - # Unless explicitly specified in the calling environment set - # TARGET_BUILD_VARIANT=user. - # This MUST be identical to the TARGET_BUILD_VARIANT used to build - # the corresponding APEXes otherwise it could result in different - # hidden API flags, see http://b/202398851#comment29 for more info. - targetBuildVariant = os.environ.get("TARGET_BUILD_VARIANT", "user") - cmd = [ - "build/soong/soong_ui.bash", - "--make-mode", - "--soong-only", - f"TARGET_BUILD_VARIANT={targetBuildVariant}", - "TARGET_PRODUCT=mainline_sdk", - "MODULE_BUILD_FROM_SOURCE=true", - "out/soong/apex/depsinfo/new-allowed-deps.txt.check", - ] + paths - print_command(extraEnv, cmd) - env = os.environ.copy() - env.update(extraEnv) - self.subprocess_runner.run(cmd, env=env) + self.snapshot_builder.build_snapshots(sdk_versions, modules) def unzip_current_stubs(self, sdk_name, apex_name): """Unzips stubs for "current" into {producer.dist_dir}/stubs/{apex}.""" - sdk_path = self.get_sdk_path(sdk_name, "current") + sdk_path = self.snapshot_builder.get_sdk_path(sdk_name, "current") dest_dir = os.path.join(self.dist_dir, "stubs", apex_name) print( f"Extracting java_sdk_library files from {sdk_path} to {dest_dir}") @@ -420,7 +438,8 @@ class SdkDistProducer: sdk_dist_dir = os.path.join(sdks_dist_dir, sdk_version, apex, subdir) - sdk_path = self.get_sdk_path(sdk, sdk_version) + sdk_path = self.snapshot_builder.get_sdk_path( + sdk, sdk_version) self.dist_sdk_snapshot_zip(sdk_path, sdk_dist_dir, module.transformations()) @@ -512,11 +531,20 @@ def apply_transformations(producer, tmp_dir, transformations): def create_producer(): + # Variables initialized from environment variables that are set by the + # calling mainline_modules_sdks.sh. + out_dir = os.environ["OUT_DIR"] + dist_dir = os.environ["DIST_DIR"] + + subprocess_runner = SubprocessRunner() + snapshot_builder = SnapshotBuilder( + subprocess_runner=subprocess_runner, + out_dir=out_dir, + ) return SdkDistProducer( - # Variables initialized from environment variables that are set by the - # calling mainline_modules_sdks.sh. - out_dir=os.environ["OUT_DIR"], - dist_dir=os.environ["DIST_DIR"], + subprocess_runner=subprocess_runner, + snapshot_builder=snapshot_builder, + dist_dir=dist_dir, ) diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py index 57601361..34e6b5ae 100644 --- a/build/mainline_modules_sdks_test.py +++ b/build/mainline_modules_sdks_test.py @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for mainline_modules_sdks.py.""" - from pathlib import Path import os import tempfile @@ -24,12 +23,15 @@ import zipfile import mainline_modules_sdks as mm -class TestPopulateDist(unittest.TestCase): +class FakeSnapshotBuilder(mm.SnapshotBuilder): + """A fake snapshot builder that does not run the build. - def create_snapshot_file(self, out_dir, name, version): - sdks_out_dir = Path(out_dir, "soong/mainline-sdks") - sdks_out_dir.mkdir(parents=True, exist_ok=True) - zip_file = Path(sdks_out_dir, f"{name}-{version}.zip") + This skips the whole build process and just creates some fake sdk + modules. + """ + + def create_snapshot_file(self, name, version): + zip_file = Path(self.get_sdk_path(name, version)) with zipfile.ZipFile(zip_file, "w") as z: z.writestr("Android.bp", "") if name.endswith("-sdk"): @@ -38,6 +40,19 @@ class TestPopulateDist(unittest.TestCase): z.writestr("sdk_library/public/lib.jar", "") z.writestr("sdk_library/public/api.txt", "") + def build_snapshots(self, sdk_versions, modules): + # Create input file structure. + sdks_out_dir = Path(self.get_mainline_sdks_path()) + sdks_out_dir.mkdir(parents=True, exist_ok=True) + # Create a fake sdk zip file for each module. + for module in modules: + for sdk in module.sdks: + for sdk_version in sdk_versions: + self.create_snapshot_file(sdk, sdk_version) + + +class TestProduceDist(unittest.TestCase): + def test(self): """Verify the dist/mainline-sdks directory is populated correctly""" with tempfile.TemporaryDirectory() as tmp_dir: @@ -51,18 +66,20 @@ class TestPopulateDist(unittest.TestCase): mm.MAINLINE_MODULES_BY_APEX["com.android.ipsec"], ] - # Create input file structure. - for module in modules: - for sdk in module.sdks: - self.create_snapshot_file(tmp_out_dir, sdk, "current") + subprocess_runner = mm.SubprocessRunner() - producer = mm.SdkDistProducer( + snapshot_builder = FakeSnapshotBuilder( + subprocess_runner=subprocess_runner, out_dir=tmp_out_dir, + ) + + producer = mm.SdkDistProducer( + subprocess_runner=subprocess_runner, + snapshot_builder=snapshot_builder, dist_dir=tmp_dist_dir, ) - sdk_versions = ["current"] - producer.populate_dist(sdk_versions, modules) + producer.produce_dist(modules) files = [] for abs_dir, _, filenames in os.walk(tmp_dist_dir): @@ -114,7 +131,11 @@ def readTestData(relative_path): class TestSoongConfigBoilerplateInserter(unittest.TestCase): def apply_transformations(self, src, transformations, expected): - producer = mm.SdkDistProducer(script=self._testMethodName) + producer = mm.SdkDistProducer( + subprocess_runner=None, + snapshot_builder=None, + script=self._testMethodName, + ) with tempfile.TemporaryDirectory() as tmp_dir: path = os.path.join(tmp_dir, "Android.bp") |