aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild/mainline_modules_sdks.py188
-rw-r--r--build/mainline_modules_sdks_test.py316
2 files changed, 354 insertions, 150 deletions
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py
index 02edc6d5..b42d6556 100755
--- a/build/mainline_modules_sdks.py
+++ b/build/mainline_modules_sdks.py
@@ -460,15 +460,27 @@ def create_dist_snapshot_for_r(build_release: BuildRelease,
def create_sdk_snapshots_in_soong(build_release: BuildRelease,
producer: "SdkDistProducer",
modules: List["MainlineModule"]):
- """Builds sdks and populates the dist."""
- producer.produce_dist_for_build_release(build_release, modules)
+ """Builds sdks and populates the dist for unbundled modules."""
+ producer.produce_unbundled_dist_for_build_release(build_release, modules)
+
+
+def create_latest_sdk_snapshots(build_release: BuildRelease,
+ producer: "SdkDistProducer",
+ modules: List["MainlineModule"]):
+ """Builds and populates the latest release, including bundled modules."""
+ producer.produce_unbundled_dist_for_build_release(build_release, modules)
+ producer.produce_bundled_dist_for_build_release(build_release, modules)
def create_legacy_dist_structures(build_release: BuildRelease,
producer: "SdkDistProducer",
modules: List["MainlineModule"]):
"""Creates legacy file structures."""
- snapshots_dir = producer.produce_dist_for_build_release(
+
+ # Only put unbundled modules in the legacy dist and stubs structures.
+ modules = [m for m in modules if not m.is_bundled()]
+
+ snapshots_dir = producer.produce_unbundled_dist_for_build_release(
build_release, modules)
# Create the out/dist/mainline-sdks/stubs structure.
@@ -525,7 +537,7 @@ Tiramisu = BuildRelease(
# before LEGACY_BUILD_RELEASE.
LATEST = BuildRelease(
name="latest",
- creator=create_sdk_snapshots_in_soong,
+ creator=create_latest_sdk_snapshots,
# There are no build release specific environment variables to pass to
# Soong.
soong_env={},
@@ -568,7 +580,11 @@ class ForRBuild:
@dataclasses.dataclass(frozen=True)
class MainlineModule:
- """Represents a mainline module"""
+ """Represents an unbundled mainline module.
+
+ This is a module that is distributed as a prebuilt and intended to be
+ updated with Mainline trains.
+ """
# The name of the apex.
apex: str
@@ -603,6 +619,10 @@ class MainlineModule:
for_r_build: typing.Optional[ForRBuild] = None
+ def is_bundled(self):
+ """Returns true for bundled modules. See BundledMainlineModule."""
+ return False
+
def transformations(self, build_release):
"""Returns the transformations to apply to this module's snapshot(s)."""
transformations = []
@@ -620,6 +640,23 @@ class MainlineModule:
return self.first_release <= target_build_release
+@dataclasses.dataclass(frozen=True)
+class BundledMainlineModule(MainlineModule):
+ """Represents a bundled Mainline module or a platform SDK for module use.
+
+ A bundled module is always preloaded into the platform images.
+ """
+
+ def is_bundled(self):
+ return True
+
+ def transformations(self, build_release):
+ # Bundled modules are only used on thin branches where the corresponding
+ # sources are absent, so skip transformations and keep the default
+ # `prefer: false`.
+ return []
+
+
# List of mainline modules.
MAINLINE_MODULES = [
MainlineModule(
@@ -723,6 +760,42 @@ MAINLINE_MODULES = [
),
]
+# List of Mainline modules that currently are never built unbundled. They should
+# not specify first_release, and they don't have com.google.android
+# counterparts.
+BUNDLED_MAINLINE_MODULES = [
+ BundledMainlineModule(
+ apex="com.android.i18n",
+ sdks=[
+ "i18n-module-sdk",
+ "i18n-module-test-exports",
+ "i18n-module-host-exports",
+ ],
+ ),
+ BundledMainlineModule(
+ apex="com.android.runtime",
+ sdks=[
+ "runtime-module-host-exports",
+ "runtime-module-sdk",
+ ],
+ ),
+ BundledMainlineModule(
+ apex="com.android.tzdata",
+ sdks=["tzdata-module-test-exports"],
+ ),
+]
+
+# List of platform SDKs for Mainline module use.
+PLATFORM_SDKS_FOR_MAINLINE = [
+ BundledMainlineModule(
+ apex="platform-mainline",
+ sdks=[
+ "platform-mainline-sdk",
+ "platform-mainline-test-exports",
+ ],
+ ),
+]
+
@dataclasses.dataclass
class SdkDistProducer:
@@ -747,17 +820,26 @@ class SdkDistProducer:
# transformed to document where the changes came from.
script: str = sys.argv[0]
- # The path to the mainline-sdks dist directory.
+ # The path to the mainline-sdks dist directory for unbundled modules.
#
# Initialized in __post_init__().
mainline_sdks_dir: str = dataclasses.field(init=False)
+ # The path to the mainline-sdks dist directory for bundled modules and
+ # platform SDKs.
+ #
+ # Initialized in __post_init__().
+ bundled_mainline_sdks_dir: str = dataclasses.field(init=False)
+
def __post_init__(self):
self.mainline_sdks_dir = os.path.join(self.dist_dir, "mainline-sdks")
+ self.bundled_mainline_sdks_dir = os.path.join(self.dist_dir,
+ "bundled-mainline-sdks")
def prepare(self):
- # Clear the mainline-sdks dist directory.
+ # Clear the sdk dist directories.
shutil.rmtree(self.mainline_sdks_dir, ignore_errors=True)
+ shutil.rmtree(self.bundled_mainline_sdks_dir, ignore_errors=True)
def produce_dist(self, modules, build_releases):
# Prepare the dist directory for the sdks.
@@ -784,39 +866,61 @@ class SdkDistProducer:
snapshot_dir = self.snapshot_builder.build_snapshots_for_build_r(
build_release, sdk_versions, modules)
- self.populate_dist(build_release, sdk_versions, modules, snapshot_dir)
+ self.populate_unbundled_dist(build_release, sdk_versions, modules,
+ snapshot_dir)
+
+ def produce_unbundled_dist_for_build_release(self, build_release, modules):
+ modules = [m for m in modules if not m.is_bundled()]
+ sdk_versions = build_release.sdk_versions
+ snapshots_dir = self.snapshot_builder.build_snapshots(
+ build_release, sdk_versions, modules)
+ self.populate_unbundled_dist(build_release, sdk_versions, modules,
+ snapshots_dir)
+ return snapshots_dir
- def produce_dist_for_build_release(self, build_release, modules):
+ def produce_bundled_dist_for_build_release(self, build_release, modules):
+ modules = [m for m in modules if m.is_bundled()]
sdk_versions = build_release.sdk_versions
snapshots_dir = self.snapshot_builder.build_snapshots(
build_release, sdk_versions, modules)
- self.populate_dist(build_release, sdk_versions, modules, snapshots_dir)
+ self.populate_bundled_dist(build_release, modules, snapshots_dir)
return snapshots_dir
- def populate_dist(self, build_release, sdk_versions, modules,
- snapshots_dir):
+ def populate_unbundled_dist(self, build_release, sdk_versions, modules,
+ snapshots_dir):
build_release_dist_dir = os.path.join(self.mainline_sdks_dir,
build_release.sub_dir)
-
for module in modules:
- apex = module.apex
for sdk_version in sdk_versions:
for sdk in module.sdks:
- subdir = re.sub("^[^-]+-(module-)?", "", sdk)
- if subdir not in ("sdk", "host-exports", "test-exports"):
- raise Exception(
- f"{sdk} is not a valid name, expected name in the"
- f" format of"
- f" ^[^-]+-(module-)?(sdk|host-exports|test-exports)"
- )
-
- sdk_dist_dir = os.path.join(build_release_dist_dir,
- sdk_version, apex, subdir)
- sdk_path = sdk_snapshot_zip_file(snapshots_dir, sdk,
- sdk_version)
- transformations = module.transformations(build_release)
- self.dist_sdk_snapshot_zip(sdk_path, sdk_dist_dir,
- transformations)
+ sdk_dist_dir = os.path.join(
+ build_release_dist_dir, sdk_version)
+ self.populate_dist_snapshot(
+ build_release, module, sdk, sdk_dist_dir, sdk_version,
+ snapshots_dir)
+
+ def populate_bundled_dist(self, build_release, modules, snapshots_dir):
+ sdk_dist_dir = self.bundled_mainline_sdks_dir
+ for module in modules:
+ for sdk in module.sdks:
+ self.populate_dist_snapshot(
+ build_release, module, sdk, sdk_dist_dir, "current",
+ snapshots_dir)
+
+ def populate_dist_snapshot(self, build_release, module, sdk, sdk_dist_dir,
+ sdk_version, snapshots_dir):
+ subdir = re.sub("^.+-(sdk|(host|test)-exports)$", r'\1', sdk)
+ if subdir not in ("sdk", "host-exports", "test-exports"):
+ raise Exception(
+ f"{sdk} is not a valid name, expected it to end"
+ f" with -(sdk|host-exports|test-exports)"
+ )
+
+ sdk_dist_subdir = os.path.join(sdk_dist_dir, module.apex, subdir)
+ sdk_path = sdk_snapshot_zip_file(snapshots_dir, sdk, sdk_version)
+ transformations = module.transformations(build_release)
+ self.dist_sdk_snapshot_zip(sdk_path, sdk_dist_subdir,
+ transformations)
def dist_sdk_snapshot_zip(self, src_sdk_zip, sdk_dist_dir, transformations):
"""Copy the sdk snapshot zip file to a dist directory.
@@ -952,12 +1056,10 @@ def google_to_aosp_name(name):
return name.replace("com.google.android.", "com.android.")
-def filter_modules(modules):
- target_build_apps = os.environ.get("TARGET_BUILD_APPS")
+def filter_modules(modules, target_build_apps):
if target_build_apps:
target_build_apps = target_build_apps.split()
return [m for m in modules if m.apex in target_build_apps]
-
return modules
@@ -977,7 +1079,16 @@ def main(args):
"--build-release",
action="append",
choices=[br.name for br in ALL_BUILD_RELEASES],
- help="A target build for which snapshots are required.",
+ help="A target build for which snapshots are required. "
+ "If it is \"latest\" then Mainline module SDKs from platform and "
+ "bundled modules are included.",
+ )
+ args_parser.add_argument(
+ "--build-platform-sdks-for-mainline",
+ action="store_true",
+ help="Also build the platform SDKs for Mainline modules. "
+ "Defaults to true when TARGET_BUILD_APPS is not set. "
+ "Applicable only if the \"latest\" build release is built.",
)
args = args_parser.parse_args(args)
@@ -989,9 +1100,16 @@ def main(args):
if b.name.lower() in selected_build_releases
]
- producer = create_producer(args.tool_path)
- modules = filter_modules(MAINLINE_MODULES)
+ target_build_apps = os.environ.get("TARGET_BUILD_APPS")
+ modules = filter_modules(MAINLINE_MODULES + BUNDLED_MAINLINE_MODULES,
+ target_build_apps)
+
+ # Also build the platform Mainline SDKs either if no specific modules are
+ # requested or if --build-platform-sdks-for-mainline is given.
+ if not target_build_apps or args.build_platform_sdks_for_mainline:
+ modules += PLATFORM_SDKS_FOR_MAINLINE
+ producer = create_producer(args.tool_path)
producer.produce_dist(modules, build_releases)
diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py
index 8d452bdd..084230e8 100644
--- a/build/mainline_modules_sdks_test.py
+++ b/build/mainline_modules_sdks_test.py
@@ -17,6 +17,7 @@
import re
from pathlib import Path
import os
+import shutil
import tempfile
import unittest
import zipfile
@@ -24,7 +25,10 @@ from unittest import mock
import mainline_modules_sdks as mm
-MAINLINE_MODULES_BY_APEX = dict((m.apex, m) for m in mm.MAINLINE_MODULES)
+MAINLINE_MODULES_BY_APEX = dict((m.apex, m) for m in (
+ mm.MAINLINE_MODULES +
+ mm.BUNDLED_MAINLINE_MODULES +
+ mm.PLATFORM_SDKS_FOR_MAINLINE))
class FakeSnapshotBuilder(mm.SnapshotBuilder):
@@ -67,116 +71,29 @@ class FakeSnapshotBuilder(mm.SnapshotBuilder):
class TestProduceDist(unittest.TestCase):
- def test(self):
- """Verify the dist/mainline-sdks directory is populated correctly"""
- with tempfile.TemporaryDirectory() as tmp_dir:
- tmp_out_dir = os.path.join(tmp_dir, "out")
- os.mkdir(tmp_out_dir)
- tmp_dist_dir = os.path.join(tmp_dir, "dist")
- os.mkdir(tmp_dist_dir)
-
- modules = [
- MAINLINE_MODULES_BY_APEX["com.android.art"],
- MAINLINE_MODULES_BY_APEX["com.android.ipsec"],
- # Create a google specific module.
- mm.aosp_to_google(MAINLINE_MODULES_BY_APEX["com.android.wifi"]),
- ]
-
- subprocess_runner = mm.SubprocessRunner()
-
- snapshot_builder = FakeSnapshotBuilder(
- tool_path="path/to/mainline_modules_sdks.sh",
- subprocess_runner=subprocess_runner,
- out_dir=tmp_out_dir,
- )
-
- build_releases = [
- mm.Q,
- mm.R,
- mm.S,
- mm.LATEST,
- mm.LEGACY_BUILD_RELEASE,
- ]
-
- producer = mm.SdkDistProducer(
- subprocess_runner=subprocess_runner,
- snapshot_builder=snapshot_builder,
- dist_dir=tmp_dist_dir,
- )
-
- producer.produce_dist(modules, build_releases)
-
- # pylint: disable=line-too-long
- self.assertEqual(
- [
- # Legacy copy of the snapshots, for use by tools that don't support build specific snapshots.
- "mainline-sdks/current/com.android.art/host-exports/art-module-host-exports-current.zip",
- "mainline-sdks/current/com.android.art/sdk/art-module-sdk-current.zip",
- "mainline-sdks/current/com.android.art/test-exports/art-module-test-exports-current.zip",
- "mainline-sdks/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
- "mainline-sdks/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
- # Build specific snapshots.
- "mainline-sdks/for-R-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
- "mainline-sdks/for-R-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
- "mainline-sdks/for-S-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
- "mainline-sdks/for-S-build/current/com.android.art/sdk/art-module-sdk-current.zip",
- "mainline-sdks/for-S-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
- "mainline-sdks/for-S-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
- "mainline-sdks/for-S-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
- "mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
- "mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
- "mainline-sdks/for-latest-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
- "mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
- "mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
- # Legacy stubs directory containing unpacked java_sdk_library artifacts.
- "stubs/com.android.art/sdk_library/public/art-removed.txt",
- "stubs/com.android.art/sdk_library/public/art-stubs.jar",
- "stubs/com.android.art/sdk_library/public/art.srcjar",
- "stubs/com.android.art/sdk_library/public/art.txt",
- "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike-removed.txt",
- "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike-stubs.jar",
- "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike.srcjar",
- "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike.txt",
- "stubs/com.google.android.wifi/sdk_library/public/framework-wifi-removed.txt",
- "stubs/com.google.android.wifi/sdk_library/public/framework-wifi-stubs.jar",
- "stubs/com.google.android.wifi/sdk_library/public/framework-wifi.srcjar",
- "stubs/com.google.android.wifi/sdk_library/public/framework-wifi.txt",
- ],
- sorted(self.list_files_in_dir(tmp_dist_dir)))
-
- r_snaphot_dir = os.path.join(
- tmp_out_dir, "soong/mainline-sdks/test/for-R-build")
- aosp_ipsec_r_bp_file = "com.android.ipsec/Android.bp"
- google_wifi_android_bp = "com.google.android.wifi/Android.bp"
- self.assertEqual([
- aosp_ipsec_r_bp_file,
- "com.android.ipsec/sdk_library/public/android.net.ipsec.ike-removed.txt",
- "com.android.ipsec/sdk_library/public/android.net.ipsec.ike-stubs.jar",
- "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.srcjar",
- "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.txt",
- google_wifi_android_bp,
- "com.google.android.wifi/sdk_library/public/framework-wifi-removed.txt",
- "com.google.android.wifi/sdk_library/public/framework-wifi-stubs.jar",
- "com.google.android.wifi/sdk_library/public/framework-wifi.srcjar",
- "com.google.android.wifi/sdk_library/public/framework-wifi.txt",
- "ipsec-module-sdk-current.zip",
- "wifi-module-sdk-current.zip",
- ], sorted(self.list_files_in_dir(r_snaphot_dir)))
-
- def read_r_snapshot_contents(path):
- abs_path = os.path.join(r_snaphot_dir, path)
- with open(abs_path, "r", encoding="utf8") as file:
- return file.read()
-
- # Check the contents of the AOSP ipsec module
- ipsec_contents = read_r_snapshot_contents(aosp_ipsec_r_bp_file)
- expected = read_test_data("ipsec_for_r_Android.bp")
- self.assertEqual(expected, ipsec_contents)
-
- # Check the contents of the Google ipsec module
- wifi_contents = read_r_snapshot_contents(google_wifi_android_bp)
- expected = read_test_data("google_wifi_for_r_Android.bp")
- self.assertEqual(expected, wifi_contents)
+ def setUp(self):
+ self.tmp_dir = tempfile.mkdtemp()
+ self.tmp_out_dir = os.path.join(self.tmp_dir, "out")
+ os.mkdir(self.tmp_out_dir)
+ self.tmp_dist_dir = os.path.join(self.tmp_dir, "dist")
+ os.mkdir(self.tmp_dist_dir)
+
+ def tearDown(self):
+ shutil.rmtree(self.tmp_dir, ignore_errors=True)
+
+ def produce_dist(self, modules, build_releases):
+ subprocess_runner = mm.SubprocessRunner()
+ snapshot_builder = FakeSnapshotBuilder(
+ tool_path="path/to/mainline_modules_sdks.sh",
+ subprocess_runner=subprocess_runner,
+ out_dir=self.tmp_out_dir,
+ )
+ producer = mm.SdkDistProducer(
+ subprocess_runner=subprocess_runner,
+ snapshot_builder=snapshot_builder,
+ dist_dir=self.tmp_dist_dir,
+ )
+ producer.produce_dist(modules, build_releases)
def list_files_in_dir(self, tmp_dist_dir):
files = []
@@ -188,6 +105,160 @@ class TestProduceDist(unittest.TestCase):
files.append(os.path.join(rel_dir, f))
return files
+ def test_unbundled_modules(self):
+ modules = [
+ MAINLINE_MODULES_BY_APEX["com.android.art"],
+ MAINLINE_MODULES_BY_APEX["com.android.ipsec"],
+ # Create a google specific module.
+ mm.aosp_to_google(MAINLINE_MODULES_BY_APEX["com.android.wifi"]),
+ ]
+ build_releases = [
+ mm.Q,
+ mm.R,
+ mm.S,
+ mm.LATEST,
+ mm.LEGACY_BUILD_RELEASE,
+ ]
+ self.produce_dist(modules, build_releases)
+
+ # pylint: disable=line-too-long
+ self.assertEqual(
+ [
+ # Legacy copy of the snapshots, for use by tools that don't support build specific snapshots.
+ "mainline-sdks/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ "mainline-sdks/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
+ "mainline-sdks/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
+ # Build specific snapshots.
+ "mainline-sdks/for-R-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
+ "mainline-sdks/for-R-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
+ "mainline-sdks/for-S-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
+ "mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
+ # Legacy stubs directory containing unpacked java_sdk_library artifacts.
+ "stubs/com.android.art/sdk_library/public/art-removed.txt",
+ "stubs/com.android.art/sdk_library/public/art-stubs.jar",
+ "stubs/com.android.art/sdk_library/public/art.srcjar",
+ "stubs/com.android.art/sdk_library/public/art.txt",
+ "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike-removed.txt",
+ "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike-stubs.jar",
+ "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike.srcjar",
+ "stubs/com.android.ipsec/sdk_library/public/android.net.ipsec.ike.txt",
+ "stubs/com.google.android.wifi/sdk_library/public/framework-wifi-removed.txt",
+ "stubs/com.google.android.wifi/sdk_library/public/framework-wifi-stubs.jar",
+ "stubs/com.google.android.wifi/sdk_library/public/framework-wifi.srcjar",
+ "stubs/com.google.android.wifi/sdk_library/public/framework-wifi.txt",
+ ],
+ sorted(self.list_files_in_dir(self.tmp_dist_dir)))
+
+ r_snaphot_dir = os.path.join(
+ self.tmp_out_dir, "soong/mainline-sdks/test/for-R-build")
+ aosp_ipsec_r_bp_file = "com.android.ipsec/Android.bp"
+ google_wifi_android_bp = "com.google.android.wifi/Android.bp"
+ self.assertEqual([
+ aosp_ipsec_r_bp_file,
+ "com.android.ipsec/sdk_library/public/android.net.ipsec.ike-removed.txt",
+ "com.android.ipsec/sdk_library/public/android.net.ipsec.ike-stubs.jar",
+ "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.srcjar",
+ "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.txt",
+ google_wifi_android_bp,
+ "com.google.android.wifi/sdk_library/public/framework-wifi-removed.txt",
+ "com.google.android.wifi/sdk_library/public/framework-wifi-stubs.jar",
+ "com.google.android.wifi/sdk_library/public/framework-wifi.srcjar",
+ "com.google.android.wifi/sdk_library/public/framework-wifi.txt",
+ "ipsec-module-sdk-current.zip",
+ "wifi-module-sdk-current.zip",
+ ], sorted(self.list_files_in_dir(r_snaphot_dir)))
+
+ def read_r_snapshot_contents(path):
+ abs_path = os.path.join(r_snaphot_dir, path)
+ with open(abs_path, "r", encoding="utf8") as file:
+ return file.read()
+
+ # Check the contents of the AOSP ipsec module
+ ipsec_contents = read_r_snapshot_contents(aosp_ipsec_r_bp_file)
+ expected = read_test_data("ipsec_for_r_Android.bp")
+ self.assertEqual(expected, ipsec_contents)
+
+ # Check the contents of the Google ipsec module
+ wifi_contents = read_r_snapshot_contents(google_wifi_android_bp)
+ expected = read_test_data("google_wifi_for_r_Android.bp")
+ self.assertEqual(expected, wifi_contents)
+
+ def test_old_release(self):
+ modules = [
+ MAINLINE_MODULES_BY_APEX["com.android.art"], # An unnbundled module
+ MAINLINE_MODULES_BY_APEX["com.android.runtime"], # A bundled module
+ MAINLINE_MODULES_BY_APEX["platform-mainline"], # Platform SDK
+ ]
+ build_releases = [mm.S]
+ self.produce_dist(modules, build_releases)
+
+ # pylint: disable=line-too-long
+ self.assertEqual(
+ [
+ "mainline-sdks/for-S-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/for-S-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ ],
+ sorted(self.list_files_in_dir(self.tmp_dist_dir)))
+
+ def test_latest_release(self):
+ modules = [
+ MAINLINE_MODULES_BY_APEX["com.android.art"], # An unnbundled module
+ MAINLINE_MODULES_BY_APEX["com.android.runtime"], # A bundled module
+ MAINLINE_MODULES_BY_APEX["platform-mainline"], # Platform SDK
+ ]
+ build_releases = [mm.LATEST]
+ self.produce_dist(modules, build_releases)
+
+ # pylint: disable=line-too-long
+ self.assertEqual(
+ [
+ # Bundled modules and platform SDKs.
+ "bundled-mainline-sdks/com.android.runtime/host-exports/runtime-module-host-exports-current.zip",
+ "bundled-mainline-sdks/com.android.runtime/sdk/runtime-module-sdk-current.zip",
+ "bundled-mainline-sdks/platform-mainline/sdk/platform-mainline-sdk-current.zip",
+ "bundled-mainline-sdks/platform-mainline/test-exports/platform-mainline-test-exports-current.zip",
+ # Unbundled (normal) modules.
+ "mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/for-latest-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ ],
+ sorted(self.list_files_in_dir(self.tmp_dist_dir)))
+
+ def test_legacy_release(self):
+ modules = [
+ MAINLINE_MODULES_BY_APEX["com.android.art"], # An unnbundled module
+ MAINLINE_MODULES_BY_APEX["com.android.runtime"], # A bundled module
+ MAINLINE_MODULES_BY_APEX["platform-mainline"], # Platform SDK
+ ]
+ build_releases = [mm.LEGACY_BUILD_RELEASE]
+ self.produce_dist(modules, build_releases)
+
+ # pylint: disable=line-too-long
+ self.assertEqual(
+ [
+ # Legacy copy of the snapshots.
+ "mainline-sdks/current/com.android.art/host-exports/art-module-host-exports-current.zip",
+ "mainline-sdks/current/com.android.art/sdk/art-module-sdk-current.zip",
+ "mainline-sdks/current/com.android.art/test-exports/art-module-test-exports-current.zip",
+ # Legacy stubs directory containing unpacked java_sdk_library artifacts.
+ "stubs/com.android.art/sdk_library/public/art-removed.txt",
+ "stubs/com.android.art/sdk_library/public/art-stubs.jar",
+ "stubs/com.android.art/sdk_library/public/art.srcjar",
+ "stubs/com.android.art/sdk_library/public/art.txt",
+ ],
+ sorted(self.list_files_in_dir(self.tmp_dist_dir)))
+
def path_to_test_data(relative_path):
"""Construct a path to a test data file.
@@ -290,15 +361,30 @@ class TestSoongConfigBoilerplateInserter(unittest.TestCase):
class TestFilterModules(unittest.TestCase):
def test_no_filter(self):
- modules = mm.filter_modules(mm.MAINLINE_MODULES)
- self.assertEqual(modules, mm.MAINLINE_MODULES)
+ all_modules = mm.MAINLINE_MODULES + mm.BUNDLED_MAINLINE_MODULES
+ modules = mm.filter_modules(all_modules, None)
+ self.assertEqual(modules, all_modules)
def test_with_filter(self):
- os.environ["TARGET_BUILD_APPS"] = "com.android.art"
- modules = mm.filter_modules(mm.MAINLINE_MODULES)
+ modules = mm.filter_modules(mm.MAINLINE_MODULES, "com.android.art")
expected = MAINLINE_MODULES_BY_APEX["com.android.art"]
self.assertEqual(modules, [expected])
+class TestModuleProperties(unittest.TestCase):
+
+ def test_unbundled(self):
+ for module in mm.MAINLINE_MODULES:
+ with self.subTest(module=module):
+ self.assertFalse(module.is_bundled())
+
+ def test_bundled(self):
+ for module in (mm.BUNDLED_MAINLINE_MODULES +
+ mm.PLATFORM_SDKS_FOR_MAINLINE):
+ with self.subTest(module=module):
+ self.assertTrue(module.is_bundled())
+ self.assertEqual(module.first_release, mm.LATEST)
+
+
if __name__ == "__main__":
unittest.main(verbosity=2)