3131import re
3232import sys
3333
34- from test .framework .utilities import EnhancedTestCase , TestLoaderFiltered
34+ from test .framework .utilities import EnhancedTestCase , TestLoaderFiltered , init_config
3535from unittest import TextTestRunner
3636
3737import easybuild .tools .systemtools as st
38+ from easybuild .tools .build_log import EasyBuildError
3839from easybuild .tools .filetools import read_file
3940from easybuild .tools .py2vs3 import string_type
4041from easybuild .tools .run import run_cmd
4142from easybuild .tools .systemtools import CPU_ARCHITECTURES , AARCH32 , AARCH64 , POWER , X86_64
4243from easybuild .tools .systemtools import CPU_FAMILIES , POWER_LE , DARWIN , LINUX , UNKNOWN
4344from easybuild .tools .systemtools import CPU_VENDORS , AMD , APM , ARM , CAVIUM , IBM , INTEL
4445from easybuild .tools .systemtools import MAX_FREQ_FP , PROC_CPUINFO_FP , PROC_MEMINFO_FP
46+ from easybuild .tools .systemtools import check_python_version
4547from easybuild .tools .systemtools import det_parallelism , get_avail_core_count , get_cpu_architecture , get_cpu_family
4648from easybuild .tools .systemtools import get_cpu_features , get_cpu_model , get_cpu_speed , get_cpu_vendor
47- from easybuild .tools .systemtools import get_glibc_version , get_os_type , get_os_name , get_os_version , get_platform_name
48- from easybuild .tools .systemtools import get_shared_lib_ext , get_system_info , get_total_memory , get_gcc_version
49+ from easybuild .tools .systemtools import get_gcc_version , get_glibc_version , get_os_type , get_os_name , get_os_version
50+ from easybuild .tools .systemtools import get_platform_name , get_shared_lib_ext , get_system_info , get_total_memory
4951
5052
5153PROC_CPUINFO_TXT = None
@@ -335,6 +337,7 @@ def setUp(self):
335337 self .orig_run_cmd = st .run_cmd
336338 self .orig_platform_uname = st .platform .uname
337339 self .orig_get_tool_version = st .get_tool_version
340+ self .orig_sys_version_info = st .sys .version_info
338341
339342 def tearDown (self ):
340343 """Cleanup after systemtools test."""
@@ -345,6 +348,7 @@ def tearDown(self):
345348 st .run_cmd = self .orig_run_cmd
346349 st .platform .uname = self .orig_platform_uname
347350 st .get_tool_version = self .orig_get_tool_version
351+ st .sys .version_info = self .orig_sys_version_info
348352 super (SystemToolsTest , self ).tearDown ()
349353
350354 def test_avail_core_count_native (self ):
@@ -767,6 +771,72 @@ def test_det_terminal_size(self):
767771 self .assertTrue (isinstance (height , int ) and height >= 0 )
768772 self .assertTrue (isinstance (width , int ) and width >= 0 )
769773
774+ def test_check_python_version (self ):
775+ """Test check_python_version function."""
776+
777+ init_config (build_options = {'silence_deprecation_warnings' : []})
778+
779+ def mock_python_ver (py_maj_ver , py_min_ver ):
780+ """Helper function to mock a particular Python version."""
781+ st .sys .version_info = (py_maj_ver , py_min_ver ) + sys .version_info [2 :]
782+
783+ # mock running with different Python versions
784+ mock_python_ver (1 , 4 )
785+ error_pattern = r"EasyBuild is not compatible \(yet\) with Python 1.4"
786+ self .assertErrorRegex (EasyBuildError , error_pattern , check_python_version )
787+
788+ mock_python_ver (4 , 0 )
789+ error_pattern = r"EasyBuild is not compatible \(yet\) with Python 4.0"
790+ self .assertErrorRegex (EasyBuildError , error_pattern , check_python_version )
791+
792+ mock_python_ver (2 , 5 )
793+ error_pattern = r"Python 2.6 or higher is required when using Python 2, found Python 2.5"
794+ self .assertErrorRegex (EasyBuildError , error_pattern , check_python_version )
795+
796+ # no problems when running with a supported Python version
797+ for pyver in [(2 , 7 ), (3 , 5 ), (3 , 6 ), (3 , 7 )]:
798+ mock_python_ver (* pyver )
799+ self .assertEqual (check_python_version (), pyver )
800+
801+ mock_python_ver (2 , 6 )
802+ # deprecation warning triggers an error in test environment
803+ error_pattern = r"Running EasyBuild with Python 2.6 is deprecated"
804+ self .assertErrorRegex (EasyBuildError , error_pattern , check_python_version )
805+
806+ # we may trigger a deprecation warning below (when testing with Python 2.6)
807+ py26_depr_warning = "\n WARNING: Deprecated functionality, will no longer work in v5.0: "
808+ py26_depr_warning += "Running EasyBuild with Python 2.6 is deprecated"
809+
810+ self .allow_deprecated_behaviour ()
811+
812+ # first test with mocked Python 2.6
813+ self .mock_stderr (True )
814+ check_python_version ()
815+ stderr = self .get_stderr ()
816+ self .mock_stderr (False )
817+
818+ # we should always get a deprecation warning here
819+ self .assertTrue (stderr .startswith (py26_depr_warning ))
820+
821+ # restore Python version info to check with Python version used to run tests
822+ st .sys .version_info = self .orig_sys_version_info
823+
824+ # shouldn't raise any errors, since Python version used to run tests should be supported;
825+ self .mock_stderr (True )
826+ (py_maj_ver , py_min_ver ) = check_python_version ()
827+ stderr = self .get_stderr ()
828+ self .mock_stderr (False )
829+
830+ self .assertTrue (py_maj_ver in [2 , 3 ])
831+ if py_maj_ver == 2 :
832+ self .assertTrue (py_min_ver in [6 , 7 ])
833+ else :
834+ self .assertTrue (py_min_ver >= 5 )
835+
836+ # only deprecation warning when actually testing with Python 2.6
837+ if sys .version_info [:2 ] == (2 , 6 ):
838+ self .assertTrue (stderr .startswith (py26_depr_warning ))
839+
770840
771841def suite ():
772842 """ returns all the testcases in this module """
0 commit comments