Merge pull request #2699 from soltanmm/coverage

Test coverage for Python.
pull/2680/merge
Nathaniel Manista 9 years ago
commit fd292c5721
  1. 3
      .gitignore
  2. 2
      src/python/grpcio/.gitignore
  3. 1
      src/python/grpcio/MANIFEST.in
  4. 0
      src/python/grpcio/requirements.txt
  5. 4
      src/python/grpcio/setup.py
  6. 10
      src/python/grpcio_test/.gitignore
  7. 4
      src/python/grpcio_test/MANIFEST.in
  8. 57
      src/python/grpcio_test/commands.py
  9. 5
      src/python/grpcio_test/requirements.txt
  10. 3
      src/python/grpcio_test/setup.cfg
  11. 30
      src/python/grpcio_test/setup.py
  12. 21
      tools/run_tests/build_python.sh
  13. 122
      tools/run_tests/python_tests.json
  14. 9
      tools/run_tests/run_python.sh
  15. 40
      tools/run_tests/run_tests.py

3
.gitignore vendored

@ -33,3 +33,6 @@ coverage
# Makefile's cache
cache.mk
# Temporary test reports
report.xml

@ -1,5 +1,5 @@
MANIFEST
grpcio.egg-info/
*.egg-info/
build/
dist/
*.egg

@ -1,2 +1,3 @@
graft grpc
include commands.py
include requirements.txt

