diff options
author | satayev <satayev@google.com> | 2021-11-04 14:48:39 +0000 |
---|---|---|
committer | satayev <satayev@google.com> | 2021-11-04 14:48:39 +0000 |
commit | 51133ffa60f5f8018f9ea9ce4d611effc11266ad (patch) | |
tree | 9acc697e5705cdd317f6bc1ccca37e80bbc1ec94 /build/mainline_modules_sdks_test.py | |
parent | 0e2804463f8f6e2396c259d221e993e60d791725 (diff) | |
download | common-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.py | 166 |
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) |