Tests: use explicit Python to run unit tests
authorSybren A. Stüvel <sybren@blender.org>
Fri, 10 Apr 2020 08:35:17 +0000 (10:35 +0200)
committerSybren A. Stüvel <sybren@blender.org>
Fri, 24 Apr 2020 15:10:22 +0000 (17:10 +0200)
CentOS on the buildbot still runs Python 3.6, which is also used for the
unit tests. This means that the tests can't use language features that
are available to Blender itself. And testing with a different version of
Python than will be used by the actual code seems like a bad idea to me.

This commit adds `TEST_PYTHON_EXECUTABLE` as advanced CMake option. This
will allow us to set a specific Python executable when we need it. When
not set, a platform-specific default will be used:

- On Windows, the `python….exe` from the installation directory. This is
  just like before this patch, except that this patch adds the
  overridability.
- On macOS/Linux, the `${PYTHON_EXECUTABLE}` as found by CMake.

Every platform should now have a value (configured by the user or
detected by CMake) for `TEST_PYTHON_EXE`, so there is no need to allow
running without. This also removes the need to have some Python files
marked as executable.

If `TEST_PYTHON_EXE` is not user-configured, and thus the above default
is used, a status message is logged by CMake. I've seen this a lot in
other projects, and I like that it shows which values are auto-detected.
However, it's not common in Blender, so if we want we can either remove
it now, or remove it after the buildbot has been set up correctly.

Differential Revision: https://developer.blender.org/D7395

Reviewed by: campbellbarton, mont29, sergey

CMakeLists.txt
tests/CMakeLists.txt
tests/python/CMakeLists.txt
tests/python/alembic_tests.py [changed mode: 0755->0644]
tests/python/cycles_render_tests.py [changed mode: 0755->0644]
tests/python/eevee_render_tests.py [changed mode: 0755->0644]
tests/python/ffmpeg_tests.py [changed mode: 0755->0644]
tests/python/opengl_draw_tests.py [changed mode: 0755->0644]
tests/python/workbench_render_tests.py [changed mode: 0755->0644]

index b6b271c80853a1e3a621a1aea8d037e7f268a75f..521dfdf4f02dddc760304f237a3779dc27b4d45c 100644 (file)
@@ -433,6 +433,8 @@ endif()
 option(WITH_GTESTS "Enable GTest unit testing" OFF)
 option(WITH_OPENGL_RENDER_TESTS "Enable OpenGL render related unit testing (Experimental)" OFF)
 option(WITH_OPENGL_DRAW_TESTS "Enable OpenGL UI drawing related unit testing (Experimental)" OFF)
+set(TEST_PYTHON_EXE "" CACHE PATH "Python executable to run unit tests")
+mark_as_advanced(TEST_PYTHON_EXE)
 
 # Documentation
 if(UNIX AND NOT APPLE)
index 94b6e49181c1c0b7e79ad03a3c8959bcc657d8fd..a3d4b2a501e49322356a43863bd2945d39891db2 100644 (file)
@@ -14,15 +14,27 @@ endif()
 # Path to Blender and Python executables for all platforms.
 if(MSVC)
   set(TEST_BLENDER_EXE ${TEST_INSTALL_DIR}/blender.exe)
-  set(TEST_PYTHON_EXE "${TEST_INSTALL_DIR}/${BLENDER_VERSION_MAJOR}.${BLENDER_VERSION_MINOR}/python/bin/python$<$<CONFIG:Debug>:_d>")
+  set(_default_test_python_exe "${TEST_INSTALL_DIR}/${BLENDER_VERSION_MAJOR}.${BLENDER_VERSION_MINOR}/python/bin/python$<$<CONFIG:Debug>:_d>")
 elseif(APPLE)
   set(TEST_BLENDER_EXE ${TEST_INSTALL_DIR}/Blender.app/Contents/MacOS/Blender)
-  set(TEST_PYTHON_EXE)
+  set(_default_test_python_exe ${PYTHON_EXECUTABLE})
 else()
   set(TEST_BLENDER_EXE ${TEST_INSTALL_DIR}/blender)
-  set(TEST_PYTHON_EXE)
+  set(_default_test_python_exe ${PYTHON_EXECUTABLE})
 endif()
 
+# The installation directory's Python is the best one to use. However, it can only be there after the install step,
+# which means that Python will never be there on a fresh system. To suit different needs, the user can pass
+# -DTEST_PYTHON_EXE=/path/to/python to CMake.
+if (NOT TEST_PYTHON_EXE)
+  set(TEST_PYTHON_EXE ${_default_test_python_exe})
+  message(STATUS "Tests: Using Python executable: ${TEST_PYTHON_EXE}")
+elseif(NOT EXISTS ${TEST_PYTHON_EXE})
+  message(FATAL_ERROR "Tests: TEST_PYTHON_EXE ${TEST_PYTHON_EXE} does not exist")
+endif()
+unset(_default_test_python_exe)
+
+
 # For testing with Valgrind
 # set(TEST_BLENDER_EXE valgrind --track-origins=yes --error-limit=no ${TEST_BLENDER_EXE})
 
index db5d5dcf73b58655c3575e71568cb8714f442a6d..753bc7c5b917660b53c71d835f0dd74a718a7072 100644 (file)
@@ -48,18 +48,14 @@ endfunction()
 
 # Run Python script outside Blender.
 function(add_python_test testname testscript)
-  if(MSVC)
-    add_test(
-      NAME ${testname}
-      COMMAND ${TEST_PYTHON_EXE} ${testscript} ${ARGN}
-    )
-  else()
-    add_test(
-      NAME ${testname}
-      COMMAND ${testscript} ${ARGN}
-    )
+  if(NOT TEST_PYTHON_EXE)
+    message(FATAL_ERROR "No Python configured for running tests, set TEST_PYTHON_EXE.")
   endif()
 
+  add_test(
+    NAME ${testname}
+    COMMAND ${TEST_PYTHON_EXE} ${testscript} ${ARGN}
+  )
   set_tests_properties(${testname} PROPERTIES ENVIRONMENT LSAN_OPTIONS=exitcode=0)
 endfunction()
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)