diff --git a/src/launchpad/artifacts/android/aab.py b/src/launchpad/artifacts/android/aab.py index 097c2672..ec59c918 100644 --- a/src/launchpad/artifacts/android/aab.py +++ b/src/launchpad/artifacts/android/aab.py @@ -5,6 +5,7 @@ import shutil import tempfile +from functools import partial from pathlib import Path from typing import Callable @@ -101,7 +102,7 @@ def get_primary_apks(self, device_spec: DeviceSpec = DeviceSpec()) -> list[APK]: APK( new_apk_path, self.get_dex_mapping(), - cleanup=lambda: shutil.rmtree(tmp_dir), + cleanup=partial(shutil.rmtree, tmp_dir), ) ) @@ -148,7 +149,8 @@ def get_dex_mapping(self) -> DexMapping | None: dex_mapping_file = dex_mapping_files[0] with open(dex_mapping_file, "rb") as f: dex_mapping_buffer = f.read() - return DexMapping(dex_mapping_buffer) + self._dex_mapping = DexMapping(dex_mapping_buffer) + return self._dex_mapping @sentry_sdk.trace def get_app_icon(self) -> bytes | None: diff --git a/tests/unit/artifacts/android/test_aab.py b/tests/unit/artifacts/android/test_aab.py index 18e3809e..0c768845 100644 --- a/tests/unit/artifacts/android/test_aab.py +++ b/tests/unit/artifacts/android/test_aab.py @@ -42,3 +42,9 @@ def test_get_app_icon_rejects_path_traversal(self, test_aab: AAB) -> None: with patch.object(test_aab, "get_manifest", return_value=malicious_manifest): with pytest.raises(UnsafePathError): test_aab.get_app_icon() + + def test_get_dex_mapping_caches_mapping(self, test_aab: AAB) -> None: + dex_mapping = test_aab.get_dex_mapping() + + assert dex_mapping is not None + assert test_aab.get_dex_mapping() is dex_mapping