aboutsummaryrefslogtreecommitdiff
path: root/build/mainline_modules_sdks_test.py
diff options
context:
space:
mode:
authorsatayev <satayev@google.com>2021-11-04 14:48:39 +0000
committersatayev <satayev@google.com>2021-11-04 14:48:39 +0000
commit51133ffa60f5f8018f9ea9ce4d611effc11266ad (patch)
tree9acc697e5705cdd317f6bc1ccca37e80bbc1ec94 /build/mainline_modules_sdks_test.py
parent0e2804463f8f6e2396c259d221e993e60d791725 (diff)
downloadcommon-51133ffa60f5f8018f9ea9ce4d611effc11266ad.tar.gz
Add mainline_modules_sdks to packages/modules/common/.
Change the list of modules to match AOSP list. Bug: 205100626 Test: atest mainline_modules_sdks_test Change-Id: I250c4aafcda5c3c1d636dac27ff5ffaa78b69b2a
Diffstat (limited to 'build/mainline_modules_sdks_test.py')
-rw-r--r--build/mainline_modules_sdks_test.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py
new file mode 100644
index 00000000..8a54ab8e
--- /dev/null
+++ b/build/mainline_modules_sdks_test.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the 'License');
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an 'AS IS' BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# 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
+import unittest
+import zipfile
+
+import mainline_modules_sdks as mm
+
+
+class TestPopulateDist(unittest.TestCase):
+
+ 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")
+ with zipfile.ZipFile(zip_file, "w") as z:
+ z.writestr("Android.bp", "")
+ if name.endswith("-sdk"):
+ z.writestr("sdk_library/public/removed.txt", "")
+ z.writestr("sdk_library/public/source.srcjar", "")
+ z.writestr("sdk_library/public/lib.jar", "")
+ z.writestr("sdk_library/public/api.txt", "")
+
+ 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 = [
+ mm.MAINLINE_MODULES_BY_APEX["com.android.art"],
+ 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")
+
+ producer = mm.SdkDistProducer(
+ out_dir=tmp_out_dir,
+ dist_dir=tmp_dist_dir,
+ )
+
+ sdk_versions = ["current"]
+ producer.populate_dist(sdk_versions, modules)
+
+ files = []
+ for abs_dir, _, filenames in os.walk(tmp_dist_dir):
+ rel_dir = os.path.relpath(abs_dir, tmp_dist_dir)
+ for f in filenames:
+ files.append(os.path.join(rel_dir, f))
+ # pylint: disable=line-too-long
+ self.assertEqual([
+ "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",
+ "stubs/com.android.art/sdk_library/public/api.txt",
+ "stubs/com.android.art/sdk_library/public/lib.jar",
+ "stubs/com.android.art/sdk_library/public/removed.txt",
+ "stubs/com.android.art/sdk_library/public/source.srcjar",
+ "stubs/com.android.ipsec/sdk_library/public/api.txt",
+ "stubs/com.android.ipsec/sdk_library/public/lib.jar",
+ "stubs/com.android.ipsec/sdk_library/public/removed.txt",
+ "stubs/com.android.ipsec/sdk_library/public/source.srcjar",
+ ], sorted(files))
+
+
+def pathToTestData(relative_path):
+ """Construct a path to a test data file.
+
+ The relative_path is relative to the location of this file.
+ """
+ this_file = __file__
+ # When running as a python_test_host (name=<x>) with an embedded launcher
+ # the __file__ points to .../<x>/<x>.py but the .../<x> is not a directory
+ # it is a binary with the launcher and the python file embedded inside. In
+ # that case a test data file <rel> is at .../<x>_data/<rel>, not
+ # .../<x>/<x>_data/<rel> so it is necessary to trim the base name (<x>.py)
+ # from the file.
+ if not os.path.isfile(this_file):
+ this_file = os.path.dirname(this_file)
+ # When the python file is at .../<x>.py (or in the case of an embedded
+ # launcher at .../<x>/<x>.py) then the test data is at .../<x>_data/<rel>.
+ this_file_without_ext, _ = os.path.splitext(this_file)
+ return os.path.join(this_file_without_ext + "_data", relative_path)
+
+
+def readTestData(relative_path):
+ with open(pathToTestData(relative_path), "r") as f:
+ return f.read()
+
+
+class TestSoongConfigBoilerplateInserter(unittest.TestCase):
+
+ def apply_transformations(self, src, transformations, expected):
+ producer = mm.SdkDistProducer(script=self._testMethodName)
+
+ with tempfile.TemporaryDirectory() as tmp_dir:
+ path = os.path.join(tmp_dir, "Android.bp")
+ with open(path, "w") as f:
+ f.write(src)
+
+ mm.apply_transformations(producer, tmp_dir, transformations)
+
+ with open(path, "r") as f:
+ result = f.read()
+
+ self.maxDiff = None
+ self.assertEqual(expected, result)
+
+ def test_common_mainline_module(self):
+ """Tests the transformations applied to a common mainline module.
+
+ This uses ipsec as an example of a common mainline module. This checks
+ that the correct Soong config module types and variables are used and
+ that it imports the definitions from the correct location.
+ """
+ src = readTestData("ipsec_Android.bp.input")
+
+ expected = readTestData("ipsec_Android.bp.expected")
+
+ module = mm.MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
+ transformations = module.transformations()
+
+ self.apply_transformations(src, transformations, expected)
+
+ def test_art(self):
+ """Tests the transformations applied to a the ART mainline module.
+
+ The ART mainline module uses a different Soong config setup to the
+ common mainline modules. This checks that the ART specific Soong config
+ module types, variable and imports are used.
+ """
+ src = readTestData("art_Android.bp.input")
+
+ expected = readTestData("art_Android.bp.expected")
+
+ module = mm.MAINLINE_MODULES_BY_APEX["com.android.art"]
+ transformations = module.transformations()
+
+ self.apply_transformations(src, transformations, expected)
+
+
+if __name__ == "__main__":
+ unittest.main(verbosity=2)