Merge pull request #6286 from jtattermusch/runtests_python3_support

Add --compiler python3.4 option to run_tests.py (enable running test using python3)
diff --git a/tools/dockerfile/grpc_interop_python/build_interop.sh b/tools/dockerfile/grpc_interop_python/build_interop.sh
index 6454a4f..f29c59d 100755
--- a/tools/dockerfile/grpc_interop_python/build_interop.sh
+++ b/tools/dockerfile/grpc_interop_python/build_interop.sh
@@ -39,8 +39,4 @@
 
 cd /var/local/git/grpc
 
-make
-
-# build Python interop client and server
-CONFIG=opt ./tools/run_tests/build_python.sh
-
+tools/run_tests/run_tests.py -l python -c opt --build_only
diff --git a/tools/run_tests/build_python.sh b/tools/run_tests/build_python.sh
index 30d1210..594c20b 100755
--- a/tools/run_tests/build_python.sh
+++ b/tools/run_tests/build_python.sh
@@ -33,6 +33,8 @@
 # change to grpc repo root
 cd $(dirname $0)/../..
 
+TOX_PYTHON_ENV="$1"
+
 ROOT=`pwd`
 export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG
 export DYLD_LIBRARY_PATH=$ROOT/libs/$CONFIG
@@ -47,9 +49,9 @@
   export GRPC_PYTHON_ENABLE_CYTHON_TRACING=1
 fi
 
-tox --notest
+tox -e ${TOX_PYTHON_ENV} --notest
 
-$ROOT/.tox/py27/bin/python $ROOT/setup.py build
-$ROOT/.tox/py27/bin/python $ROOT/setup.py build_py
-$ROOT/.tox/py27/bin/python $ROOT/setup.py build_ext --inplace
-$ROOT/.tox/py27/bin/python $ROOT/setup.py gather --test
+$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build
+$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_py
+$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_ext --inplace
+$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py gather --test
diff --git a/tools/run_tests/run_python.sh b/tools/run_tests/run_python.sh
index a93ef25..7a3ce6b 100755
--- a/tools/run_tests/run_python.sh
+++ b/tools/run_tests/run_python.sh
@@ -33,6 +33,8 @@
 # change to grpc repo root
 cd $(dirname $0)/../..
 
+TOX_PYTHON_ENV="$1"
+
 ROOT=`pwd`
 export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG
 export DYLD_LIBRARY_PATH=$ROOT/libs/$CONFIG
@@ -45,9 +47,9 @@
 if [ "$CONFIG" = "gcov" ]
 then
   export GRPC_PYTHON_ENABLE_CYTHON_TRACING=1
-  tox
+  tox -e ${TOX_PYTHON_ENV}
 else
-  $ROOT/.tox/py27/bin/python $ROOT/setup.py test_lite
+  $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py test_lite
 fi
 
 mkdir -p $ROOT/reports
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 4b98985..dea481e 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -356,25 +356,20 @@
 
 class PythonLanguage(object):
 
-  def __init__(self):
-    self._build_python_versions = ['2.7']
-    self._has_python_versions = []
-
   def configure(self, config, args):
     self.config = config
     self.args = args
-    _check_compiler(self.args.compiler, ['default'])
+    self._tox_env = self._get_tox_env(self.args.compiler)
 
   def test_specs(self):
     # load list of known test suites
     with open('src/python/grpcio/tests/tests.json') as tests_json_file:
       tests_json = json.load(tests_json_file)
     environment = dict(_FORCE_ENVIRON_FOR_WRAPPERS)
-    environment['PYVER'] = '2.7'
     environment['PYTHONPATH'] = os.path.abspath('src/python/gens')
     if self.config.build_config != 'gcov':
       return [self.config.job_spec(
-          ['tools/run_tests/run_python.sh'],
+          ['tools/run_tests/run_python.sh', self._tox_env],
           None,
           environ=dict(environment.items() +
                        [('GRPC_PYTHON_TESTRUNNER_FILTER', suite_name)]),
@@ -399,18 +394,7 @@
     return []
 
   def build_steps(self):
-    commands = []
-    for python_version in self._build_python_versions:
-      try:
-        with open(os.devnull, 'w') as output:
-          subprocess.check_call(['which', 'python' + python_version],
-                                stdout=output, stderr=output)
-        commands.append(['tools/run_tests/build_python.sh', python_version])
-        self._has_python_versions.append(python_version)
-      except:
-        jobset.message('WARNING', 'Missing Python ' + python_version,
-                       do_newline=True)
-    return commands
+    return [['tools/run_tests/build_python.sh', self._tox_env]]
 
   def post_tests_steps(self):
     return []
@@ -421,6 +405,15 @@
   def dockerfile_dir(self):
     return 'tools/dockerfile/test/python_jessie_%s' % _docker_arch_suffix(self.args.arch)
 
+  def _get_tox_env(self, compiler):
+    """Returns name of tox environment based on selected compiler."""
+    if compiler == 'python2.7' or compiler == 'default':
+      return 'py27'
+    elif compiler == 'python3.4':
+      return 'py34'
+    else:
+      raise Exception('Compiler %s not supported.' % compiler)
+
   def __str__(self):
     return 'python'
 
@@ -808,7 +801,8 @@
                   choices=['default',
                            'gcc4.4', 'gcc4.9', 'gcc5.3',
                            'clang3.4', 'clang3.6',
-                           'vs2010', 'vs2013', 'vs2015'],
+                           'vs2010', 'vs2013', 'vs2015',
+                           'python2.7', 'python3.4'],
                   default='default',
                   help='Selects compiler to use. Allowed values depend on the platform and language.')
 argp.add_argument('--build_only',
diff --git a/tox.ini b/tox.ini
index a655935..66b74a3 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,7 +1,7 @@
 # GRPC Python tox (test environment) settings
 [tox]
 skipsdist = true
-envlist = py27
+envlist = py27,py34
 
 [testenv]
 setenv =