unit_test_generate_android_project.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import json
  9. import os
  10. import pytest
  11. import platform
  12. import subprocess
  13. import sys
  14. from packaging.version import Version
  15. ROOT_DEV_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..'))
  16. if ROOT_DEV_PATH not in sys.path:
  17. sys.path.append(ROOT_DEV_PATH)
  18. from cmake.Tools import common
  19. from cmake.Tools.Platform.Android import android_support, generate_android_project
  20. @pytest.mark.parametrize(
  21. "from_override, version_str, expected_result", [
  22. pytest.param(False, b"Gradle 4.10.1", Version('4.10.1'), id='equalMinVersion'),
  23. pytest.param(False, b"Gradle 5.6.4", Version('5.6.4'), id='equalMaxVersion'),
  24. pytest.param(False, b"Gradle 1.0", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR), id='lessThanMinVersion'),
  25. pytest.param(False, b"Gradle 26.3", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR), id='greaterThanMaxVersion'),
  26. pytest.param(True, b"Gradle 4.10.1", Version('4.10.1')),
  27. pytest.param(True, b"Gradle 5.6.4", Version('5.6.4')),
  28. pytest.param(True, b"Gradle 1.0", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR)),
  29. pytest.param(True, b"Gradle 26.3", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR))
  30. ]
  31. )
  32. def test_verify_gradle(tmpdir, from_override, version_str, expected_result):
  33. orig_check_output = subprocess.check_output
  34. if from_override:
  35. gradle_script = 'gradle.bat' if platform.system() == 'Windows' else 'gradle'
  36. tmpdir.ensure(f'gradle/bin/{gradle_script}')
  37. override_gradle_install_path = str(tmpdir.join('gradle').realpath())
  38. else:
  39. override_gradle_install_path = None
  40. def _mock_check_output(args, shell):
  41. assert args
  42. assert shell == (platform.system() == 'Windows')
  43. if from_override:
  44. assert args[0] == os.path.normpath(f'{override_gradle_install_path}/bin/{gradle_script}')
  45. assert args[1] == '-v'
  46. return version_str
  47. subprocess.check_output = _mock_check_output
  48. try:
  49. result_version, result_override_path = generate_android_project.verify_gradle(override_gradle_install_path)
  50. assert isinstance(expected_result, Version)
  51. assert result_version == expected_result
  52. if from_override:
  53. assert os.path.normpath(result_override_path) == os.path.normpath(os.path.join(override_gradle_install_path, 'bin', gradle_script))
  54. else:
  55. assert result_override_path is None
  56. except common.LmbrCmdError:
  57. assert isinstance(expected_result, common.LmbrCmdError)
  58. except Exception as e:
  59. pass
  60. finally:
  61. subprocess.check_output = orig_check_output
  62. @pytest.mark.parametrize(
  63. "from_override, version_str, expected_result", [
  64. pytest.param(False, f"cmake version {generate_android_project.CMAKE_MIN_VERSION}\nKit Ware", generate_android_project.CMAKE_MIN_VERSION, id='equalMinVersion'),
  65. pytest.param(False, "cmake version 4.0.0\nKit Ware", Version('4.0.0'), id='greaterThanMinVersion'),
  66. pytest.param(False, "cmake version 1.0.0\nKit Ware", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR), id='lessThanMinVersion'),
  67. pytest.param(True, f"cmake version {generate_android_project.CMAKE_MIN_VERSION}\nKit Ware", generate_android_project.CMAKE_MIN_VERSION, id='override_equalMinVersion'),
  68. pytest.param(True, "cmake version 4.0.0\nKit Ware", Version('4.0.0'), id='override_greaterThanMinVersion'),
  69. pytest.param(True, "cmake version 1.0.0\nKit Ware", common.LmbrCmdError('error', common.ERROR_CODE_ENVIRONMENT_ERROR), id='override_lessThanMinVersion'),
  70. ]
  71. )
  72. def test_verify_cmake(tmpdir, from_override, version_str, expected_result):
  73. orig_check_output = subprocess.check_output
  74. if from_override:
  75. cmake_exe = 'cmake.exe' if platform.system() == 'Windows' else 'cmake'
  76. tmpdir.ensure(f'cmake/bin/{cmake_exe}')
  77. override_cmake_install_path = str(tmpdir.join('cmake').realpath())
  78. else:
  79. override_cmake_install_path = None
  80. def _mock_check_output(args, shell, stderr):
  81. assert args
  82. assert shell == (platform.system() == 'Windows')
  83. if from_override:
  84. assert args[0] == os.path.normpath(f'{override_cmake_install_path}/bin/{cmake_exe}')
  85. assert args[1] == '--version'
  86. return version_str.encode('utf-8', 'ignore')
  87. subprocess.check_output = _mock_check_output
  88. try:
  89. result_version, result_override_path = generate_android_project.verify_cmake(override_cmake_install_path)
  90. assert isinstance(expected_result, Version)
  91. assert result_version == expected_result
  92. if from_override:
  93. assert os.path.normpath(result_override_path) == os.path.normpath(os.path.join(override_cmake_install_path, 'bin', cmake_exe))
  94. else:
  95. assert result_override_path is None
  96. except common.LmbrCmdError:
  97. assert isinstance(expected_result, common.LmbrCmdError)
  98. finally:
  99. subprocess.check_output = orig_check_output
  100. @pytest.mark.parametrize(
  101. "from_override, version_str, expected_result", [
  102. pytest.param(False, b"1.0.0", Version('1.0.0')),
  103. pytest.param(False, b"1.10.0", Version('1.10.0')),
  104. pytest.param(True, b"1.0.0", Version('1.0.0')),
  105. pytest.param(True, b"1.10.0", Version('1.10.0'))
  106. ]
  107. )
  108. def test_verify_ninja(tmpdir, from_override, version_str, expected_result):
  109. orig_check_output = subprocess.check_output
  110. if from_override:
  111. ninja_exe = 'ninja.exe' if platform.system() == 'Windows' else 'ninja'
  112. tmpdir.ensure(f'ninja/{ninja_exe}')
  113. override_cmake_install_path = str(tmpdir.join('ninja').realpath())
  114. else:
  115. override_cmake_install_path = None
  116. def _mock_check_output(args, shell, stderr):
  117. assert args
  118. assert shell == (platform.system() == 'Windows')
  119. if from_override:
  120. assert args[0] == os.path.normpath(f'{override_cmake_install_path}/{ninja_exe}')
  121. assert args[1] == '--version'
  122. return version_str
  123. subprocess.check_output = _mock_check_output
  124. try:
  125. result_version, result_override_path = generate_android_project.verify_ninja(override_cmake_install_path)
  126. assert isinstance(expected_result, Version)
  127. assert result_version == expected_result
  128. if from_override:
  129. assert os.path.normpath(result_override_path) == os.path.normpath(os.path.join(override_cmake_install_path, ninja_exe))
  130. else:
  131. assert result_override_path is None
  132. except common.LmbrCmdError:
  133. assert isinstance(expected_result, common.LmbrCmdError)
  134. finally:
  135. subprocess.check_output = orig_check_output