aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/buildgen/plugins/expand_version.py17
-rwxr-xr-xtools/codegen/core/gen_static_metadata.py4
-rwxr-xr-xtools/codegen/extensions/gen_reflection_proto.sh2
-rwxr-xr-xtools/distrib/check_generated_pb_files.sh3
-rwxr-xr-xtools/distrib/check_include_guards.py2
-rw-r--r--tools/distrib/python/grpcio_tools/setup.py52
-rwxr-xr-xtools/distrib/python/make_grpcio_tools.py79
-rw-r--r--tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile2
-rwxr-xr-xtools/dockerfile/interoptest/grpc_interop_go/build_interop.sh1
-rw-r--r--tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile2
-rw-r--r--tools/dockerfile/test/csharp_coreclr_x64/Dockerfile2
-rw-r--r--tools/dockerfile/test/csharp_jessie_x64/Dockerfile2
-rw-r--r--tools/dockerfile/test/multilang_jessie_x64/Dockerfile2
-rw-r--r--tools/dockerfile/test/python_pyenv_x64/Dockerfile3
-rw-r--r--tools/doxygen/Doxyfile.c++51
-rw-r--r--tools/doxygen/Doxyfile.c++.internal220
-rw-r--r--tools/doxygen/Doxyfile.core2
-rw-r--r--tools/doxygen/Doxyfile.core.internal10
-rwxr-xr-xtools/gce/create_linux_worker.sh3
-rwxr-xr-xtools/gource/gen-all-logs.sh3
-rwxr-xr-xtools/gource/gource.sh2
-rwxr-xr-xtools/gource/make-video.sh2
-rw-r--r--tools/grift/Dockerfile67
-rw-r--r--tools/grift/README.md26
-rw-r--r--tools/grift/grpc_plugins_generator.patch2505
-rwxr-xr-xtools/jenkins/run_interop.sh2
-rw-r--r--tools/run_tests/artifact_targets.py70
-rw-r--r--tools/run_tests/build_artifact_python.bat28
-rwxr-xr-xtools/run_tests/build_artifact_python.sh36
-rwxr-xr-xtools/run_tests/build_csharp_coreclr.sh2
-rwxr-xr-xtools/run_tests/build_package_node.sh6
-rwxr-xr-xtools/run_tests/build_python.sh1
-rw-r--r--tools/run_tests/build_stats_schema.json56
-rw-r--r--tools/run_tests/build_stats_schema_no_matrix.json44
-rw-r--r--tools/run_tests/package_targets.py9
-rwxr-xr-xtools/run_tests/run_build_statistics.py204
-rwxr-xr-xtools/run_tests/run_interop_tests.py2
-rwxr-xr-xtools/run_tests/run_tests.py110
-rwxr-xr-xtools/run_tests/sanity/check_submodules.sh3
-rw-r--r--tools/run_tests/sources_and_headers.json146
-rw-r--r--tools/run_tests/tests.json672
41 files changed, 4203 insertions, 252 deletions
diff --git a/tools/buildgen/plugins/expand_version.py b/tools/buildgen/plugins/expand_version.py
index c6cc5621c9..6098cca59c 100755
--- a/tools/buildgen/plugins/expand_version.py
+++ b/tools/buildgen/plugins/expand_version.py
@@ -85,10 +85,21 @@ class Version:
return '%d.%d.%d' % (self.major, self.minor, self.patch)
def php(self):
- """Version string in PHP style"""
- """PECL does not allow tag in version string"""
- return '%d.%d.%d' % (self.major, self.minor, self.patch)
+ """Version string for PHP PECL package"""
+ s = '%d.%d.%d' % (self.major, self.minor, self.patch)
+ if self.tag:
+ if self.tag == 'dev':
+ s += 'dev'
+ elif len(self.tag) >= 3 and self.tag[0:3] == 'pre':
+ s += 'RC%d' % int(self.tag[3:])
+ else:
+ raise Exception('Don\'t know how to translate version tag "%s" to PECL version' % self.tag)
+ return s
+ def php_composer(self):
+ """Version string for PHP Composer package"""
+ return '%d.%d.%d' % (self.major, self.minor, self.patch)
+
def mako_plugin(dictionary):
"""Expand version numbers:
- for each language, ensure there's a language_version tag in
diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py
index c3c04966df..859adcbeb1 100755
--- a/tools/codegen/core/gen_static_metadata.py
+++ b/tools/codegen/core/gen_static_metadata.py
@@ -50,8 +50,8 @@ CONFIG = [
'host',
'grpc-message',
'grpc-status',
- 'census-bin',
- 'census-binary-bin',
+ 'grpc-tracing-bin',
+ 'grpc-census-bin',
'',
('grpc-status', '0'),
('grpc-status', '1'),
diff --git a/tools/codegen/extensions/gen_reflection_proto.sh b/tools/codegen/extensions/gen_reflection_proto.sh
index 45a1a9f4ec..bd8aac6a7b 100755
--- a/tools/codegen/extensions/gen_reflection_proto.sh
+++ b/tools/codegen/extensions/gen_reflection_proto.sh
@@ -36,7 +36,7 @@ SRC_DIR="src/cpp/ext"
INCLUDE_DIR="grpc++/ext"
TMP_DIR="tmp"
GRPC_PLUGIN="bins/opt/grpc_cpp_plugin"
-PROTOC=third_party/protobuf/src/protoc
+PROTOC="bins/opt/protobuf/protoc"
set -e
diff --git a/tools/distrib/check_generated_pb_files.sh b/tools/distrib/check_generated_pb_files.sh
index 557067883c..6b93895484 100755
--- a/tools/distrib/check_generated_pb_files.sh
+++ b/tools/distrib/check_generated_pb_files.sh
@@ -38,3 +38,6 @@ docker build -t grpc_check_generated_pb_files tools/dockerfile/grpc_check_genera
# run check_pb_files against the checked out codebase
docker run -e TEST=$TEST --rm=true -v ${HOST_GIT_ROOT:-`pwd`}:/var/local/jenkins/grpc -t grpc_check_generated_pb_files /var/local/jenkins/grpc/tools/dockerfile/grpc_check_generated_pb_files/check_pb_files.sh
+
+# If the test fails, please make sure your protobuf submodule is up-to-date and run
+# tools/codegen/extensions/gen_reflection_proto.sh to update the generated files.
diff --git a/tools/distrib/check_include_guards.py b/tools/distrib/check_include_guards.py
index 56b2924a1a..28312813f6 100755
--- a/tools/distrib/check_include_guards.py
+++ b/tools/distrib/check_include_guards.py
@@ -200,6 +200,6 @@ validator = GuardValidator()
for filename in filename_list:
if filename in KNOWN_BAD: continue
- ok = validator.check(filename, args.fix)
+ ok = ok and validator.check(filename, args.fix)
sys.exit(0 if ok else 1)
diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py
index bb1f1cf085..a07a586fb2 100644
--- a/tools/distrib/python/grpcio_tools/setup.py
+++ b/tools/distrib/python/grpcio_tools/setup.py
@@ -27,6 +27,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+from distutils import cygwinccompiler
from distutils import extension
from distutils import util
import errno
@@ -68,26 +69,35 @@ BUILD_WITH_CYTHON = os.environ.get('GRPC_PYTHON_BUILD_WITH_CYTHON', False)
EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None)
EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None)
if EXTRA_ENV_COMPILE_ARGS is None:
- EXTRA_ENV_COMPILE_ARGS = '-fno-wrapv -frtti -std=c++11'
+ EXTRA_ENV_COMPILE_ARGS = '-std=c++11'
if 'win32' in sys.platform:
- # We use define flags here and don't directly add to DEFINE_MACROS below to
- # ensure that the expert user/builder has a way of turning it off (via the
- # envvars) without adding yet more GRPC-specific envvars.
- # See https://sourceforge.net/p/mingw-w64/bugs/363/
- if '32' in platform.architecture()[0]:
- EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s'
+ if sys.version_info < (3, 5):
+ # We use define flags here and don't directly add to DEFINE_MACROS below to
+ # ensure that the expert user/builder has a way of turning it off (via the
+ # envvars) without adding yet more GRPC-specific envvars.
+ # See https://sourceforge.net/p/mingw-w64/bugs/363/
+ if '32' in platform.architecture()[0]:
+ EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s'
+ else:
+ EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64'
else:
- EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64'
+ # We need to statically link the C++ Runtime, only the C runtime is
+ # available dynamically
+ EXTRA_ENV_COMPILE_ARGS += ' /MT'
+ elif "linux" in sys.platform or "darwin" in sys.platform:
+ EXTRA_ENV_COMPILE_ARGS += ' -fno-wrapv -frtti'
if EXTRA_ENV_LINK_ARGS is None:
- EXTRA_ENV_LINK_ARGS = '-lpthread'
- if 'win32' in sys.platform:
- # TODO(atash) check if this is actually safe to just import and call on
- # non-Windows (to avoid breaking import style)
- from distutils.cygwinccompiler import get_msvcr
- msvcr = get_msvcr()[0]
+ EXTRA_ENV_LINK_ARGS = ''
+ if "linux" in sys.platform or "darwin" in sys.platform:
+ EXTRA_ENV_LINK_ARGS += ' -lpthread'
+ elif "win32" in sys.platform and sys.version_info < (3, 5):
+ msvcr = cygwinccompiler.get_msvcr()[0]
+ # TODO(atash) sift through the GCC specs to see if libstdc++ can have any
+ # influence on the linkage outcome on MinGW for non-C++ programs.
EXTRA_ENV_LINK_ARGS += (
' -static-libgcc -static-libstdc++ -mcrtdll={msvcr} '
'-static'.format(msvcr=msvcr))
+
EXTRA_COMPILE_ARGS = shlex.split(EXTRA_ENV_COMPILE_ARGS)
EXTRA_LINK_ARGS = shlex.split(EXTRA_ENV_LINK_ARGS)
@@ -101,9 +111,13 @@ PROTO_INCLUDE = os.path.normpath(protoc_lib_deps.PROTO_INCLUDE)
GRPC_PYTHON_TOOLS_PACKAGE = 'grpc.tools'
GRPC_PYTHON_PROTO_RESOURCES_NAME = '_proto'
-DEFINE_MACROS = (('HAVE_PTHREAD', 1),)
-if "win32" in sys.platform and '64bit' in platform.architecture()[0]:
- DEFINE_MACROS += (('MS_WIN64', 1),)
+DEFINE_MACROS = ()
+if "win32" in sys.platform:
+ DEFINE_MACROS += (('WIN32_LEAN_AND_MEAN', 1),)
+ if '64bit' in platform.architecture()[0]:
+ DEFINE_MACROS += (('MS_WIN64', 1),)
+elif "linux" in sys.platform or "darwin" in sys.platform:
+ DEFINE_MACROS += (('HAVE_PTHREAD', 1),)
# By default, Python3 distutils enforces compatibility of
# c plugins (.so files) with the OSX version Python3 was built with.
@@ -177,8 +191,8 @@ setuptools.setup(
packages=setuptools.find_packages('.'),
namespace_packages=['grpc'],
install_requires=[
- 'protobuf>=3.0.0a3',
- 'grpcio>=0.15.0',
+ 'protobuf>=3.0.0',
+ 'grpcio>={version}'.format(version=grpc_version.VERSION),
],
package_data=package_data(),
)
diff --git a/tools/distrib/python/make_grpcio_tools.py b/tools/distrib/python/make_grpcio_tools.py
index adf58445af..7413928eca 100755
--- a/tools/distrib/python/make_grpcio_tools.py
+++ b/tools/distrib/python/make_grpcio_tools.py
@@ -88,22 +88,23 @@ GRPC_ROOT = os.path.abspath(
os.path.join(os.path.dirname(os.path.abspath(__file__)),
'..', '..', '..'))
-GRPC_PYTHON_ROOT = os.path.join(GRPC_ROOT, 'tools/distrib/python/grpcio_tools')
+GRPC_PYTHON_ROOT = os.path.join(GRPC_ROOT, 'tools', 'distrib',
+ 'python', 'grpcio_tools')
-GRPC_PYTHON_PROTOBUF_RELATIVE_ROOT = 'third_party/protobuf/src'
+GRPC_PYTHON_PROTOBUF_RELATIVE_ROOT = os.path.join('third_party', 'protobuf', 'src')
GRPC_PROTOBUF = os.path.join(GRPC_ROOT, GRPC_PYTHON_PROTOBUF_RELATIVE_ROOT)
-GRPC_PROTOC_PLUGINS = os.path.join(GRPC_ROOT, 'src/compiler')
-GRPC_PYTHON_PROTOBUF = os.path.join(GRPC_PYTHON_ROOT,
- 'third_party/protobuf/src')
-GRPC_PYTHON_PROTOC_PLUGINS = os.path.join(GRPC_PYTHON_ROOT,
- 'grpc_root/src/compiler')
+GRPC_PROTOC_PLUGINS = os.path.join(GRPC_ROOT, 'src', 'compiler')
+GRPC_PYTHON_PROTOBUF = os.path.join(GRPC_PYTHON_ROOT, 'third_party', 'protobuf',
+ 'src')
+GRPC_PYTHON_PROTOC_PLUGINS = os.path.join(GRPC_PYTHON_ROOT, 'grpc_root', 'src',
+ 'compiler')
GRPC_PYTHON_PROTOC_LIB_DEPS = os.path.join(GRPC_PYTHON_ROOT,
'protoc_lib_deps.py')
GRPC_INCLUDE = os.path.join(GRPC_ROOT, 'include')
-GRPC_PYTHON_INCLUDE = os.path.join(GRPC_PYTHON_ROOT, 'grpc_root/include')
+GRPC_PYTHON_INCLUDE = os.path.join(GRPC_PYTHON_ROOT, 'grpc_root', 'include')
-BAZEL_DEPS = os.path.join(GRPC_ROOT, 'tools/distrib/python/bazel_deps.sh')
+BAZEL_DEPS = os.path.join(GRPC_ROOT, 'tools', 'distrib', 'python', 'bazel_deps.sh')
BAZEL_DEPS_PROTOC_LIB_QUERY = '//:protoc_lib'
BAZEL_DEPS_COMMON_PROTOS_QUERY = '//:well_known_protos'
@@ -136,64 +137,6 @@ def long_path(path):
else:
return path
-def atomic_file_copy(src, dst):
- """Based on the lock-free-whack-a-mole algorithm, depending on filesystem
- renaming being atomic. Described at http://stackoverflow.com/a/28090883.
- """
- try:
- if filecmp.cmp(src, dst):
- return
- except:
- pass
- dst_dir = os.path.abspath(os.path.dirname(dst))
- dst_base = os.path.basename(dst)
- this_id = str(uuid.uuid4()).replace('.', '-')
- temporary_file = os.path.join(dst_dir, '{}.{}.tmp'.format(dst_base, this_id))
- mole_file = os.path.join(dst_dir, '{}.{}.mole.tmp'.format(dst_base, this_id))
- mole_pattern = os.path.join(dst_dir, '{}.*.mole.tmp'.format(dst_base))
- src = long_path(src)
- dst = long_path(dst)
- temporary_file = long_path(temporary_file)
- mole_file = long_path(mole_file)
- mole_pattern = long_path(mole_pattern)
- shutil.copy2(src, temporary_file)
- try:
- os.rename(temporary_file, mole_file)
- except:
- print('Error moving temporary file {} to {}'.format(temporary_file, mole_file), file=sys.stderr)
- print('while trying to copy file {} to {}'.format(src, dst), file=sys.stderr)
- raise
- for other_file in glob.glob(mole_pattern):
- other_id = other_file.split('.')[-3]
- if this_id == other_id:
- pass
- elif this_id < other_id:
- try:
- os.remove(other_file)
- except:
- pass
- else:
- try:
- os.remove(mole_file)
- except:
- pass
- this_id = other_id
- mole_file = other_file
- try:
- if filecmp.cmp(src, dst):
- try:
- os.remove(mole_file)
- except:
- pass
- return
- except:
- pass
- try:
- os.rename(mole_file, dst)
- except:
- pass
-
-
def main():
os.chdir(GRPC_ROOT)
@@ -211,7 +154,7 @@ def main():
for relative_file in files:
source_file = os.path.abspath(os.path.join(source_dir, relative_file))
target_file = os.path.abspath(os.path.join(target_dir, relative_file))
- atomic_file_copy(source_file, target_file)
+ shutil.copyfile(source_file, target_file)
try:
protoc_lib_deps_content = get_deps()
diff --git a/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile
index e3d52f0cb5..087cc4e2bb 100644
--- a/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile
+++ b/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile
@@ -95,6 +95,8 @@ RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
nuget \
&& apt-get clean
+RUN nuget update -self
+
# Prepare ccache
RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
RUN ln -s /usr/bin/ccache /usr/local/bin/g++
diff --git a/tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh
index e891549342..1fd088322c 100755
--- a/tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh
+++ b/tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh
@@ -46,6 +46,7 @@ go get github.com/golang/protobuf/proto
go get golang.org/x/net/context
go get golang.org/x/net/trace
go get golang.org/x/oauth2
+go get golang.org/x/oauth2/google
go get google.golang.org/cloud
# Build the interop client and server
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile
index 81e3fdc380..328825392b 100644
--- a/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile
@@ -112,5 +112,7 @@ RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
nuget \
&& apt-get clean
+RUN nuget update -self
+
# Define the default command.
CMD ["bash"]
diff --git a/tools/dockerfile/test/csharp_coreclr_x64/Dockerfile b/tools/dockerfile/test/csharp_coreclr_x64/Dockerfile
index 25c6fe6ec6..4921815190 100644
--- a/tools/dockerfile/test/csharp_coreclr_x64/Dockerfile
+++ b/tools/dockerfile/test/csharp_coreclr_x64/Dockerfile
@@ -95,6 +95,8 @@ RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
nuget \
&& apt-get clean
+RUN nuget update -self
+
# Install dotnet SDK based on https://www.microsoft.com/net/core#debian
RUN apt-get update && apt-get install -y curl libunwind8 gettext
diff --git a/tools/dockerfile/test/csharp_jessie_x64/Dockerfile b/tools/dockerfile/test/csharp_jessie_x64/Dockerfile
index e3d52f0cb5..087cc4e2bb 100644
--- a/tools/dockerfile/test/csharp_jessie_x64/Dockerfile
+++ b/tools/dockerfile/test/csharp_jessie_x64/Dockerfile
@@ -95,6 +95,8 @@ RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
nuget \
&& apt-get clean
+RUN nuget update -self
+
# Prepare ccache
RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
RUN ln -s /usr/bin/ccache /usr/local/bin/g++
diff --git a/tools/dockerfile/test/multilang_jessie_x64/Dockerfile b/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
index 13f7c10f92..2540b52ec8 100644
--- a/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
+++ b/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
@@ -80,6 +80,8 @@ RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
nuget \
&& apt-get clean
+RUN nuget update -self
+
#=================
# C++ dependencies
RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean
diff --git a/tools/dockerfile/test/python_pyenv_x64/Dockerfile b/tools/dockerfile/test/python_pyenv_x64/Dockerfile
index abb5f3c89b..ecd785a86d 100644
--- a/tools/dockerfile/test/python_pyenv_x64/Dockerfile
+++ b/tools/dockerfile/test/python_pyenv_x64/Dockerfile
@@ -95,7 +95,8 @@ RUN curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/py
RUN pyenv update
RUN pyenv install 3.5-dev
RUN pyenv install 3.6-dev
-RUN pyenv local 3.5-dev 3.6-dev
+RUN pyenv install pypy-5.3.1
+RUN pyenv local 3.5-dev 3.6-dev pypy-5.3.1
# Prepare ccache
RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index a2415e1217..314a42d989 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -807,6 +807,34 @@ include/grpc++/support/string_ref.h \
include/grpc++/support/stub_options.h \
include/grpc++/support/sync_stream.h \
include/grpc++/support/time.h \
+include/grpc/byte_buffer.h \
+include/grpc/byte_buffer_reader.h \
+include/grpc/compression.h \
+include/grpc/grpc.h \
+include/grpc/grpc_posix.h \
+include/grpc/grpc_security_constants.h \
+include/grpc/status.h \
+include/grpc/impl/codegen/byte_buffer.h \
+include/grpc/impl/codegen/byte_buffer_reader.h \
+include/grpc/impl/codegen/compression_types.h \
+include/grpc/impl/codegen/connectivity_state.h \
+include/grpc/impl/codegen/grpc_types.h \
+include/grpc/impl/codegen/propagation_bits.h \
+include/grpc/impl/codegen/status.h \
+include/grpc/impl/codegen/alloc.h \
+include/grpc/impl/codegen/atm.h \
+include/grpc/impl/codegen/atm_gcc_atomic.h \
+include/grpc/impl/codegen/atm_gcc_sync.h \
+include/grpc/impl/codegen/atm_windows.h \
+include/grpc/impl/codegen/log.h \
+include/grpc/impl/codegen/port_platform.h \
+include/grpc/impl/codegen/slice.h \
+include/grpc/impl/codegen/slice_buffer.h \
+include/grpc/impl/codegen/sync.h \
+include/grpc/impl/codegen/sync_generic.h \
+include/grpc/impl/codegen/sync_posix.h \
+include/grpc/impl/codegen/sync_windows.h \
+include/grpc/impl/codegen/time.h \
include/grpc++/impl/codegen/async_stream.h \
include/grpc++/impl/codegen/async_unary_call.h \
include/grpc++/impl/codegen/call.h \
@@ -836,28 +864,7 @@ include/grpc++/impl/codegen/sync.h \
include/grpc++/impl/codegen/sync_cxx11.h \
include/grpc++/impl/codegen/sync_no_cxx11.h \
include/grpc++/impl/codegen/sync_stream.h \
-include/grpc++/impl/codegen/time.h \
-include/grpc/impl/codegen/byte_buffer.h \
-include/grpc/impl/codegen/byte_buffer_reader.h \
-include/grpc/impl/codegen/compression_types.h \
-include/grpc/impl/codegen/connectivity_state.h \
-include/grpc/impl/codegen/grpc_types.h \
-include/grpc/impl/codegen/propagation_bits.h \
-include/grpc/impl/codegen/status.h \
-include/grpc/impl/codegen/alloc.h \
-include/grpc/impl/codegen/atm.h \
-include/grpc/impl/codegen/atm_gcc_atomic.h \
-include/grpc/impl/codegen/atm_gcc_sync.h \
-include/grpc/impl/codegen/atm_windows.h \
-include/grpc/impl/codegen/log.h \
-include/grpc/impl/codegen/port_platform.h \
-include/grpc/impl/codegen/slice.h \
-include/grpc/impl/codegen/slice_buffer.h \
-include/grpc/impl/codegen/sync.h \
-include/grpc/impl/codegen/sync_generic.h \
-include/grpc/impl/codegen/sync_posix.h \
-include/grpc/impl/codegen/sync_windows.h \
-include/grpc/impl/codegen/time.h
+include/grpc++/impl/codegen/time.h
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 945298b964..12eb651384 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -807,6 +807,34 @@ include/grpc++/support/string_ref.h \
include/grpc++/support/stub_options.h \
include/grpc++/support/sync_stream.h \
include/grpc++/support/time.h \
+include/grpc/byte_buffer.h \
+include/grpc/byte_buffer_reader.h \
+include/grpc/compression.h \
+include/grpc/grpc.h \
+include/grpc/grpc_posix.h \
+include/grpc/grpc_security_constants.h \
+include/grpc/status.h \
+include/grpc/impl/codegen/byte_buffer.h \
+include/grpc/impl/codegen/byte_buffer_reader.h \
+include/grpc/impl/codegen/compression_types.h \
+include/grpc/impl/codegen/connectivity_state.h \
+include/grpc/impl/codegen/grpc_types.h \
+include/grpc/impl/codegen/propagation_bits.h \
+include/grpc/impl/codegen/status.h \
+include/grpc/impl/codegen/alloc.h \
+include/grpc/impl/codegen/atm.h \
+include/grpc/impl/codegen/atm_gcc_atomic.h \
+include/grpc/impl/codegen/atm_gcc_sync.h \
+include/grpc/impl/codegen/atm_windows.h \
+include/grpc/impl/codegen/log.h \
+include/grpc/impl/codegen/port_platform.h \
+include/grpc/impl/codegen/slice.h \
+include/grpc/impl/codegen/slice_buffer.h \
+include/grpc/impl/codegen/sync.h \
+include/grpc/impl/codegen/sync_generic.h \
+include/grpc/impl/codegen/sync_posix.h \
+include/grpc/impl/codegen/sync_windows.h \
+include/grpc/impl/codegen/time.h \
include/grpc++/impl/codegen/async_stream.h \
include/grpc++/impl/codegen/async_unary_call.h \
include/grpc++/impl/codegen/call.h \
@@ -837,34 +865,94 @@ include/grpc++/impl/codegen/sync_cxx11.h \
include/grpc++/impl/codegen/sync_no_cxx11.h \
include/grpc++/impl/codegen/sync_stream.h \
include/grpc++/impl/codegen/time.h \
-include/grpc/impl/codegen/byte_buffer.h \
-include/grpc/impl/codegen/byte_buffer_reader.h \
-include/grpc/impl/codegen/compression_types.h \
-include/grpc/impl/codegen/connectivity_state.h \
-include/grpc/impl/codegen/grpc_types.h \
-include/grpc/impl/codegen/propagation_bits.h \
-include/grpc/impl/codegen/status.h \
-include/grpc/impl/codegen/alloc.h \
-include/grpc/impl/codegen/atm.h \
-include/grpc/impl/codegen/atm_gcc_atomic.h \
-include/grpc/impl/codegen/atm_gcc_sync.h \
-include/grpc/impl/codegen/atm_windows.h \
-include/grpc/impl/codegen/log.h \
-include/grpc/impl/codegen/port_platform.h \
-include/grpc/impl/codegen/slice.h \
-include/grpc/impl/codegen/slice_buffer.h \
-include/grpc/impl/codegen/sync.h \
-include/grpc/impl/codegen/sync_generic.h \
-include/grpc/impl/codegen/sync_posix.h \
-include/grpc/impl/codegen/sync_windows.h \
-include/grpc/impl/codegen/time.h \
include/grpc++/impl/codegen/core_codegen.h \
src/cpp/client/secure_credentials.h \
src/cpp/common/secure_auth_context.h \
src/cpp/server/secure_server_credentials.h \
src/cpp/client/create_channel_internal.h \
+src/cpp/common/channel_filter.h \
src/cpp/server/dynamic_thread_pool.h \
src/cpp/server/thread_pool_interface.h \
+src/core/lib/channel/channel_args.h \
+src/core/lib/channel/channel_stack.h \
+src/core/lib/channel/channel_stack_builder.h \
+src/core/lib/channel/compress_filter.h \
+src/core/lib/channel/connected_channel.h \
+src/core/lib/channel/context.h \
+src/core/lib/channel/handshaker.h \
+src/core/lib/channel/http_client_filter.h \
+src/core/lib/channel/http_server_filter.h \
+src/core/lib/compression/algorithm_metadata.h \
+src/core/lib/compression/message_compress.h \
+src/core/lib/debug/trace.h \
+src/core/lib/http/format_request.h \
+src/core/lib/http/httpcli.h \
+src/core/lib/http/parser.h \
+src/core/lib/iomgr/closure.h \
+src/core/lib/iomgr/endpoint.h \
+src/core/lib/iomgr/endpoint_pair.h \
+src/core/lib/iomgr/error.h \
+src/core/lib/iomgr/ev_epoll_linux.h \
+src/core/lib/iomgr/ev_poll_and_epoll_posix.h \
+src/core/lib/iomgr/ev_poll_posix.h \
+src/core/lib/iomgr/ev_posix.h \
+src/core/lib/iomgr/exec_ctx.h \
+src/core/lib/iomgr/executor.h \
+src/core/lib/iomgr/iocp_windows.h \
+src/core/lib/iomgr/iomgr.h \
+src/core/lib/iomgr/iomgr_internal.h \
+src/core/lib/iomgr/iomgr_posix.h \
+src/core/lib/iomgr/load_file.h \
+src/core/lib/iomgr/network_status_tracker.h \
+src/core/lib/iomgr/polling_entity.h \
+src/core/lib/iomgr/pollset.h \
+src/core/lib/iomgr/pollset_set.h \
+src/core/lib/iomgr/pollset_set_windows.h \
+src/core/lib/iomgr/pollset_windows.h \
+src/core/lib/iomgr/resolve_address.h \
+src/core/lib/iomgr/sockaddr.h \
+src/core/lib/iomgr/sockaddr_posix.h \
+src/core/lib/iomgr/sockaddr_utils.h \
+src/core/lib/iomgr/sockaddr_windows.h \
+src/core/lib/iomgr/socket_utils_posix.h \
+src/core/lib/iomgr/socket_windows.h \
+src/core/lib/iomgr/tcp_client.h \
+src/core/lib/iomgr/tcp_posix.h \
+src/core/lib/iomgr/tcp_server.h \
+src/core/lib/iomgr/tcp_windows.h \
+src/core/lib/iomgr/time_averaged_stats.h \
+src/core/lib/iomgr/timer.h \
+src/core/lib/iomgr/timer_heap.h \
+src/core/lib/iomgr/udp_server.h \
+src/core/lib/iomgr/unix_sockets_posix.h \
+src/core/lib/iomgr/wakeup_fd_pipe.h \
+src/core/lib/iomgr/wakeup_fd_posix.h \
+src/core/lib/iomgr/workqueue.h \
+src/core/lib/iomgr/workqueue_posix.h \
+src/core/lib/iomgr/workqueue_windows.h \
+src/core/lib/json/json.h \
+src/core/lib/json/json_common.h \
+src/core/lib/json/json_reader.h \
+src/core/lib/json/json_writer.h \
+src/core/lib/surface/api_trace.h \
+src/core/lib/surface/call.h \
+src/core/lib/surface/call_test_only.h \
+src/core/lib/surface/channel.h \
+src/core/lib/surface/channel_init.h \
+src/core/lib/surface/channel_stack_type.h \
+src/core/lib/surface/completion_queue.h \
+src/core/lib/surface/event_string.h \
+src/core/lib/surface/init.h \
+src/core/lib/surface/lame_client.h \
+src/core/lib/surface/server.h \
+src/core/lib/transport/byte_stream.h \
+src/core/lib/transport/connectivity_state.h \
+src/core/lib/transport/metadata.h \
+src/core/lib/transport/metadata_batch.h \
+src/core/lib/transport/static_metadata.h \
+src/core/lib/transport/timeout_encoding.h \
+src/core/lib/transport/transport.h \
+src/core/lib/transport/transport_impl.h \
src/cpp/client/secure_credentials.cc \
src/cpp/common/auth_property_iterator.cc \
src/cpp/common/secure_auth_context.cc \
@@ -880,6 +968,7 @@ src/cpp/client/credentials.cc \
src/cpp/client/generic_stub.cc \
src/cpp/client/insecure_credentials.cc \
src/cpp/common/channel_arguments.cc \
+src/cpp/common/channel_filter.cc \
src/cpp/common/completion_queue.cc \
src/cpp/common/core_codegen.cc \
src/cpp/common/rpc_method.cc \
@@ -897,6 +986,95 @@ src/cpp/util/slice.cc \
src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \
src/cpp/util/time.cc \
+src/core/lib/channel/channel_args.c \
+src/core/lib/channel/channel_stack.c \
+src/core/lib/channel/channel_stack_builder.c \
+src/core/lib/channel/compress_filter.c \
+src/core/lib/channel/connected_channel.c \
+src/core/lib/channel/handshaker.c \
+src/core/lib/channel/http_client_filter.c \
+src/core/lib/channel/http_server_filter.c \
+src/core/lib/compression/compression.c \
+src/core/lib/compression/message_compress.c \
+src/core/lib/debug/trace.c \
+src/core/lib/http/format_request.c \
+src/core/lib/http/httpcli.c \
+src/core/lib/http/parser.c \
+src/core/lib/iomgr/closure.c \
+src/core/lib/iomgr/endpoint.c \
+src/core/lib/iomgr/endpoint_pair_posix.c \
+src/core/lib/iomgr/endpoint_pair_windows.c \
+src/core/lib/iomgr/error.c \
+src/core/lib/iomgr/ev_epoll_linux.c \
+src/core/lib/iomgr/ev_poll_and_epoll_posix.c \
+src/core/lib/iomgr/ev_poll_posix.c \
+src/core/lib/iomgr/ev_posix.c \
+src/core/lib/iomgr/exec_ctx.c \
+src/core/lib/iomgr/executor.c \
+src/core/lib/iomgr/iocp_windows.c \
+src/core/lib/iomgr/iomgr.c \
+src/core/lib/iomgr/iomgr_posix.c \
+src/core/lib/iomgr/iomgr_windows.c \
+src/core/lib/iomgr/load_file.c \
+src/core/lib/iomgr/network_status_tracker.c \
+src/core/lib/iomgr/polling_entity.c \
+src/core/lib/iomgr/pollset_set_windows.c \
+src/core/lib/iomgr/pollset_windows.c \
+src/core/lib/iomgr/resolve_address_posix.c \
+src/core/lib/iomgr/resolve_address_windows.c \
+src/core/lib/iomgr/sockaddr_utils.c \
+src/core/lib/iomgr/socket_utils_common_posix.c \
+src/core/lib/iomgr/socket_utils_linux.c \
+src/core/lib/iomgr/socket_utils_posix.c \
+src/core/lib/iomgr/socket_windows.c \
+src/core/lib/iomgr/tcp_client_posix.c \
+src/core/lib/iomgr/tcp_client_windows.c \
+src/core/lib/iomgr/tcp_posix.c \
+src/core/lib/iomgr/tcp_server_posix.c \
+src/core/lib/iomgr/tcp_server_windows.c \
+src/core/lib/iomgr/tcp_windows.c \
+src/core/lib/iomgr/time_averaged_stats.c \
+src/core/lib/iomgr/timer.c \
+src/core/lib/iomgr/timer_heap.c \
+src/core/lib/iomgr/udp_server.c \
+src/core/lib/iomgr/unix_sockets_posix.c \
+src/core/lib/iomgr/unix_sockets_posix_noop.c \
+src/core/lib/iomgr/wakeup_fd_eventfd.c \
+src/core/lib/iomgr/wakeup_fd_nospecial.c \
+src/core/lib/iomgr/wakeup_fd_pipe.c \
+src/core/lib/iomgr/wakeup_fd_posix.c \
+src/core/lib/iomgr/workqueue_posix.c \
+src/core/lib/iomgr/workqueue_windows.c \
+src/core/lib/json/json.c \
+src/core/lib/json/json_reader.c \
+src/core/lib/json/json_string.c \
+src/core/lib/json/json_writer.c \
+src/core/lib/surface/alarm.c \
+src/core/lib/surface/api_trace.c \
+src/core/lib/surface/byte_buffer.c \
+src/core/lib/surface/byte_buffer_reader.c \
+src/core/lib/surface/call.c \
+src/core/lib/surface/call_details.c \
+src/core/lib/surface/call_log_batch.c \
+src/core/lib/surface/channel.c \
+src/core/lib/surface/channel_init.c \
+src/core/lib/surface/channel_ping.c \
+src/core/lib/surface/channel_stack_type.c \
+src/core/lib/surface/completion_queue.c \
+src/core/lib/surface/event_string.c \
+src/core/lib/surface/lame_client.c \
+src/core/lib/surface/metadata_array.c \
+src/core/lib/surface/server.c \
+src/core/lib/surface/validate_metadata.c \
+src/core/lib/surface/version.c \
+src/core/lib/transport/byte_stream.c \
+src/core/lib/transport/connectivity_state.c \
+src/core/lib/transport/metadata.c \
+src/core/lib/transport/metadata_batch.c \
+src/core/lib/transport/static_metadata.c \
+src/core/lib/transport/timeout_encoding.c \
+src/core/lib/transport/transport.c \
+src/core/lib/transport/transport_op_string.c \
src/cpp/codegen/codegen_init.cc
# This tag can be used to specify the character encoding of the source files
diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core
index e631c962b3..27f878e8ab 100644
--- a/tools/doxygen/Doxyfile.core
+++ b/tools/doxygen/Doxyfile.core
@@ -765,6 +765,7 @@ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
+include/grpc/grpc_security_constants.h \
include/grpc/status.h \
include/grpc/impl/codegen/byte_buffer.h \
include/grpc/impl/codegen/byte_buffer_reader.h \
@@ -788,7 +789,6 @@ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h \
include/grpc/grpc_security.h \
-include/grpc/grpc_security_constants.h \
include/grpc/census.h \
include/grpc/support/alloc.h \
include/grpc/support/atm.h \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 745069480c..426c6d91e3 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -765,6 +765,7 @@ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
+include/grpc/grpc_security_constants.h \
include/grpc/status.h \
include/grpc/impl/codegen/byte_buffer.h \
include/grpc/impl/codegen/byte_buffer_reader.h \
@@ -788,7 +789,6 @@ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h \
include/grpc/grpc_security.h \
-include/grpc/grpc_security_constants.h \
include/grpc/census.h \
src/core/lib/channel/channel_args.h \
src/core/lib/channel/channel_stack.h \
@@ -867,6 +867,7 @@ src/core/lib/transport/connectivity_state.h \
src/core/lib/transport/metadata.h \
src/core/lib/transport/metadata_batch.h \
src/core/lib/transport/static_metadata.h \
+src/core/lib/transport/timeout_encoding.h \
src/core/lib/transport/transport.h \
src/core/lib/transport/transport_impl.h \
src/core/ext/transport/chttp2/transport/bin_decoder.h \
@@ -888,7 +889,6 @@ src/core/ext/transport/chttp2/transport/incoming_metadata.h \
src/core/ext/transport/chttp2/transport/internal.h \
src/core/ext/transport/chttp2/transport/status_conversion.h \
src/core/ext/transport/chttp2/transport/stream_map.h \
-src/core/ext/transport/chttp2/transport/timeout_encoding.h \
src/core/ext/transport/chttp2/transport/varint.h \
src/core/ext/transport/chttp2/alpn/alpn.h \
src/core/lib/security/context/security_context.h \
@@ -941,11 +941,13 @@ third_party/nanopb/pb_encode.h \
src/core/ext/load_reporting/load_reporting.h \
src/core/ext/load_reporting/load_reporting_filter.h \
src/core/ext/census/aggregation.h \
+src/core/ext/census/base_resources.h \
src/core/ext/census/census_interface.h \
src/core/ext/census/census_rpc_stats.h \
src/core/ext/census/gen/census.pb.h \
src/core/ext/census/grpc_filter.h \
src/core/ext/census/mlog.h \
+src/core/ext/census/resource.h \
src/core/ext/census/rpc_metric_id.h \
src/core/lib/surface/init.c \
src/core/lib/channel/channel_args.c \
@@ -1034,6 +1036,7 @@ src/core/lib/transport/connectivity_state.c \
src/core/lib/transport/metadata.c \
src/core/lib/transport/metadata_batch.c \
src/core/lib/transport/static_metadata.c \
+src/core/lib/transport/timeout_encoding.c \
src/core/lib/transport/transport.c \
src/core/lib/transport/transport_op_string.c \
src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c \
@@ -1056,7 +1059,6 @@ src/core/ext/transport/chttp2/transport/parsing.c \
src/core/ext/transport/chttp2/transport/status_conversion.c \
src/core/ext/transport/chttp2/transport/stream_lists.c \
src/core/ext/transport/chttp2/transport/stream_map.c \
-src/core/ext/transport/chttp2/transport/timeout_encoding.c \
src/core/ext/transport/chttp2/transport/varint.c \
src/core/ext/transport/chttp2/transport/writing.c \
src/core/ext/transport/chttp2/alpn/alpn.c \
@@ -1124,6 +1126,7 @@ src/core/ext/resolver/dns/native/dns_resolver.c \
src/core/ext/resolver/sockaddr/sockaddr_resolver.c \
src/core/ext/load_reporting/load_reporting.c \
src/core/ext/load_reporting/load_reporting_filter.c \
+src/core/ext/census/base_resources.c \
src/core/ext/census/context.c \
src/core/ext/census/gen/census.pb.c \
src/core/ext/census/grpc_context.c \
@@ -1133,6 +1136,7 @@ src/core/ext/census/initialize.c \
src/core/ext/census/mlog.c \
src/core/ext/census/operation.c \
src/core/ext/census/placeholders.c \
+src/core/ext/census/resource.c \
src/core/ext/census/tracing.c \
src/core/plugin_registry/grpc_plugin_registry.c \
include/grpc/support/alloc.h \
diff --git a/tools/gce/create_linux_worker.sh b/tools/gce/create_linux_worker.sh
index c41e4d299b..7bf8b24081 100755
--- a/tools/gce/create_linux_worker.sh
+++ b/tools/gce/create_linux_worker.sh
@@ -43,7 +43,8 @@ gcloud compute instances create $INSTANCE_NAME \
--project="$CLOUD_PROJECT" \
--zone "$ZONE" \
--machine-type n1-standard-8 \
- --image ubuntu-15-10 \
+ --image=ubuntu-1510 \
+ --image-project=grpc-testing \
--boot-disk-size 1000
echo 'Created GCE instance, waiting 60 seconds for it to come online.'
diff --git a/tools/gource/gen-all-logs.sh b/tools/gource/gen-all-logs.sh
index 85352c514e..ab60c3c1b1 100755
--- a/tools/gource/gen-all-logs.sh
+++ b/tools/gource/gen-all-logs.sh
@@ -41,7 +41,6 @@ do
git clone https://github.com/grpc/$repo.git
cd $repo
gource --output-custom-log $tmpdir/logs/$repo
- sed -i .backup "s,\|/,\|/$repo/,g" $tmpdir/logs/$repo
+ sed -i "s,|/,|/$repo/,g" $tmpdir/logs/$repo
done
-rm $tmpdir/logs/*.backup
cat $tmpdir/logs/* | sort -n > $outdir/all-logs.txt
diff --git a/tools/gource/gource.sh b/tools/gource/gource.sh
index b3dad5d7c7..5529b32bbd 100755
--- a/tools/gource/gource.sh
+++ b/tools/gource/gource.sh
@@ -34,7 +34,7 @@ gource \
--max-file-lag 0.05 \
--max-files 0 \
-e 0.01 \
- --hide filenames,dirnames \
+ --hide filenames,dirnames,mouse,progress \
--disable-auto-rotate \
--file-filter '/grpc/doc/ref' \
$*
diff --git a/tools/gource/make-video.sh b/tools/gource/make-video.sh
index 02d79df81b..cde0437255 100755
--- a/tools/gource/make-video.sh
+++ b/tools/gource/make-video.sh
@@ -37,7 +37,7 @@ $(dirname $0)/gource.sh \
--stop-at-end \
--output-ppm-stream - \
$@ | \
-ffmpeg \
+avconv \
-y \
-r 60 \
-f image2pipe \
diff --git a/tools/grift/Dockerfile b/tools/grift/Dockerfile
new file mode 100644
index 0000000000..223ee93992
--- /dev/null
+++ b/tools/grift/Dockerfile
@@ -0,0 +1,67 @@
+# Copyright 2016, 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.
+
+FROM ubuntu:14.04
+
+RUN apt-get update && \
+ apt-get install -y \
+ git build-essential \
+ pkg-config flex \
+ bison \
+ libkrb5-dev \
+ libsasl2-dev \
+ libnuma-dev \
+ pkg-config \
+ libssl-dev \
+ autoconf libtool \
+ cmake \
+ libiberty-dev \
+ g++ unzip \
+ curl make automake libtool libboost-dev
+
+# Configure git
+RUN git config --global user.name "Jenkins" && \
+ git config --global user.email "jenkins@grpc"
+
+# Clone gRPC
+RUN git clone https://github.com/grpc/grpc
+
+# Update Submodules
+RUN cd grpc && git submodule update --init
+
+# Install protobuf
+RUN cd grpc/third_party/protobuf && ./autogen.sh && ./configure && \
+ make -j && make check -j && make install && ldconfig
+
+# Install gRPC
+RUN cd grpc && make -j && make install
+
+# Install thrift
+RUN cd grpc/third_party/thrift && git am --signoff < ../../tools/grift/grpc_plugins_generator.patch && \
+ ./bootstrap.sh && ./configure && make -j && make install \ No newline at end of file
diff --git a/tools/grift/README.md b/tools/grift/README.md
new file mode 100644
index 0000000000..7cbbdc567b
--- /dev/null
+++ b/tools/grift/README.md
@@ -0,0 +1,26 @@
+Copyright 2016 Google Inc.
+
+#Documentation
+
+grift is integration of [Apache Thrift](https://github.com/apache/thrift.git) Serializer with gRPC.
+
+This integration allows you to use grpc to send thrift messages in C++ and java.
+
+grift uses Compact Protocol to serialize thrift messages.
+
+##generating grpc plugins for thrift services
+
+###CPP
+```sh
+ $ thrift --gen cpp <thrift-file>
+```
+
+###JAVA
+```sh
+ $ thrift --gen java <thrift-file>
+```
+
+#Installation
+
+Before Installing thrift make sure to apply this [patch](grpc_plugins_generator.patch) to third_party/thrift.
+Go to third_party/thrift and follow the [INSTALLATION](https://github.com/apache/thrift.git) instructions to install thrift with commit id bcad91771b7f0bff28a1cac1981d7ef2b9bcef3c. \ No newline at end of file
diff --git a/tools/grift/grpc_plugins_generator.patch b/tools/grift/grpc_plugins_generator.patch
new file mode 100644
index 0000000000..de82a01f62
--- /dev/null
+++ b/tools/grift/grpc_plugins_generator.patch
@@ -0,0 +1,2505 @@
+From 0894590b5020c38106d4ebb2291994668c64f9dd Mon Sep 17 00:00:00 2001
+From: chedeti <chedeti@google.com>
+Date: Sun, 31 Jul 2016 15:47:47 -0700
+Subject: [PATCH 1/3] don't build tests
+
+---
+ Makefile.am | 7 ++-----
+ lib/cpp/Makefile.am | 7 ++-----
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 10fe49a..d49caac 100755
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -21,10 +21,6 @@ ACLOCAL_AMFLAGS = -I ./aclocal
+
+ SUBDIRS = compiler/cpp lib
+
+-if WITH_TESTS
+-SUBDIRS += test
+-endif
+-
+ if WITH_TUTORIAL
+ SUBDIRS += tutorial
+ endif
+@@ -117,4 +113,5 @@ EXTRA_DIST = \
+ CHANGES \
+ NOTICE \
+ README.md \
+- Thrift.podspec
++ Thrift.podspec \
++ test
+diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am
+index 6fd15d2..7de1fad 100755
+--- a/lib/cpp/Makefile.am
++++ b/lib/cpp/Makefile.am
+@@ -27,10 +27,6 @@ moc__%.cpp: %.h
+
+ SUBDIRS = .
+
+-if WITH_TESTS
+-SUBDIRS += test
+-endif
+-
+ pkgconfigdir = $(libdir)/pkgconfig
+
+ lib_LTLIBRARIES = libthrift.la
+@@ -277,7 +273,8 @@ EXTRA_DIST = \
+ thrift-qt.pc.in \
+ thrift-qt5.pc.in \
+ src/thrift/qt/CMakeLists.txt \
+- $(WINDOWS_DIST)
++ $(WINDOWS_DIST) \
++ test
+
+ style-local:
+ $(CPPSTYLE_CMD)
+--
+2.8.0.rc3.226.g39d4020
+
+
+From 387e4300bc9d98176a92a7c010621443a538e7f2 Mon Sep 17 00:00:00 2001
+From: chedeti <chedeti@google.com>
+Date: Sun, 31 Jul 2016 16:16:40 -0700
+Subject: [PATCH 2/3] grpc cpp plugins generator with example
+
+---
+ compiler/cpp/src/generate/t_cpp_generator.cc | 489 +++++++++++++++++++++++----
+ tutorial/cpp/CMakeLists.txt | 53 ---
+ tutorial/cpp/CppClient.cpp | 80 -----
+ tutorial/cpp/CppServer.cpp | 181 ----------
+ tutorial/cpp/GriftClient.cpp | 93 +++++
+ tutorial/cpp/GriftServer.cpp | 93 +++++
+ tutorial/cpp/Makefile.am | 66 ++--
+ tutorial/cpp/test.thrift | 13 +
+ 8 files changed, 652 insertions(+), 416 deletions(-)
+ delete mode 100644 tutorial/cpp/CMakeLists.txt
+ delete mode 100644 tutorial/cpp/CppClient.cpp
+ delete mode 100644 tutorial/cpp/CppServer.cpp
+ create mode 100644 tutorial/cpp/GriftClient.cpp
+ create mode 100644 tutorial/cpp/GriftServer.cpp
+ create mode 100644 tutorial/cpp/test.thrift
+
+diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
+index 6c04899..1557241 100644
+--- a/compiler/cpp/src/generate/t_cpp_generator.cc
++++ b/compiler/cpp/src/generate/t_cpp_generator.cc
+@@ -162,6 +162,8 @@ public:
+ bool specialized = false);
+ void generate_function_helpers(t_service* tservice, t_function* tfunction);
+ void generate_service_async_skeleton(t_service* tservice);
++ void generate_service_stub_interface(t_service* tservice);
++ void generate_service_stub(t_service* tservice);
+
+ /**
+ * Serialization constructs
+@@ -883,10 +885,10 @@ void t_cpp_generator::generate_struct_declaration(ofstream& out,
+ bool is_user_struct) {
+ string extends = "";
+ if (is_exception) {
+- extends = " : public ::apache::thrift::TException";
++ extends = " : public apache::thrift::TException";
+ } else {
+- if (is_user_struct && !gen_templates_) {
+- extends = " : public virtual ::apache::thrift::TBase";
++ if (!gen_templates_) {
++ extends = " : public virtual apache::thrift::TBase";
+ }
+ }
+
+@@ -1130,9 +1132,15 @@ void t_cpp_generator::generate_struct_definition(ofstream& out,
+ vector<t_field*>::const_iterator m_iter;
+ const vector<t_field*>& members = tstruct->get_members();
+
++ string method_prefix = "";
++ if (service_name_ != "") {
++ method_prefix = service_name_ + "::";
++ }
++
+ // Destructor
+ if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) {
+- force_cpp_out << endl << indent() << tstruct->get_name() << "::~" << tstruct->get_name()
++ force_cpp_out << endl << indent() << method_prefix <<
++ tstruct->get_name() << "::~" << tstruct->get_name()
+ << "() throw() {" << endl;
+ indent_up();
+
+@@ -1145,12 +1153,14 @@ void t_cpp_generator::generate_struct_definition(ofstream& out,
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+ if (is_reference((*m_iter))) {
+ std::string type = type_name((*m_iter)->get_type());
+- out << endl << indent() << "void " << tstruct->get_name() << "::__set_"
++ out << endl << indent() << "void " << method_prefix
++ << tstruct->get_name() << "::__set_"
+ << (*m_iter)->get_name() << "(boost::shared_ptr<"
+ << type_name((*m_iter)->get_type(), false, false) << ">";
+ out << " val) {" << endl;
+ } else {
+- out << endl << indent() << "void " << tstruct->get_name() << "::__set_"
++ out << endl << indent() << "void " << method_prefix
++ << tstruct->get_name() << "::__set_"
+ << (*m_iter)->get_name() << "(" << type_name((*m_iter)->get_type(), false, true);
+ out << " val) {" << endl;
+ }
+@@ -1177,11 +1187,16 @@ void t_cpp_generator::generate_struct_definition(ofstream& out,
+ * @param tstruct The struct
+ */
+ void t_cpp_generator::generate_struct_reader(ofstream& out, t_struct* tstruct, bool pointers) {
++ string method_prefix = "";
++ if (service_name_ != "") {
++ method_prefix = service_name_ + "::";
++ }
++
+ if (gen_templates_) {
+ out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
+- << tstruct->get_name() << "::read(Protocol_* iprot) {" << endl;
++ << method_prefix << tstruct->get_name() << "::read(Protocol_* iprot) {" << endl;
+ } else {
+- indent(out) << "uint32_t " << tstruct->get_name()
++ indent(out) << "uint32_t " << method_prefix << tstruct->get_name()
+ << "::read(::apache::thrift::protocol::TProtocol* iprot) {" << endl;
+ }
+ indent_up();
+@@ -1301,14 +1316,18 @@ void t_cpp_generator::generate_struct_reader(ofstream& out, t_struct* tstruct, b
+ */
+ void t_cpp_generator::generate_struct_writer(ofstream& out, t_struct* tstruct, bool pointers) {
+ string name = tstruct->get_name();
++ string method_prefix = "";
++ if (service_name_ != "") {
++ method_prefix = service_name_ + "::";
++ }
+ const vector<t_field*>& fields = tstruct->get_sorted_members();
+ vector<t_field*>::const_iterator f_iter;
+
+ if (gen_templates_) {
+ out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
+- << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
++ << method_prefix << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
+ } else {
+- indent(out) << "uint32_t " << tstruct->get_name()
++ indent(out) << "uint32_t " << method_prefix << tstruct->get_name()
+ << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl;
+ }
+ indent_up();
+@@ -1369,14 +1388,18 @@ void t_cpp_generator::generate_struct_result_writer(ofstream& out,
+ t_struct* tstruct,
+ bool pointers) {
+ string name = tstruct->get_name();
++ string method_prefix = "";
++ if (service_name_ != "") {
++ method_prefix = service_name_ + "::";
++ }
+ const vector<t_field*>& fields = tstruct->get_sorted_members();
+ vector<t_field*>::const_iterator f_iter;
+
+ if (gen_templates_) {
+ out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
+- << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
++ << method_prefix << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
+ } else {
+- indent(out) << "uint32_t " << tstruct->get_name()
++ indent(out) << "uint32_t " << method_prefix << tstruct->get_name()
+ << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl;
+ }
+ indent_up();
+@@ -1385,18 +1408,7 @@ void t_cpp_generator::generate_struct_result_writer(ofstream& out,
+
+ indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << endl;
+
+- bool first = true;
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+- if (first) {
+- first = false;
+- out << endl << indent() << "if ";
+- } else {
+- out << " else if ";
+- }
+-
+- out << "(this->__isset." << (*f_iter)->get_name() << ") {" << endl;
+-
+- indent_up();
+
+ // Write field header
+ out << indent() << "xfer += oprot->writeFieldBegin("
+@@ -1410,9 +1422,6 @@ void t_cpp_generator::generate_struct_result_writer(ofstream& out,
+ }
+ // Write field closer
+ indent(out) << "xfer += oprot->writeFieldEnd();" << endl;
+-
+- indent_down();
+- indent(out) << "}";
+ }
+
+ // Write the struct map
+@@ -1478,9 +1487,13 @@ void t_cpp_generator::generate_struct_ostream_operator(std::ofstream& out, t_str
+ }
+
+ void t_cpp_generator::generate_struct_print_method_decl(std::ofstream& out, t_struct* tstruct) {
++ string method_prefix = "";
++ if (service_name_ != "") {
++ method_prefix = service_name_ + "::";
++ }
+ out << "void ";
+ if (tstruct) {
+- out << tstruct->get_name() << "::";
++ out << method_prefix << tstruct->get_name() << "::";
+ }
+ out << "printTo(std::ostream& out) const";
+ }
+@@ -1601,11 +1614,13 @@ void t_cpp_generator::generate_exception_what_method(std::ofstream& out, t_struc
+ */
+ void t_cpp_generator::generate_service(t_service* tservice) {
+ string svcname = tservice->get_name();
++ string ns = tservice->get_program()->get_namespace("cpp");
+
+ // Make output files
+- string f_header_name = get_out_dir() + svcname + ".h";
++ string f_header_name = get_out_dir() + svcname + ".grpc.thrift.h";
+ f_header_.open(f_header_name.c_str());
+
++
+ // Print header file includes
+ f_header_ << autogen_comment();
+ f_header_ << "#ifndef " << svcname << "_H" << endl << "#define " << svcname << "_H" << endl
+@@ -1621,15 +1636,38 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+ f_header_ << "#include <thrift/async/TAsyncDispatchProcessor.h>" << endl;
+ }
+ f_header_ << "#include <thrift/async/TConcurrentClientSyncInfo.h>" << endl;
++
+ f_header_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ << "_types.h\""
+ << endl;
+
+ t_service* extends_service = tservice->get_extends();
+- if (extends_service != NULL) {
++ if (extends_service) {
+ f_header_ << "#include \"" << get_include_prefix(*(extends_service->get_program()))
+- << extends_service->get_name() << ".h\"" << endl;
++ << extends_service->get_name() << ".grpc.thrift.h\"" << endl;
+ }
+
++
++ f_header_ <<
++ "#include <grpc++/impl/codegen/async_stream.h>" << endl <<
++ "#include <grpc++/impl/codegen/async_unary_call.h>" << endl <<
++ "#include <grpc++/impl/codegen/thrift_utils.h>" << endl <<
++ "#include <grpc++/impl/codegen/rpc_method.h>" << endl <<
++ "#include <grpc++/impl/codegen/service_type.h>" << endl <<
++ "#include <grpc++/impl/codegen/status.h>" << endl <<
++ "#include <grpc++/impl/codegen/stub_options.h>" << endl <<
++ "#include <grpc++/impl/codegen/sync_stream.h>" << endl;
++
++
++ f_header_ <<
++ endl <<
++ "namespace grpc {" << endl <<
++ "class CompletionQueue;" << endl <<
++ "class Channel;" << endl <<
++ "class RpcService;" << endl <<
++ "class ServerCompletionQueue;" << endl <<
++ "class ServerContext;" << endl <<
++ "}" << endl;
++
+ f_header_ << endl << ns_open_ << endl << endl;
+
+ f_header_ << "#ifdef _WIN32\n"
+@@ -1638,10 +1676,13 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+ "#endif\n\n";
+
+ // Service implementation file includes
+- string f_service_name = get_out_dir() + svcname + ".cpp";
++ string f_service_name = get_out_dir() + svcname + ".grpc.thrift.cpp";
+ f_service_.open(f_service_name.c_str());
+ f_service_ << autogen_comment();
+- f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl;
++
++ f_service_ << "#include \"" <<
++ get_include_prefix(*get_program()) << svcname << ".grpc.thrift.h\"" << endl;
++
+ if (gen_cob_style_) {
+ f_service_ << "#include \"thrift/async/TAsyncChannel.h\"" << endl;
+ }
+@@ -1652,7 +1693,7 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+ string f_service_tcc_name = get_out_dir() + svcname + ".tcc";
+ f_service_tcc_.open(f_service_tcc_name.c_str());
+ f_service_tcc_ << autogen_comment();
+- f_service_tcc_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\""
++ f_service_tcc_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".grpc.thrift.h\""
+ << endl;
+
+ f_service_tcc_ << "#ifndef " << svcname << "_TCC" << endl << "#define " << svcname << "_TCC"
+@@ -1663,19 +1704,69 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+ }
+ }
+
++ f_service_ <<
++ endl <<
++ "#include <grpc++/impl/codegen/async_stream.h>" << endl <<
++ "#include <grpc++/impl/codegen/async_unary_call.h>" << endl <<
++ "#include <grpc++/impl/codegen/channel_interface.h>" << endl <<
++ "#include <grpc++/impl/codegen/client_unary_call.h>" << endl <<
++ "#include <grpc++/impl/codegen/method_handler_impl.h>" << endl <<
++ "#include <grpc++/impl/codegen/rpc_service_method.h>" << endl <<
++ "#include <grpc++/impl/codegen/service_type.h>" << endl <<
++ "#include <grpc++/impl/codegen/sync_stream.h>" << endl <<
++ endl;
++
+ f_service_ << endl << ns_open_ << endl << endl;
+ f_service_tcc_ << endl << ns_open_ << endl << endl;
+
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++
++ f_service_ <<
++ "static const char* " << service_name_ << "_method_names[] = {" << endl;
++
++
++ indent_up();
++
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "\"/" << ns << "." << service_name_ << "/" << (*f_iter)->get_name() << "\"," << endl;
++ }
++
++
++ t_service* service_iter = extends_service;
++ while (service_iter) {
++ vector<t_function*> functions = service_iter->get_functions();
++ vector<t_function*>::iterator f_iter;
++
++ for ( f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "\"/" << service_iter->get_program()->get_namespace("cpp") <<
++ "." << service_iter->get_name() << "/" << (*f_iter)->get_name() << "\"," << endl;
++ }
++ service_iter = service_iter->get_extends();
++ }
++
++ indent_down();
++ f_service_ <<
++ "};" << endl;
++
++ // Generate service class
++ if ( extends_service) {
++ f_header_ << "class " << service_name_ << " : public " <<
++ type_name(extends_service) << " {" << endl <<
++ "public:" << endl;
++ }
++ else {
++ f_header_ << "class " << service_name_ << "{" << endl <<
++ "public:" << endl;
++ }
++
+ // Generate all the components
+- generate_service_interface(tservice, "");
+- generate_service_interface_factory(tservice, "");
+- generate_service_null(tservice, "");
+ generate_service_helpers(tservice);
+- generate_service_client(tservice, "");
+- generate_service_processor(tservice, "");
+- generate_service_multiface(tservice);
+- generate_service_skeleton(tservice);
+- generate_service_client(tservice, "Concurrent");
++ generate_service_interface(tservice, "");
++ generate_service_stub_interface(tservice);
++ generate_service_stub(tservice);
+
+ // Generate all the cob components
+ if (gen_cob_style_) {
+@@ -1688,10 +1779,14 @@ void t_cpp_generator::generate_service(t_service* tservice) {
+ generate_service_async_skeleton(tservice);
+ }
+
++ // Close service class
++ f_header_ << "};" << endl;
++
+ f_header_ << "#ifdef _WIN32\n"
+ " #pragma warning( pop )\n"
+ "#endif\n\n";
+
++
+ // Close the namespace
+ f_service_ << ns_close_ << endl << endl;
+ f_service_tcc_ << ns_close_ << endl << endl;
+@@ -1729,15 +1824,11 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
+ string name_orig = ts->get_name();
+
+ // TODO(dreiss): Why is this stuff not in generate_function_helpers?
+- ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_args");
++ ts->set_name((*f_iter)->get_name() + "Req");
+ generate_struct_declaration(f_header_, ts, false);
+- generate_struct_definition(out, f_service_, ts, false);
++ generate_struct_definition(out, f_service_, ts, true);
+ generate_struct_reader(out, ts);
+ generate_struct_writer(out, ts);
+- ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_pargs");
+- generate_struct_declaration(f_header_, ts, false, true, false, true);
+- generate_struct_definition(out, f_service_, ts, false);
+- generate_struct_writer(out, ts, true);
+ ts->set_name(name_orig);
+
+ generate_function_helpers(tservice, *f_iter);
+@@ -1745,13 +1836,218 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
+ }
+
+ /**
++ * Generates a service Stub Interface
++ *
++ * @param tservice The service to generate a stub for.
++ *
++ */
++void t_cpp_generator::generate_service_stub_interface(t_service* tservice) {
++
++ string extends = "";
++ if (tservice->get_extends()) {
++ extends = " : virtual public " + type_name(tservice->get_extends()) + "::StubInterface";
++ }
++
++ f_header_ <<
++ endl <<
++ "class StubInterface " << extends << " {" << endl;
++ indent_up();
++ f_header_ <<
++ " public:" << endl <<
++ indent() << "virtual ~StubInterface() {}" << endl;
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_header_ <<
++ indent() << "virtual ::grpc::Status " << function_name <<
++ "(::grpc::ClientContext* context, const " << function_name <<
++ "Req& request, " << function_name << "Resp* response) = 0;" << endl;
++ }
++ indent_down();
++ f_header_ <<
++ "};" << endl << endl;
++
++}
++void t_cpp_generator::generate_service_stub(t_service* tservice) {
++ f_header_ <<
++ endl <<
++ "class Stub : public StubInterface {" <<
++ endl;
++
++ indent_up();
++ f_header_ <<
++ " public:" << endl <<
++ indent() << "Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);" <<
++ endl;
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_header_ <<
++ indent() << "::grpc::Status " << function_name <<
++ "(::grpc::ClientContext* context, const " << function_name <<
++ "Req& request, " << function_name << "Resp* response) override;" << endl;
++ }
++
++ t_service* extends_service = tservice->get_extends();
++ t_service* service_iter = extends_service;
++ while (service_iter) {
++ // generate inherited methods
++ vector<t_function*> functions = service_iter->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_header_ <<
++ indent() << "::grpc::Status " << function_name <<
++ "(::grpc::ClientContext* context, const " << function_name <<
++ "Req& request, " << function_name << "Resp* response) override;" << endl;
++ }
++ service_iter = service_iter->get_extends();
++ }
++
++ f_header_ <<
++ endl <<
++ " private:" << endl <<
++ indent() << "std::shared_ptr< ::grpc::ChannelInterface> channel_;" <<
++ endl;
++
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_header_ <<
++ indent() << "const ::grpc::RpcMethod rpcmethod_" << (*f_iter)->get_name() << "_;" << endl;
++ }
++
++ service_iter = extends_service;
++ while (service_iter) {
++ // generate inherited methods
++ vector<t_function*> functions = service_iter->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_header_ <<
++ indent() << "const ::grpc::RpcMethod rpcmethod_" << (*f_iter)->get_name() << "_;" << endl;
++ }
++ service_iter = service_iter->get_extends();
++ }
++
++ indent_down();
++ f_header_ <<
++ "};" << endl << endl;
++
++ // generate the implementaion of Stub
++ f_service_ <<
++ endl <<
++ service_name_ << "::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)" << endl;
++
++ indent_up();
++ f_service_ <<
++ indent() << ": channel_(channel)" << endl;
++ int i=0;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter , ++i) {
++ f_service_ <<
++ indent() <<
++ ", rpcmethod_" << (*f_iter)->get_name() << "_(" <<
++ service_name_ << "_method_names[" << i << "], ::grpc::RpcMethod::NORMAL_RPC, channel)" << endl;
++ }
++
++ service_iter = extends_service;
++ while (service_iter) {
++ // generate inherited methods
++ vector<t_function*> functions = service_iter->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter, ++i) {
++ f_service_ <<
++ indent() <<
++ ", rpcmethod_" << (*f_iter)->get_name() << "_(" <<
++ service_name_ << "_method_names[" << i << "], ::grpc::RpcMethod::NORMAL_RPC, channel)" << endl;
++ }
++ service_iter = service_iter->get_extends();
++ }
++ f_service_ <<
++ indent() << "{}" << endl;
++ indent_down();
++
++ // generate NewStub
++ f_header_ <<
++ endl <<
++ "static std::unique_ptr<Stub> NewStub(const std::shared_ptr\
++ < ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());" <<
++ endl;
++
++ // generate NewStub Implementation
++ f_service_ <<
++ endl <<
++ "std::unique_ptr< " << service_name_ << "::Stub> " << service_name_ << "::NewStub(const std::shared_ptr\
++ < ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {" << endl;
++
++ indent_up();
++ f_service_ <<
++ indent() << "std::unique_ptr< " << service_name_ << "::Stub> stub(new " << service_name_ <<
++ "::Stub(channel));" << endl <<
++ indent() << "return stub;" << endl;
++ indent_down();
++ f_service_ <<
++ "}" << endl;
++
++ // generate stub methods
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_service_ <<
++ endl <<
++ "::grpc::Status " << service_name_ << "::Stub::" << function_name <<
++ "(::grpc::ClientContext* context, const " << service_name_ << "::" <<
++ function_name << "Req& request, " << service_name_ << "::" <<
++ function_name << "Resp* response) {" << endl;
++
++ indent_up();
++ f_service_ <<
++ indent() << "return ::grpc::BlockingUnaryCall(channel_.get(), rpcmethod_" <<
++ function_name << "_, context, request, response);" << endl;
++ indent_down();
++
++ f_service_ <<
++ "}" << endl;
++
++ }
++
++ service_iter = extends_service;
++ while (service_iter) {
++ vector<t_function*> functions = service_iter->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_service_ <<
++ endl <<
++ "::grpc::Status " << service_name_ << "::Stub::" << function_name <<
++ "(::grpc::ClientContext* context, const " << service_name_ << "::" <<
++ function_name << "Req& request, " << service_name_ << "::" <<
++ function_name << "Resp* response) {" << endl;
++
++ indent_up();
++ f_service_ <<
++ indent() << "return ::grpc::BlockingUnaryCall(channel_.get(), rpcmethod_" <<
++ function_name << "_, context, request, response);" << endl;
++ indent_down();
++
++ f_service_ <<
++ "}" << endl;
++
++ }
++ service_iter = service_iter->get_extends();
++ }
++
++}
++
++
++/**
+ * Generates a service interface definition.
+ *
+ * @param tservice The service to generate a header definition for
+ */
+ void t_cpp_generator::generate_service_interface(t_service* tservice, string style) {
+
+- string service_if_name = service_name_ + style + "If";
++ string service_if_name = "Service";
+ if (style == "CobCl") {
+ // Forward declare the client.
+ string client_name = service_name_ + "CobClient";
+@@ -1764,13 +2060,15 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+ }
+
+ string extends = "";
+- if (tservice->get_extends() != NULL) {
+- extends = " : virtual public " + type_name(tservice->get_extends()) + style + "If";
++ if (tservice->get_extends()) {
++ extends = " : virtual public " + type_name(tservice->get_extends()) + style + "::Service";
+ if (style == "CobCl" && gen_templates_) {
+ // TODO(simpkins): If gen_templates_ is enabled, we currently assume all
+ // parent services were also generated with templates enabled.
+ extends += "T<Protocol_>";
+ }
++ } else {
++ extends = " : public ::grpc::Service";
+ }
+
+ if (style == "CobCl" && gen_templates_) {
+@@ -1778,7 +2076,9 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+ }
+ f_header_ << "class " << service_if_name << extends << " {" << endl << " public:" << endl;
+ indent_up();
+- f_header_ << indent() << "virtual ~" << service_if_name << "() {}" << endl;
++
++ f_header_ << indent() << "Service();" << endl;
++ f_header_ << indent() << "virtual ~Service();" << endl;
+
+ vector<t_function*> functions = tservice->get_functions();
+ vector<t_function*>::iterator f_iter;
+@@ -1786,7 +2086,12 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+ if ((*f_iter)->has_doc())
+ f_header_ << endl;
+ generate_java_doc(f_header_, *f_iter);
+- f_header_ << indent() << "virtual " << function_signature(*f_iter, style) << " = 0;" << endl;
++
++ string function_name = (*f_iter)->get_name();
++ f_header_ <<
++ indent() << "virtual ::grpc::Status " << function_name <<
++ "(::grpc::ServerContext* context, const "<< function_name <<
++ "Req* request, "<< function_name << "Resp* response);" << endl;
+ }
+ indent_down();
+ f_header_ << "};" << endl << endl;
+@@ -1797,6 +2102,66 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty
+ f_header_ << "typedef " << service_if_name << "< ::apache::thrift::protocol::TProtocol> "
+ << service_name_ << style << "If;" << endl << endl;
+ }
++
++ // generate the service interface implementations
++
++ f_service_ <<
++ endl <<
++ service_name_ << "::Service::Service() {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "(void)" << service_name_ << "_method_names;" << endl;
++ uint32_t i=0;
++ for(i=0;i<functions.size(); i++) {
++ string function_name = functions[i]->get_name();
++ f_service_ <<
++ endl <<
++ indent() << "AddMethod(new ::grpc::RpcServiceMethod(" << endl;
++ indent_up();
++
++ f_service_ <<
++ indent() << service_name_ << "_method_names[" << i << "]," << endl <<
++ indent() << "::grpc::RpcMethod::NORMAL_RPC," << endl <<
++ indent() << "new ::grpc::RpcMethodHandler< " << service_name_ << "::Service, " <<
++ service_name_ << "::" << function_name << "Req, " << service_name_ << "::" <<
++ function_name << "Resp>(" << endl;
++
++ indent_up();
++ f_service_ <<
++ indent() << "std::mem_fn(&" << service_name_ << "::Service::" << function_name << "), this)));" << endl;
++
++ indent_down();
++ indent_down();
++ }
++
++ indent_down();
++ f_service_ <<
++ "}" << endl;
++
++ f_service_ <<
++ endl <<
++ service_name_ << "::Service::~Service() {" << endl <<
++ "}" << endl;
++
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ string function_name = (*f_iter)->get_name();
++ f_service_ <<
++ endl <<
++ "::grpc::Status " << service_name_ << "::Service::" << function_name <<
++ "(::grpc::ServerContext* context, const " << service_name_ << "::" << function_name <<
++ "Req* request, " << service_name_ << "::" << function_name << "Resp* response) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "(void) context;" << endl <<
++ indent() << "(void) request;" << endl <<
++ indent() << "(void) response;" << endl <<
++ indent() << "return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED,\"\");" << endl;
++ indent_down();
++
++ f_service_ <<
++ "}" << endl;
++ }
++
+ }
+
+ /**
+@@ -3095,7 +3460,7 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
+
+ std::ofstream& out = (gen_templates_ ? f_service_tcc_ : f_service_);
+
+- t_struct result(program_, tservice->get_name() + "_" + tfunction->get_name() + "_result");
++ t_struct result(program_, tfunction->get_name() + "Resp");
+ t_field success(tfunction->get_returntype(), "success", 0);
+ if (!tfunction->get_returntype()->is_void()) {
+ result.append(&success);
+@@ -3109,17 +3474,9 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function*
+ }
+
+ generate_struct_declaration(f_header_, &result, false);
+- generate_struct_definition(out, f_service_, &result, false);
++ generate_struct_definition(out, f_service_, &result, true);
+ generate_struct_reader(out, &result);
+ generate_struct_result_writer(out, &result);
+-
+- result.set_name(tservice->get_name() + "_" + tfunction->get_name() + "_presult");
+- generate_struct_declaration(f_header_, &result, false, true, true, gen_cob_style_);
+- generate_struct_definition(out, f_service_, &result, false);
+- generate_struct_reader(out, &result, true);
+- if (gen_cob_style_) {
+- generate_struct_writer(out, &result, true);
+- }
+ }
+
+ /**
+@@ -3162,8 +3519,8 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+ << endl;
+ scope_up(out);
+
+- string argsname = tservice->get_name() + "_" + tfunction->get_name() + "_args";
+- string resultname = tservice->get_name() + "_" + tfunction->get_name() + "_result";
++ string argsname = tfunction->get_name() + "Req";
++ string resultname = tfunction->get_name() + "Resp";
+
+ if (tfunction->is_oneway() && !unnamed_oprot_seqid) {
+ out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
+@@ -3320,7 +3677,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+ out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
+ }
+
+- out << indent() << tservice->get_name() + "_" + tfunction->get_name() << "_args args;" << endl
++ out << indent() << tfunction->get_name() << "Req args;" << endl
+ << indent() << "void* ctx = NULL;" << endl << indent()
+ << "if (this->eventHandler_.get() != NULL) {" << endl << indent()
+ << " ctx = this->eventHandler_->getContext(" << service_func_name << ", NULL);" << endl
+@@ -3487,7 +3844,7 @@ void t_cpp_generator::generate_process_function(t_service* tservice,
+ << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl;
+
+ // Throw the TDelayedException, and catch the result
+- out << indent() << tservice->get_name() << "_" << tfunction->get_name() << "_result result;"
++ out << indent() << tfunction->get_name() << "Resp result;"
+ << endl << endl << indent() << "try {" << endl;
+ indent_up();
+ out << indent() << "_throw->throw_it();" << endl << indent() << "return cob(false);"
+diff --git a/tutorial/cpp/CMakeLists.txt b/tutorial/cpp/CMakeLists.txt
+deleted file mode 100644
+index 8a3d085..0000000
+--- a/tutorial/cpp/CMakeLists.txt
++++ /dev/null
+@@ -1,53 +0,0 @@
+-#
+-# Licensed to the Apache Software Foundation (ASF) under one
+-# or more contributor license agreements. See the NOTICE file
+-# distributed with this work for additional information
+-# regarding copyright ownership. The ASF licenses this file
+-# to you under the Apache License, Version 2.0 (the
+-# "License"); you may not use this file except in compliance
+-# with the License. You may obtain a copy of the License at
+-#
+-# http://www.apache.org/licenses/LICENSE-2.0
+-#
+-# Unless required by applicable law or agreed to in writing,
+-# software distributed under the License is distributed on an
+-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-# KIND, either express or implied. See the License for the
+-# specific language governing permissions and limitations
+-# under the License.
+-#
+-
+-find_package(Boost 1.53.0 REQUIRED)
+-include_directories(SYSTEM "${Boost_INCLUDE_DIRS}")
+-
+-#Make sure gen-cpp files can be included
+-include_directories("${CMAKE_CURRENT_BINARY_DIR}")
+-include_directories("${CMAKE_CURRENT_BINARY_DIR}/gen-cpp")
+-include_directories("${PROJECT_SOURCE_DIR}/lib/cpp/src")
+-
+-include(ThriftMacros)
+-
+-set(tutorialgencpp_SOURCES
+- gen-cpp/Calculator.cpp
+- gen-cpp/SharedService.cpp
+- gen-cpp/shared_constants.cpp
+- gen-cpp/shared_types.cpp
+- gen-cpp/tutorial_constants.cpp
+- gen-cpp/tutorial_types.cpp
+-)
+-add_library(tutorialgencpp STATIC ${tutorialgencpp_SOURCES})
+-LINK_AGAINST_THRIFT_LIBRARY(tutorialgencpp thrift)
+-
+-add_custom_command(OUTPUT gen-cpp/Calculator.cpp gen-cpp/SharedService.cpp gen-cpp/shared_constants.cpp gen-cpp/shared_types.cpp gen-cpp/tutorial_constants.cpp gen-cpp/tutorial_types.cpp
+- COMMAND ${THRIFT_COMPILER} --gen cpp -r ${PROJECT_SOURCE_DIR}/tutorial/tutorial.thrift
+-)
+-
+-add_executable(TutorialServer CppServer.cpp)
+-target_link_libraries(TutorialServer tutorialgencpp)
+-LINK_AGAINST_THRIFT_LIBRARY(TutorialServer thrift)
+-target_link_libraries(TutorialServer ${ZLIB_LIBRARIES})
+-
+-add_executable(TutorialClient CppClient.cpp)
+-target_link_libraries(TutorialClient tutorialgencpp)
+-LINK_AGAINST_THRIFT_LIBRARY(TutorialClient thrift)
+-target_link_libraries(TutorialClient ${ZLIB_LIBRARIES})
+diff --git a/tutorial/cpp/CppClient.cpp b/tutorial/cpp/CppClient.cpp
+deleted file mode 100644
+index 2763fee..0000000
+--- a/tutorial/cpp/CppClient.cpp
++++ /dev/null
+@@ -1,80 +0,0 @@
+-/*
+- * Licensed to the Apache Software Foundation (ASF) under one
+- * or more contributor license agreements. See the NOTICE file
+- * distributed with this work for additional information
+- * regarding copyright ownership. The ASF licenses this file
+- * to you under the Apache License, Version 2.0 (the
+- * "License"); you may not use this file except in compliance
+- * with the License. You may obtain a copy of the License at
+- *
+- * http://www.apache.org/licenses/LICENSE-2.0
+- *
+- * Unless required by applicable law or agreed to in writing,
+- * software distributed under the License is distributed on an
+- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+- * KIND, either express or implied. See the License for the
+- * specific language governing permissions and limitations
+- * under the License.
+- */
+-
+-#include <iostream>
+-
+-#include <thrift/protocol/TBinaryProtocol.h>
+-#include <thrift/transport/TSocket.h>
+-#include <thrift/transport/TTransportUtils.h>
+-
+-#include "../gen-cpp/Calculator.h"
+-
+-using namespace std;
+-using namespace apache::thrift;
+-using namespace apache::thrift::protocol;
+-using namespace apache::thrift::transport;
+-
+-using namespace tutorial;
+-using namespace shared;
+-
+-int main() {
+- boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090));
+- boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
+- boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
+- CalculatorClient client(protocol);
+-
+- try {
+- transport->open();
+-
+- client.ping();
+- cout << "ping()" << endl;
+-
+- cout << "1 + 1 = " << client.add(1, 1) << endl;
+-
+- Work work;
+- work.op = Operation::DIVIDE;
+- work.num1 = 1;
+- work.num2 = 0;
+-
+- try {
+- client.calculate(1, work);
+- cout << "Whoa? We can divide by zero!" << endl;
+- } catch (InvalidOperation& io) {
+- cout << "InvalidOperation: " << io.why << endl;
+- // or using generated operator<<: cout << io << endl;
+- // or by using std::exception native method what(): cout << io.what() << endl;
+- }
+-
+- work.op = Operation::SUBTRACT;
+- work.num1 = 15;
+- work.num2 = 10;
+- int32_t diff = client.calculate(1, work);
+- cout << "15 - 10 = " << diff << endl;
+-
+- // Note that C++ uses return by reference for complex types to avoid
+- // costly copy construction
+- SharedStruct ss;
+- client.getStruct(ss, 1);
+- cout << "Received log: " << ss << endl;
+-
+- transport->close();
+- } catch (TException& tx) {
+- cout << "ERROR: " << tx.what() << endl;
+- }
+-}
+diff --git a/tutorial/cpp/CppServer.cpp b/tutorial/cpp/CppServer.cpp
+deleted file mode 100644
+index eafffa9..0000000
+--- a/tutorial/cpp/CppServer.cpp
++++ /dev/null
+@@ -1,181 +0,0 @@
+-/*
+- * Licensed to the Apache Software Foundation (ASF) under one
+- * or more contributor license agreements. See the NOTICE file
+- * distributed with this work for additional information
+- * regarding copyright ownership. The ASF licenses this file
+- * to you under the Apache License, Version 2.0 (the
+- * "License"); you may not use this file except in compliance
+- * with the License. You may obtain a copy of the License at
+- *
+- * http://www.apache.org/licenses/LICENSE-2.0
+- *
+- * Unless required by applicable law or agreed to in writing,
+- * software distributed under the License is distributed on an
+- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+- * KIND, either express or implied. See the License for the
+- * specific language governing permissions and limitations
+- * under the License.
+- */
+-
+-#include <thrift/concurrency/ThreadManager.h>
+-#include <thrift/concurrency/PlatformThreadFactory.h>
+-#include <thrift/protocol/TBinaryProtocol.h>
+-#include <thrift/server/TSimpleServer.h>
+-#include <thrift/server/TThreadPoolServer.h>
+-#include <thrift/server/TThreadedServer.h>
+-#include <thrift/transport/TServerSocket.h>
+-#include <thrift/transport/TSocket.h>
+-#include <thrift/transport/TTransportUtils.h>
+-#include <thrift/TToString.h>
+-
+-#include <boost/make_shared.hpp>
+-
+-#include <iostream>
+-#include <stdexcept>
+-#include <sstream>
+-
+-#include "../gen-cpp/Calculator.h"
+-
+-using namespace std;
+-using namespace apache::thrift;
+-using namespace apache::thrift::concurrency;
+-using namespace apache::thrift::protocol;
+-using namespace apache::thrift::transport;
+-using namespace apache::thrift::server;
+-
+-using namespace tutorial;
+-using namespace shared;
+-
+-class CalculatorHandler : public CalculatorIf {
+-public:
+- CalculatorHandler() {}
+-
+- void ping() { cout << "ping()" << endl; }
+-
+- int32_t add(const int32_t n1, const int32_t n2) {
+- cout << "add(" << n1 << ", " << n2 << ")" << endl;
+- return n1 + n2;
+- }
+-
+- int32_t calculate(const int32_t logid, const Work& work) {
+- cout << "calculate(" << logid << ", " << work << ")" << endl;
+- int32_t val;
+-
+- switch (work.op) {
+- case Operation::ADD:
+- val = work.num1 + work.num2;
+- break;
+- case Operation::SUBTRACT:
+- val = work.num1 - work.num2;
+- break;
+- case Operation::MULTIPLY:
+- val = work.num1 * work.num2;
+- break;
+- case Operation::DIVIDE:
+- if (work.num2 == 0) {
+- InvalidOperation io;
+- io.whatOp = work.op;
+- io.why = "Cannot divide by 0";
+- throw io;
+- }
+- val = work.num1 / work.num2;
+- break;
+- default:
+- InvalidOperation io;
+- io.whatOp = work.op;
+- io.why = "Invalid Operation";
+- throw io;
+- }
+-
+- SharedStruct ss;
+- ss.key = logid;
+- ss.value = to_string(val);
+-
+- log[logid] = ss;
+-
+- return val;
+- }
+-
+- void getStruct(SharedStruct& ret, const int32_t logid) {
+- cout << "getStruct(" << logid << ")" << endl;
+- ret = log[logid];
+- }
+-
+- void zip() { cout << "zip()" << endl; }
+-
+-protected:
+- map<int32_t, SharedStruct> log;
+-};
+-
+-/*
+- CalculatorIfFactory is code generated.
+- CalculatorCloneFactory is useful for getting access to the server side of the
+- transport. It is also useful for making per-connection state. Without this
+- CloneFactory, all connections will end up sharing the same handler instance.
+-*/
+-class CalculatorCloneFactory : virtual public CalculatorIfFactory {
+- public:
+- virtual ~CalculatorCloneFactory() {}
+- virtual CalculatorIf* getHandler(const ::apache::thrift::TConnectionInfo& connInfo)
+- {
+- boost::shared_ptr<TSocket> sock = boost::dynamic_pointer_cast<TSocket>(connInfo.transport);
+- cout << "Incoming connection\n";
+- cout << "\tSocketInfo: " << sock->getSocketInfo() << "\n";
+- cout << "\tPeerHost: " << sock->getPeerHost() << "\n";
+- cout << "\tPeerAddress: " << sock->getPeerAddress() << "\n";
+- cout << "\tPeerPort: " << sock->getPeerPort() << "\n";
+- return new CalculatorHandler;
+- }
+- virtual void releaseHandler( ::shared::SharedServiceIf* handler) {
+- delete handler;
+- }
+-};
+-
+-int main() {
+- TThreadedServer server(
+- boost::make_shared<CalculatorProcessorFactory>(boost::make_shared<CalculatorCloneFactory>()),
+- boost::make_shared<TServerSocket>(9090), //port
+- boost::make_shared<TBufferedTransportFactory>(),
+- boost::make_shared<TBinaryProtocolFactory>());
+-
+- /*
+- // if you don't need per-connection state, do the following instead
+- TThreadedServer server(
+- boost::make_shared<CalculatorProcessor>(boost::make_shared<CalculatorHandler>()),
+- boost::make_shared<TServerSocket>(9090), //port
+- boost::make_shared<TBufferedTransportFactory>(),
+- boost::make_shared<TBinaryProtocolFactory>());
+- */
+-
+- /**
+- * Here are some alternate server types...
+-
+- // This server only allows one connection at a time, but spawns no threads
+- TSimpleServer server(
+- boost::make_shared<CalculatorProcessor>(boost::make_shared<CalculatorHandler>()),
+- boost::make_shared<TServerSocket>(9090),
+- boost::make_shared<TBufferedTransportFactory>(),
+- boost::make_shared<TBinaryProtocolFactory>());
+-
+- const int workerCount = 4;
+-
+- boost::shared_ptr<ThreadManager> threadManager =
+- ThreadManager::newSimpleThreadManager(workerCount);
+- threadManager->threadFactory(
+- boost::make_shared<PlatformThreadFactory>());
+- threadManager->start();
+-
+- // This server allows "workerCount" connection at a time, and reuses threads
+- TThreadPoolServer server(
+- boost::make_shared<CalculatorProcessorFactory>(boost::make_shared<CalculatorCloneFactory>()),
+- boost::make_shared<TServerSocket>(9090),
+- boost::make_shared<TBufferedTransportFactory>(),
+- boost::make_shared<TBinaryProtocolFactory>(),
+- threadManager);
+- */
+-
+- cout << "Starting the server..." << endl;
+- server.serve();
+- cout << "Done." << endl;
+- return 0;
+-}
+diff --git a/tutorial/cpp/GriftClient.cpp b/tutorial/cpp/GriftClient.cpp
+new file mode 100644
+index 0000000..647a683
+--- /dev/null
++++ b/tutorial/cpp/GriftClient.cpp
+@@ -0,0 +1,93 @@
++/*
++ *
++ * Copyright 2016, 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.
++ *
++ */
++
++#include <iostream>
++#include <memory>
++#include <string>
++
++#include <grpc++/grpc++.h>
++
++#include "gen-cpp/Greeter.grpc.thrift.h"
++
++using grpc::Channel;
++using grpc::ClientContext;
++using grpc::Status;
++using test::Greeter;
++
++class GreeterClient {
++ public:
++ GreeterClient(std::shared_ptr<Channel> channel)
++ : stub_(Greeter::NewStub(channel)) {}
++
++ // Assembles the client's payload, sends it and presents the response back
++ // from the server.
++ std::string SayHello(const std::string& user) {
++ // Data we are sending to the server.
++ Greeter::SayHelloReq req;
++ req.request.name = user;
++
++ // Container for the data we expect from the server.
++ Greeter::SayHelloResp reply;
++
++ // Context for the client. It could be used to convey extra information to
++ // the server and/or tweak certain RPC behaviors.
++ ClientContext context;
++
++ // The actual RPC.
++ Status status = stub_->SayHello(&context, req, &reply);
++
++ // Act upon its status.
++ if (status.ok()) {
++ return reply.success.message;
++ } else {
++ return "RPC failed";
++ }
++ }
++
++ private:
++ std::unique_ptr<Greeter::Stub> stub_;
++};
++
++int main() {
++ // Instantiate the client. It requires a channel, out of which the actual RPCs
++ // are created. This channel models a connection to an endpoint (in this case,
++ // localhost at port 50051). We indicate that the channel isn't authenticated
++ // (use of InsecureChannelCredentials()).
++ GreeterClient greeter(grpc::CreateChannel(
++ "localhost:50051", grpc::InsecureChannelCredentials()));
++ std::string user("world");
++ std::string reply = greeter.SayHello(user);
++ std::cout << "Greeter received: " << reply << std::endl;
++
++ return 0;
++}
+diff --git a/tutorial/cpp/GriftServer.cpp b/tutorial/cpp/GriftServer.cpp
+new file mode 100644
+index 0000000..7c01606
+--- /dev/null
++++ b/tutorial/cpp/GriftServer.cpp
+@@ -0,0 +1,93 @@
++/*
++ *
++ * Copyright 2016, 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.
++ *
++ */
++
++#include <iostream>
++#include <memory>
++#include <string>
++
++#include <grpc++/grpc++.h>
++
++#include "gen-cpp/Greeter.grpc.thrift.h"
++#include <grpc++/server_builder.h>
++
++using grpc::Server;
++using grpc::ServerBuilder;
++using grpc::ServerContext;
++using grpc::Status;
++using test::Greeter;
++
++// Logic and data behind the server's behavior.
++class GreeterServiceImpl final : public Greeter::Service {
++ public:
++ ~GreeterServiceImpl() {
++ // shutdown server
++ server->Shutdown();
++ }
++
++ Status SayHello(ServerContext* context,const Greeter::SayHelloReq* request,
++ Greeter::SayHelloResp* reply) override {
++ std::string prefix("Hello ");
++
++ reply->success.message = prefix + request->request.name;
++
++ return Status::OK;
++ }
++
++ void RunServer() {
++ std::string server_address("0.0.0.0:50051");
++
++ ServerBuilder builder;
++ // Listen on the given address without any authentication mechanism.
++ builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
++ // Register "service" as the instance through which we'll communicate with
++ // clients. In this case it corresponds to an *synchronous* service.
++ builder.RegisterService(this);
++ // Finally assemble the server.
++ server = builder.BuildAndStart();
++ std::cout << "Server listening on " << server_address << std::endl;
++
++ // Wait for the server to shutdown. Note that some other thread must be
++ // responsible for shutting down the server for this call to ever return.
++ server->Wait();
++ }
++
++ private:
++ std::unique_ptr<Server> server;
++};
++
++int main() {
++ GreeterServiceImpl service;
++ service.RunServer();
++
++ return 0;
++}
+diff --git a/tutorial/cpp/Makefile.am b/tutorial/cpp/Makefile.am
+index 184a69d..6f91e28 100755
+--- a/tutorial/cpp/Makefile.am
++++ b/tutorial/cpp/Makefile.am
+@@ -18,44 +18,38 @@
+ #
+ AUTOMAKE_OPTIONS = subdir-objects serial-tests
+
+-BUILT_SOURCES = gen-cpp/shared_types.cpp \
+- gen-cpp/tutorial_types.cpp
++BUILT_SOURCES = gen-cpp/test_types.cpp
+
+-noinst_LTLIBRARIES = libtutorialgencpp.la
+-nodist_libtutorialgencpp_la_SOURCES = \
+- gen-cpp/Calculator.cpp \
+- gen-cpp/Calculator.h \
+- gen-cpp/SharedService.cpp \
+- gen-cpp/SharedService.h \
+- gen-cpp/shared_constants.cpp \
+- gen-cpp/shared_constants.h \
+- gen-cpp/shared_types.cpp \
+- gen-cpp/shared_types.h \
+- gen-cpp/tutorial_constants.cpp \
+- gen-cpp/tutorial_constants.h \
+- gen-cpp/tutorial_types.cpp \
+- gen-cpp/tutorial_types.h
++#noinst_LTLIBRARIES = libtutorialgencpp.la
++noinst_LTLIBRARIES = libtestgencpp.la
++nodist_libtestgencpp_la_SOURCES = \
++ gen-cpp/Greeter.grpc.thrift.cpp \
++ gen-cpp/Greeter.grpc.thrift.h \
++ gen-cpp/test_constants.cpp \
++ gen-cpp/test_constants.h \
++ gen-cpp/test_types.cpp \
++ gen-cpp/test_types.h
+
+
+
+-libtutorialgencpp_la_LIBADD = $(top_builddir)/lib/cpp/libthrift.la
++libtestgencpp_la_LIBADD = $(top_builddir)/lib/cpp/libthrift.la
+
+ noinst_PROGRAMS = \
+- TutorialServer \
+- TutorialClient
++ TestServer \
++ TestClient
+
+-TutorialServer_SOURCES = \
+- CppServer.cpp
++TestServer_SOURCES = \
++ GriftServer.cpp
+
+-TutorialServer_LDADD = \
+- libtutorialgencpp.la \
++TestServer_LDADD = \
++ libtestgencpp.la \
+ $(top_builddir)/lib/cpp/libthrift.la
+
+-TutorialClient_SOURCES = \
+- CppClient.cpp
++TestClient_SOURCES = \
++ GriftClient.cpp
+
+-TutorialClient_LDADD = \
+- libtutorialgencpp.la \
++TestClient_LDADD = \
++ libtestgencpp.la \
+ $(top_builddir)/lib/cpp/libthrift.la
+
+ #
+@@ -63,26 +57,26 @@ TutorialClient_LDADD = \
+ #
+ THRIFT = $(top_builddir)/compiler/cpp/thrift
+
+-gen-cpp/Calculator.cpp gen-cpp/SharedService.cpp gen-cpp/shared_constants.cpp gen-cpp/shared_types.cpp gen-cpp/tutorial_constants.cpp gen-cpp/tutorial_types.cpp: $(top_srcdir)/tutorial/tutorial.thrift
++gen-cpp/Greeter.grpc.thrift.cpp gen-cpp/test_constants.cpp gen-cpp/test_types.cpp: $(top_srcdir)/tutorial/cpp/test.thrift
+ $(THRIFT) --gen cpp -r $<
+
+ AM_CPPFLAGS = $(BOOST_CPPFLAGS) $(LIBEVENT_CPPFLAGS) -I$(top_srcdir)/lib/cpp/src -Igen-cpp
+ AM_CXXFLAGS = -Wall -Wextra -pedantic
+-AM_LDFLAGS = $(BOOST_LDFLAGS) $(LIBEVENT_LDFLAGS)
++AM_LDFLAGS = $(BOOST_LDFLAGS) $(LIBEVENT_LDFLAGS) `pkg-config --libs grpc++ grpc` -lpthread -ldl -lgrpc
+
+ clean-local:
+- $(RM) gen-cpp/*
++ $(RM) -r gen-cpp
+
+-tutorialserver: all
+- ./TutorialServer
++testserver: all
++ ./TestServer
+
+-tutorialclient: all
+- ./TutorialClient
++testclient: all
++ ./TestClient
+
+ style-local:
+ $(CPPSTYLE_CMD)
+
+ EXTRA_DIST = \
+ CMakeLists.txt \
+- CppClient.cpp \
+- CppServer.cpp
++ GriftClient.cpp \
++ GriftServer.cpp
+diff --git a/tutorial/cpp/test.thrift b/tutorial/cpp/test.thrift
+new file mode 100644
+index 0000000..de3c9a4
+--- /dev/null
++++ b/tutorial/cpp/test.thrift
+@@ -0,0 +1,13 @@
++namespace cpp test
++
++struct HelloRequest {
++ 1:string name
++}
++
++struct HelloResponse {
++ 1:string message
++}
++
++service Greeter {
++ HelloResponse SayHello(1:HelloRequest request);
++}
+\ No newline at end of file
+--
+2.8.0.rc3.226.g39d4020
+
+
+From 3e4d75a2e2c474ee7700e7c9acaf89fdb768bedc Mon Sep 17 00:00:00 2001
+From: chedeti <chedeti@google.com>
+Date: Sun, 31 Jul 2016 16:23:53 -0700
+Subject: [PATCH 3/3] grpc java plugins generator
+
+for examples refer to https://github.com/grpc/grpc-java/tree/master/examples/thrift
+---
+ compiler/cpp/src/generate/t_java_generator.cc | 906 +++++++++++++++++++++++++-
+ tutorial/Makefile.am | 8 +-
+ 2 files changed, 887 insertions(+), 27 deletions(-)
+
+diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
+index 2db8cb8..8b28fe2 100644
+--- a/compiler/cpp/src/generate/t_java_generator.cc
++++ b/compiler/cpp/src/generate/t_java_generator.cc
+@@ -97,10 +97,10 @@ public:
+ } else if(iter->second.compare("suppress") == 0) {
+ suppress_generated_annotations_ = true;
+ } else {
+- throw "unknown option java:" + iter->first + "=" + iter->second;
++ throw "unknown option java:" + iter->first + "=" + iter->second;
+ }
+ } else {
+- throw "unknown option java:" + iter->first;
++ throw "unknown option java:" + iter->first;
+ }
+ }
+
+@@ -195,6 +195,17 @@ public:
+ void generate_service_async_server(t_service* tservice);
+ void generate_process_function(t_service* tservice, t_function* tfunction);
+ void generate_process_async_function(t_service* tservice, t_function* tfunction);
++ void generate_service_impl_base(t_service* tservice);
++ void generate_method_descriptors(t_service* tservice);
++ void generate_stub(t_service* tservice);
++ void generate_blocking_stub(t_service* tservice);
++ void generate_future_stub(t_service* tservice);
++ void generate_method_ids(t_service* tservice);
++ void generate_method_handlers(t_service* tservice);
++ void generate_service_descriptors(t_service* tservice);
++ void generate_service_builder(t_service* tservice);
++ void generate_arg_ids(t_service* tservice);
++ void generate_message_factory(t_service* tservice);
+
+ void generate_java_union(t_struct* tstruct);
+ void generate_union_constructor(ofstream& out, t_struct* tstruct);
+@@ -307,6 +318,8 @@ public:
+ std::string java_package();
+ std::string java_type_imports();
+ std::string java_suppressions();
++ std::string grpc_imports();
++ std::string import_extended_service(t_service* tservice);
+ std::string type_name(t_type* ttype,
+ bool in_container = false,
+ bool in_init = false,
+@@ -368,7 +381,7 @@ private:
+ bool use_option_type_;
+ bool undated_generated_annotations_;
+ bool suppress_generated_annotations_;
+-
++
+ };
+
+ /**
+@@ -456,6 +469,35 @@ string t_java_generator::java_suppressions() {
+ return "@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n";
+ }
+
++string t_java_generator::grpc_imports() {
++ return
++ string() +
++ "import static io.grpc.stub.ClientCalls.asyncUnaryCall;\n" +
++ "import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;\n" +
++ "import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;\n" +
++ "import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;\n" +
++ "import static io.grpc.stub.ClientCalls.blockingUnaryCall;\n" +
++ "import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;\n" +
++ "import static io.grpc.stub.ClientCalls.futureUnaryCall;\n" +
++ "import static io.grpc.MethodDescriptor.generateFullMethodName;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncUnaryCall;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;\n" +
++ "import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;\n" +
++ "import io.grpc.thrift.ThriftUtils;\n\n";
++}
++
++string t_java_generator::import_extended_service(t_service* tservice) {
++ if (!tservice) {
++ return string() + "\n";
++ }
++ string ns = tservice->get_program()->get_namespace("java");
++ string extend_service_name = tservice->get_name() + "Grpc";
++ return string() + "import " + ns + "." + extend_service_name + ";\n\n";
++}
++
+ /**
+ * Nothing in Java
+ */
+@@ -2772,25 +2814,51 @@ void t_java_generator::generate_field_value_meta_data(std::ofstream& out, t_type
+ */
+ void t_java_generator::generate_service(t_service* tservice) {
+ // Make output file
+- string f_service_name = package_dir_ + "/" + make_valid_java_filename(service_name_) + ".java";
++ string f_service_name = package_dir_ + "/" + make_valid_java_filename(service_name_) + "Grpc.java";
+ f_service_.open(f_service_name.c_str());
+
+- f_service_ << autogen_comment() << java_package() << java_type_imports() << java_suppressions();
++ f_service_ <<
++ autogen_comment() <<
++ java_package() <<
++ java_type_imports() <<
++ grpc_imports() <<
++ import_extended_service(tservice->get_extends());
++ java_suppressions();
++
++ f_service_ <<
++ "public class " << service_name_ << "Grpc {" << endl <<
++ endl;
+
+- if (!suppress_generated_annotations_) {
+- generate_javax_generated_annotation(f_service_);
+- }
+- f_service_ << "public class " << service_name_ << " {" << endl << endl;
+ indent_up();
+
++ // generate constructor
++ f_service_ <<
++ indent() << "private " << service_name_ <<
++ "Grpc() {}" << endl << endl;
++
++ f_service_ <<
++ indent() << "public static final String SERVICE_NAME = " <<
++ "\"" << package_name_ << "." << service_name_ << "\";" << endl << endl;
++
+ // Generate the three main parts of the service
+ generate_service_interface(tservice);
+- generate_service_async_interface(tservice);
+- generate_service_client(tservice);
+- generate_service_async_client(tservice);
+- generate_service_server(tservice);
+- generate_service_async_server(tservice);
++ generate_arg_ids(tservice);
++ generate_message_factory(tservice);
++ generate_service_impl_base(tservice);
++ //generate_service_async_interface(tservice);
++ //generate_service_client(tservice);
++ //generate_service_async_client(tservice);
++ //generate_service_server(tservice);
++ //generate_service_async_server(tservice);
+ generate_service_helpers(tservice);
++ generate_method_descriptors(tservice);
++ generate_stub(tservice);
++ generate_blocking_stub(tservice);
++ generate_future_stub(tservice);
++ generate_method_ids(tservice);
++ generate_method_handlers(tservice);
++ generate_service_descriptors(tservice);
++ generate_service_builder(tservice);
+
+ indent_down();
+ f_service_ << "}" << endl;
+@@ -2805,24 +2873,820 @@ void t_java_generator::generate_service(t_service* tservice) {
+ void t_java_generator::generate_service_interface(t_service* tservice) {
+ string extends = "";
+ string extends_iface = "";
+- if (tservice->get_extends() != NULL) {
+- extends = type_name(tservice->get_extends());
+- extends_iface = " extends " + extends + ".Iface";
+- }
+
+ generate_java_doc(f_service_, tservice);
+- f_service_ << indent() << "public interface Iface" << extends_iface << " {" << endl << endl;
++ f_service_ << indent() <<
++ "@java.lang.Deprecated public static interface " << service_name_;
++
++ if (tservice->get_extends()) {
++ f_service_ << " extends " << tservice->get_extends()->get_name() + "Grpc." <<
++ tservice->get_extends()->get_name() << endl;
++ }
++ f_service_ << " {" << endl;
++
++ indent_up();
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ //generate_java_doc(f_service_, *f_iter);
++ f_service_ <<
++ indent() << "public void " << (*f_iter)->get_name() << "(" << (*f_iter)->get_name() <<
++ "_args request," << endl <<
++ indent() << " io.grpc.stub.StreamObserver<" << (*f_iter)->get_name() <<
++ "_result> responseObserver);" << endl << endl;
++ }
++ indent_down();
++ f_service_ << indent() << "}" << endl << endl;
++}
++
++void t_java_generator::generate_arg_ids(t_service* tservice) {
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ int i=0;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ << indent() <<
++ "private static final int ARG_IN_METHOD_" <<
++ (*f_iter)->get_name() << " = " << ++i << ";" << endl;
++ f_service_ << indent() <<
++ "private static final int ARG_OUT_METHOD_" <<
++ (*f_iter)->get_name() << " = " << ++i << ";" << endl;
++ }
++ f_service_ << endl;
++
++ if (tservice->get_extends()) {
++ f_service_ << indent() << "// ARG IDs for extended service" << endl;
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ << indent() <<
++ "private static final int ARG_IN_METHOD_" <<
++ (*f_iter)->get_name() << " = " << ++i << ";" << endl;
++ f_service_ << indent() <<
++ "private static final int ARG_OUT_METHOD_" <<
++ (*f_iter)->get_name() << " = " << ++i << ";" << endl;
++ }
++ f_service_ << endl;
++ }
++}
++
++void t_java_generator::generate_message_factory(t_service* tservice) {
++ f_service_ << indent() <<
++ "private static final class ThriftMessageFactory<T extends " <<
++ "org.apache.thrift.TBase<T,?>>" << endl << indent() <<
++ " implements io.grpc.thrift.MessageFactory<T> {" << endl;
++ indent_up();
++ f_service_ << indent() <<
++ "private final int id;" << endl << endl;
++ f_service_ << endl;
++
++ f_service_ << indent() <<
++ "ThriftMessageFactory(int id) {" << endl <<
++ indent() << " this.id = id;" << endl <<
++ indent() << "}" << endl;
++
++ f_service_ << indent() <<
++ "@java.lang.Override" << endl <<
++ indent() << "public T newInstance() {" << endl;
++ indent_up();
++
++ f_service_ << indent() <<
++ "Object o;" << endl <<
++ indent() << "switch (id) {" << endl;
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ << indent() <<
++ "case ARG_IN_METHOD_" << (*f_iter)->get_name() << ":" << endl <<
++ indent() << " o = new " << (*f_iter)->get_name() << "_args();" <<
++ endl << indent() << " break;" << endl;
++ f_service_ << indent() <<
++ "case ARG_OUT_METHOD_" << (*f_iter)->get_name() << ":" << endl <<
++ indent() << " o = new " << (*f_iter)->get_name() << "_result();" <<
++ endl << indent() << " break;" << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for (f_iter = functions.begin(); f_iter!= functions.end(); ++f_iter) {
++ f_service_ << indent() <<
++ "case ARG_IN_METHOD_" << (*f_iter)->get_name() << ":" << endl <<
++ indent() << " o = new " << extend_service_name << "." << (*f_iter)->get_name() << "_args();" <<
++ endl << indent() << " break;" << endl;
++ f_service_ << indent() <<
++ "case ARG_OUT_METHOD_" << (*f_iter)->get_name() << ":" << endl <<
++ indent() << " o = new " << extend_service_name << "." << (*f_iter)->get_name() << "_result();" <<
++ endl << indent() << " break;" << endl;
++ }
++ }
++
++ f_service_ << indent() <<
++ "default:" << endl << indent() <<
++ " throw new AssertionError();" << endl << indent() <<
++ "}" << endl;
++
++ f_service_ << indent() <<
++ "@java.lang.SuppressWarnings(\"unchecked\")" << endl <<
++ indent() << "T t = (T) o;" << endl << indent() <<
++ "return t;" << endl;
++
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl;
++
++ indent_down();
++ f_service_ << indent() << "}" << endl;
++}
++
++void t_java_generator::generate_service_impl_base(t_service* tservice) {
++ f_service_ <<
++ indent() << "public static abstract class " << service_name_ <<
++ "ImplBase implements " << service_name_ << ", io.grpc.BindableService {" << endl;
++ indent_up();
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public void " << (*f_iter)->get_name() << "(" << (*f_iter)->get_name() <<
++ "_args request, " << endl <<
++ indent() << " io.grpc.stub.StreamObserver<" << (*f_iter)->get_name() <<
++ "_result> responseObserver) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "asyncUnimplementedUnaryCall(METHOD_" << (*f_iter)->get_name() <<
++ ", responseObserver);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc" ;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public void " << (*f_iter)->get_name() << "(" <<
++ extend_service_name << "." << (*f_iter)->get_name() <<
++ "_args request, " << endl <<
++ indent() << " io.grpc.stub.StreamObserver<" << extend_service_name
++ << "." << (*f_iter)->get_name() << "_result> responseObserver) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "asyncUnimplementedUnaryCall(METHOD_" << (*f_iter)->get_name() <<
++ ", responseObserver);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++ }
++
++ f_service_ <<
++ indent() << "@java.lang.Override" <<
++ " public io.grpc.ServerServiceDefinition bindService() {" << endl;
+ indent_up();
++ f_service_ <<
++ indent() << "return " << service_name_ << "Grpc.bindService(this);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Abstract Service
++ f_service_ <<
++ indent() << "@java.lang.Deprecated public static abstract class Abstract" << service_name_ <<
++ " extends " << service_name_ << "ImplBase {}" << endl << endl;
++}
++
++void t_java_generator::generate_method_descriptors(t_service* tservice) {
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for( f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "public static final io.grpc.MethodDescriptor<" <<
++ (*f_iter)->get_name() << "_args," << endl <<
++ indent() << " " << (*f_iter)->get_name() << "_result> METHOD_" << (*f_iter)->get_name() <<
++ " = " << endl << indent() << " io.grpc.MethodDescriptor.create(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " io.grpc.MethodDescriptor.MethodType.UNARY," << endl <<
++ indent() << " generateFullMethodName(" << "\"" << package_name_ << "." <<
++ service_name_ << "\" , \"" << (*f_iter)->get_name() << "\")," << endl <<
++ indent() << " io.grpc.thrift.ThriftUtils.marshaller(" << endl <<
++ indent() << " new ThriftMessageFactory<" << (*f_iter)->get_name() <<
++ "_args>( ARG_IN_METHOD_" << (*f_iter)->get_name() << "))," << endl <<
++ indent() << " io.grpc.thrift.ThriftUtils.marshaller(" << endl <<
++ indent() << " new ThriftMessageFactory<" << (*f_iter)->get_name() <<
++ "_result>( ARG_OUT_METHOD_" << (*f_iter)->get_name() << ")));" << endl << endl;
++ indent_down();
++ }
++
++ if(tservice->get_extends()) {
++ t_service* extends_service = tservice->get_extends();
++ functions = extends_service->get_functions();
++ string extend_service_name = extends_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "public static final io.grpc.MethodDescriptor<" << extend_service_name << "." <<
++ (*f_iter)->get_name() << "_args," << endl <<
++ indent() << " " << extend_service_name << "." << (*f_iter)->get_name() << "_result> METHOD_"
++ << (*f_iter)->get_name() << " = " << endl << indent() <<
++ " io.grpc.MethodDescriptor.create(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " io.grpc.MethodDescriptor.MethodType.UNARY," << endl <<
++ indent() << " generateFullMethodName(" << "\"" << package_name_ << "." <<
++ service_name_ << "\" , \"" << (*f_iter)->get_name() << "\")," << endl <<
++ indent() << " io.grpc.thrift.ThriftUtils.marshaller(" << endl <<
++ indent() << " new ThriftMessageFactory<" << extend_service_name << "." <<
++ (*f_iter)->get_name() << "_args>( ARG_IN_METHOD_" << (*f_iter)->get_name() << "))," << endl <<
++ indent() << " io.grpc.thrift.ThriftUtils.marshaller(" << endl <<
++ indent() << " new ThriftMessageFactory<" << extend_service_name << "." << (*f_iter)->get_name() <<
++ "_result>( ARG_OUT_METHOD_" << (*f_iter)->get_name() << ")));" << endl << endl;
++ indent_down();
++ }
++ }
++}
++
++void t_java_generator::generate_stub(t_service* tservice) {
++ f_service_ <<
++ indent() <<
++ "public static " << service_name_ <<
++ "Stub newStub(io.grpc.Channel channel) {" <<
++ endl;
++
++ indent_up();
++ f_service_ <<
++ indent() <<
++ "return new " << service_name_ << "Stub(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Stub impl
++
++ f_service_ <<
++ indent() << "public static class " <<
++ service_name_ << "Stub extends io.grpc.stub.AbstractStub<" <<
++ service_name_ << "Stub>" << endl <<
++ indent() << " implements " << service_name_ << "{" << endl;
++ indent_up();
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "Stub(io.grpc.Channel channel) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "Stub(io.grpc.Channel channel, " << endl <<
++ indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "protected " << service_name_ << "Stub build(io.grpc.Channel channel, " <<
++ endl << indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new " << service_name_ << "Stub(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public void " << (*f_iter)->get_name() << "(" <<
++ (*f_iter)->get_name() << "_args request," << endl << indent() <<
++ " io.grpc.stub.StreamObserver<" << (*f_iter)->get_name() <<
++ "_result> responseObserver) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "asyncUnaryCall(" << endl <<
++ indent() << " getChannel().newCall(METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions()), request, responseObserver);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public void " << (*f_iter)->get_name() << "(" <<
++ extend_service_name << "." << (*f_iter)->get_name() << "_args request,"
++ << endl << indent() << " io.grpc.stub.StreamObserver<" <<
++ extend_service_name << "." << (*f_iter)->get_name() <<
++ "_result> responseObserver) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "asyncUnaryCall(" << endl <<
++ indent() << " getChannel().newCall(METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions()), request, responseObserver);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++ }
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++}
++
++void t_java_generator::generate_blocking_stub(t_service* tservice) {
++ f_service_ <<
++ indent() << "public static " << service_name_ <<
++ "BlockingStub newBlockingStub(" << endl <<
++ indent() << " io.grpc.Channel channel) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new " << service_name_ << "BlockingStub(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Blocking Client
++ f_service_ <<
++ indent() << "@java.lang.Deprecated public static interface " << service_name_ <<
++ "BlockingClient " ;
++
++ if (tservice->get_extends()) {
++ string extend_service_name = tservice->get_extends()->get_name();
++ f_service_ << endl << indent() << " extends " << extend_service_name << "Grpc." <<
++ extend_service_name << "BlockingClient " ;
++ }
++
++ f_service_ << "{" << endl;
++
++ indent_up();
++
+ vector<t_function*> functions = tservice->get_functions();
+ vector<t_function*>::iterator f_iter;
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
+- generate_java_doc(f_service_, *f_iter);
+- indent(f_service_) << "public " << function_signature(*f_iter) << ";" << endl << endl;
++ f_service_ <<
++ indent() << "public " << (*f_iter)->get_name() << "_result " <<
++ (*f_iter)->get_name() << "(" << (*f_iter)->get_name() << "_args request);" << endl << endl;
++ }
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Blocking Stub impl
++
++ f_service_ <<
++ indent() << "public static class " <<
++ service_name_ << "BlockingStub extends io.grpc.stub.AbstractStub<" <<
++ service_name_ << "BlockingStub>" << endl <<
++ indent() << " implements " << service_name_ << "BlockingClient {";
++
++ indent_up();
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "BlockingStub(io.grpc.Channel channel) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "BlockingStub(io.grpc.Channel channel, " << endl <<
++ indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "protected " << service_name_ << "BlockingStub build(io.grpc.Channel channel, " <<
++ endl << indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new " << service_name_ << "BlockingStub(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public " << (*f_iter)->get_name() << "_result " << (*f_iter)->get_name() << "(" <<
++ (*f_iter)->get_name() << "_args request) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return blockingUnaryCall(" << endl <<
++ indent() << " getChannel(), METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions(), request);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public " << extend_service_name << "." << (*f_iter)->get_name() <<
++ "_result " << (*f_iter)->get_name() << "(" << extend_service_name << "." <<
++ (*f_iter)->get_name() << "_args request) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return blockingUnaryCall(" << endl <<
++ indent() << " getChannel(), METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions(), request);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++ }
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++}
++
++void t_java_generator::generate_future_stub(t_service* tservice) {
++ f_service_ <<
++ indent() << "public static " << service_name_ <<
++ "FutureStub newFutureStub(" << endl <<
++ indent() << " io.grpc.Channel channel) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new " << service_name_ << "FutureStub(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Future Client
++ f_service_ <<
++ indent() << "@java.lang.Deprecated public static interface " << service_name_ <<
++ "FutureClient " ;
++
++ if (tservice->get_extends()) {
++ string extend_service_name = tservice->get_extends()->get_name();
++ f_service_ << endl << indent() << " extends " << extend_service_name << "Grpc." <<
++ extend_service_name << "FutureClient " ;
++ }
++ f_service_ << "{" << endl;
++
++ indent_up();
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "public com.google.common.util.concurrent.ListenableFuture<" <<
++ (*f_iter)->get_name() << "_result> " << (*f_iter)->get_name() << "(" << endl <<
++ indent() << " " << (*f_iter)->get_name() << "_args request);" << endl << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "public com.google.common.util.concurrent.ListenableFuture<" <<
++ extend_service_name << "." << (*f_iter)->get_name() << "_result> " <<
++ (*f_iter)->get_name() << "(" << endl <<
++ indent() << " " << extend_service_name << "." << (*f_iter)->get_name() <<
++ "_args request);" << endl << endl;
++ }
++ }
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // generate Stub impl
++
++ f_service_ <<
++ indent() << "public static class " <<
++ service_name_ << "FutureStub extends io.grpc.stub.AbstractStub<" <<
++ service_name_ << "FutureStub>" << endl <<
++ indent() << " implements " << service_name_ << "FutureClient {" << endl;
++ indent_up();
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "FutureStub(io.grpc.Channel channel) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "private " << service_name_ << "FutureStub(io.grpc.Channel channel, " << endl <<
++ indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "super(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "protected " << service_name_ << "FutureStub build(io.grpc.Channel channel, " <<
++ endl << indent() << " io.grpc.CallOptions callOptions) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new " << service_name_ << "FutureStub(channel, callOptions);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ functions = tservice->get_functions();
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public com.google.common.util.concurrent.ListenableFuture<" <<
++ (*f_iter)->get_name() << "_result> " << (*f_iter)->get_name() << "(" <<
++ endl << indent() << " " << (*f_iter)->get_name() << "_args request) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return futureUnaryCall(" << endl <<
++ indent() << " getChannel().newCall(METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions()), request);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "public com.google.common.util.concurrent.ListenableFuture<" <<
++ extend_service_name << "." << (*f_iter)->get_name() << "_result> " <<
++ (*f_iter)->get_name() << "(" << endl << indent() << " " <<
++ extend_service_name << "." << (*f_iter)->get_name() << "_args request) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return futureUnaryCall(" << endl <<
++ indent() << " getChannel().newCall(METHOD_" << (*f_iter)->get_name() <<
++ ", getCallOptions()), request);" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++ }
++ }
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++}
++
++void t_java_generator::generate_method_ids(t_service* tservice) {
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ int i=0;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter, ++i) {
++ f_service_ <<
++ indent() << "private static final int METHODID_" <<
++ (*f_iter)->get_name() << " = " << i << ";" << endl;
++ }
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter, ++i) {
++ f_service_ <<
++ indent() << "private static final int METHODID_" <<
++ (*f_iter)->get_name() << " = " << i << ";" << endl;
++ }
++ }
++ f_service_ << endl;
++}
++
++void t_java_generator::generate_method_handlers(t_service* tservice) {
++ f_service_ <<
++ indent() << "private static class MethodHandlers<Req, Resp> implements" <<
++ endl << indent() << " io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>," <<
++ endl << indent() << " io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>," <<
++ endl << indent() << " io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>," <<
++ endl << indent() << " io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {" <<
++ endl;
++ indent_up();
++ f_service_ <<
++ indent() << "private final " << service_name_ << " serviceImpl;" << endl <<
++ indent() << "private final int methodId;" << endl << endl;
++
++ f_service_ <<
++ indent() << "public MethodHandlers(" << service_name_ << " serviceImpl, int " <<
++ "methodId) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "this.serviceImpl = serviceImpl;" << endl <<
++ indent() << "this.methodId = methodId;" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // invoke
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "@java.lang.SuppressWarnings(\"unchecked\")" << endl <<
++ indent() << "public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {" <<
++ endl;
++ indent_up();
++ f_service_ <<
++ indent() << "switch (methodId) {" << endl;
++ indent_up();
++
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "case METHODID_" << (*f_iter)->get_name() << ":" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "serviceImpl." << (*f_iter)->get_name() << "((" << (*f_iter)->get_name() <<
++ "_args) request," << endl <<
++ indent() << " (io.grpc.stub.StreamObserver<" << (*f_iter)->get_name() << "_result>)" <<
++ " responseObserver);" << endl <<
++ indent() << "break;" << endl << endl;
++ indent_down();
++ }
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "case METHODID_" << (*f_iter)->get_name() << ":" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "serviceImpl." << (*f_iter)->get_name() << "((" << extend_service_name <<
++ "." << (*f_iter)->get_name() << "_args) request," << endl <<
++ indent() << " (io.grpc.stub.StreamObserver<" << extend_service_name << "." <<
++ (*f_iter)->get_name() << "_result>)" << " responseObserver);" << endl <<
++ indent() << "break;" << endl << endl;
++ indent_down();
++ }
+ }
++ f_service_ <<
++ indent() << "default:" << endl <<
++ indent() << " throw new AssertionError();" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl;
++ indent_down();
++ f_service_ <<
++ indent() << "}" << endl << endl;
++
++ // invoke
++ f_service_ <<
++ indent() << "@java.lang.Override" << endl <<
++ indent() << "@java.lang.SuppressWarnings(\"unchecked\")" << endl <<
++ indent() << "public io.grpc.stub.StreamObserver<Req> invoke(" << endl <<
++ indent() << " io.grpc.stub.StreamObserver<Resp> responseObserver) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "switch (methodId) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "default:" << endl;
++ f_service_ <<
++ indent() << " throw new AssertionError();" << endl;
++ indent_down();
++ f_service_ << indent() << "}" << endl;
+ indent_down();
+ f_service_ << indent() << "}" << endl << endl;
++ indent_down();
++ f_service_ << indent() << "}" << endl << endl;
++
+ }
+
++void t_java_generator::generate_service_descriptors(t_service* tservice) {
++ // generate service descriptor
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ f_service_ <<
++ indent() << "public static io.grpc.ServiceDescriptor getServiceDescriptor() {" <<
++ endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return new io.grpc.ServiceDescriptor(SERVICE_NAME";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "," << endl <<
++ indent() << " METHOD_" << (*f_iter)->get_name();
++ }
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << "," << endl <<
++ indent() << " METHOD_" << (*f_iter)->get_name();
++ }
++ }
++ f_service_ << ");" << endl;
++ indent_down();
++ f_service_ << indent() << "}" << endl << endl;
++}
++
++void t_java_generator::generate_service_builder(t_service* tservice) {
++ // bind Service
++ vector<t_function*> functions = tservice->get_functions();
++ vector<t_function*>::iterator f_iter;
++ f_service_ <<
++ indent() << "@java.lang.Deprecated public static io.grpc.ServerServiceDefinition" <<
++ " bindService(" << endl <<
++ indent() << " final " << service_name_ << " serviceImpl) {" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << "return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())" <<
++ endl;
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << " .addMethod(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " METHOD_" << (*f_iter)->get_name() << "," << endl <<
++ indent() << " asyncUnaryCall(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " new MethodHandlers<" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " " << (*f_iter)->get_name() << "_args," << endl <<
++ indent() << " " << (*f_iter)->get_name() << "_result>(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " serviceImpl, METHODID_" << (*f_iter)->get_name() << ")))" << endl;
++ indent_down();
++ indent_down();
++ indent_down();
++ indent_down();
++ }
++
++ if (tservice->get_extends()) {
++ t_service* extend_service = tservice->get_extends();
++ functions = extend_service->get_functions();
++ string extend_service_name = extend_service->get_name() + "Grpc";
++ for(f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
++ f_service_ <<
++ indent() << " .addMethod(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " METHOD_" << (*f_iter)->get_name() << "," << endl <<
++ indent() << " asyncUnaryCall(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " new MethodHandlers<" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " " << extend_service_name << "." << (*f_iter)->get_name() << "_args," << endl <<
++ indent() << " " << extend_service_name << "." << (*f_iter)->get_name() << "_result>(" << endl;
++ indent_up();
++ f_service_ <<
++ indent() << " serviceImpl, METHODID_" << (*f_iter)->get_name() << ")))" << endl;
++ indent_down();
++ indent_down();
++ indent_down();
++ indent_down();
++ }
++ }
++ f_service_ <<
++ indent() << " .build();" << endl;
++ indent_down();
++ f_service_ << indent() << "}" << endl << endl;
++}
++
++
+ void t_java_generator::generate_service_async_interface(t_service* tservice) {
+ string extends = "";
+ string extends_iface = "";
+diff --git a/tutorial/Makefile.am b/tutorial/Makefile.am
+index 5865c54..1cffbe6 100755
+--- a/tutorial/Makefile.am
++++ b/tutorial/Makefile.am
+@@ -35,11 +35,6 @@ if WITH_D
+ SUBDIRS += d
+ endif
+
+-if WITH_JAVA
+-SUBDIRS += java
+-SUBDIRS += js
+-endif
+-
+ if WITH_PYTHON
+ SUBDIRS += py
+ SUBDIRS += py.twisted
+@@ -95,4 +90,5 @@ EXTRA_DIST = \
+ php \
+ shared.thrift \
+ tutorial.thrift \
+- README.md
++ README.md \
++ java
+--
+2.8.0.rc3.226.g39d4020
+
diff --git a/tools/jenkins/run_interop.sh b/tools/jenkins/run_interop.sh
index a424aea7fc..4a7bff3389 100755
--- a/tools/jenkins/run_interop.sh
+++ b/tools/jenkins/run_interop.sh
@@ -31,6 +31,8 @@
# This script is invoked by Jenkins and runs interop test suite.
set -ex
+export LANG=en_US.UTF-8
+
# Enter the gRPC repo root
cd $(dirname $0)/../..
diff --git a/tools/run_tests/artifact_targets.py b/tools/run_tests/artifact_targets.py
index 8550ee7b84..d36f963a7c 100644
--- a/tools/run_tests/artifact_targets.py
+++ b/tools/run_tests/artifact_targets.py
@@ -31,6 +31,8 @@
"""Definition of targets to build artifacts."""
import os.path
+import random
+import string
import sys
import jobset
@@ -79,27 +81,16 @@ _ARCH_FLAG_MAP = {
'x64': '-m64'
}
-python_windows_version_arch_map = {
- ('x86', '2.7'): 'Python27_32bits',
- ('x64', '2.7'): 'Python27',
- ('x86', '3.4'): 'Python34_32bits',
- ('x64', '3.4'): 'Python34',
-}
class PythonArtifact:
"""Builds Python artifacts."""
- def __init__(self, platform, arch, python_version, manylinux_build=None):
- if manylinux_build:
- self.name = 'python%s_%s_%s_%s' % (python_version, platform, arch, manylinux_build)
- else:
- self.name = 'python%s_%s_%s' % (python_version, platform, arch)
+ def __init__(self, platform, arch, py_version):
+ self.name = 'python_%s_%s_%s' % (platform, arch, py_version)
self.platform = platform
self.arch = arch
- self.labels = ['artifact', 'python', python_version, platform, arch]
- self.python_version = python_version
- self.python_windows_prefix = python_windows_version_arch_map[arch, python_version]
- self.manylinux_build = manylinux_build
+ self.labels = ['artifact', 'python', platform, arch, py_version]
+ self.py_version = py_version
def pre_build_jobspecs(self):
return []
@@ -111,8 +102,8 @@ class PythonArtifact:
environ['SETARCH_CMD'] = 'linux32'
# Inside the manylinux container, the python installations are located in
# special places...
- environ['PYTHON'] = '/opt/python/{}/bin/python'.format(self.manylinux_build)
- environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.manylinux_build)
+ environ['PYTHON'] = '/opt/python/{}/bin/python'.format(self.py_version)
+ environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.py_version)
# Platform autodetection for the manylinux1 image breaks so we set the
# defines ourselves.
# TODO(atash) get better platform-detection support in core so we don't
@@ -126,14 +117,24 @@ class PythonArtifact:
environ=environ,
timeout_seconds=60*60)
elif self.platform == 'windows':
+ if 'Python27' in self.py_version or 'Python34' in self.py_version:
+ environ['EXT_COMPILER'] = 'mingw32'
+ else:
+ environ['EXT_COMPILER'] = 'msvc'
+ # For some reason, the batch script %random% always runs with the same
+ # seed. We create a random temp-dir here
+ dir = ''.join(random.choice(string.ascii_uppercase) for _ in range(10))
return create_jobspec(self.name,
['tools\\run_tests\\build_artifact_python.bat',
- self.python_windows_prefix,
- '32' if self.arch == 'x86' else '64'
+ self.py_version,
+ '32' if self.arch == 'x86' else '64',
+ dir
],
+ environ=environ,
shell=True)
else:
- environ['PYTHON'] = 'python{}'.format(self.python_version)
+ environ['PYTHON'] = self.py_version
+ environ['SKIP_PIP_INSTALL'] = 'TRUE'
return create_jobspec(self.name,
['tools/run_tests/build_artifact_python.sh'],
environ=environ)
@@ -330,18 +331,23 @@ def targets():
for Cls in (CSharpExtArtifact, NodeExtArtifact, ProtocArtifact)
for platform in ('linux', 'macos', 'windows')
for arch in ('x86', 'x64')] +
- [PythonArtifact('linux', 'x86', '2.7', 'cp27-cp27m'),
- PythonArtifact('linux', 'x86', '2.7', 'cp27-cp27mu'),
- PythonArtifact('linux', 'x64', '2.7', 'cp27-cp27m'),
- PythonArtifact('linux', 'x64', '2.7', 'cp27-cp27mu'),
- PythonArtifact('macos', 'x64', '2.7'),
- PythonArtifact('windows', 'x86', '2.7'),
- PythonArtifact('windows', 'x64', '2.7'),
- PythonArtifact('linux', 'x86', '3.4', 'cp34-cp34m'),
- PythonArtifact('linux', 'x64', '3.4', 'cp34-cp34m'),
- PythonArtifact('macos', 'x64', '3.4'),
- PythonArtifact('windows', 'x86', '3.4'),
- PythonArtifact('windows', 'x64', '3.4'),
+ [PythonArtifact('linux', 'x86', 'cp27-cp27m'),
+ PythonArtifact('linux', 'x86', 'cp27-cp27mu'),
+ PythonArtifact('linux', 'x86', 'cp34-cp34m'),
+ PythonArtifact('linux', 'x86', 'cp35-cp35m'),
+ PythonArtifact('linux', 'x64', 'cp27-cp27m'),
+ PythonArtifact('linux', 'x64', 'cp27-cp27mu'),
+ PythonArtifact('linux', 'x64', 'cp34-cp34m'),
+ PythonArtifact('linux', 'x64', 'cp35-cp35m'),
+ PythonArtifact('macos', 'x64', 'python2.7'),
+ PythonArtifact('macos', 'x64', 'python3.4'),
+ PythonArtifact('macos', 'x64', 'python3.5'),
+ PythonArtifact('windows', 'x86', 'Python27_32bits'),
+ PythonArtifact('windows', 'x86', 'Python34_32bits'),
+ PythonArtifact('windows', 'x86', 'Python35_32bits'),
+ PythonArtifact('windows', 'x64', 'Python27'),
+ PythonArtifact('windows', 'x64', 'Python34'),
+ PythonArtifact('windows', 'x64', 'Python35'),
RubyArtifact('linux', 'x86'),
RubyArtifact('linux', 'x64'),
RubyArtifact('macos', 'x64'),
diff --git a/tools/run_tests/build_artifact_python.bat b/tools/run_tests/build_artifact_python.bat
index 074a3c6781..246713a6ce 100644
--- a/tools/run_tests/build_artifact_python.bat
+++ b/tools/run_tests/build_artifact_python.bat
@@ -36,31 +36,43 @@ pip install -rrequirements.txt
set GRPC_PYTHON_BUILD_WITH_CYTHON=1
+@rem Multiple builds are running simultaneously, so to avoid distutils
+@rem file collisions, we build everything in a tmp directory
+if not exist "artifacts" mkdir "artifacts"
+set ARTIFACT_DIR=%cd%\artifacts
+set BUILD_DIR=C:\Windows\Temp\pygrpc-%3\
+mkdir %BUILD_DIR%
+xcopy /s/e/q %cd%\* %BUILD_DIR%
+pushd %BUILD_DIR%
+
@rem Set up gRPC Python tools
python tools\distrib\python\make_grpcio_tools.py
@rem Build gRPC Python extensions
-python setup.py build_ext -c mingw32
+python setup.py build_ext -c %EXT_COMPILER% || goto :error
pushd tools\distrib\python\grpcio_tools
-python setup.py build_ext -c mingw32
+python setup.py build_ext -c %EXT_COMPILER% || goto :error
popd
-
@rem Build gRPC Python distributions
-python setup.py bdist_wheel
+python setup.py bdist_wheel || goto :error
pushd tools\distrib\python\grpcio_tools
-python setup.py bdist_wheel
+python setup.py bdist_wheel || goto :error
popd
-mkdir artifacts
-xcopy /Y /I /S dist\* artifacts\ || goto :error
-xcopy /Y /I /S tools\distrib\python\grpcio_tools\dist\* artifacts\ || goto :error
+xcopy /Y /I /S dist\* %ARTIFACT_DIR% || goto :error
+xcopy /Y /I /S tools\distrib\python\grpcio_tools\dist\* %ARTIFACT_DIR% || goto :error
+
+popd
+rmdir /s /q %BUILD_DIR%
goto :EOF
:error
+popd
+rmdir /s /q %BUILD_DIR%
exit /b 1
diff --git a/tools/run_tests/build_artifact_python.sh b/tools/run_tests/build_artifact_python.sh
index 8f8330ef24..9fed7c5028 100755
--- a/tools/run_tests/build_artifact_python.sh
+++ b/tools/run_tests/build_artifact_python.sh
@@ -38,38 +38,42 @@ export PYTHON=${PYTHON:-python}
export PIP=${PIP:-pip}
export AUDITWHEEL=${AUDITWHEEL:-auditwheel}
+# Because multiple builds run in parallel, some distutils file
+# operations may collide. To avoid this, each build is run in
+# a temp directory
+mkdir -p artifacts
+ARTIFACT_DIR="$PWD/artifacts"
+BUILD_DIR=`mktemp -d "${TMPDIR:-/tmp}/pygrpc.XXXXXX"`
+trap "rm -rf $BUILD_DIR" EXIT
+cp -r * "$BUILD_DIR"
+cd "$BUILD_DIR"
# Build the source distribution first because MANIFEST.in cannot override
# exclusion of built shared objects among package resources (for some
# inexplicable reason).
-${SETARCH_CMD} ${PYTHON} setup.py \
- sdist
+${SETARCH_CMD} ${PYTHON} setup.py sdist
# Wheel has a bug where directories don't get excluded.
# https://bitbucket.org/pypa/wheel/issues/99/cannot-exclude-directory
-${SETARCH_CMD} ${PYTHON} setup.py \
- bdist_wheel
+${SETARCH_CMD} ${PYTHON} setup.py bdist_wheel
# Build gRPC tools package distribution
${PYTHON} tools/distrib/python/make_grpcio_tools.py
# Build gRPC tools package source distribution
-${SETARCH_CMD} ${PYTHON} tools/distrib/python/grpcio_tools/setup.py \
- sdist
+${SETARCH_CMD} ${PYTHON} tools/distrib/python/grpcio_tools/setup.py sdist
# Build gRPC tools package binary distribution
-CFLAGS="$CFLAGS -fno-wrapv" ${SETARCH_CMD} \
- ${PYTHON} tools/distrib/python/grpcio_tools/setup.py bdist_wheel
+${SETARCH_CMD} ${PYTHON} tools/distrib/python/grpcio_tools/setup.py bdist_wheel
-mkdir -p artifacts
if [ "$BUILD_MANYLINUX_WHEEL" != "" ]
then
for wheel in dist/*.whl; do
- ${AUDITWHEEL} repair $wheel -w artifacts/
+ ${AUDITWHEEL} repair $wheel -w "$ARTIFACT_DIR"
rm $wheel
done
for wheel in tools/distrib/python/grpcio_tools/dist/*.whl; do
- ${AUDITWHEEL} repair $wheel -w artifacts/
+ ${AUDITWHEEL} repair $wheel -w "$ARTIFACT_DIR"
rm $wheel
done
fi
@@ -81,14 +85,14 @@ fi
if [ "$BUILD_HEALTH_CHECKING" != "" ]
then
${PIP} install -rrequirements.txt
- ${PIP} install grpcio --no-index --find-links "file://${PWD}/artifacts/"
- ${PIP} install grpcio-tools --no-index --find-links "file://${PWD}/artifacts/"
+ ${PIP} install grpcio --no-index --find-links "file://$ARTIFACT_DIR/"
+ ${PIP} install grpcio-tools --no-index --find-links "file://$ARTIFACT_DIR/"
# Build gRPC health check source distribution
${SETARCH_CMD} ${PYTHON} src/python/grpcio_health_checking/setup.py \
preprocess build_package_protos sdist
- cp -r src/python/grpcio_health_checking/dist/* artifacts
+ cp -r src/python/grpcio_health_checking/dist/* "$ARTIFACT_DIR"
fi
-cp -r dist/* artifacts
-cp -r tools/distrib/python/grpcio_tools/dist/* artifacts
+cp -r dist/* "$ARTIFACT_DIR"
+cp -r tools/distrib/python/grpcio_tools/dist/* "$ARTIFACT_DIR"
diff --git a/tools/run_tests/build_csharp_coreclr.sh b/tools/run_tests/build_csharp_coreclr.sh
index 733b1a2083..02cf0d39cb 100755
--- a/tools/run_tests/build_csharp_coreclr.sh
+++ b/tools/run_tests/build_csharp_coreclr.sh
@@ -35,4 +35,4 @@ cd $(dirname $0)/../../src/csharp
# TODO(jtattermusch): introduce caching
dotnet restore .
-dotnet build -f netstandard1.5 --configuration $MSBUILD_CONFIG '**/project.json'
+dotnet build --configuration $MSBUILD_CONFIG '**/project.json'
diff --git a/tools/run_tests/build_package_node.sh b/tools/run_tests/build_package_node.sh
index ef4a10cca7..a5636cf87a 100755
--- a/tools/run_tests/build_package_node.sh
+++ b/tools/run_tests/build_package_node.sh
@@ -49,7 +49,11 @@ cp grpc-*.tgz $artifacts/grpc.tgz
mkdir -p bin
-cd src/node/tools
+cd $base/src/node/health_check
+npm pack
+cp grpc-health-check-*.tgz $artifacts/
+
+cd $base/src/node/tools
npm update
npm pack
cp grpc-tools-*.tgz $artifacts/
diff --git a/tools/run_tests/build_python.sh b/tools/run_tests/build_python.sh
index 727b11e273..b786c479f3 100755
--- a/tools/run_tests/build_python.sh
+++ b/tools/run_tests/build_python.sh
@@ -111,6 +111,7 @@ TOOLCHAIN=${4:-$(toolchain)}
ROOT=`pwd`
export CFLAGS="-I$ROOT/include -std=gnu99 -fno-wrapv $CFLAGS"
export GRPC_PYTHON_BUILD_WITH_CYTHON=1
+export LANG=en_US.UTF-8
# Default python on the host to fall back to when instantiating e.g. the
# virtualenv.
diff --git a/tools/run_tests/build_stats_schema.json b/tools/run_tests/build_stats_schema.json
new file mode 100644
index 0000000000..021a349545
--- /dev/null
+++ b/tools/run_tests/build_stats_schema.json
@@ -0,0 +1,56 @@
+[
+ {
+ "name": "build_number",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "timestamp",
+ "type": "TIMESTAMP",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "matrix",
+ "type": "RECORD",
+ "mode": "REPEATED",
+ "fields": [
+ {
+ "name": "name",
+ "type": "STRING",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "duration",
+ "type": "FLOAT",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "pass_count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "failure_count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "error",
+ "type": "RECORD",
+ "mode": "REPEATED",
+ "fields": [
+ {
+ "name": "description",
+ "type": "STRING",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ }
+ ]
+ }
+ ]
+ }
+]
diff --git a/tools/run_tests/build_stats_schema_no_matrix.json b/tools/run_tests/build_stats_schema_no_matrix.json
new file mode 100644
index 0000000000..42650e3024
--- /dev/null
+++ b/tools/run_tests/build_stats_schema_no_matrix.json
@@ -0,0 +1,44 @@
+[
+ {
+ "name": "build_number",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "timestamp",
+ "type": "TIMESTAMP",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "duration",
+ "type": "FLOAT",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "pass_count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "failure_count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "error",
+ "type": "RECORD",
+ "mode": "REPEATED",
+ "fields": [
+ {
+ "name": "description",
+ "type": "STRING",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "count",
+ "type": "INTEGER",
+ "mode": "NULLABLE"
+ }
+ ]
+ }
+]
diff --git a/tools/run_tests/package_targets.py b/tools/run_tests/package_targets.py
index ce3f08dfbc..5e6de2e317 100644
--- a/tools/run_tests/package_targets.py
+++ b/tools/run_tests/package_targets.py
@@ -81,7 +81,14 @@ class CSharpPackage:
self.labels += ['windows']
def pre_build_jobspecs(self):
- return []
+ if 'windows' in self.labels:
+ return [create_jobspec('prebuild_%s' % self.name,
+ ['tools\\run_tests\\pre_build_csharp.bat'],
+ shell=True,
+ flake_retries=5,
+ timeout_retries=2)]
+ else:
+ return []
def build_jobspec(self):
if self.use_coreclr:
diff --git a/tools/run_tests/run_build_statistics.py b/tools/run_tests/run_build_statistics.py
new file mode 100755
index 0000000000..92c53782a8
--- /dev/null
+++ b/tools/run_tests/run_build_statistics.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python2.7
+# Copyright 2016, 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.
+
+"""Tool to get build statistics from Jenkins and upload to BigQuery."""
+
+import argparse
+import jenkinsapi
+from jenkinsapi.custom_exceptions import JenkinsAPIException
+from jenkinsapi.jenkins import Jenkins
+import json
+import os
+import re
+import sys
+import urllib
+
+
+gcp_utils_dir = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '../gcp/utils'))
+sys.path.append(gcp_utils_dir)
+import big_query_utils
+
+
+_HAS_MATRIX=True
+_PROJECT_ID = 'grpc-testing'
+_HAS_MATRIX = True
+_BUILDS = {'gRPC_master': _HAS_MATRIX,
+ 'gRPC_interop_master': not _HAS_MATRIX,
+ 'gRPC_pull_requests': _HAS_MATRIX,
+ 'gRPC_interop_pull_requests': not _HAS_MATRIX,
+}
+_URL_BASE = 'https://grpc-testing.appspot.com/job'
+_KNOWN_ERRORS = [
+ 'Failed to build workspace Tests with scheme AllTests',
+ 'Build timed out',
+ 'FATAL: Unable to produce a script file',
+ 'FAILED: Failed to build interop docker images',
+ 'LLVM ERROR: IO failure on output stream.',
+ 'MSBUILD : error MSB1009: Project file does not exist.',
+]
+_UNKNOWN_ERROR = 'Unknown error'
+_DATASET_ID = 'build_statistics'
+
+
+def _scrape_for_known_errors(html):
+ error_list = []
+ known_error_count = 0
+ for known_error in _KNOWN_ERRORS:
+ errors = re.findall(known_error, html)
+ this_error_count = len(errors)
+ if this_error_count > 0:
+ known_error_count += this_error_count
+ error_list.append({'description': known_error,
+ 'count': this_error_count})
+ print('====> %d failures due to %s' % (this_error_count, known_error))
+ return error_list, known_error_count
+
+
+def _get_last_processed_buildnumber(build_name):
+ query = 'SELECT max(build_number) FROM [%s:%s.%s];' % (
+ _PROJECT_ID, _DATASET_ID, build_name)
+ query_job = big_query_utils.sync_query_job(bq, _PROJECT_ID, query)
+ page = bq.jobs().getQueryResults(
+ pageToken=None,
+ **query_job['jobReference']).execute(num_retries=3)
+ if page['rows'][0]['f'][0]['v']:
+ return int(page['rows'][0]['f'][0]['v'])
+ return 0
+
+
+def _process_matrix(build, url_base):
+ matrix_list = []
+ for matrix in build.get_matrix_runs():
+ matrix_str = re.match('.*\\xc2\\xbb ((?:[^,]+,?)+) #.*',
+ matrix.name).groups()[0]
+ matrix_tuple = matrix_str.split(',')
+ json_url = '%s/config=%s,language=%s,platform=%s/testReport/api/json' % (
+ url_base, matrix_tuple[0], matrix_tuple[1], matrix_tuple[2])
+ console_url = '%s/config=%s,language=%s,platform=%s/consoleFull' % (
+ url_base, matrix_tuple[0], matrix_tuple[1], matrix_tuple[2])
+ matrix_dict = {'name': matrix_str,
+ 'duration': matrix.get_duration().total_seconds()}
+ matrix_dict.update(_process_build(json_url, console_url))
+ matrix_list.append(matrix_dict)
+
+ return matrix_list
+
+
+def _process_build(json_url, console_url):
+ build_result = {}
+ error_list = []
+ try:
+ html = urllib.urlopen(json_url).read()
+ test_result = json.loads(html)
+ print('====> Parsing result from %s' % json_url)
+ failure_count = test_result['failCount']
+ build_result['pass_count'] = test_result['passCount']
+ build_result['failure_count'] = failure_count
+ if failure_count > 0:
+ error_list, known_error_count = _scrape_for_known_errors(html)
+ unknown_error_count = failure_count - known_error_count
+ # This can happen if the same error occurs multiple times in one test.
+ if failure_count < known_error_count:
+ print('====> Some errors are duplicates.')
+ unknown_error_count = 0
+ error_list.append({'description': _UNKNOWN_ERROR,
+ 'count': unknown_error_count})
+ except Exception as e:
+ print('====> Got exception for %s: %s.' % (json_url, str(e)))
+ print('====> Parsing errors from %s.' % console_url)
+ html = urllib.urlopen(console_url).read()
+ build_result['pass_count'] = 0
+ build_result['failure_count'] = 1
+ error_list, _ = _scrape_for_known_errors(html)
+ if error_list:
+ error_list.append({'description': _UNKNOWN_ERROR, 'count': 0})
+ else:
+ error_list.append({'description': _UNKNOWN_ERROR, 'count': 1})
+
+ if error_list:
+ build_result['error'] = error_list
+
+ return build_result
+
+
+# parse command line
+argp = argparse.ArgumentParser(description='Get build statistics.')
+argp.add_argument('-u', '--username', default='jenkins')
+argp.add_argument('-b', '--builds',
+ choices=['all'] + sorted(_BUILDS.keys()),
+ nargs='+',
+ default=['all'])
+args = argp.parse_args()
+
+J = Jenkins('https://grpc-testing.appspot.com', args.username, 'apiToken')
+bq = big_query_utils.create_big_query()
+
+for build_name in _BUILDS.keys() if 'all' in args.builds else args.builds:
+ print('====> Build: %s' % build_name)
+ # Since get_last_completed_build() always fails due to malformatted string
+ # error, we use get_build_metadata() instead.
+ job = None
+ try:
+ job = J[build_name]
+ except Exception as e:
+ print('====> Failed to get build %s: %s.' % (build_name, str(e)))
+ continue
+ last_processed_build_number = _get_last_processed_buildnumber(build_name)
+ last_complete_build_number = job.get_last_completed_buildnumber()
+ # To avoid processing all builds for a project never looked at. In this case,
+ # only examine 10 latest builds.
+ starting_build_number = max(last_processed_build_number+1,
+ last_complete_build_number-9)
+ for build_number in xrange(starting_build_number,
+ last_complete_build_number+1):
+ print('====> Processing %s build %d.' % (build_name, build_number))
+ build = None
+ try:
+ build = job.get_build_metadata(build_number)
+ except KeyError:
+ print('====> Build %s is missing. Skip.' % build_number)
+ continue
+ build_result = {'build_number': build_number,
+ 'timestamp': str(build.get_timestamp())}
+ url_base = json_url = '%s/%s/%d' % (_URL_BASE, build_name, build_number)
+ if _BUILDS[build_name]: # The build has matrix, such as gRPC_master.
+ build_result['matrix'] = _process_matrix(build, url_base)
+ else:
+ json_url = '%s/testReport/api/json' % url_base
+ console_url = '%s/consoleFull' % url_base
+ build_result['duration'] = build.get_duration().total_seconds()
+ build_result.update(_process_build(json_url, console_url))
+ rows = [big_query_utils.make_row(build_number, build_result)]
+ if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET_ID, build_name,
+ rows):
+ print '====> Error uploading result to bigquery.'
+ sys.exit(1)
+
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index 78096b216c..0d402d67e5 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -662,7 +662,7 @@ argp.add_argument('--prod_servers',
'cloud_to_prod_auth tests against.'))
argp.add_argument('-s', '--server',
choices=['all'] + sorted(_SERVERS),
- action='append',
+ nargs='+',
help='Run cloud_to_cloud servers in a separate docker ' +
'image. Servers can only be started automatically if ' +
'--use_docker option is enabled.',
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 542415d908..78ef05b635 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -139,6 +139,53 @@ def _is_use_docker_child():
return True if os.getenv('RUN_TESTS_COMMAND') else False
+_PythonConfigVars = collections.namedtuple(
+ '_ConfigVars', ['shell', 'builder', 'builder_prefix_arguments',
+ 'venv_relative_python', 'toolchain', 'runner'])
+
+
+def _python_config_generator(name, major, minor, bits, config_vars):
+ return PythonConfig(
+ name,
+ config_vars.shell + config_vars.builder + config_vars.builder_prefix_arguments + [
+ _python_pattern_function(major=major, minor=minor, bits=bits)] + [
+ name] + config_vars.venv_relative_python + config_vars.toolchain,
+ config_vars.shell + config_vars.runner + [
+ os.path.join(name, config_vars.venv_relative_python[0])])
+
+
+def _pypy_config_generator(name, major, config_vars):
+ return PythonConfig(
+ name,
+ config_vars.shell + config_vars.builder + config_vars.builder_prefix_arguments + [
+ _pypy_pattern_function(major=major)] + [
+ name] + config_vars.venv_relative_python + config_vars.toolchain,
+ config_vars.shell + config_vars.runner + [
+ os.path.join(name, config_vars.venv_relative_python[0])])
+
+
+def _python_pattern_function(major, minor, bits):
+ # Bit-ness is handled by the test machine's environment
+ if os.name == "nt":
+ if bits == "64":
+ return '/c/Python{major}{minor}/python.exe'.format(
+ major=major, minor=minor, bits=bits)
+ else:
+ return '/c/Python{major}{minor}_{bits}bits/python.exe'.format(
+ major=major, minor=minor, bits=bits)
+ else:
+ return 'python{major}.{minor}'.format(major=major, minor=minor)
+
+
+def _pypy_pattern_function(major):
+ if major == '2':
+ return 'pypy'
+ elif major == '3':
+ return 'pypy3'
+ else:
+ raise ValueError("Unknown PyPy major version")
+
+
class CLanguage(object):
def __init__(self, make_target, test_lang):
@@ -471,36 +518,40 @@ class PythonLanguage(object):
bits = '32'
else:
bits = '64'
+
if os.name == 'nt':
shell = ['bash']
builder = [os.path.abspath('tools/run_tests/build_python_msys2.sh')]
builder_prefix_arguments = ['MINGW{}'.format(bits)]
venv_relative_python = ['Scripts/python.exe']
toolchain = ['mingw32']
- python_pattern_function = lambda major, minor, bits: (
- '/c/Python{major}{minor}/python.exe'.format(major=major, minor=minor, bits=bits)
- if bits == '64' else
- '/c/Python{major}{minor}_{bits}bits/python.exe'.format(
- major=major, minor=minor, bits=bits))
else:
shell = []
builder = [os.path.abspath('tools/run_tests/build_python.sh')]
builder_prefix_arguments = []
venv_relative_python = ['bin/python']
toolchain = ['unix']
- # Bit-ness is handled by the test machine's environment
- python_pattern_function = lambda major, minor, bits: 'python{major}.{minor}'.format(major=major, minor=minor)
+
runner = [os.path.abspath('tools/run_tests/run_python.sh')]
- python_config_generator = lambda name, major, minor, bits: PythonConfig(
- name,
- shell + builder + builder_prefix_arguments
- + [python_pattern_function(major=major, minor=minor, bits=bits)]
- + [name] + venv_relative_python + toolchain,
- shell + runner + [os.path.join(name, venv_relative_python[0])])
- python27_config = python_config_generator(name='py27', major='2', minor='7', bits=bits)
- python34_config = python_config_generator(name='py34', major='3', minor='4', bits=bits)
- python35_config = python_config_generator(name='py35', major='3', minor='5', bits=bits)
- python36_config = python_config_generator(name='py36', major='3', minor='6', bits=bits)
+ config_vars = _PythonConfigVars(shell, builder, builder_prefix_arguments,
+ venv_relative_python, toolchain, runner)
+ python27_config = _python_config_generator(name='py27', major='2',
+ minor='7', bits=bits,
+ config_vars=config_vars)
+ python34_config = _python_config_generator(name='py34', major='3',
+ minor='4', bits=bits,
+ config_vars=config_vars)
+ python35_config = _python_config_generator(name='py35', major='3',
+ minor='5', bits=bits,
+ config_vars=config_vars)
+ python36_config = _python_config_generator(name='py36', major='3',
+ minor='6', bits=bits,
+ config_vars=config_vars)
+ pypy27_config = _pypy_config_generator(name='pypy', major='2',
+ config_vars=config_vars)
+ pypy32_config = _pypy_config_generator(name='pypy3', major='3',
+ config_vars=config_vars)
+
if args.compiler == 'default':
if os.name == 'nt':
return (python27_config,)
@@ -514,6 +565,10 @@ class PythonLanguage(object):
return (python35_config,)
elif args.compiler == 'python3.6':
return (python36_config,)
+ elif args.compiler == 'pypy':
+ return (pypy27_config,)
+ elif args.compiler == 'pypy3':
+ return (pypy32_config,)
else:
raise Exception('Compiler %s not supported.' % args.compiler)
@@ -701,14 +756,16 @@ class ObjCLanguage(object):
_check_compiler(self.args.compiler, ['default'])
def test_specs(self):
- return [self.config.job_spec(['src/objective-c/tests/run_tests.sh'],
- timeout_seconds=None,
- shortname='objc-tests',
- environ=_FORCE_ENVIRON_FOR_WRAPPERS),
- self.config.job_spec(['src/objective-c/tests/build_example_test.sh'],
- timeout_seconds=15*60,
- shortname='objc-examples-build',
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ return [
+ self.config.job_spec(['src/objective-c/tests/run_tests.sh'],
+ timeout_seconds=None,
+ shortname='objc-tests',
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS),
+ self.config.job_spec(['src/objective-c/tests/build_example_test.sh'],
+ timeout_seconds=30*60,
+ shortname='objc-examples-build',
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS),
+ ]
def pre_build_steps(self):
return []
@@ -893,6 +950,7 @@ def runs_per_test_type(arg_str):
msg = '\'{}\' is not a positive integer or \'inf\''.format(arg_str)
raise argparse.ArgumentTypeError(msg)
+
# parse command line
argp = argparse.ArgumentParser(description='Run grpc tests.')
argp.add_argument('-c', '--config',
@@ -946,7 +1004,7 @@ argp.add_argument('--compiler',
'gcc4.4', 'gcc4.6', 'gcc4.9', 'gcc5.3',
'clang3.4', 'clang3.5', 'clang3.6', 'clang3.7',
'vs2010', 'vs2013', 'vs2015',
- 'python2.7', 'python3.4', 'python3.5', 'python3.6',
+ 'python2.7', 'python3.4', 'python3.5', 'python3.6', 'pypy', 'pypy3',
'node0.12', 'node4', 'node5',
'coreclr'],
default='default',
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index b602d69564..d2ab5b01cc 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -45,8 +45,9 @@ cat << EOF | awk '{ print $1 }' | sort > $want_submodules
05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f)
c99458533a9b4c743ed51537e25989ea55944908 third_party/googletest (release-1.7.0)
f8ac463766281625ad710900479130c7fcb4d63b third_party/nanopb (nanopb-0.3.4-29-gf8ac463)
- bdeb215cab2985195325fcd5e70c3fa751f46e0f third_party/protobuf (v3.0.0-beta-3.3)
+ e8ae137c96444ea313485ed1118c5e43b2099cf1 third_party/protobuf (v3.0.0-beta-4-74-ge8ae137)
50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8)
+ bcad91771b7f0bff28a1cac1981d7ef2b9bcef3c third_party/thrift
EOF
diff -u $submodules $want_submodules
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index 439f425c88..11daf24e0a 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -149,6 +149,22 @@
],
"headers": [],
"language": "c",
+ "name": "census_resource_test",
+ "src": [
+ "test/core/census/resource_test.c"
+ ],
+ "third_party": false,
+ "type": "target"
+ },
+ {
+ "deps": [
+ "gpr",
+ "gpr_test_util",
+ "grpc",
+ "grpc_test_util"
+ ],
+ "headers": [],
+ "language": "c",
"name": "channel_create_test",
"src": [
"test/core/surface/channel_create_test.c"
@@ -1685,7 +1701,7 @@
"language": "c",
"name": "timeout_encoding_test",
"src": [
- "test/core/transport/chttp2/timeout_encoding_test.c"
+ "test/core/transport/timeout_encoding_test.c"
],
"third_party": false,
"type": "target"
@@ -2102,6 +2118,24 @@
],
"headers": [],
"language": "c++",
+ "name": "filter_end2end_test",
+ "src": [
+ "test/cpp/end2end/filter_end2end_test.cc"
+ ],
+ "third_party": false,
+ "type": "target"
+ },
+ {
+ "deps": [
+ "gpr",
+ "gpr_test_util",
+ "grpc",
+ "grpc++",
+ "grpc++_test_util",
+ "grpc_test_util"
+ ],
+ "headers": [],
+ "language": "c++",
"name": "generic_end2end_test",
"src": [
"test/cpp/end2end/generic_end2end_test.cc"
@@ -2130,14 +2164,11 @@
{
"deps": [
"gpr",
- "gpr_test_util",
"grpc",
"grpc++",
"grpc++_reflection",
"grpc++_test_config",
- "grpc++_test_util",
- "grpc_cli_libs",
- "grpc_test_util"
+ "grpc_cli_libs"
],
"headers": [],
"language": "c++",
@@ -2228,6 +2259,35 @@
},
{
"deps": [
+ "gpr",
+ "gpr_test_util",
+ "grpc",
+ "grpc++",
+ "grpc++_codegen_proto",
+ "grpc++_config_proto",
+ "grpc++_reflection",
+ "grpc_cli_libs",
+ "grpc_test_util"
+ ],
+ "headers": [
+ "src/proto/grpc/testing/echo.grpc.pb.h",
+ "src/proto/grpc/testing/echo.pb.h",
+ "src/proto/grpc/testing/echo_messages.grpc.pb.h",
+ "src/proto/grpc/testing/echo_messages.pb.h",
+ "test/cpp/util/string_ref_helper.h"
+ ],
+ "language": "c++",
+ "name": "grpc_tool_test",
+ "src": [
+ "test/cpp/util/grpc_tool_test.cc",
+ "test/cpp/util/string_ref_helper.cc",
+ "test/cpp/util/string_ref_helper.h"
+ ],
+ "third_party": false,
+ "type": "target"
+ },
+ {
+ "deps": [
"grpc",
"grpc++",
"grpc++_test_util",
@@ -2313,6 +2373,7 @@
"grpc++_test_util",
"grpc_test_util",
"interop_server_helper",
+ "interop_server_lib",
"interop_server_main"
],
"headers": [],
@@ -4198,7 +4259,6 @@
"gpr",
"grpc_base",
"grpc_lb_policy_grpclb",
- "grpc_lb_policy_grpclb",
"grpc_lb_policy_pick_first",
"grpc_lb_policy_round_robin",
"grpc_load_reporting",
@@ -4294,7 +4354,6 @@
"gpr",
"grpc_base",
"grpc_lb_policy_grpclb",
- "grpc_lb_policy_grpclb",
"grpc_lb_policy_pick_first",
"grpc_lb_policy_round_robin",
"grpc_load_reporting",
@@ -4354,6 +4413,7 @@
},
{
"deps": [
+ "gpr",
"grpc",
"grpc++_base",
"grpc++_codegen_base",
@@ -4435,7 +4495,8 @@
"grpc++_codegen_base_src",
"grpc++_codegen_proto",
"grpc++_config_proto",
- "grpc_test_util"
+ "grpc_test_util",
+ "thrift_util"
],
"headers": [
"src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h",
@@ -4473,7 +4534,6 @@
{
"deps": [
"gpr",
- "grpc",
"grpc++_base",
"grpc++_codegen_base",
"grpc++_codegen_base_src",
@@ -4492,10 +4552,13 @@
"deps": [
"grpc++",
"grpc++_reflection",
- "grpc_plugin_support"
+ "grpc++_test_config"
],
"headers": [
"test/cpp/util/cli_call.h",
+ "test/cpp/util/cli_credentials.h",
+ "test/cpp/util/config_grpc_cli.h",
+ "test/cpp/util/grpc_tool.h",
"test/cpp/util/proto_file_parser.h",
"test/cpp/util/proto_reflection_descriptor_database.h"
],
@@ -4504,6 +4567,11 @@
"src": [
"test/cpp/util/cli_call.cc",
"test/cpp/util/cli_call.h",
+ "test/cpp/util/cli_credentials.cc",
+ "test/cpp/util/cli_credentials.h",
+ "test/cpp/util/config_grpc_cli.h",
+ "test/cpp/util/grpc_tool.cc",
+ "test/cpp/util/grpc_tool.h",
"test/cpp/util/proto_file_parser.cc",
"test/cpp/util/proto_file_parser.h",
"test/cpp/util/proto_reflection_descriptor_database.cc",
@@ -4652,7 +4720,7 @@
"src/proto/grpc/testing/test.pb.h"
],
"language": "c++",
- "name": "interop_server_main",
+ "name": "interop_server_lib",
"src": [
"test/cpp/interop/interop_server.cc"
],
@@ -4661,6 +4729,19 @@
},
{
"deps": [
+ "interop_server_lib"
+ ],
+ "headers": [],
+ "language": "c++",
+ "name": "interop_server_main",
+ "src": [
+ "test/cpp/interop/interop_server_bootstrap.cc"
+ ],
+ "third_party": false,
+ "type": "lib"
+ },
+ {
+ "deps": [
"grpc++",
"grpc++_test_util",
"grpc_test_util"
@@ -5407,6 +5488,7 @@
"test/core/end2end/tests/default_host.c",
"test/core/end2end/tests/disappearing_server.c",
"test/core/end2end/tests/empty_batch.c",
+ "test/core/end2end/tests/filter_call_init_fails.c",
"test/core/end2end/tests/filter_causes_close.c",
"test/core/end2end/tests/graceful_server_shutdown.c",
"test/core/end2end/tests/high_initial_seqno.c",
@@ -5468,6 +5550,7 @@
"test/core/end2end/tests/default_host.c",
"test/core/end2end/tests/disappearing_server.c",
"test/core/end2end/tests/empty_batch.c",
+ "test/core/end2end/tests/filter_call_init_fails.c",
"test/core/end2end/tests/filter_causes_close.c",
"test/core/end2end/tests/graceful_server_shutdown.c",
"test/core/end2end/tests/high_initial_seqno.c",
@@ -5508,11 +5591,13 @@
"headers": [
"include/grpc/census.h",
"src/core/ext/census/aggregation.h",
+ "src/core/ext/census/base_resources.h",
"src/core/ext/census/census_interface.h",
"src/core/ext/census/census_rpc_stats.h",
"src/core/ext/census/gen/census.pb.h",
"src/core/ext/census/grpc_filter.h",
"src/core/ext/census/mlog.h",
+ "src/core/ext/census/resource.h",
"src/core/ext/census/rpc_metric_id.h"
],
"language": "c",
@@ -5520,6 +5605,8 @@
"src": [
"include/grpc/census.h",
"src/core/ext/census/aggregation.h",
+ "src/core/ext/census/base_resources.c",
+ "src/core/ext/census/base_resources.h",
"src/core/ext/census/census_interface.h",
"src/core/ext/census/census_rpc_stats.h",
"src/core/ext/census/context.c",
@@ -5534,6 +5621,8 @@
"src/core/ext/census/mlog.h",
"src/core/ext/census/operation.c",
"src/core/ext/census/placeholders.c",
+ "src/core/ext/census/resource.c",
+ "src/core/ext/census/resource.h",
"src/core/ext/census/rpc_metric_id.h",
"src/core/ext/census/tracing.c"
],
@@ -5726,6 +5815,7 @@
"include/grpc/compression.h",
"include/grpc/grpc.h",
"include/grpc/grpc_posix.h",
+ "include/grpc/grpc_security_constants.h",
"include/grpc/status.h",
"src/core/lib/channel/channel_args.h",
"src/core/lib/channel/channel_stack.h",
@@ -5804,6 +5894,7 @@
"src/core/lib/transport/metadata.h",
"src/core/lib/transport/metadata_batch.h",
"src/core/lib/transport/static_metadata.h",
+ "src/core/lib/transport/timeout_encoding.h",
"src/core/lib/transport/transport.h",
"src/core/lib/transport/transport_impl.h"
],
@@ -5815,6 +5906,7 @@
"include/grpc/compression.h",
"include/grpc/grpc.h",
"include/grpc/grpc_posix.h",
+ "include/grpc/grpc_security_constants.h",
"include/grpc/status.h",
"src/core/lib/channel/channel_args.c",
"src/core/lib/channel/channel_args.h",
@@ -5979,6 +6071,8 @@
"src/core/lib/transport/metadata_batch.h",
"src/core/lib/transport/static_metadata.c",
"src/core/lib/transport/static_metadata.h",
+ "src/core/lib/transport/timeout_encoding.c",
+ "src/core/lib/transport/timeout_encoding.h",
"src/core/lib/transport/transport.c",
"src/core/lib/transport/transport.h",
"src/core/lib/transport/transport_impl.h",
@@ -6193,7 +6287,6 @@
],
"headers": [
"include/grpc/grpc_security.h",
- "include/grpc/grpc_security_constants.h",
"src/core/lib/security/context/security_context.h",
"src/core/lib/security/credentials/composite/composite_credentials.h",
"src/core/lib/security/credentials/credentials.h",
@@ -6218,7 +6311,6 @@
"name": "grpc_secure",
"src": [
"include/grpc/grpc_security.h",
- "include/grpc/grpc_security_constants.h",
"src/core/lib/http/httpcli_security_connector.c",
"src/core/lib/security/context/security_context.c",
"src/core/lib/security/context/security_context.h",
@@ -6341,7 +6433,6 @@
"src/core/ext/transport/chttp2/transport/internal.h",
"src/core/ext/transport/chttp2/transport/status_conversion.h",
"src/core/ext/transport/chttp2/transport/stream_map.h",
- "src/core/ext/transport/chttp2/transport/timeout_encoding.h",
"src/core/ext/transport/chttp2/transport/varint.h"
],
"language": "c",
@@ -6385,8 +6476,6 @@
"src/core/ext/transport/chttp2/transport/stream_lists.c",
"src/core/ext/transport/chttp2/transport/stream_map.c",
"src/core/ext/transport/chttp2/transport/stream_map.h",
- "src/core/ext/transport/chttp2/transport/timeout_encoding.c",
- "src/core/ext/transport/chttp2/transport/timeout_encoding.h",
"src/core/ext/transport/chttp2/transport/varint.c",
"src/core/ext/transport/chttp2/transport/varint.h",
"src/core/ext/transport/chttp2/transport/writing.c"
@@ -6542,8 +6631,9 @@
},
{
"deps": [
- "grpc",
- "grpc++_codegen_base"
+ "gpr",
+ "grpc++_codegen_base",
+ "grpc_base"
],
"headers": [
"include/grpc++/alarm.h",
@@ -6594,6 +6684,7 @@
"include/grpc++/support/sync_stream.h",
"include/grpc++/support/time.h",
"src/cpp/client/create_channel_internal.h",
+ "src/cpp/common/channel_filter.h",
"src/cpp/server/dynamic_thread_pool.h",
"src/cpp/server/thread_pool_interface.h"
],
@@ -6657,6 +6748,8 @@
"src/cpp/client/generic_stub.cc",
"src/cpp/client/insecure_credentials.cc",
"src/cpp/common/channel_arguments.cc",
+ "src/cpp/common/channel_filter.cc",
+ "src/cpp/common/channel_filter.h",
"src/cpp/common/completion_queue.cc",
"src/cpp/common/core_codegen.cc",
"src/cpp/common/rpc_method.cc",
@@ -6813,5 +6906,22 @@
],
"third_party": false,
"type": "filegroup"
+ },
+ {
+ "deps": [
+ "grpc++_codegen_base"
+ ],
+ "headers": [
+ "include/grpc++/impl/codegen/thrift_serializer.h",
+ "include/grpc++/impl/codegen/thrift_utils.h"
+ ],
+ "language": "c++",
+ "name": "thrift_util",
+ "src": [
+ "include/grpc++/impl/codegen/thrift_serializer.h",
+ "include/grpc++/impl/codegen/thrift_utils.h"
+ ],
+ "third_party": false,
+ "type": "filegroup"
}
]
diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json
index 283f2af129..b0c09ace5b 100644
--- a/tools/run_tests/tests.json
+++ b/tools/run_tests/tests.json
@@ -182,6 +182,27 @@
"flaky": false,
"gtest": false,
"language": "c",
+ "name": "census_resource_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ]
+ },
+ {
+ "args": [],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "gtest": false,
+ "language": "c",
"name": "channel_create_test",
"platforms": [
"linux",
@@ -2240,6 +2261,27 @@
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "filter_end2end_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ]
+ },
+ {
+ "args": [],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "generic_end2end_test",
"platforms": [
"linux",
@@ -2282,6 +2324,27 @@
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "grpc_tool_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ]
+ },
+ {
+ "args": [],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "grpclb_api_test",
"platforms": [
"linux",
@@ -4699,6 +4762,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_census_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -5601,6 +5686,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_compress_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -6489,6 +6596,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_fakesec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -7276,6 +7404,26 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_fd_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -8084,6 +8232,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -8902,6 +9072,22 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full+pipe_test",
+ "platforms": [
+ "linux"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -9642,6 +9828,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full+trace_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -10522,6 +10730,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_load_reporting_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -11410,6 +11640,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_oauth2_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -12229,6 +12480,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_proxy_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -12943,6 +13215,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -13699,6 +13992,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair+trace_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -14434,6 +14748,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair_1byte_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -15267,6 +15602,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_ssl_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -16169,6 +16526,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_ssl_cert_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -17015,6 +17394,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_ssl_proxy_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -17758,6 +18158,26 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_uds_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -18584,6 +19004,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_census_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -19464,6 +19906,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_compress_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -20258,6 +20722,26 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_fd_nosec_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -21044,6 +21528,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -21846,6 +22352,22 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full+pipe_nosec_test",
+ "platforms": [
+ "linux"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -22564,6 +23086,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_full+trace_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -23422,6 +23966,28 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_load_reporting_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -24247,6 +24813,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_proxy_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -24940,6 +25527,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -25675,6 +26283,27 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair+trace_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -26409,6 +27038,29 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "windows",
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [
+ "msan"
+ ],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_sockpair_1byte_nosec_test",
+ "platforms": [
+ "windows",
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [
@@ -27224,6 +27876,26 @@
},
{
"args": [
+ "filter_call_init_fails"
+ ],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c",
+ "name": "h2_uds_nosec_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix"
+ ]
+ },
+ {
+ "args": [
"filter_causes_close"
],
"ci_platforms": [