@ -89,7 +89,7 @@ _PACKAGE_DIRECTORIES = {
_INSTALL_REQUIRES = (
'enum34==1.0.4',
'futures==2.2.0',
'protobuf==3.0.0a3'
'protobuf==3.0.0a3',
)
_SETUP_REQUIRES = (
@ -97,7 +97,7 @@ _SETUP_REQUIRES = (
) + _INSTALL_REQUIRES
_COMMAND_CLASS = {
'doc': commands.SphinxDocumentation
'doc': commands.SphinxDocumentation,
}
setuptools.setup(

@ -0,0 +1,10 @@
MANIFEST
*.egg-info/
build/
dist/
*.egg
*.egg/
*.eggs/
.coverage
.coverage.*
nosetests.xml

@ -0,0 +1,4 @@
graft grpc_interop
graft grpc_test
include commands.py
include requirements.txt

@ -0,0 +1,57 @@
# Copyright 2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""Provides distutils command classes for the GRPC Python test setup process."""
import os
import os.path
import sys
import setuptools
class RunTests(setuptools.Command):
"""Command to run all tests via py.test."""
description = ''
user_options = [('pytest-args=', 'a', 'arguments to pass to py.test')]
def initialize_options(self):
self.pytest_args = []
def finalize_options(self):
pass
def run(self):
# We import here to ensure that setup.py has had a chance to install the
# relevant package eggs first.
import pytest
result = pytest.main(self.pytest_args)
if result != 0:
raise SystemExit(result)

@ -0,0 +1,5 @@
pytest>=2.6
pytest-cov>=2.0
pytest-xdist>=1.11
oauth2client>=1.4.7
grpcio>=0.10.0a0

@ -0,0 +1,3 @@
[pytest]
norecursedirs = _cython
python_files = *_test.py

@ -29,8 +29,17 @@
"""A setup module for the GRPC Python interop testing package."""
import os
import os.path
import setuptools
# Ensure we're in the proper directory whether or not we're being used by pip.
os.chdir(os.path.dirname(os.path.abspath(__file__)))
# Break import-style to ensure we can actually find our commands module.
import commands
_PACKAGES = setuptools.find_packages('.', exclude=['*._cython', '*._cython.*'])
_PACKAGE_DIRECTORIES = {
@ -43,13 +52,28 @@ _PACKAGE_DATA = {
'credentials/server1.pem',]
}
_INSTALL_REQUIRES = ['oauth2client>=1.4.7', 'grpcio>=0.10.0a0']
_SETUP_REQUIRES = (
'pytest>=2.6',
'pytest-cov>=2.0',
'pytest-xdist>=1.11',
)
_INSTALL_REQUIRES = (
'oauth2client>=1.4.7',
'grpcio>=0.10.0a0',
)
_COMMAND_CLASS = {
'test': commands.RunTests
}
setuptools.setup(
name='grpcio_test',
version='0.0.1',
version='0.10.0a0',
packages=_PACKAGES,
package_dir=_PACKAGE_DIRECTORIES,
package_data=_PACKAGE_DATA,
install_requires=_INSTALL_REQUIRES
install_requires=_INSTALL_REQUIRES + _SETUP_REQUIRES,
setup_requires=_SETUP_REQUIRES,
cmdclass=_COMMAND_CLASS
)

@ -33,7 +33,9 @@ set -ex
# change to grpc repo root
cd $(dirname $0)/../..
root=`pwd`
ROOT=`pwd`
GRPCIO=$ROOT/src/python/grpcio
GRPCIO_TEST=$ROOT/src/python/grpcio_test
make_virtualenv() {
virtualenv_name="python"$1"_virtual_environment"
@ -42,9 +44,16 @@ make_virtualenv() {
# Build the entire virtual environment
virtualenv -p `which "python"$1` $virtualenv_name
source $virtualenv_name/bin/activate
pip install -r src/python/requirements.txt
CFLAGS="-I$root/include -std=c89" LDFLAGS=-L$root/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install src/python/grpcio
pip install src/python/grpcio_test
# Install grpcio
cd $GRPCIO
pip install -r requirements.txt
CFLAGS="-I$ROOT/include -std=c89" LDFLAGS=-L$ROOT/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install $GRPCIO
# Install grpcio_test
cd $GRPCIO_TEST
pip install -r requirements.txt
pip install $GRPCIO_TEST
else
source $virtualenv_name/bin/activate
# Uninstall and re-install the packages we care about. Don't use
@ -53,12 +62,12 @@ make_virtualenv() {
# dependency upgrades.
(yes | pip uninstall grpcio) || true
(yes | pip uninstall grpcio_test) || true
(CFLAGS="-I$root/include -std=c89" LDFLAGS=-L$root/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install src/python/grpcio) || (
(CFLAGS="-I$ROOT/include -std=c89" LDFLAGS=-L$ROOT/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install $GRPCIO) || (
# Fall back to rebuilding the entire environment
rm -rf $virtualenv_name
make_virtualenv $1
)
pip install src/python/grpcio_test
pip install $GRPCIO_TEST
fi
}

@ -1,122 +0,0 @@
[
{
"module": "grpc_test._adapter._c_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._low_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._intermediary_low_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._links_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._lonely_rear_link_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._blocking_invocation_inline_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._event_invocation_synchronous_event_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._adapter._future_invocation_asynchronous_event_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._links._lonely_invocation_link_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test._links._transmission_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.early_adopter.implementations_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.base.implementations_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.face.blocking_invocation_inline_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.face.event_invocation_synchronous_event_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.face.future_invocation_asynchronous_event_service_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.foundation._later_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_test.framework.foundation._logging_pool_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_interop._insecure_interop_test",
"pythonVersions": [
"2.7"
]
},
{
"module": "grpc_interop._secure_interop_test",
"pythonVersions": [
"2.7"
]
},
{
"file": "test/compiler/python_plugin_test.py",
"pythonVersions": [
"2.7"
]
}
]

@ -33,8 +33,9 @@ set -ex
# change to grpc repo root
cd $(dirname $0)/../..
root=`pwd`
export LD_LIBRARY_PATH=$root/libs/$CONFIG
export DYLD_LIBRARY_PATH=$root/libs/$CONFIG
ROOT=`pwd`
GRPCIO_TEST=$ROOT/src/python/grpcio_test
export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG
export DYLD_LIBRARY_PATH=$ROOT/libs/$CONFIG
source "python"$PYVER"_virtual_environment"/bin/activate
"python"$PYVER -B $*
"python"$PYVER $GRPCIO_TEST/setup.py test -a "-n8 --cov=grpc --junitxml=./report.xml"

@ -187,40 +187,18 @@ class PhpLanguage(object):
class PythonLanguage(object):
def __init__(self):
with open('tools/run_tests/python_tests.json') as f:
self._tests = json.load(f)
self._build_python_versions = set([
python_version
for test in self._tests
for python_version in test['pythonVersions']])
self._build_python_versions = ['2.7']
self._has_python_versions = []
def test_specs(self, config, travis):
job_specifications = []
for test in self._tests:
command = None
short_name = None
if 'module' in test:
command = ['tools/run_tests/run_python.sh', '-m', test['module']]
short_name = test['module']
elif 'file' in test:
command = ['tools/run_tests/run_python.sh', test['file']]
short_name = test['file']
else:
raise ValueError('expected input to be a module or file to run '
'unittests from')
for python_version in test['pythonVersions']:
if python_version in self._has_python_versions:
environment = dict(_FORCE_ENVIRON_FOR_WRAPPERS)
environment['PYVER'] = python_version
job_specifications.append(config.job_spec(
command, None, environ=environment, shortname=short_name))
else:
jobset.message(
'WARNING',
'Could not find Python {}; skipping test'.format(python_version),
'{}\n'.format(command), do_newline=True)
return job_specifications
environment = dict(_FORCE_ENVIRON_FOR_WRAPPERS)
environment['PYVER'] = '2.7'
return [config.job_spec(
['tools/run_tests/run_python.sh'],
None,
environ=environment,
shortname='py.test',
)]
def make_targets(self):
return ['static_c', 'grpc_python_plugin', 'shared_c']

Loading…
Cancel
Save