diff options
| author | Shyamnath Premnadh <shyamnath.premnadh@qt.io> | 2023-04-03 14:01:09 +0200 |
|---|---|---|
| committer | Shyamnath Premnadh <shyamnath.premnadh@qt.io> | 2023-04-17 16:26:08 +0200 |
| commit | 43d2453a186d9abf30bb2c0799a824f15b163bf2 (patch) | |
| tree | 1b9b5e05d31556a2863938a8894adbede860d89d /sources/pyside6/tests/tools/pyside6-android-deploy | |
| parent | 0e40c7af91df19a2ac20d88b55d4ef4d71845c55 (diff) | |
Android Deployment: tests
Pick-to: 6.5
Task-number: PYSIDE-1612
Change-Id: Icd4a6efc828f2b4843ec40d4766788120ed6789e
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/pyside6/tests/tools/pyside6-android-deploy')
| -rw-r--r-- | sources/pyside6/tests/tools/pyside6-android-deploy/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | sources/pyside6/tests/tools/pyside6-android-deploy/test_pyside6_android_deploy.py | 177 |
2 files changed, 180 insertions, 0 deletions
diff --git a/sources/pyside6/tests/tools/pyside6-android-deploy/CMakeLists.txt b/sources/pyside6/tests/tools/pyside6-android-deploy/CMakeLists.txt new file mode 100644 index 000000000..c32d636ed --- /dev/null +++ b/sources/pyside6/tests/tools/pyside6-android-deploy/CMakeLists.txt @@ -0,0 +1,3 @@ +if(CMAKE_HOST_UNIX) + PYSIDE_TEST(test_pyside6_android_deploy.py) +endif() diff --git a/sources/pyside6/tests/tools/pyside6-android-deploy/test_pyside6_android_deploy.py b/sources/pyside6/tests/tools/pyside6-android-deploy/test_pyside6_android_deploy.py new file mode 100644 index 000000000..5801c6fdc --- /dev/null +++ b/sources/pyside6/tests/tools/pyside6-android-deploy/test_pyside6_android_deploy.py @@ -0,0 +1,177 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import unittest +import tempfile +import shutil +import sys +import os +import importlib +from pathlib import Path +from configparser import ConfigParser +from unittest.mock import patch +from unittest import mock + + +class ConfigFile: + def __init__(self, config_file: Path) -> None: + self.config_file = config_file + self.parser = ConfigParser(comment_prefixes="/", allow_no_value=True) + self.parser.read(self.config_file) + + def get_value(self, section: str, key: str): + return str(self.parser.get(section, key)) + + +class TestPySide6AndroidDeploy(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.pyside_root = Path(__file__).parents[5].resolve() + cls.example_root = cls.pyside_root / "examples" + example_widget_application = cls.example_root / "gui" / "analogclock" + cls.temp_dir = tempfile.mkdtemp() + cls.temp_example = Path( + shutil.copytree(example_widget_application, Path(cls.temp_dir) / "analogclock") + ).resolve() + cls.current_dir = Path.cwd() + cls.pyside_wheel = Path("tmp/PySide6-6.5.0a1-6.5.0-cp37-abi3-android_x86_64.whl") + cls.shiboken_wheel = Path("tmp/shiboken6-6.5.0a1-6.5.0-cp37-abi3-android_x86_64.whl") + cls.ndk_path = Path("tmp/android_sdk/ndk/25.2.9519653") + cls.sdk_path = Path("tmp/android_sdk") + + sys.path.append(str(cls.pyside_root / "sources" / "pyside-tools")) + cls.deploy_lib = importlib.import_module("deploy_lib") + cls.android_deploy = importlib.import_module("android_deploy") + sys.modules["android_deploy"] = cls.android_deploy + + # required for comparing long strings + cls.maxDiff = None + + # print no outputs to stdout + sys.stdout = mock.MagicMock() + + def setUp(self): + os.chdir(self.temp_example) + self.config_file = self.temp_example / "pysidedeploy.spec" + + @patch("android_deploy.extract_and_copy_jar") + @patch("android_deploy.Wheel") + def test_dry_run(self, mock_jar, mock_wheel): + mock_wheel.version = "6.5.0a1" + + # test if dry_run works without errors + self.android_deploy.main(name="android_app", shiboken_wheel=self.shiboken_wheel, + pyside_wheel=self.pyside_wheel, dry_run=True, force=True) + + self.assertEqual(mock_wheel.call_count, 1) + self.assertEqual(mock_jar.call_count, 1) + self.assertFalse(self.config_file.exists()) + + @patch("android_deploy.extract_and_copy_jar") + @patch("android_deploy.Wheel") + def test_config(self, mock_jar, mock_wheel): + ''' + Tests config options from the dynamically created buildozer.spec and pysidedeploy.spec + ''' + mock_wheel.version = "6.5.0a1" + + self.android_deploy.main(name="android_app", shiboken_wheel=self.shiboken_wheel, + pyside_wheel=self.pyside_wheel, init=True, force=True) + + self.assertEqual(mock_wheel.call_count, 1) + self.assertEqual(mock_jar.call_count, 1) + self.assertTrue(self.config_file.exists()) + + # test config file contents + config_obj = ConfigFile(config_file=self.config_file) + self.assertEqual(config_obj.get_value("app", "input_file"), "main.py") + self.assertEqual(config_obj.get_value("python", "android_packages"), + "buildozer==1.5.0,cython==0.29.33") + self.assertEqual(config_obj.get_value("qt", "wheel_pyside"), + str(self.pyside_wheel.resolve())) + self.assertEqual(config_obj.get_value("qt", "wheel_shiboken"), + str(self.shiboken_wheel.resolve())) + self.assertEqual(config_obj.get_value("buildozer", "mode"), "debug") + self.assertEqual(config_obj.get_value("buildozer", "recipe_dir"), + str(self.temp_example / "deployment" / "recipes")) + self.assertEqual(config_obj.get_value("buildozer", "jars_dir"), + str(self.temp_example / "deployment" / "jar" / "PySide6" / "jar")) + self.assertEqual(config_obj.get_value("buildozer", "ndk_path"), "") + self.assertEqual(config_obj.get_value("buildozer", "sdk_path"), "") + self.assertEqual(config_obj.get_value("buildozer", "modules"), "Core,Gui,Widgets") + self.assertEqual(config_obj.get_value("buildozer", "local_libs"), + "plugins_platforms_qtforandroid") + self.assertEqual(config_obj.get_value("buildozer", "arch"), "x86_64") + self.config_file.unlink() + + @patch("android_deploy.extract_and_copy_jar") + @patch("android_deploy.Wheel") + def test_config_with_ndk_sdk(self, mock_jar, mock_wheel): + mock_wheel.version = "6.5.0a1" + + self.android_deploy.main(name="android_app", shiboken_wheel=self.shiboken_wheel, + pyside_wheel=self.pyside_wheel, ndk_path=self.ndk_path, + sdk_path=self.sdk_path, init=True, force=True) + + self.assertEqual(mock_wheel.call_count, 1) + self.assertEqual(mock_jar.call_count, 1) + self.assertTrue(self.config_file.exists()) + + # test config file contents + config_obj = ConfigFile(config_file=self.config_file) + self.assertEqual(config_obj.get_value("buildozer", "ndk_path"), + str(self.ndk_path.resolve())) + self.assertEqual(config_obj.get_value("buildozer", "sdk_path"), + str(self.sdk_path.resolve())) + self.config_file.unlink() + + def test_error_pwd_not_projectdir(self): + os.chdir(self.current_dir) + with self.assertRaises(RuntimeError): + self.android_deploy.main(name="android_app", shiboken_wheel=self.shiboken_wheel, + pyside_wheel=self.pyside_wheel, init=True, force=True) + + def test_error_no_wheels(self): + os.chdir(self.current_dir) + with self.assertRaises(RuntimeError): + self.android_deploy.main(name="android_app", shiboken_wheel=None, + pyside_wheel=self.pyside_wheel, init=True, force=True) + + @patch("android_deploy.extract_and_copy_jar") + @patch("android_deploy.Wheel") + def test_config_with_Qml(self, mock_jar, mock_wheel): + example_qml_application = self.example_root / "quick" / "models" / "stringlistmodel" + temp_qml_example = Path( + shutil.copytree(example_qml_application, Path(self.temp_dir) / "stringlistmodel") + ).resolve() + config_file = temp_qml_example / "pysidedeploy.spec" + (temp_qml_example / "stringlistmodel.py").rename(temp_qml_example / "main.py") + (temp_qml_example / "stringlistmodel.pyproject").unlink() + os.chdir(temp_qml_example) + + mock_wheel.version = "6.5.0a1" + + self.android_deploy.main(name="android_app", shiboken_wheel=self.shiboken_wheel, + pyside_wheel=self.pyside_wheel, init=True, force=True) + + self.assertEqual(mock_wheel.call_count, 1) + self.assertEqual(mock_jar.call_count, 1) + self.assertTrue(config_file.exists()) + + # test config file contents + config_obj = ConfigFile(config_file=config_file) + self.assertEqual(config_obj.get_value("buildozer", "modules"), + "Core,Gui,Widgets,Network,OpenGL,Qml,Quick,QuickControls2") + config_file.unlink() + + def tearDown(self) -> None: + super().tearDown() + os.chdir(self.current_dir) + + @classmethod + def tearDownClass(cls) -> None: + shutil.rmtree(Path(cls.temp_dir)) + + +if __name__ == "__main__": + unittest.main() |
