From cb46db070485cf581521e9c60db4827d3386751f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 14 Apr 2015 17:18:26 -0700 Subject: [PATCH 001/217] Initial version of service_packager script --- src/node/bin/service_packager | 2 + src/node/cli/service_packager.js | 116 ++++++++++++++++++ src/node/cli/service_packager/index.js | 35 ++++++ .../service_packager/package.json.template | 16 +++ src/node/package.json | 3 + 5 files changed, 172 insertions(+) create mode 100755 src/node/bin/service_packager create mode 100644 src/node/cli/service_packager.js create mode 100644 src/node/cli/service_packager/index.js create mode 100644 src/node/cli/service_packager/package.json.template diff --git a/src/node/bin/service_packager b/src/node/bin/service_packager new file mode 100755 index 00000000000..c7f24609977 --- /dev/null +++ b/src/node/bin/service_packager @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require(__dirname+'/../cli/service_packager.js').main(process.argv.slice(2)); \ No newline at end of file diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js new file mode 100644 index 00000000000..7bf54b1c624 --- /dev/null +++ b/src/node/cli/service_packager.js @@ -0,0 +1,116 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +var _ = require('underscore'); +var async = require('async'); +var pbjs = require('protobufjs/cli/pbjs'); +var parseArgs = require('minimist'); +var Mustache = require('mustache'); + +var package_json = require('../package.json'); + +var template_path = path.resolve(__dirname, 'service_packager'); + +var package_tpl_path = path.join(template_path, 'package.json.template'); + +var arg_format = { + string: ['include', 'out', 'name', 'version'], + alias: { + include: 'i', + out: 'o', + name: 'n', + version: 'v' + } +}; + +// TODO(mlumish): autogenerate README.md from proto file + +function generatePackage(params, callback) { + fs.readFile(package_tpl_path, {encoding: 'utf-8'}, function(err, template) { + if (err) { + callback(err); + } else { + var rendered = Mustache.render(template, params); + callback(null, rendered); + } + }); +} + +function copyFile(src_path, dest_path) { + fs.createReadStream(src_path).pipe(fs.createWriteStream(dest_path)); +} + +function main(argv) { + var args = parseArgs(argv, arg_format); + var out_path = path.resolve(args.out); + var include_dirs = _.map(path.resolve, args.include); + args.grpc_version = package_json.version; + generatePackage(args, function(err, rendered) { + if (err) throw err; + fs.writeFile(path.join(out_path, 'package.json'), rendered, function(err) { + if (err) throw err; + }); + }); + copyFile(path.join(template_path, 'index.js'), + path.join(out_path, 'index.js')); + copyFile(path.join(__dirname, '..', 'LICENSE'), + path.join(out_path, 'LICENSE')); + + + + var service_stream = fs.createWriteStream(path.join(out_path, + 'service.json')); + var pbjs_args = _.flatten(['node', 'pbjs', + args._[0], + _.map(include_dirs, function(dir) { + return "-path=" + dir; + })]); + var old_stdout = process.stdout; + process.__defineGetter__('stdout', function() { + return service_stream; + }); + var pbjs_status = pbjs.main(pbjs_args); + process.__defineGetter__('stdout', function() { + return old_stdout; + }); + if (pbjs_status !== pbjs.STATUS_OK) { + throw new Error('pbjs failed with status code ' + pbjs_status); + } +} + +exports.main = main; diff --git a/src/node/cli/service_packager/index.js b/src/node/cli/service_packager/index.js new file mode 100644 index 00000000000..8a22120ce08 --- /dev/null +++ b/src/node/cli/service_packager/index.js @@ -0,0 +1,35 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +var grpc = require('grpc'); +module.exports = grpc.load(__dirname + '/service.json'); diff --git a/src/node/cli/service_packager/package.json.template b/src/node/cli/service_packager/package.json.template new file mode 100644 index 00000000000..4f199f2f95e --- /dev/null +++ b/src/node/cli/service_packager/package.json.template @@ -0,0 +1,16 @@ +{ + "name": "{{{name}}}", + "version": "{{{version}}}", + "author": "Google Inc.", + "description": "Client library for {{{name}}} built on gRPC", + "license": "Apache-2.0", + "dependencies": { + "grpc": "{{{grpc_version}}}" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "service.json" + ] +} diff --git a/src/node/package.json b/src/node/package.json index fc3ca1f103c..03f81ba5326 100644 --- a/src/node/package.json +++ b/src/node/package.json @@ -36,6 +36,7 @@ "jshint": "^2.5.0", "minimist": "^1.1.0", "mocha": "~1.21.0", + "mustache": "^2.0.0", "strftime": "^0.8.2" }, "engines": { @@ -46,6 +47,8 @@ "README.md", "index.js", "binding.gyp", + "bin", + "cli", "examples", "ext", "interop", From f4b2832850e9e77dd116adbcaf4f0f24c7044a7f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 12 May 2015 12:39:22 -0700 Subject: [PATCH 002/217] service_packager now properly generates service and package files --- src/node/cli/service_packager.js | 5 ++++- src/node/cli/service_packager/index.js | 3 ++- src/node/cli/service_packager/package.json.template | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js index 7bf54b1c624..41875b5420e 100644 --- a/src/node/cli/service_packager.js +++ b/src/node/cli/service_packager.js @@ -78,7 +78,9 @@ function copyFile(src_path, dest_path) { function main(argv) { var args = parseArgs(argv, arg_format); var out_path = path.resolve(args.out); - var include_dirs = _.map(path.resolve, args.include); + var include_dirs = _.map(_.flatten([args.include]), function(p) { + return path.resolve(p); + }); args.grpc_version = package_json.version; generatePackage(args, function(err, rendered) { if (err) throw err; @@ -97,6 +99,7 @@ function main(argv) { 'service.json')); var pbjs_args = _.flatten(['node', 'pbjs', args._[0], + '-legacy', _.map(include_dirs, function(dir) { return "-path=" + dir; })]); diff --git a/src/node/cli/service_packager/index.js b/src/node/cli/service_packager/index.js index 8a22120ce08..811e08b89ac 100644 --- a/src/node/cli/service_packager/index.js +++ b/src/node/cli/service_packager/index.js @@ -32,4 +32,5 @@ */ var grpc = require('grpc'); -module.exports = grpc.load(__dirname + '/service.json'); +exports.client = grpc.load(__dirname + '/service.json', 'json'); +exports.auth = require('google-auth-library'); diff --git a/src/node/cli/service_packager/package.json.template b/src/node/cli/service_packager/package.json.template index 4f199f2f95e..9f9019172e0 100644 --- a/src/node/cli/service_packager/package.json.template +++ b/src/node/cli/service_packager/package.json.template @@ -5,7 +5,8 @@ "description": "Client library for {{{name}}} built on gRPC", "license": "Apache-2.0", "dependencies": { - "grpc": "{{{grpc_version}}}" + "grpc": "{{{grpc_version}}}", + "google-auth-library": "^0.9.2" }, "main": "index.js", "files": [ From b70d1d9dcac2281f2a7d76bd243ec490736f49ec Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 13 May 2015 10:55:00 -0700 Subject: [PATCH 003/217] Fixed include path handling --- src/node/cli/service_packager.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js index 41875b5420e..7fb0a8fe284 100644 --- a/src/node/cli/service_packager.js +++ b/src/node/cli/service_packager.js @@ -78,9 +78,12 @@ function copyFile(src_path, dest_path) { function main(argv) { var args = parseArgs(argv, arg_format); var out_path = path.resolve(args.out); - var include_dirs = _.map(_.flatten([args.include]), function(p) { - return path.resolve(p); - }); + var include_dirs = []; + if (args.include) { + include_dirs = _.map(_.flatten([args.include]), function(p) { + return path.resolve(p); + }); + } args.grpc_version = package_json.version; generatePackage(args, function(err, rendered) { if (err) throw err; @@ -93,8 +96,6 @@ function main(argv) { copyFile(path.join(__dirname, '..', 'LICENSE'), path.join(out_path, 'LICENSE')); - - var service_stream = fs.createWriteStream(path.join(out_path, 'service.json')); var pbjs_args = _.flatten(['node', 'pbjs', From c880cad41c191c6ce4974eb3d0bc33b8671aa31c Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 13 May 2015 11:08:42 -0700 Subject: [PATCH 004/217] Added service_packager description to bin/README.md --- src/node/bin/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/node/bin/README.md diff --git a/src/node/bin/README.md b/src/node/bin/README.md new file mode 100644 index 00000000000..2f856e428ef --- /dev/null +++ b/src/node/bin/README.md @@ -0,0 +1,16 @@ +# Command Line Tools + +# Service Packager + +The command line tool `bin/service_packager`, when called with the following command line: + +```bash +service_packager proto_file -o output_path -n name -v version [-i input_path...] +``` + +Populates `output_path` with a node package consisting of a `package.json` populated with `name` and `version`, an `index.js`, a `LICENSE` file copied from gRPC, and a `service.json`, which is compiled from `proto_file` and the given `input_path`s. `require('output_path')` returns an object that is equivalent to + +```js +{ client: require('grpc').load('service.json'), + auth: require('google-auth-library') } +``` From 357cb81c7d2e66f997504f67adc503e4d4dcf90b Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 14 May 2015 05:33:43 +0200 Subject: [PATCH 005/217] Straightening out the includes. --- src/ruby/ext/grpc/rb_byte_buffer.c | 2 +- src/ruby/ext/grpc/rb_byte_buffer.h | 3 ++- src/ruby/ext/grpc/rb_call.c | 2 +- src/ruby/ext/grpc/rb_call.h | 3 ++- src/ruby/ext/grpc/rb_channel.c | 2 +- src/ruby/ext/grpc/rb_channel.h | 3 ++- src/ruby/ext/grpc/rb_channel_args.c | 3 ++- src/ruby/ext/grpc/rb_channel_args.h | 3 ++- src/ruby/ext/grpc/rb_completion_queue.h | 3 ++- src/ruby/ext/grpc/rb_credentials.c | 2 +- src/ruby/ext/grpc/rb_credentials.h | 3 ++- src/ruby/ext/grpc/rb_grpc.h | 3 ++- src/ruby/ext/grpc/rb_server.c | 2 +- src/ruby/ext/grpc/rb_server.h | 3 ++- src/ruby/ext/grpc/rb_server_credentials.c | 2 +- src/ruby/ext/grpc/rb_server_credentials.h | 3 ++- 16 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/ruby/ext/grpc/rb_byte_buffer.c b/src/ruby/ext/grpc/rb_byte_buffer.c index e3a5277f544..edf0d3b115e 100644 --- a/src/ruby/ext/grpc/rb_byte_buffer.c +++ b/src/ruby/ext/grpc/rb_byte_buffer.c @@ -33,7 +33,7 @@ #include "rb_byte_buffer.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_byte_buffer.h b/src/ruby/ext/grpc/rb_byte_buffer.h index 96b9009dae9..c7ddd764890 100644 --- a/src/ruby/ext/grpc/rb_byte_buffer.h +++ b/src/ruby/ext/grpc/rb_byte_buffer.h @@ -34,8 +34,9 @@ #ifndef GRPC_RB_BYTE_BUFFER_H_ #define GRPC_RB_BYTE_BUFFER_H_ +#include + #include -#include /* Converts a char* with a length to a grpc_byte_buffer */ grpc_byte_buffer *grpc_rb_s_to_byte_buffer(char *string, size_t length); diff --git a/src/ruby/ext/grpc/rb_call.c b/src/ruby/ext/grpc/rb_call.c index c46af250cd7..29f870f9298 100644 --- a/src/ruby/ext/grpc/rb_call.c +++ b/src/ruby/ext/grpc/rb_call.c @@ -33,7 +33,7 @@ #include "rb_call.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_call.h b/src/ruby/ext/grpc/rb_call.h index 003ce0429e0..1d2fbc3580e 100644 --- a/src/ruby/ext/grpc/rb_call.h +++ b/src/ruby/ext/grpc/rb_call.h @@ -34,8 +34,9 @@ #ifndef GRPC_RB_CALL_H_ #define GRPC_RB_CALL_H_ +#include + #include -#include /* Gets the wrapped call from a VALUE. */ grpc_call* grpc_rb_get_wrapped_call(VALUE v); diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 214675af927..d6876bc5546 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -33,7 +33,7 @@ #include "rb_channel.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_channel.h b/src/ruby/ext/grpc/rb_channel.h index 6e3c087689e..77e1f6acbca 100644 --- a/src/ruby/ext/grpc/rb_channel.h +++ b/src/ruby/ext/grpc/rb_channel.h @@ -34,7 +34,8 @@ #ifndef GRPC_RB_CHANNEL_H_ #define GRPC_RB_CHANNEL_H_ -#include +#include + #include /* Initializes the Channel class. */ diff --git a/src/ruby/ext/grpc/rb_channel_args.c b/src/ruby/ext/grpc/rb_channel_args.c index acd545f5d2f..42ed3a1ec80 100644 --- a/src/ruby/ext/grpc/rb_channel_args.c +++ b/src/ruby/ext/grpc/rb_channel_args.c @@ -33,7 +33,8 @@ #include "rb_channel_args.h" -#include +#include + #include #include "rb_grpc.h" diff --git a/src/ruby/ext/grpc/rb_channel_args.h b/src/ruby/ext/grpc/rb_channel_args.h index 78a333bd082..591dd848acc 100644 --- a/src/ruby/ext/grpc/rb_channel_args.h +++ b/src/ruby/ext/grpc/rb_channel_args.h @@ -34,7 +34,8 @@ #ifndef GRPC_RB_CHANNEL_ARGS_H_ #define GRPC_RB_CHANNEL_ARGS_H_ -#include +#include + #include /* Converts a hash object containing channel args to a channel args instance. diff --git a/src/ruby/ext/grpc/rb_completion_queue.h b/src/ruby/ext/grpc/rb_completion_queue.h index e4d04b10c83..6cc4e96589b 100644 --- a/src/ruby/ext/grpc/rb_completion_queue.h +++ b/src/ruby/ext/grpc/rb_completion_queue.h @@ -34,8 +34,9 @@ #ifndef GRPC_RB_COMPLETION_QUEUE_H_ #define GRPC_RB_COMPLETION_QUEUE_H_ +#include + #include -#include /* Gets the wrapped completion queue from the ruby wrapper */ grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v); diff --git a/src/ruby/ext/grpc/rb_credentials.c b/src/ruby/ext/grpc/rb_credentials.c index 1ec88914e46..3fca848b2b4 100644 --- a/src/ruby/ext/grpc/rb_credentials.c +++ b/src/ruby/ext/grpc/rb_credentials.c @@ -33,7 +33,7 @@ #include "rb_credentials.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_credentials.h b/src/ruby/ext/grpc/rb_credentials.h index e7c43c9c781..840f7d5f9cf 100644 --- a/src/ruby/ext/grpc/rb_credentials.h +++ b/src/ruby/ext/grpc/rb_credentials.h @@ -34,7 +34,8 @@ #ifndef GRPC_RB_CREDENTIALS_H_ #define GRPC_RB_CREDENTIALS_H_ -#include +#include + #include /* Initializes the ruby Credentials class. */ diff --git a/src/ruby/ext/grpc/rb_grpc.h b/src/ruby/ext/grpc/rb_grpc.h index a502273de1b..6ea6cbd0b6c 100644 --- a/src/ruby/ext/grpc/rb_grpc.h +++ b/src/ruby/ext/grpc/rb_grpc.h @@ -35,7 +35,8 @@ #define GRPC_RB_H_ #include -#include +#include + #include /* grpc_rb_mGrpcCore is the module containing the ruby wrapper GRPC classes. */ diff --git a/src/ruby/ext/grpc/rb_server.c b/src/ruby/ext/grpc/rb_server.c index 0651c36c0b4..3182d03fab7 100644 --- a/src/ruby/ext/grpc/rb_server.c +++ b/src/ruby/ext/grpc/rb_server.c @@ -33,7 +33,7 @@ #include "rb_server.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_server.h b/src/ruby/ext/grpc/rb_server.h index 5e4b711d35b..59c9e6905b9 100644 --- a/src/ruby/ext/grpc/rb_server.h +++ b/src/ruby/ext/grpc/rb_server.h @@ -34,7 +34,8 @@ #ifndef GRPC_RB_SERVER_H_ #define GRPC_RB_SERVER_H_ -#include +#include + #include /* Initializes the Server class. */ diff --git a/src/ruby/ext/grpc/rb_server_credentials.c b/src/ruby/ext/grpc/rb_server_credentials.c index a86389445fb..23271c40b73 100644 --- a/src/ruby/ext/grpc/rb_server_credentials.c +++ b/src/ruby/ext/grpc/rb_server_credentials.c @@ -33,7 +33,7 @@ #include "rb_server_credentials.h" -#include +#include #include #include diff --git a/src/ruby/ext/grpc/rb_server_credentials.h b/src/ruby/ext/grpc/rb_server_credentials.h index 35b395ad5cc..69d919b7406 100644 --- a/src/ruby/ext/grpc/rb_server_credentials.h +++ b/src/ruby/ext/grpc/rb_server_credentials.h @@ -34,7 +34,8 @@ #ifndef GRPC_RB_SERVER_CREDENTIALS_H_ #define GRPC_RB_SERVER_CREDENTIALS_H_ -#include +#include + #include /* Initializes the ruby ServerCredentials class. */ From 2e4b735f613e6259161c20e0c6d292b40c868bfb Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 14 May 2015 06:21:15 +0200 Subject: [PATCH 006/217] Enabling the ruby extension to automatically build grpc. --- src/ruby/ext/grpc/extconf.rb | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ruby/ext/grpc/extconf.rb b/src/ruby/ext/grpc/extconf.rb index f15f85bf56d..1b801edc8ec 100644 --- a/src/ruby/ext/grpc/extconf.rb +++ b/src/ruby/ext/grpc/extconf.rb @@ -34,13 +34,25 @@ INCLUDEDIR = RbConfig::CONFIG['includedir'] if ENV.key? 'GRPC_ROOT' GRPC_ROOT = ENV['GRPC_ROOT'] - if ENV.key? 'GRPC_LIB_DIR' - GRPC_LIB_DIR = ENV['GRPC_LIB_DIR'] +else + grpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..')) + if File.exist?(File.join(grpc_root, 'include/grpc/grpc.h')) + GRPC_ROOT = grpc_root else - GRPC_LIB_DIR = 'libs/opt' + GRPC_ROOT = nil end +end + +if ENV.key? 'CONFIG' + GRPC_CONFIG = ENV['CONFIG'] else - GRPC_ROOT = nil + GRPC_CONFIG = 'opt' +end + +if (ENV.key? 'GRPC_LIB_DIR') && (!GRPC_ROOT.nil?) + GRPC_LIB_DIR = File.join(GRPC_ROOT, ENV['GRPC_LIB_DIR']) +else + GRPC_LIB_DIR = File.join(File.join(GRPC_ROOT, 'libs'), GRPC_CONFIG) end HEADER_DIRS = [ @@ -67,7 +79,10 @@ LIB_DIRS = [ unless GRPC_ROOT.nil? HEADER_DIRS.unshift File.join(GRPC_ROOT, 'include') - LIB_DIRS.unshift File.join(GRPC_ROOT, GRPC_LIB_DIR) + LIB_DIRS.unshift GRPC_LIB_DIR + unless File.exist?(File.join(GRPC_LIB_DIR, 'libgrpc.a')) + system("make -C #{GRPC_ROOT} static_c CONFIG=#{GRPC_CONFIG}") + end end def crash(msg) From cbd9c8bf9bb8f17bd1b107b4ac95dc1ae5a6a959 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 14 May 2015 06:22:26 +0200 Subject: [PATCH 007/217] Changing run_tests to simplify the ruby build. --- tools/run_tests/build_ruby.sh | 13 +++---------- tools/run_tests/run_tests.py | 2 +- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/tools/run_tests/build_ruby.sh b/tools/run_tests/build_ruby.sh index 53a69cf0798..de96413bc12 100755 --- a/tools/run_tests/build_ruby.sh +++ b/tools/run_tests/build_ruby.sh @@ -31,17 +31,10 @@ set -ex -CONFIG=${CONFIG:-opt} +export CONFIG=${CONFIG:-opt} -# change to grpc repo root -cd $(dirname $0)/../.. - -# tells npm install to look for files in that directory -export GRPC_ROOT=`pwd` -# tells npm install the subdirectory with library files -export GRPC_LIB_SUBDIR=libs/$CONFIG - -cd src/ruby +# change to grpc's ruby directory +cd $(dirname $0)/../../src/ruby bundle install rake compile:grpc diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 7150ebb5531..41f53a434a7 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -214,7 +214,7 @@ class RubyLanguage(object): return [config.job_spec(['tools/run_tests/run_ruby.sh'], None)] def make_targets(self): - return ['static_c'] + return ['run_dep_checks'] def build_steps(self): return [['tools/run_tests/build_ruby.sh']] From 886d7ecb7ad77af47aa65996f3b5c791d394e1bc Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 14 May 2015 16:18:42 -0700 Subject: [PATCH 008/217] More scalable unary polling - admit only one poller for read and one for write at a time (poll is level triggered, so this avoids a thundering herd on each event) - wake only one poller when more pollers are needed, again avoiding a thundering herd --- src/core/iomgr/fd_posix.c | 75 +++++++++++++++---- src/core/iomgr/fd_posix.h | 4 +- .../pollset_multipoller_with_poll_posix.c | 2 +- src/core/iomgr/pollset_posix.c | 4 +- 4 files changed, 65 insertions(+), 20 deletions(-) diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 9c8133d2d4c..afd6ddce64d 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -98,6 +98,7 @@ static grpc_fd *alloc_fd(int fd) { r->fd = fd; r->watcher_root.next = r->watcher_root.prev = &r->watcher_root; r->freelist_next = NULL; + r->read_watcher = r->write_watcher = NULL; return r; } @@ -147,14 +148,24 @@ int grpc_fd_is_orphaned(grpc_fd *fd) { return (gpr_atm_acq_load(&fd->refst) & 1) == 0; } -static void wake_watchers(grpc_fd *fd) { - grpc_fd_watcher *watcher; +static void maybe_wake_one_watcher_locked(grpc_fd *fd) { + if (fd->watcher_root.next != &fd->watcher_root) { + grpc_pollset_force_kick(fd->watcher_root.next->pollset); + } +} + +static void maybe_wake_one_watcher(grpc_fd *fd) { gpr_mu_lock(&fd->watcher_mu); + maybe_wake_one_watcher_locked(fd); + gpr_mu_unlock(&fd->watcher_mu); +} + +static void wake_all_watchers(grpc_fd *fd) { + grpc_fd_watcher *watcher; for (watcher = fd->watcher_root.next; watcher != &fd->watcher_root; watcher = watcher->next) { grpc_pollset_force_kick(watcher->pollset); } - gpr_mu_unlock(&fd->watcher_mu); } void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_cb_func on_done, void *user_data) { @@ -162,7 +173,7 @@ void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_cb_func on_done, void *user_data) { fd->on_done_user_data = user_data; shutdown(fd->fd, SHUT_RDWR); ref_by(fd, 1); /* remove active status, but keep referenced */ - wake_watchers(fd); + wake_all_watchers(fd); unref_by(fd, 2); /* drop the reference */ } @@ -204,7 +215,7 @@ static void notify_on(grpc_fd *fd, gpr_atm *st, grpc_iomgr_closure *closure, set_ready call. NOTE: we don't have an ABA problem here, since we should never have concurrent calls to the same notify_on function. */ - wake_watchers(fd); + maybe_wake_one_watcher(fd); return; } /* swap was unsuccessful due to an intervening set_ready call. @@ -290,29 +301,61 @@ void grpc_fd_notify_on_write(grpc_fd *fd, grpc_iomgr_closure *closure) { gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, gpr_uint32 read_mask, gpr_uint32 write_mask, grpc_fd_watcher *watcher) { + gpr_uint32 mask = 0; /* keep track of pollers that have requested our events, in case they change */ grpc_fd_ref(fd); gpr_mu_lock(&fd->watcher_mu); - watcher->next = &fd->watcher_root; - watcher->prev = watcher->next->prev; - watcher->next->prev = watcher->prev->next = watcher; + /* if there is nobody polling for read, but we need to, then start doing so */ + if (!fd->read_watcher && gpr_atm_acq_load(&fd->readst) > READY) { + fd->read_watcher = watcher; + mask |= read_mask; + } + /* if there is nobody polling for write, but we need to, then start doing so */ + if (!fd->write_watcher && gpr_atm_acq_load(&fd->writest) > READY) { + fd->write_watcher = watcher; + mask |= write_mask; + } + /* if not polling, remember this watcher in case we need someone to later */ + if (mask == 0) { + watcher->next = &fd->watcher_root; + watcher->prev = watcher->next->prev; + watcher->next->prev = watcher->prev->next = watcher; + } watcher->pollset = pollset; watcher->fd = fd; gpr_mu_unlock(&fd->watcher_mu); - return (gpr_atm_acq_load(&fd->readst) != READY ? read_mask : 0) | - (gpr_atm_acq_load(&fd->writest) != READY ? write_mask : 0); + return mask; } -void grpc_fd_end_poll(grpc_fd_watcher *watcher) { - gpr_mu_lock(&watcher->fd->watcher_mu); - watcher->next->prev = watcher->prev; - watcher->prev->next = watcher->next; - gpr_mu_unlock(&watcher->fd->watcher_mu); +void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) { + int was_polling = 0; + int kick = 0; + grpc_fd *fd = watcher->fd; + + gpr_mu_lock(&fd->watcher_mu); + if (watcher == fd->read_watcher) { + was_polling = 1; + kick |= !got_read; + fd->read_watcher = NULL; + } + if (watcher == fd->write_watcher) { + was_polling = 1; + kick |= !got_write; + fd->write_watcher = NULL; + } + if (!was_polling) { + watcher->next->prev = watcher->prev; + watcher->prev->next = watcher->next; + } + if (kick) { + maybe_wake_one_watcher_locked(fd); + } + gpr_mu_unlock(&fd->watcher_mu); - grpc_fd_unref(watcher->fd); + grpc_fd_unref(fd); } void grpc_fd_become_readable(grpc_fd *fd, int allow_synchronous_callback) { diff --git a/src/core/iomgr/fd_posix.h b/src/core/iomgr/fd_posix.h index be21f2b55f8..af79d4c4495 100644 --- a/src/core/iomgr/fd_posix.h +++ b/src/core/iomgr/fd_posix.h @@ -68,6 +68,8 @@ struct grpc_fd { gpr_mu watcher_mu; grpc_fd_watcher watcher_root; + grpc_fd_watcher *read_watcher; + grpc_fd_watcher *write_watcher; gpr_atm readst; gpr_atm writest; @@ -103,7 +105,7 @@ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, gpr_uint32 read_mask, gpr_uint32 write_mask, grpc_fd_watcher *rec); /* Complete polling previously started with grpc_fd_begin_poll */ -void grpc_fd_end_poll(grpc_fd_watcher *rec); +void grpc_fd_end_poll(grpc_fd_watcher *rec, int got_read, int got_write); /* Return 1 if this fd is orphaned, 0 otherwise */ int grpc_fd_is_orphaned(grpc_fd *fd); diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c index 25b7cfda1a1..4d36107ab0f 100644 --- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c +++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c @@ -98,7 +98,7 @@ static void end_polling(grpc_pollset *pollset) { pollset_hdr *h; h = pollset->data.ptr; for (i = 1; i < h->pfd_count; i++) { - grpc_fd_end_poll(&h->watchers[i]); + grpc_fd_end_poll(&h->watchers[i], h->pfds[i].revents & POLLIN, h->pfds[i].revents & POLLOUT); } } diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 4d1bcad9e27..ed744255559 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -410,10 +410,10 @@ static int unary_poll_pollset_maybe_work(grpc_pollset *pollset, pfd[1].events = grpc_fd_begin_poll(fd, pollset, POLLIN, POLLOUT, &fd_watcher); - r = poll(pfd, GPR_ARRAY_SIZE(pfd), timeout); + r = poll(pfd, GPR_ARRAY_SIZE(pfd) - (pfd[1].events == 0), timeout); GRPC_TIMER_MARK(GRPC_PTAG_POLL_FINISHED, r); - grpc_fd_end_poll(&fd_watcher); + grpc_fd_end_poll(&fd_watcher, pfd[1].revents & POLLIN, pfd[1].revents & POLLOUT); if (r < 0) { if (errno != EINTR) { From 79d68d550b8eea6a786726c3f2196b7526bf4b27 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 14 May 2015 19:04:40 -0700 Subject: [PATCH 009/217] To allow local private changes to be build into private docker images to do interop testing before submitting code c++ and java are done previously, adding ruby and node. see script tools/gce_setup/private_build_and_test.sh --- tools/dockerfile/grpc_node/build.sh | 8 ++++++++ tools/dockerfile/grpc_ruby/build.sh | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100755 tools/dockerfile/grpc_node/build.sh create mode 100755 tools/dockerfile/grpc_ruby/build.sh diff --git a/tools/dockerfile/grpc_node/build.sh b/tools/dockerfile/grpc_node/build.sh new file mode 100755 index 00000000000..86a681d453e --- /dev/null +++ b/tools/dockerfile/grpc_node/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash +cp -R /var/local/git-clone/grpc /var/local/git + +make clean -C /var/local/git/grpc + +make install_c -j12 -C /var/local/git/grpc + +cd /var/local/git/grpc/src/node && npm install && node-gyp rebuild diff --git a/tools/dockerfile/grpc_ruby/build.sh b/tools/dockerfile/grpc_ruby/build.sh new file mode 100755 index 00000000000..ab0267d9a64 --- /dev/null +++ b/tools/dockerfile/grpc_ruby/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash +cp -R /var/local/git-clone/grpc /var/local/git + +make clean -C /var/local/git/grpc + +make install_c -j12 -C /var/local/git/grpc + +/bin/bash -l -c 'cd /var/local/git/grpc/src/ruby && gem update bundler && bundle && rake' From 08b0e667ecc1bdb990d2a26a30842291b1699b03 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 15 May 2015 09:34:49 -0700 Subject: [PATCH 010/217] Added comments to service_packager script --- src/node/cli/service_packager.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js index 7fb0a8fe284..f29180b2526 100644 --- a/src/node/cli/service_packager.js +++ b/src/node/cli/service_packager.js @@ -60,6 +60,12 @@ var arg_format = { // TODO(mlumish): autogenerate README.md from proto file +/** + * Render package.json file from template using provided parameters. + * @param {Object} params Map of parameter names to values + * @param {function(Error, string)} callback Callback to pass rendered template + * text to + */ function generatePackage(params, callback) { fs.readFile(package_tpl_path, {encoding: 'utf-8'}, function(err, template) { if (err) { @@ -71,10 +77,26 @@ function generatePackage(params, callback) { }); } +/** + * Copy a file + * @param {string} src_path The filepath to copy from + * @param {string} dest_path The filepath to copy to + */ function copyFile(src_path, dest_path) { fs.createReadStream(src_path).pipe(fs.createWriteStream(dest_path)); } +/** + * Run the script. Copies the index.js and LICENSE files to the output path, + * renders the package.json template to the output path, and generates a + * service.json file from the input proto files using pbjs. The arguments are + * taken directly from the command line, and handled as follows: + * -i (--include) : An include path for pbjs (can be dpulicated) + * -o (--output): The output path + * -n (--name): The name of the package + * -v (--version): The package version + * @param {Array} argv The argument vector + */ function main(argv) { var args = parseArgs(argv, arg_format); var out_path = path.resolve(args.out); From 9a065d2e2f91df6ff836771a2105d2368a72b3b8 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 27 Apr 2015 00:05:01 -0700 Subject: [PATCH 011/217] Adjusts generated header to new runtime and surface. --- src/compiler/generator_helpers.h | 8 ++ src/compiler/objective_c_generator.cc | 199 ++++++++++++++------------ src/compiler/objective_c_generator.h | 5 +- src/compiler/objective_c_plugin.cc | 32 +++-- 4 files changed, 132 insertions(+), 112 deletions(-) diff --git a/src/compiler/generator_helpers.h b/src/compiler/generator_helpers.h index 7ce4ec526c9..a232fcc9548 100644 --- a/src/compiler/generator_helpers.h +++ b/src/compiler/generator_helpers.h @@ -103,6 +103,14 @@ inline grpc::string CapitalizeFirstLetter(grpc::string s) { return s; } +inline grpc::string LowercaseFirstLetter(grpc::string s) { + if (s.empty()) { + return s; + } + s[0] = ::tolower(s[0]); + return s; +} + inline grpc::string LowerUnderscoreToUpperCamel(grpc::string str) { std::vector tokens = tokenize(str, "_"); grpc::string result = ""; diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc index c68c9c37c21..d1482a40d07 100644 --- a/src/compiler/objective_c_generator.cc +++ b/src/compiler/objective_c_generator.cc @@ -43,51 +43,87 @@ namespace grpc_objective_c_generator { namespace { -void PrintSimpleBlockSignature(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { - (*vars)["method_name"] = method->name(); - (*vars)["request_type"] = PrefixedName(method->input_type()->name()); - (*vars)["response_type"] = PrefixedName(method->output_type()->name()); +using ::grpc::protobuf::io::Printer; +using ::grpc::protobuf::MethodDescriptor; +using ::std::map; +using ::grpc::string; + +void PrintProtoRpcDeclarationAsPragma(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["client_stream"] = method->client_streaming() ? "stream " : ""; + vars["server_stream"] = method->server_streaming() ? "stream " : ""; + + printer->Print(vars, + "#pragma mark $method_name$($client_stream$$request_type$)" + " returns ($server_stream$$response_type$)\n\n"); +} - if (method->server_streaming()) { - printer->Print("// When the response stream finishes, the handler is " - "called with nil for both arguments.\n\n"); +void PrintMethodSignature(Printer *printer, + const MethodDescriptor *method, + const map& vars) { + // TODO(jcanizales): Print method comments. + + printer->Print(vars, "- ($return_type$)$method_name$With"); + if (method->client_streaming()) { + printer->Print("RequestsWriter:(id)request"); } else { - printer->Print("// The handler is only called once.\n\n"); + printer->Print(vars, "Request:($prefix$$request_type$ *)request"); } - printer->Print(*vars, "- (id)$method_name$WithRequest:" - "($request_type$)request completionHandler:(void(^)" - "($response_type$ *, NSError *))handler"); + + // TODO(jcanizales): Put this on a new line and align colons. + printer->Print(" handler:(void(^)("); + if (method->server_streaming()) { + printer->Print("BOOL done, "); + } + printer->Print(vars, + "$prefix$$response_type$ *response, NSError *error))handler"); } -void PrintSimpleDelegateSignature(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { - (*vars)["method_name"] = method->name(); - (*vars)["request_type"] = PrefixedName(method->input_type()->name()); +void PrintSimpleSignature(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["method_name"] = + grpc_generator::LowercaseFirstLetter(vars["method_name"]); + vars["return_type"] = "void"; + PrintMethodSignature(printer, method, vars); +} - printer->Print(*vars, "- (id)$method_name$WithRequest:" - "($request_type$)request delegate:(id)delegate"); +void PrintAdvancedSignature(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["method_name"] = "RPCTo" + vars["method_name"]; + vars["return_type"] = "ProtoRPC *"; + PrintMethodSignature(printer, method, vars); } -void PrintAdvancedSignature(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { - (*vars)["method_name"] = method->name(); - printer->Print(*vars, "- (GRXSource *)$method_name$WithRequest:" - "(id)request"); +void PrintMethodDeclarations(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["method_name"] = method->name(); + vars["request_type"] = method->input_type()->name(); + vars["response_type"] = method->output_type()->name(); + + PrintProtoRpcDeclarationAsPragma(printer, method, vars); + + PrintSimpleSignature(printer, method, vars); + printer->Print(";\n\n"); + PrintAdvancedSignature(printer, method, vars); + printer->Print(";\n\n\n"); } -void PrintSourceMethodSimpleBlock(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { - PrintSimpleBlockSignature(printer, method, vars); +void PrintSourceMethodSimpleBlock(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["method_name"] = method->name(); + vars["request_type"] = method->input_type()->name(); + vars["response_type"] = method->output_type()->name(); + + PrintSimpleSignature(printer, method, vars); - (*vars)["method_name"] = method->name(); printer->Print(" {\n"); printer->Indent(); - printer->Print(*vars, "return [[self $method_name$WithRequest:request] " + printer->Print(vars, "return [[self $method_name$WithRequest:request] " "connectHandler:^(id value, NSError *error) {\n"); printer->Indent(); printer->Print("handler(value, error);\n"); @@ -97,36 +133,25 @@ void PrintSourceMethodSimpleBlock(grpc::protobuf::io::Printer *printer, printer->Print("}\n"); } -void PrintSourceMethodSimpleDelegate(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { - PrintSimpleDelegateSignature(printer, method, vars); +void PrintSourceMethodAdvanced(Printer *printer, + const MethodDescriptor *method, + map vars) { + vars["method_name"] = method->name(); + vars["request_type"] = method->input_type()->name(); + vars["response_type"] = method->output_type()->name(); - (*vars)["method_name"] = method->name(); - printer->Print(" {\n"); - printer->Indent(); - printer->Print(*vars, "return [[self $method_name$WithRequest:request]" - "connectToSink:delegate];\n"); - printer->Outdent(); - printer->Print("}\n"); -} - -void PrintSourceMethodAdvanced(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, - std::map *vars) { PrintAdvancedSignature(printer, method, vars); - (*vars)["method_name"] = method->name(); printer->Print(" {\n"); printer->Indent(); - printer->Print(*vars, "return [self $method_name$WithRequest:request " + printer->Print(vars, "return [self $method_name$WithRequest:request " "client:[self newClient]];\n"); printer->Outdent(); printer->Print("}\n"); } -void PrintSourceMethodHandler(grpc::protobuf::io::Printer *printer, - const grpc::protobuf::MethodDescriptor *method, +void PrintSourceMethodHandler(Printer *printer, + const MethodDescriptor *method, std::map *vars) { (*vars)["method_name"] = method->name(); (*vars)["response_type"] = PrefixedName(method->output_type()->name()); @@ -148,53 +173,42 @@ void PrintSourceMethodHandler(grpc::protobuf::io::Printer *printer, } grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, - const grpc::string message_header) { + const string prefix) { grpc::string output; grpc::protobuf::io::StringOutputStream output_stream(&output); - grpc::protobuf::io::Printer printer(&output_stream, '$'); - std::map vars; - printer.Print("#import \"PBgRPCClient.h\"\n"); - printer.Print("#import \"PBStub.h\"\n"); - vars["message_header"] = message_header; - printer.Print(vars, "#import \"$message_header$\"\n\n"); - printer.Print("@protocol GRXSource\n"); - printer.Print("@class GRXSource\n\n"); - vars["service_name"] = service->name(); - printer.Print("@protocol $service_name$Stub \n\n"); - printer.Print("#pragma mark Simple block handlers\n\n"); - for (int i = 0; i < service->method_count(); i++) { - PrintSimpleBlockSignature(&printer, service->method(i), &vars); - printer.Print(";\n"); - } - printer.Print("\n"); - printer.Print("#pragma mark Simple delegate handlers.\n\n"); - printer.Print("# TODO(jcanizales): Use high-level snippets to remove this duplication."); - for (int i = 0; i < service->method_count(); i++) { - PrintSimpleDelegateSignature(&printer, service->method(i), &vars); - printer.Print(";\n"); - } - printer.Print("\n"); - printer.Print("#pragma mark Advanced handlers.\n\n"); + Printer printer(&output_stream, '$'); + + printer.Print("@protocol GRXWriteable;\n"); + printer.Print("@protocol GRXWriter;\n\n"); + + map vars = {{"service_name", service->name()}, + {"prefix", prefix}}; + printer.Print(vars, "@protocol $prefix$$service_name$ \n\n"); + for (int i = 0; i < service->method_count(); i++) { - PrintAdvancedSignature(&printer, service->method(i), &vars); - printer.Print(";\n"); + PrintMethodDeclarations(&printer, service->method(i), vars); } - printer.Print("\n"); printer.Print("@end\n\n"); - printer.Print("// Basic stub that only does marshalling and parsing\n"); - printer.Print(vars, "@interface $service_name$Stub :" - " PBStub<$service_name$Stub>\n"); - printer.Print("- (instancetype)initWithHost:(NSString *)host;\n"); + + printer.Print("// Basic service implementation, over gRPC, that only does" + " marshalling and parsing.\n"); + // use prefix + printer.Print(vars, "@interface RMT$service_name$ :" + " ProtoService\n"); + printer.Print("- (instancetype)initWithHost:(NSString *)host" + " NS_DESIGNATED_INITIALIZER;\n"); printer.Print("@end\n"); return output; } -grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service) { +grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, + const string prefix) { grpc::string output; grpc::protobuf::io::StringOutputStream output_stream(&output); - grpc::protobuf::io::Printer printer(&output_stream, '$'); - std::map vars; - vars["service_name"] = service->name(); + Printer printer(&output_stream, '$'); + + map vars = {{"service_name", service->name()}, + {"prefix", prefix}}; printer.Print(vars, "#import \"$service_name$Stub.pb.h\"\n"); printer.Print("#import \"PBGeneratedMessage+GRXSource.h\"\n\n"); vars["full_name"] = service->full_name(); @@ -211,17 +225,12 @@ grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service) { printer.Print("}\n\n"); printer.Print("#pragma mark Simple block handlers.\n"); for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodSimpleBlock(&printer, service->method(i), &vars); - } - printer.Print("\n"); - printer.Print("#pragma mark Simple delegate handlers.\n"); - for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodSimpleDelegate(&printer, service->method(i), &vars); + PrintSourceMethodSimpleBlock(&printer, service->method(i), vars); } printer.Print("\n"); printer.Print("#pragma mark Advanced handlers.\n"); for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodAdvanced(&printer, service->method(i), &vars); + PrintSourceMethodAdvanced(&printer, service->method(i), vars); } printer.Print("\n"); printer.Print("#pragma mark Handlers for subclasses " diff --git a/src/compiler/objective_c_generator.h b/src/compiler/objective_c_generator.h index 93c730b34e4..e01724a7f7d 100644 --- a/src/compiler/objective_c_generator.h +++ b/src/compiler/objective_c_generator.h @@ -39,9 +39,10 @@ namespace grpc_objective_c_generator { grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, - const grpc::string message_header); + const grpc::string prefix); -grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service); +grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, + const grpc::string prefix); } // namespace grpc_objective_c_generator diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc index eebce0cd20d..ef32dcc0562 100644 --- a/src/compiler/objective_c_plugin.cc +++ b/src/compiler/objective_c_plugin.cc @@ -54,27 +54,29 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { return true; } + grpc::string file_name = grpc_generator::FileNameInUpperCamel(file); + grpc::string prefix = "RMT"; // TODO + for (int i = 0; i < file->service_count(); i++) { const grpc::protobuf::ServiceDescriptor *service = file->service(i); - grpc::string file_name = grpc_objective_c_generator::StubFileName( - service->name()); // Generate .pb.h - grpc::string header_code = grpc_objective_c_generator::GetHeader( - service, grpc_objective_c_generator::MessageHeaderName(file)); - std::unique_ptr header_output( - context->Open(file_name + ".pb.h")); - grpc::protobuf::io::CodedOutputStream header_coded_out( - header_output.get()); - header_coded_out.WriteRaw(header_code.data(), header_code.size()); + + Insert(context, file_name + ".pb.h", "imports", + "#import \n"); + + Insert(context, file_name + ".pb.h", "global_scope", + grpc_objective_c_generator::GetHeader(service, prefix)); // Generate .pb.m - grpc::string source_code = grpc_objective_c_generator::GetSource(service); - std::unique_ptr source_output( - context->Open(file_name + ".pb.m")); - grpc::protobuf::io::CodedOutputStream source_coded_out( - source_output.get()); - source_coded_out.WriteRaw(source_code.data(), source_code.size()); + + Insert(context, file_name + ".pb.m", "imports", + "#import \n" + "#import \n" + "#import \n"); + + Insert(context, file_name + ".pb.m", "global_scope", + grpc_objective_c_generator::GetSource(service, prefix)); } return true; From 472f0b0a6b52119698197c221958af959f95d87f Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Tue, 12 May 2015 22:56:04 -0700 Subject: [PATCH 012/217] Fixes generated implementation file and adjusts plugin to proto3 Still missing: retrieving prefix from file option. --- src/compiler/objective_c_generator.cc | 159 +++++++++--------- src/compiler/objective_c_generator.h | 4 + src/compiler/objective_c_plugin.cc | 8 +- .../Sample/RemoteTestClient/Test.pb.m | 1 + 4 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc index d1482a40d07..6898b4dda3a 100644 --- a/src/compiler/objective_c_generator.cc +++ b/src/compiler/objective_c_generator.cc @@ -40,14 +40,15 @@ #include -namespace grpc_objective_c_generator { -namespace { - using ::grpc::protobuf::io::Printer; using ::grpc::protobuf::MethodDescriptor; +using ::grpc::protobuf::ServiceDescriptor; using ::std::map; using ::grpc::string; +namespace grpc_objective_c_generator { +namespace { + void PrintProtoRpcDeclarationAsPragma(Printer *printer, const MethodDescriptor *method, map vars) { @@ -72,6 +73,7 @@ void PrintMethodSignature(Printer *printer, } // TODO(jcanizales): Put this on a new line and align colons. + // TODO(jcanizales): eventHandler for server streaming? printer->Print(" handler:(void(^)("); if (method->server_streaming()) { printer->Print("BOOL done, "); @@ -112,69 +114,67 @@ void PrintMethodDeclarations(Printer *printer, printer->Print(";\n\n\n"); } -void PrintSourceMethodSimpleBlock(Printer *printer, - const MethodDescriptor *method, - map vars) { - vars["method_name"] = method->name(); - vars["request_type"] = method->input_type()->name(); - vars["response_type"] = method->output_type()->name(); +void PrintSimpleImplementation(Printer *printer, + const MethodDescriptor *method, + map vars) { + printer->Print("{\n"); + printer->Print(vars, "[[self RPCTo$method_name$With"); + if (method->client_streaming()) { + printer->Print("RequestsWriter:requestsWriter"); //TODO(jcanizales):request? + } else { + printer->Print("Request:request"); + } + printer->Print(" handler:handler] start];\n"); + printer->Print("}\n"); +} - PrintSimpleSignature(printer, method, vars); +void PrintAdvancedImplementation(Printer *printer, + const MethodDescriptor *method, + map vars) { + printer->Print("{\n"); + printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n"); + + printer->Print(" requestsWriter:"); + if (method->client_streaming()) { + printer->Print("requestsWriter\n"); + } else { + printer->Print("[GRXWriter writerWithValue:request]\n"); + } + + printer->Print(vars, " responseClass:[$response_type$ class]\n"); + + printer->Print(" responsesWriteable:[GRXWriteable "); + if (method->server_streaming()) { + printer->Print("writeableWithStreamHandler:handler]];\n"); + } else { + printer->Print("writeableWithSingleValueHandler:handler]];\n"); + } - printer->Print(" {\n"); - printer->Indent(); - printer->Print(vars, "return [[self $method_name$WithRequest:request] " - "connectHandler:^(id value, NSError *error) {\n"); - printer->Indent(); - printer->Print("handler(value, error);\n"); - printer->Outdent(); - printer->Print("}];\n"); - printer->Outdent(); printer->Print("}\n"); } -void PrintSourceMethodAdvanced(Printer *printer, - const MethodDescriptor *method, - map vars) { +void PrintMethodImplementations(Printer *printer, + const MethodDescriptor *method, + map vars) { vars["method_name"] = method->name(); vars["request_type"] = method->input_type()->name(); vars["response_type"] = method->output_type()->name(); - PrintAdvancedSignature(printer, method, vars); + PrintProtoRpcDeclarationAsPragma(printer, method, vars); - printer->Print(" {\n"); - printer->Indent(); - printer->Print(vars, "return [self $method_name$WithRequest:request " - "client:[self newClient]];\n"); - printer->Outdent(); - printer->Print("}\n"); -} + // TODO(jcanizales): Print documentation from the method. + PrintSimpleSignature(printer, method, vars); + PrintSimpleImplementation(printer, method, vars); -void PrintSourceMethodHandler(Printer *printer, - const MethodDescriptor *method, - std::map *vars) { - (*vars)["method_name"] = method->name(); - (*vars)["response_type"] = PrefixedName(method->output_type()->name()); - (*vars)["caps_name"] = grpc_generator::CapitalizeFirstLetter(method->name()); - - printer->Print(*vars, "- (GRXSource *)$method_name$WithRequest:" - "(id)request client:(PBgRPCClient *)client {\n"); - printer->Indent(); - printer->Print(*vars, - "return [self responseWithMethod:$@\"$caps_name\"\n"); - printer->Print(*vars, - " class:[$response_type$ class]\n"); - printer->Print(" request:request\n"); - printer->Print(" client:client];\n"); - printer->Outdent(); - printer->Print("}\n"); + printer->Print("// Returns a not-yet-started RPC object.\n"); + PrintAdvancedSignature(printer, method, vars); + PrintAdvancedImplementation(printer, method, vars); } -} +} // namespace -grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, - const string prefix) { - grpc::string output; +string GetHeader(const ServiceDescriptor *service, const string prefix) { + string output; grpc::protobuf::io::StringOutputStream output_stream(&output); Printer printer(&output_stream, '$'); @@ -192,52 +192,47 @@ grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, printer.Print("// Basic service implementation, over gRPC, that only does" " marshalling and parsing.\n"); - // use prefix - printer.Print(vars, "@interface RMT$service_name$ :" - " ProtoService\n"); + printer.Print(vars, "@interface $prefix$$service_name$ :" + " ProtoService<$prefix$$service_name$>\n"); printer.Print("- (instancetype)initWithHost:(NSString *)host" " NS_DESIGNATED_INITIALIZER;\n"); printer.Print("@end\n"); return output; } -grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, - const string prefix) { - grpc::string output; +string GetSource(const ServiceDescriptor *service, const string prefix) { + string output; grpc::protobuf::io::StringOutputStream output_stream(&output); Printer printer(&output_stream, '$'); map vars = {{"service_name", service->name()}, + {"package", service->file()->package()}, {"prefix", prefix}}; - printer.Print(vars, "#import \"$service_name$Stub.pb.h\"\n"); - printer.Print("#import \"PBGeneratedMessage+GRXSource.h\"\n\n"); - vars["full_name"] = service->full_name(); + + printer.Print(vars, + "static NSString *const kPackageName = @\"$package$\";\n"); printer.Print(vars, - "static NSString *const kInterface = @\"$full_name$\";\n"); - printer.Print("@implementation $service_name$Stub\n\n"); + "static NSString *const kServiceName = @\"$service_name$\";\n\n"); + + printer.Print(vars, "@implementation $prefix$$service_name$\n\n"); + + printer.Print("// Designated initializer\n"); printer.Print("- (instancetype)initWithHost:(NSString *)host {\n"); - printer.Indent(); - printer.Print("if ((self = [super initWithHost:host " - "interface:kInterface])) {\n"); - printer.Print("}\n"); - printer.Print("return self;\n"); - printer.Outdent(); + printer.Print(" return (self = [super initWithHost:host" + " packageName:kPackageName serviceName:kServiceName]);\n"); printer.Print("}\n\n"); - printer.Print("#pragma mark Simple block handlers.\n"); - for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodSimpleBlock(&printer, service->method(i), vars); - } - printer.Print("\n"); - printer.Print("#pragma mark Advanced handlers.\n"); - for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodAdvanced(&printer, service->method(i), vars); - } - printer.Print("\n"); - printer.Print("#pragma mark Handlers for subclasses " - "(stub wrappers) to override.\n"); + printer.Print("// Override superclass initializer to disallow different" + " package and service names.\n"); + printer.Print("- (instancetype)initWithHost:(NSString *)host\n"); + printer.Print(" packageName:(NSString *)packageName\n"); + printer.Print(" serviceName:(NSString *)serviceName {\n"); + printer.Print(" return [self initWithHost:host];\n"); + printer.Print("}\n\n\n"); + for (int i = 0; i < service->method_count(); i++) { - PrintSourceMethodHandler(&printer, service->method(i), &vars); + PrintMethodImplementations(&printer, service->method(i), vars); } + printer.Print("@end\n"); return output; } diff --git a/src/compiler/objective_c_generator.h b/src/compiler/objective_c_generator.h index e01724a7f7d..548e96fcf19 100644 --- a/src/compiler/objective_c_generator.h +++ b/src/compiler/objective_c_generator.h @@ -38,9 +38,13 @@ namespace grpc_objective_c_generator { +// Returns the content to be included in the "global_scope" insertion point of +// the generated header file. grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, const grpc::string prefix); +// Returns the content to be included in the "global_scope" insertion point of +// the generated implementation file. grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, const grpc::string prefix); diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc index ef32dcc0562..dec8594673a 100644 --- a/src/compiler/objective_c_plugin.cc +++ b/src/compiler/objective_c_plugin.cc @@ -62,20 +62,20 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { // Generate .pb.h - Insert(context, file_name + ".pb.h", "imports", + Insert(context, file_name + ".pbobjc.h", "imports", "#import \n"); - Insert(context, file_name + ".pb.h", "global_scope", + Insert(context, file_name + ".pbobjc.h", "global_scope", grpc_objective_c_generator::GetHeader(service, prefix)); // Generate .pb.m - Insert(context, file_name + ".pb.m", "imports", + Insert(context, file_name + ".pbobjc.m", "imports", "#import \n" "#import \n" "#import \n"); - Insert(context, file_name + ".pb.m", "global_scope", + Insert(context, file_name + ".pbobjc.m", "global_scope", grpc_objective_c_generator::GetSource(service, prefix)); } diff --git a/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m b/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m index 31a3ba3a611..5c2b98890b5 100644 --- a/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m +++ b/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m @@ -44,6 +44,7 @@ static NSString *const kServiceName = @"TestService"; return [self initWithHost:host]; } + #pragma mark EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty) // One empty request followed by one empty response. From 1a7918bc6e83db04822cafe06e69ee99a6d666c1 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Wed, 13 May 2015 12:04:03 -0700 Subject: [PATCH 013/217] Generate separate files until either of GeneratorContext::OpenForAppend/Insert work. --- src/compiler/objective_c_plugin.cc | 67 ++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc index dec8594673a..1fe382cfdb6 100644 --- a/src/compiler/objective_c_plugin.cc +++ b/src/compiler/objective_c_plugin.cc @@ -39,44 +39,59 @@ #include "src/compiler/objective_c_generator.h" #include "src/compiler/objective_c_generator_helpers.h" +using ::grpc::string; + class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: ObjectiveCGrpcGenerator() {} virtual ~ObjectiveCGrpcGenerator() {} virtual bool Generate(const grpc::protobuf::FileDescriptor *file, - const grpc::string ¶meter, + const string ¶meter, grpc::protobuf::compiler::GeneratorContext *context, - grpc::string *error) const { + string *error) const { if (file->service_count() == 0) { // No services. Do nothing. return true; } - grpc::string file_name = grpc_generator::FileNameInUpperCamel(file); - grpc::string prefix = "RMT"; // TODO + string file_name = grpc_generator::FileNameInUpperCamel(file); + string prefix = "RMT"; // TODO for (int i = 0; i < file->service_count(); i++) { const grpc::protobuf::ServiceDescriptor *service = file->service(i); - // Generate .pb.h + { + // Generate .pbrpc.h + + string imports = string("#import \"") + file_name + ".pbobjc.h\"\n" + "#import \n"; + //Append(context, file_name + ".pbobjc.h",/* "imports",*/ imports); - Insert(context, file_name + ".pbobjc.h", "imports", - "#import \n"); + string declarations = + grpc_objective_c_generator::GetHeader(service, prefix); + //Append(context, file_name + ".pbobjc.h",/* "global_scope",*/ + // declarations); - Insert(context, file_name + ".pbobjc.h", "global_scope", - grpc_objective_c_generator::GetHeader(service, prefix)); + Write(context, file_name + ".pbrpc.h", imports + declarations); + } - // Generate .pb.m + { + // Generate .pbrpc.m - Insert(context, file_name + ".pbobjc.m", "imports", + string imports = string("#import \"") + file_name + ".pbrpc.h\"\n" "#import \n" "#import \n" - "#import \n"); - - Insert(context, file_name + ".pbobjc.m", "global_scope", - grpc_objective_c_generator::GetSource(service, prefix)); + "#import \n"; + //Append(context, file_name + ".pbobjc.m",/* "imports",*/ imports); + + string definitions = + grpc_objective_c_generator::GetSource(service, prefix); + //Append(context, file_name + ".pbobjc.m",/* "global_scope",*/ + // definitions); + Write(context, file_name + ".pbrpc.m", imports + definitions); + } } return true; @@ -85,13 +100,31 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { private: // Insert the given code into the given file at the given insertion point. void Insert(grpc::protobuf::compiler::GeneratorContext *context, - const grpc::string &filename, const grpc::string &insertion_point, - const grpc::string &code) const { + const string &filename, const string &insertion_point, + const string &code) const { std::unique_ptr output( context->OpenForInsert(filename, insertion_point)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); } + + // Append the given code into the given file. + void Append(grpc::protobuf::compiler::GeneratorContext *context, + const string &filename, const string &code) const { + std::unique_ptr output( + context->OpenForAppend(filename)); + grpc::protobuf::io::CodedOutputStream coded_out(output.get()); + coded_out.WriteRaw(code.data(), code.size()); + } + + // Write the given code into the given file. + void Write(grpc::protobuf::compiler::GeneratorContext *context, + const string &filename, const string &code) const { + std::unique_ptr output( + context->Open(filename)); + grpc::protobuf::io::CodedOutputStream coded_out(output.get()); + coded_out.WriteRaw(code.data(), code.size()); + } }; int main(int argc, char *argv[]) { From 1900dfc70b04545fe7a0f6a7ad9441ab3ba1fdda Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Fri, 15 May 2015 09:44:04 -0700 Subject: [PATCH 014/217] Generate imports for .proto dependencies, and read prefix from file. The prefix has still to be applied per-message, and we could do forward-declarations in the generated header. --- src/compiler/objective_c_generator.cc | 9 ++- src/compiler/objective_c_generator_helpers.h | 12 +-- src/compiler/objective_c_plugin.cc | 78 +++++++++----------- 3 files changed, 39 insertions(+), 60 deletions(-) diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc index 6898b4dda3a..8f35302beee 100644 --- a/src/compiler/objective_c_generator.cc +++ b/src/compiler/objective_c_generator.cc @@ -118,9 +118,9 @@ void PrintSimpleImplementation(Printer *printer, const MethodDescriptor *method, map vars) { printer->Print("{\n"); - printer->Print(vars, "[[self RPCTo$method_name$With"); + printer->Print(vars, " [[self RPCTo$method_name$With"); if (method->client_streaming()) { - printer->Print("RequestsWriter:requestsWriter"); //TODO(jcanizales):request? + printer->Print("RequestsWriter:request"); } else { printer->Print("Request:request"); } @@ -136,12 +136,13 @@ void PrintAdvancedImplementation(Printer *printer, printer->Print(" requestsWriter:"); if (method->client_streaming()) { - printer->Print("requestsWriter\n"); + printer->Print("request\n"); } else { printer->Print("[GRXWriter writerWithValue:request]\n"); } - printer->Print(vars, " responseClass:[$response_type$ class]\n"); + printer->Print(vars, + " responseClass:[$prefix$$response_type$ class]\n"); printer->Print(" responsesWriteable:[GRXWriteable "); if (method->server_streaming()) { diff --git a/src/compiler/objective_c_generator_helpers.h b/src/compiler/objective_c_generator_helpers.h index 6a7c13991fd..d92a2b5e9af 100644 --- a/src/compiler/objective_c_generator_helpers.h +++ b/src/compiler/objective_c_generator_helpers.h @@ -40,18 +40,8 @@ namespace grpc_objective_c_generator { -const grpc::string prefix = "PBG"; - inline grpc::string MessageHeaderName(const grpc::protobuf::FileDescriptor *file) { - return grpc_generator::FileNameInUpperCamel(file) + ".pb.h"; -} - -inline grpc::string StubFileName(grpc::string service_name) { - return prefix + service_name + "Stub"; -} - -inline grpc::string PrefixedName(grpc::string name) { - return prefix + name; + return grpc_generator::FileNameInUpperCamel(file) + ".pbobjc.h"; } } diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc index 1fe382cfdb6..3cb170e95cf 100644 --- a/src/compiler/objective_c_plugin.cc +++ b/src/compiler/objective_c_plugin.cc @@ -57,66 +57,54 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } string file_name = grpc_generator::FileNameInUpperCamel(file); - string prefix = "RMT"; // TODO + string prefix = file->options().objc_class_prefix(); - for (int i = 0; i < file->service_count(); i++) { - const grpc::protobuf::ServiceDescriptor *service = file->service(i); + { + // Generate .pbrpc.h - { - // Generate .pbrpc.h + string imports = string("#import \"") + file_name + ".pbobjc.h\"\n" + "#import \n"; - string imports = string("#import \"") + file_name + ".pbobjc.h\"\n" - "#import \n"; - //Append(context, file_name + ".pbobjc.h",/* "imports",*/ imports); - - string declarations = - grpc_objective_c_generator::GetHeader(service, prefix); - //Append(context, file_name + ".pbobjc.h",/* "global_scope",*/ - // declarations); + // TODO(jcanizales): Instead forward-declare the input and output types + // and import the files in the .pbrpc.m + string proto_imports; + for (int i = 0; i < file->dependency_count(); i++) { + string header = grpc_objective_c_generator::MessageHeaderName( + file->dependency(i)); + proto_imports += string("#import \"") + header + "\"\n"; + } - Write(context, file_name + ".pbrpc.h", imports + declarations); + string declarations; + for (int i = 0; i < file->service_count(); i++) { + const grpc::protobuf::ServiceDescriptor *service = file->service(i); + declarations += grpc_objective_c_generator::GetHeader(service, prefix); } - { - // Generate .pbrpc.m + Write(context, file_name + ".pbrpc.h", + imports + '\n' + proto_imports + '\n' + declarations); + } + + { + // Generate .pbrpc.m - string imports = string("#import \"") + file_name + ".pbrpc.h\"\n" - "#import \n" - "#import \n" - "#import \n"; - //Append(context, file_name + ".pbobjc.m",/* "imports",*/ imports); + string imports = string("#import \"") + file_name + ".pbrpc.h\"\n" + "#import \n" + "#import \n" + "#import \n"; - string definitions = - grpc_objective_c_generator::GetSource(service, prefix); - //Append(context, file_name + ".pbobjc.m",/* "global_scope",*/ - // definitions); - Write(context, file_name + ".pbrpc.m", imports + definitions); + string definitions; + for (int i = 0; i < file->service_count(); i++) { + const grpc::protobuf::ServiceDescriptor *service = file->service(i); + definitions += grpc_objective_c_generator::GetSource(service, prefix); } + + Write(context, file_name + ".pbrpc.m", imports + '\n' + definitions); } return true; } private: - // Insert the given code into the given file at the given insertion point. - void Insert(grpc::protobuf::compiler::GeneratorContext *context, - const string &filename, const string &insertion_point, - const string &code) const { - std::unique_ptr output( - context->OpenForInsert(filename, insertion_point)); - grpc::protobuf::io::CodedOutputStream coded_out(output.get()); - coded_out.WriteRaw(code.data(), code.size()); - } - - // Append the given code into the given file. - void Append(grpc::protobuf::compiler::GeneratorContext *context, - const string &filename, const string &code) const { - std::unique_ptr output( - context->OpenForAppend(filename)); - grpc::protobuf::io::CodedOutputStream coded_out(output.get()); - coded_out.WriteRaw(code.data(), code.size()); - } - // Write the given code into the given file. void Write(grpc::protobuf::compiler::GeneratorContext *context, const string &filename, const string &code) const { From fbac5f17b71cb2fc6b3b8f377dc1b896fdf952e0 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 14:20:44 -0700 Subject: [PATCH 015/217] Crash handling test --- Makefile | 88 +++++++++++++- build.json | 36 +++++- include/grpc/support/subprocess.h | 10 +- src/core/support/subprocess_posix.c | 6 +- src/core/surface/call.c | 9 +- test/core/fling/fling_test.c | 4 +- test/cpp/end2end/crash_test.cc | 159 ++++++++++++++++++++++++++ test/cpp/end2end/crash_test_server.cc | 95 +++++++++++++++ test/cpp/util/subprocess.cc | 66 +++++++++++ test/cpp/util/subprocess.h | 61 ++++++++++ tools/run_tests/tests.json | 9 ++ 11 files changed, 536 insertions(+), 7 deletions(-) create mode 100644 test/cpp/end2end/crash_test.cc create mode 100644 test/cpp/end2end/crash_test_server.cc create mode 100644 test/cpp/util/subprocess.cc create mode 100644 test/cpp/util/subprocess.h diff --git a/Makefile b/Makefile index fae87b9d452..6d47993f8d1 100644 --- a/Makefile +++ b/Makefile @@ -672,6 +672,8 @@ async_streaming_ping_pong_test: $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_te async_unary_ping_pong_test: $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test cli_call_test: $(BINDIR)/$(CONFIG)/cli_call_test +crash_test: $(BINDIR)/$(CONFIG)/crash_test +crash_test_server: $(BINDIR)/$(CONFIG)/crash_test_server credentials_test: $(BINDIR)/$(CONFIG)/credentials_test cxx_time_test: $(BINDIR)/$(CONFIG)/cxx_time_test end2end_test: $(BINDIR)/$(CONFIG)/end2end_test @@ -1084,7 +1086,7 @@ buildtests: buildtests_c buildtests_cxx buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test -buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test +buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/crash_test $(BINDIR)/$(CONFIG)/crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test test: test_c test_cxx @@ -1816,6 +1818,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/channel_arguments_test || ( echo test channel_arguments_test failed ; exit 1 ) $(E) "[RUN] Testing cli_call_test" $(Q) $(BINDIR)/$(CONFIG)/cli_call_test || ( echo test cli_call_test failed ; exit 1 ) + $(E) "[RUN] Testing crash_test" + $(Q) $(BINDIR)/$(CONFIG)/crash_test || ( echo test crash_test failed ; exit 1 ) $(E) "[RUN] Testing credentials_test" $(Q) $(BINDIR)/$(CONFIG)/credentials_test || ( echo test credentials_test failed ; exit 1 ) $(E) "[RUN] Testing cxx_time_test" @@ -3011,6 +3015,7 @@ LIBGRPC++_TEST_UTIL_SRC = \ $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc \ test/cpp/util/cli_call.cc \ test/cpp/util/create_test_channel.cc \ + test/cpp/util/subprocess.cc \ LIBGRPC++_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_TEST_UTIL_SRC)))) @@ -3056,6 +3061,7 @@ endif endif $(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o: $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc LIBGRPC++_UNSECURE_SRC = \ @@ -6897,6 +6903,86 @@ endif endif +CRASH_TEST_SRC = \ + test/cpp/end2end/crash_test.cc \ + +CRASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CRASH_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/crash_test: openssl_dep_error + +else + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/crash_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/crash_test: $(PROTOBUF_DEP) $(CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/crash_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/crash_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_crash_test: $(CRASH_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CRASH_TEST_OBJS:.o=.dep) +endif +endif + + +CRASH_TEST_SERVER_SRC = \ + test/cpp/end2end/crash_test_server.cc \ + +CRASH_TEST_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CRASH_TEST_SERVER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/crash_test_server: openssl_dep_error + +else + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/crash_test_server: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/crash_test_server: $(PROTOBUF_DEP) $(CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/crash_test_server + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/crash_test_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_crash_test_server: $(CRASH_TEST_SERVER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CRASH_TEST_SERVER_OBJS:.o=.dep) +endif +endif + + CREDENTIALS_TEST_SRC = \ test/cpp/client/credentials_test.cc \ diff --git a/build.json b/build.json index bdc167e5461..b087031bfc5 100644 --- a/build.json +++ b/build.json @@ -542,7 +542,8 @@ "test/cpp/util/echo.proto", "test/cpp/util/echo_duplicate.proto", "test/cpp/util/cli_call.cc", - "test/cpp/util/create_test_channel.cc" + "test/cpp/util/create_test_channel.cc", + "test/cpp/util/subprocess.cc" ] }, { @@ -1874,6 +1875,39 @@ "gpr" ] }, + { + "name": "crash_test", + "build": "test", + "language": "c++", + "src": [ + "test/cpp/end2end/crash_test.cc" + ], + "deps": [ + "grpc++_test_util", + "grpc_test_util", + "grpc++", + "grpc", + "gpr_test_util", + "gpr" + ] + }, + { + "name": "crash_test_server", + "build": "test", + "run": false, + "language": "c++", + "src": [ + "test/cpp/end2end/crash_test_server.cc" + ], + "deps": [ + "grpc++_test_util", + "grpc_test_util", + "grpc++", + "grpc", + "gpr_test_util", + "gpr" + ] + }, { "name": "credentials_test", "build": "test", diff --git a/include/grpc/support/subprocess.h b/include/grpc/support/subprocess.h index c59751da83e..e6dbb88eaee 100644 --- a/include/grpc/support/subprocess.h +++ b/include/grpc/support/subprocess.h @@ -34,16 +34,24 @@ #ifndef GRPC_SUPPORT_SUBPROCESS_H #define GRPC_SUPPORT_SUBPROCESS_H +#ifdef __cplusplus +extern "C" { +#endif + typedef struct gpr_subprocess gpr_subprocess; /* .exe on windows, empty on unices */ char *gpr_subprocess_binary_extension(); -gpr_subprocess *gpr_subprocess_create(int argc, char **argv); +gpr_subprocess *gpr_subprocess_create(int argc, const char **argv); /* if subprocess has not been joined, kill it */ void gpr_subprocess_destroy(gpr_subprocess *p); /* returns exit status; can be called at most once */ int gpr_subprocess_join(gpr_subprocess *p); void gpr_subprocess_interrupt(gpr_subprocess *p); +#ifdef __cplusplus +} // extern "C" +#endif + #endif diff --git a/src/core/support/subprocess_posix.c b/src/core/support/subprocess_posix.c index 4580537aa85..327c476b166 100644 --- a/src/core/support/subprocess_posix.c +++ b/src/core/support/subprocess_posix.c @@ -57,7 +57,7 @@ struct gpr_subprocess { char *gpr_subprocess_binary_extension() { return ""; } -gpr_subprocess *gpr_subprocess_create(int argc, char **argv) { +gpr_subprocess *gpr_subprocess_create(int argc, const char **argv) { gpr_subprocess *r; int pid; char **exec_args; @@ -92,7 +92,11 @@ void gpr_subprocess_destroy(gpr_subprocess *p) { int gpr_subprocess_join(gpr_subprocess *p) { int status; +retry: if (waitpid(p->pid, &status, 0) == -1) { + if (errno == EINTR) { + goto retry; + } gpr_log(GPR_ERROR, "waitpid failed: %s", strerror(errno)); return -1; } diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 50df36cae9f..e1fef35fe76 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -1175,6 +1175,10 @@ static void set_cancelled_value(grpc_status_code status, void *dest) { } static void finish_batch(grpc_call *call, int success, void *tag) { + grpc_cq_end_op(call->cq, tag, call, success); +} + +static void finish_batch_with_close(grpc_call *call, int success, void *tag) { grpc_cq_end_op(call->cq, tag, call, 1); } @@ -1185,6 +1189,7 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t out; const grpc_op *op; grpc_ioreq *req; + void (*finish_func)(grpc_call *, int, void *) = finish_batch; GRPC_CALL_LOG_BATCH(GPR_INFO, call, ops, nops, tag); @@ -1268,6 +1273,7 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, op->data.recv_status_on_client.trailing_metadata; req = &reqs[out++]; req->op = GRPC_IOREQ_RECV_CLOSE; + finish_func = finish_batch_with_close; break; case GRPC_OP_RECV_CLOSE_ON_SERVER: req = &reqs[out++]; @@ -1277,13 +1283,14 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, op->data.recv_close_on_server.cancelled; req = &reqs[out++]; req->op = GRPC_IOREQ_RECV_CLOSE; + finish_func = finish_batch_with_close; break; } } grpc_cq_begin_op(call->cq, call); - return grpc_call_start_ioreq_and_call_back(call, reqs, out, finish_batch, + return grpc_call_start_ioreq_and_call_back(call, reqs, out, finish_func, tag); } diff --git a/test/core/fling/fling_test.c b/test/core/fling/fling_test.c index 7c1643df6aa..6b07f83d5bb 100644 --- a/test/core/fling/fling_test.c +++ b/test/core/fling/fling_test.c @@ -60,7 +60,7 @@ int main(int argc, char **argv) { args[1] = "--bind"; gpr_join_host_port(&args[2], "::", port); args[3] = "--no-secure"; - svr = gpr_subprocess_create(4, args); + svr = gpr_subprocess_create(4, (const char**)args); gpr_free(args[0]); gpr_free(args[2]); @@ -71,7 +71,7 @@ int main(int argc, char **argv) { args[3] = "--scenario=ping-pong-request"; args[4] = "--no-secure"; args[5] = 0; - cli = gpr_subprocess_create(6, args); + cli = gpr_subprocess_create(6, (const char**)args); gpr_free(args[0]); gpr_free(args[2]); diff --git a/test/cpp/end2end/crash_test.cc b/test/cpp/end2end/crash_test.cc new file mode 100644 index 00000000000..dbb24d4259b --- /dev/null +++ b/test/cpp/end2end/crash_test.cc @@ -0,0 +1,159 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" +#include "src/cpp/server/thread_pool.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "test/cpp/util/subprocess.h" + +using grpc::cpp::test::util::EchoRequest; +using grpc::cpp::test::util::EchoResponse; +using std::chrono::system_clock; + +static std::string g_root; + +namespace grpc { +namespace testing { + +namespace { + +class CrashTest : public ::testing::Test { + protected: + CrashTest() {} + + std::unique_ptr CreateServerAndStub() { + auto port = grpc_pick_unused_port_or_die(); + auto addr = (std::ostringstream() << "localhost:" << port).str(); + server_.reset(new SubProcess({ + (std::ostringstream() << g_root << "/crash_test_server").str(), + (std::ostringstream() << "--address=" << addr).str(), + })); + GPR_ASSERT(server_); + return grpc::cpp::test::util::TestService::NewStub(CreateChannel(addr, InsecureCredentials(), ChannelArguments())); + } + + void KillServer() { + server_.reset(); + } + + private: + std::unique_ptr server_; +}; + +TEST_F(CrashTest, KillAfterWrite) { + auto stub = CreateServerAndStub(); + + EchoRequest request; + EchoResponse response; + ClientContext context; + + auto stream = stub->BidiStream(&context); + + request.set_message("Hello"); + EXPECT_TRUE(stream->Write(request)); + EXPECT_TRUE(stream->Read(&response)); + EXPECT_EQ(response.message(), request.message()); + + request.set_message("I'm going to kill you"); + EXPECT_TRUE(stream->Write(request)); + + KillServer(); + + EXPECT_FALSE(stream->Read(&response)); + + EXPECT_FALSE(stream->Finish().IsOk()); +} + +TEST_F(CrashTest, KillBeforeWrite) { + auto stub = CreateServerAndStub(); + + EchoRequest request; + EchoResponse response; + ClientContext context; + + auto stream = stub->BidiStream(&context); + + request.set_message("Hello"); + EXPECT_TRUE(stream->Write(request)); + EXPECT_TRUE(stream->Read(&response)); + EXPECT_EQ(response.message(), request.message()); + + KillServer(); + + request.set_message("You should be dead"); + EXPECT_FALSE(stream->Write(request)); + EXPECT_FALSE(stream->Read(&response)); + + EXPECT_FALSE(stream->Finish().IsOk()); +} + +} // namespace + +} // namespace testing +} // namespace grpc + +int main(int argc, char** argv) { + std::string me = argv[0]; + auto lslash = me.rfind('/'); + if (lslash != std::string::npos) { + g_root = me.substr(0, lslash); + } else { + g_root = "."; + } + + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/cpp/end2end/crash_test_server.cc b/test/cpp/end2end/crash_test_server.cc new file mode 100644 index 00000000000..b6b30a52046 --- /dev/null +++ b/test/cpp/end2end/crash_test_server.cc @@ -0,0 +1,95 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "test/cpp/util/echo.grpc.pb.h" + +DEFINE_string(address, "", "Address to bind to"); + +using grpc::cpp::test::util::EchoRequest; +using grpc::cpp::test::util::EchoResponse; + +// In some distros, gflags is in the namespace google, and in some others, +// in gflags. This hack is enabling us to find both. +namespace google {} +namespace gflags {} +using namespace google; +using namespace gflags; + +namespace grpc { +namespace testing { + +class ServiceImpl final : public grpc::cpp::test::util::TestService::Service { + Status BidiStream(ServerContext* context, + ServerReaderWriter* stream) + GRPC_OVERRIDE { + EchoRequest request; + EchoResponse response; + while (stream->Read(&request)) { + gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); + response.set_message(request.message()); + stream->Write(response); + } + return Status::OK; + } +}; + +void RunServer() { + ServiceImpl service; + + ServerBuilder builder; + builder.AddListeningPort(FLAGS_address, grpc::InsecureServerCredentials()); + builder.RegisterService(&service); + std::unique_ptr server(builder.BuildAndStart()); + std::cout << "Server listening on " << FLAGS_address << std::endl; + server->Wait(); +} + +} +} + +int main(int argc, char** argv) { + ParseCommandLineFlags(&argc, &argv, true); + grpc::testing::RunServer(); + + return 0; +} diff --git a/test/cpp/util/subprocess.cc b/test/cpp/util/subprocess.cc new file mode 100644 index 00000000000..ae4334fa54a --- /dev/null +++ b/test/cpp/util/subprocess.cc @@ -0,0 +1,66 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "test/cpp/util/subprocess.h" + +#include + +#include + +namespace grpc { + +static gpr_subprocess *MakeProcess(std::initializer_list args) { + std::vector vargs; + for (auto it = args.begin(); it != args.end(); ++it) { + vargs.push_back(it->c_str()); + } + return gpr_subprocess_create(vargs.size(), &vargs[0]); +} + +SubProcess::SubProcess(std::initializer_list args) + : subprocess_(MakeProcess(args)) { +} + +SubProcess::~SubProcess() { + gpr_subprocess_destroy(subprocess_); +} + +int SubProcess::Join() { + return gpr_subprocess_join(subprocess_); +} + +void SubProcess::Interrupt() { + gpr_subprocess_interrupt(subprocess_); +} + +} // namespace grpc \ No newline at end of file diff --git a/test/cpp/util/subprocess.h b/test/cpp/util/subprocess.h new file mode 100644 index 00000000000..02cce578f88 --- /dev/null +++ b/test/cpp/util/subprocess.h @@ -0,0 +1,61 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_TEST_CPP_UTIL_SUBPROCESS_H +#define GRPC_TEST_CPP_UTIL_SUBPROCESS_H + +#include +#include + +struct gpr_subprocess; + +namespace grpc { + +class SubProcess { + public: + SubProcess(std::initializer_list args); + ~SubProcess(); + + int Join(); + void Interrupt(); + + private: + SubProcess(const SubProcess& other); + SubProcess& operator=(const SubProcess& other); + + gpr_subprocess *const subprocess_; +}; + +} // namespace grpc + +#endif // GRPC_TEST_CPP_UTIL_SUBPROCESS_H diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index e0b7ef16fb6..87fb3276ab4 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -614,6 +614,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c++", + "name": "crash_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c++", From 134e92fafba1638121c3ddfee4c7e3d52404a374 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 11 May 2015 14:24:34 -0700 Subject: [PATCH 016/217] Move state update to ack, to prevent races Conflicts: src/core/surface/call.c --- src/core/surface/call.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/surface/call.c b/src/core/surface/call.c index e1fef35fe76..7a30de5f332 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -588,6 +588,7 @@ static void call_on_done_send(void *pc, int success) { lock(call); if (call->last_send_contains & (1 << GRPC_IOREQ_SEND_INITIAL_METADATA)) { finish_ioreq_op(call, GRPC_IOREQ_SEND_INITIAL_METADATA, success); + call->write_state = WRITE_STATE_STARTED; } if (call->last_send_contains & (1 << GRPC_IOREQ_SEND_MESSAGE)) { finish_ioreq_op(call, GRPC_IOREQ_SEND_MESSAGE, success); @@ -596,6 +597,10 @@ static void call_on_done_send(void *pc, int success) { finish_ioreq_op(call, GRPC_IOREQ_SEND_TRAILING_METADATA, success); finish_ioreq_op(call, GRPC_IOREQ_SEND_STATUS, success); finish_ioreq_op(call, GRPC_IOREQ_SEND_CLOSE, 1); + call->write_state = WRITE_STATE_WRITE_CLOSED; + } + if (!success) { + call->write_state = WRITE_STATE_WRITE_CLOSED; } call->last_send_contains = 0; call->sending = 0; @@ -810,7 +815,6 @@ static int fill_send_ops(grpc_call *call, grpc_transport_op *op) { op->send_ops = &call->send_ops; op->bind_pollset = grpc_cq_pollset(call->cq); call->last_send_contains |= 1 << GRPC_IOREQ_SEND_INITIAL_METADATA; - call->write_state = WRITE_STATE_STARTED; call->send_initial_metadata_count = 0; /* fall through intended */ case WRITE_STATE_STARTED: @@ -826,7 +830,6 @@ static int fill_send_ops(grpc_call *call, grpc_transport_op *op) { op->is_last_send = 1; op->send_ops = &call->send_ops; call->last_send_contains |= 1 << GRPC_IOREQ_SEND_CLOSE; - call->write_state = WRITE_STATE_WRITE_CLOSED; if (!call->is_client) { /* send trailing metadata */ data = call->request_data[GRPC_IOREQ_SEND_TRAILING_METADATA]; From 069daa383e720ac662fd4d8dd852f486556dcacf Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 14:40:53 -0700 Subject: [PATCH 017/217] Sleep a little after server death to allow TCP time to catch up --- test/cpp/end2end/crash_test.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/cpp/end2end/crash_test.cc b/test/cpp/end2end/crash_test.cc index dbb24d4259b..91370edcd4c 100644 --- a/test/cpp/end2end/crash_test.cc +++ b/test/cpp/end2end/crash_test.cc @@ -86,6 +86,8 @@ class CrashTest : public ::testing::Test { void KillServer() { server_.reset(); + // give some time for the TCP connection to drop + gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(1))); } private: From f95f048c3e05e9d7de351534ca5c09b8edbadaaf Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 14:42:54 -0700 Subject: [PATCH 018/217] Make cq tracing work again --- src/core/surface/completion_queue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 48910afda33..8c9ca48a059 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -275,14 +275,14 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); memset(&ret, 0, sizeof(ret)); ret.type = GRPC_QUEUE_TIMEOUT; - GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ev->base); + GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); return ret; } } gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); ret = ev->base; gpr_free(ev); - GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ev->base); + GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); return ret; } From 3cdd9bbdbce1f460254b7117ebb7cff67146d5d1 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 14:43:47 -0700 Subject: [PATCH 019/217] clang-format --- test/cpp/end2end/crash_test.cc | 10 ++++++---- test/cpp/end2end/crash_test_server.cc | 1 - test/cpp/util/subprocess.cc | 25 +++++++++---------------- test/cpp/util/subprocess.h | 14 +++++++------- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/test/cpp/end2end/crash_test.cc b/test/cpp/end2end/crash_test.cc index 91370edcd4c..10f4944b547 100644 --- a/test/cpp/end2end/crash_test.cc +++ b/test/cpp/end2end/crash_test.cc @@ -73,15 +73,17 @@ class CrashTest : public ::testing::Test { protected: CrashTest() {} - std::unique_ptr CreateServerAndStub() { + std::unique_ptr + CreateServerAndStub() { auto port = grpc_pick_unused_port_or_die(); auto addr = (std::ostringstream() << "localhost:" << port).str(); server_.reset(new SubProcess({ - (std::ostringstream() << g_root << "/crash_test_server").str(), - (std::ostringstream() << "--address=" << addr).str(), + (std::ostringstream() << g_root << "/crash_test_server").str(), + (std::ostringstream() << "--address=" << addr).str(), })); GPR_ASSERT(server_); - return grpc::cpp::test::util::TestService::NewStub(CreateChannel(addr, InsecureCredentials(), ChannelArguments())); + return grpc::cpp::test::util::TestService::NewStub( + CreateChannel(addr, InsecureCredentials(), ChannelArguments())); } void KillServer() { diff --git a/test/cpp/end2end/crash_test_server.cc b/test/cpp/end2end/crash_test_server.cc index b6b30a52046..1f8f5331996 100644 --- a/test/cpp/end2end/crash_test_server.cc +++ b/test/cpp/end2end/crash_test_server.cc @@ -83,7 +83,6 @@ void RunServer() { std::cout << "Server listening on " << FLAGS_address << std::endl; server->Wait(); } - } } diff --git a/test/cpp/util/subprocess.cc b/test/cpp/util/subprocess.cc index ae4334fa54a..d758f629acc 100644 --- a/test/cpp/util/subprocess.cc +++ b/test/cpp/util/subprocess.cc @@ -40,27 +40,20 @@ namespace grpc { static gpr_subprocess *MakeProcess(std::initializer_list args) { - std::vector vargs; - for (auto it = args.begin(); it != args.end(); ++it) { - vargs.push_back(it->c_str()); - } - return gpr_subprocess_create(vargs.size(), &vargs[0]); + std::vector vargs; + for (auto it = args.begin(); it != args.end(); ++it) { + vargs.push_back(it->c_str()); + } + return gpr_subprocess_create(vargs.size(), &vargs[0]); } SubProcess::SubProcess(std::initializer_list args) - : subprocess_(MakeProcess(args)) { -} + : subprocess_(MakeProcess(args)) {} -SubProcess::~SubProcess() { - gpr_subprocess_destroy(subprocess_); -} +SubProcess::~SubProcess() { gpr_subprocess_destroy(subprocess_); } -int SubProcess::Join() { - return gpr_subprocess_join(subprocess_); -} +int SubProcess::Join() { return gpr_subprocess_join(subprocess_); } -void SubProcess::Interrupt() { - gpr_subprocess_interrupt(subprocess_); -} +void SubProcess::Interrupt() { gpr_subprocess_interrupt(subprocess_); } } // namespace grpc \ No newline at end of file diff --git a/test/cpp/util/subprocess.h b/test/cpp/util/subprocess.h index 02cce578f88..8fafe3d1772 100644 --- a/test/cpp/util/subprocess.h +++ b/test/cpp/util/subprocess.h @@ -43,17 +43,17 @@ namespace grpc { class SubProcess { public: - SubProcess(std::initializer_list args); - ~SubProcess(); + SubProcess(std::initializer_list args); + ~SubProcess(); - int Join(); - void Interrupt(); + int Join(); + void Interrupt(); private: - SubProcess(const SubProcess& other); - SubProcess& operator=(const SubProcess& other); + SubProcess(const SubProcess& other); + SubProcess& operator=(const SubProcess& other); - gpr_subprocess *const subprocess_; + gpr_subprocess* const subprocess_; }; } // namespace grpc From a969d7c04c7ca3a1f023329f82d2c461698c244f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 15:47:51 -0700 Subject: [PATCH 020/217] Compile fix --- test/cpp/end2end/crash_test.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/cpp/end2end/crash_test.cc b/test/cpp/end2end/crash_test.cc index 10f4944b547..628b3e25438 100644 --- a/test/cpp/end2end/crash_test.cc +++ b/test/cpp/end2end/crash_test.cc @@ -76,10 +76,12 @@ class CrashTest : public ::testing::Test { std::unique_ptr CreateServerAndStub() { auto port = grpc_pick_unused_port_or_die(); - auto addr = (std::ostringstream() << "localhost:" << port).str(); + std::ostringstream addr_stream; + addr_stream << "localhost:" << port; + auto addr = addr_stream.str(); server_.reset(new SubProcess({ - (std::ostringstream() << g_root << "/crash_test_server").str(), - (std::ostringstream() << "--address=" << addr).str(), + g_root + "/crash_test_server", + "--address=" + addr, })); GPR_ASSERT(server_); return grpc::cpp::test::util::TestService::NewStub( From 74e5edab67c70cc3085ff59f6fae9b7ecd76bed6 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 15:55:01 -0700 Subject: [PATCH 021/217] Compile fix --- test/cpp/end2end/crash_test_server.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/crash_test_server.cc b/test/cpp/end2end/crash_test_server.cc index 1f8f5331996..20808a02409 100644 --- a/test/cpp/end2end/crash_test_server.cc +++ b/test/cpp/end2end/crash_test_server.cc @@ -58,7 +58,7 @@ using namespace gflags; namespace grpc { namespace testing { -class ServiceImpl final : public grpc::cpp::test::util::TestService::Service { +class ServiceImpl GRPC_FINAL : public ::grpc::cpp::test::util::TestService::Service { Status BidiStream(ServerContext* context, ServerReaderWriter* stream) GRPC_OVERRIDE { From dd093f33f6891152f076f95c2a94bbc26d75aef1 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 16:29:58 -0700 Subject: [PATCH 022/217] Remove some bad asserts --- include/grpc++/stream.h | 6 +++--- src/cpp/server/server.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/grpc++/stream.h b/include/grpc++/stream.h index 0efdbdaecae..c836f98c2a4 100644 --- a/include/grpc++/stream.h +++ b/include/grpc++/stream.h @@ -114,7 +114,7 @@ class ClientReader GRPC_FINAL : public ClientReaderInterface { CallOpBuffer buf; buf.AddRecvInitialMetadata(context_); call_.PerformOps(&buf); - GPR_ASSERT(cq_.Pluck(&buf)); + cq_.Pluck(&buf); // status ignored } bool Read(R* msg) GRPC_OVERRIDE { @@ -216,7 +216,7 @@ class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface { CallOpBuffer buf; buf.AddSendInitialMetadata(&context->send_initial_metadata_); call_.PerformOps(&buf); - GPR_ASSERT(cq_.Pluck(&buf)); + cq_.Pluck(&buf); } // Blocking wait for initial metadata from server. The received metadata @@ -229,7 +229,7 @@ class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface { CallOpBuffer buf; buf.AddRecvInitialMetadata(context_); call_.PerformOps(&buf); - GPR_ASSERT(cq_.Pluck(&buf)); + cq_.Pluck(&buf); // status ignored } bool Read(R* msg) GRPC_OVERRIDE { diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 62f4020d7e9..e66b4ed2d8b 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -149,7 +149,7 @@ class Server::SyncRequest GRPC_FINAL : public CompletionQueueTag { } buf.AddServerSendStatus(&ctx_.trailing_metadata_, status); call_.PerformOps(&buf); - GPR_ASSERT(cq_.Pluck(&buf)); + cq_.Pluck(&buf); /* status ignored */ void* ignored_tag; bool ignored_ok; cq_.Shutdown(); From e793ba12c6a67ad938eda2b28f7c9fc9f83efd7c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 09:37:22 -0700 Subject: [PATCH 023/217] Begin marking up for Doxygen --- include/grpc/grpc.h | 77 ++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index ce01b2d855a..2868f05400a 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -92,12 +92,13 @@ typedef struct { } value; } grpc_arg; -/* An array of arguments that can be passed around. - Used to set optional channel-level configuration. - These configuration options are modelled as key-value pairs as defined - by grpc_arg; keys are strings to allow easy backwards-compatible extension - by arbitrary parties. - All evaluation is performed at channel creation time. */ +/** An array of arguments that can be passed around. + + Used to set optional channel-level configuration. + These configuration options are modelled as key-value pairs as defined + by grpc_arg; keys are strings to allow easy backwards-compatible extension + by arbitrary parties. + All evaluation is performed at channel creation time. */ typedef struct { size_t num_args; grpc_arg *args; @@ -192,15 +193,28 @@ typedef struct grpc_metadata { } internal_data; } grpc_metadata; +/** \enum grpc_completion_type + \brief The type of completion (for grpc_event) */ typedef enum grpc_completion_type { - GRPC_QUEUE_SHUTDOWN, /* Shutting down */ - GRPC_QUEUE_TIMEOUT, /* No event before timeout */ - GRPC_OP_COMPLETE /* operation completion */ + /** Shutting down */ + GRPC_QUEUE_SHUTDOWN, + /** No event before timeout */ + GRPC_QUEUE_TIMEOUT, + /** Operation completion */ + GRPC_OP_COMPLETE } grpc_completion_type; +/** The result of an operation. + + Returned by a completion queue when the operation started with tag. */ typedef struct grpc_event { + /** The type of the completion. */ grpc_completion_type type; + /** non-zero if the operation was successful, 0 upon failure. + Only GRPC_OP_COMPLETE can succeed or fail. */ int success; + /** The tag passed to grpc_call_start_batch etc to start this operation. + Only GRPC_OP_COMPLETE has a tag. */ void *tag; } grpc_event; @@ -319,37 +333,42 @@ typedef struct grpc_op { } data; } grpc_op; -/* Initialize the grpc library. - It is not safe to call any other grpc functions before calling this. - (To avoid overhead, little checking is done, and some things may work. We - do not warrant that they will continue to do so in future revisions of this - library). */ +/** Initialize the grpc library. + + It is not safe to call any other grpc functions before calling this. + (To avoid overhead, little checking is done, and some things may work. We + do not warrant that they will continue to do so in future revisions of this + library). */ void grpc_init(void); -/* Shut down the grpc library. - No memory is used by grpc after this call returns, nor are any instructions - executing within the grpc library. - Prior to calling, all application owned grpc objects must have been - destroyed. */ +/** Shut down the grpc library. + + No memory is used by grpc after this call returns, nor are any instructions + executing within the grpc library. + Prior to calling, all application owned grpc objects must have been + destroyed. */ void grpc_shutdown(void); +/** Create a completion queue */ grpc_completion_queue *grpc_completion_queue_create(void); -/* Blocks until an event is available, the completion queue is being shut down, - or deadline is reached. Returns NULL on timeout, otherwise the event that - occurred. +/** Blocks until an event is available, the completion queue is being shut down, + or deadline is reached. + + Returns NULL on timeout, otherwise the event that occurred. - Callers must not call grpc_completion_queue_next and - grpc_completion_queue_pluck simultaneously on the same completion queue. */ + Callers must not call grpc_completion_queue_next and + grpc_completion_queue_pluck simultaneously on the same completion queue. */ grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline); -/* Blocks until an event with tag 'tag' is available, the completion queue is - being shutdown or deadline is reached. Returns NULL on timeout, or a pointer - to the event that occurred. +/** Blocks until an event with tag 'tag' is available, the completion queue is + being shutdown or deadline is reached. + + Returns NULL on timeout, or a pointer to the event that occurred. - Callers must not call grpc_completion_queue_next and - grpc_completion_queue_pluck simultaneously on the same completion queue. */ + Callers must not call grpc_completion_queue_next and + grpc_completion_queue_pluck simultaneously on the same completion queue. */ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq, void *tag, gpr_timespec deadline); From 354bf6d77ba0c89288d8196abeebb6cb764d5a22 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 10:18:03 -0700 Subject: [PATCH 024/217] Document variable usage in fd_posix Update some code based on that documentation --- src/core/iomgr/fd_posix.c | 20 +++++++++++++++----- src/core/iomgr/fd_posix.h | 24 +++++++++++++++++++++++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index afd6ddce64d..4cbc46cd179 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -96,7 +96,7 @@ static grpc_fd *alloc_fd(int fd) { gpr_atm_rel_store(&r->writest, NOT_READY); gpr_atm_rel_store(&r->shutdown, 0); r->fd = fd; - r->watcher_root.next = r->watcher_root.prev = &r->watcher_root; + r->inactive_watcher_root.next = r->inactive_watcher_root.prev = &r->inactive_watcher_root; r->freelist_next = NULL; r->read_watcher = r->write_watcher = NULL; return r; @@ -149,8 +149,12 @@ int grpc_fd_is_orphaned(grpc_fd *fd) { } static void maybe_wake_one_watcher_locked(grpc_fd *fd) { - if (fd->watcher_root.next != &fd->watcher_root) { - grpc_pollset_force_kick(fd->watcher_root.next->pollset); + if (fd->inactive_watcher_root.next != &fd->inactive_watcher_root) { + grpc_pollset_force_kick(fd->inactive_watcher_root.next->pollset); + } else if (fd->read_watcher) { + grpc_pollset_force_kick(fd->read_watcher->pollset); + } else if (fd->write_watcher) { + grpc_pollset_force_kick(fd->write_watcher->pollset); } } @@ -162,10 +166,16 @@ static void maybe_wake_one_watcher(grpc_fd *fd) { static void wake_all_watchers(grpc_fd *fd) { grpc_fd_watcher *watcher; - for (watcher = fd->watcher_root.next; watcher != &fd->watcher_root; + for (watcher = fd->inactive_watcher_root.next; watcher != &fd->inactive_watcher_root; watcher = watcher->next) { grpc_pollset_force_kick(watcher->pollset); } + if (fd->read_watcher) { + grpc_pollset_force_kick(fd->read_watcher->pollset); + } + if (fd->write_watcher && fd->write_watcher != fd->read_watcher) { + grpc_pollset_force_kick(fd->write_watcher->pollset); + } } void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_cb_func on_done, void *user_data) { @@ -319,7 +329,7 @@ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, } /* if not polling, remember this watcher in case we need someone to later */ if (mask == 0) { - watcher->next = &fd->watcher_root; + watcher->next = &fd->inactive_watcher_root; watcher->prev = watcher->next->prev; watcher->next->prev = watcher->prev->next = watcher; } diff --git a/src/core/iomgr/fd_posix.h b/src/core/iomgr/fd_posix.h index af79d4c4495..cfc533b7f56 100644 --- a/src/core/iomgr/fd_posix.h +++ b/src/core/iomgr/fd_posix.h @@ -66,8 +66,30 @@ struct grpc_fd { gpr_mu set_state_mu; gpr_atm shutdown; + /* The watcher list. + + The following watcher related fields are protected by watcher_mu. + + An fd_watcher is an ephemeral object created when an fd wants to + begin polling, and destroyed after the poll. + + It denotes the fd's interest in whether to read poll or write poll + or both or neither on this fd. + + If a watcher is asked to poll for reads or writes, the read_watcher + or write_watcher fields are set respectively. A watcher may be asked + to poll for both, in which case both fields will be set. + + read_watcher and write_watcher may be NULL if no watcher has been + asked to poll for reads or writes. + + If an fd_watcher is not asked to poll for reads or writes, it's added + to a linked list of inactive watchers, rooted at inactive_watcher_root. + If at a later time there becomes need of a poller to poll, one of + the inactive pollers may be kicked out of their poll loops to take + that responsibility. */ gpr_mu watcher_mu; - grpc_fd_watcher watcher_root; + grpc_fd_watcher inactive_watcher_root; grpc_fd_watcher *read_watcher; grpc_fd_watcher *write_watcher; From 236d098395c5360e90f224435a14bed7f2cce6f2 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 10:26:44 -0700 Subject: [PATCH 025/217] Add another little comment --- src/core/iomgr/fd_posix.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 4cbc46cd179..3ff27631be0 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -347,16 +347,19 @@ void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) { gpr_mu_lock(&fd->watcher_mu); if (watcher == fd->read_watcher) { + /* remove read watcher, kick if we still need a read */ was_polling = 1; kick |= !got_read; fd->read_watcher = NULL; } if (watcher == fd->write_watcher) { + /* remove write watcher, kick if we still need a write */ was_polling = 1; kick |= !got_write; fd->write_watcher = NULL; } if (!was_polling) { + /* remove from inactive list */ watcher->next->prev = watcher->prev; watcher->prev->next = watcher->next; } From 2f24d956dfd53c3c58cf33623a1d468cc3900eea Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 10:39:34 -0700 Subject: [PATCH 026/217] Clarify booleanness of kick --- src/core/iomgr/fd_posix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 3ff27631be0..31a62b8ef8e 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -349,13 +349,13 @@ void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) { if (watcher == fd->read_watcher) { /* remove read watcher, kick if we still need a read */ was_polling = 1; - kick |= !got_read; + kick = kick || !got_read; fd->read_watcher = NULL; } if (watcher == fd->write_watcher) { /* remove write watcher, kick if we still need a write */ was_polling = 1; - kick |= !got_write; + kick = kick || !got_write; fd->write_watcher = NULL; } if (!was_polling) { From 8e50fe97644bb62e48c58707eb10513c317d041f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 10:45:04 -0700 Subject: [PATCH 027/217] clang-format --- src/core/iomgr/fd_posix.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 3ff27631be0..63615ea25f7 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -96,7 +96,8 @@ static grpc_fd *alloc_fd(int fd) { gpr_atm_rel_store(&r->writest, NOT_READY); gpr_atm_rel_store(&r->shutdown, 0); r->fd = fd; - r->inactive_watcher_root.next = r->inactive_watcher_root.prev = &r->inactive_watcher_root; + r->inactive_watcher_root.next = r->inactive_watcher_root.prev = + &r->inactive_watcher_root; r->freelist_next = NULL; r->read_watcher = r->write_watcher = NULL; return r; @@ -166,8 +167,8 @@ static void maybe_wake_one_watcher(grpc_fd *fd) { static void wake_all_watchers(grpc_fd *fd) { grpc_fd_watcher *watcher; - for (watcher = fd->inactive_watcher_root.next; watcher != &fd->inactive_watcher_root; - watcher = watcher->next) { + for (watcher = fd->inactive_watcher_root.next; + watcher != &fd->inactive_watcher_root; watcher = watcher->next) { grpc_pollset_force_kick(watcher->pollset); } if (fd->read_watcher) { @@ -322,7 +323,8 @@ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, fd->read_watcher = watcher; mask |= read_mask; } - /* if there is nobody polling for write, but we need to, then start doing so */ + /* if there is nobody polling for write, but we need to, then start doing so + */ if (!fd->write_watcher && gpr_atm_acq_load(&fd->writest) > READY) { fd->write_watcher = watcher; mask |= write_mask; @@ -349,13 +351,13 @@ void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) { if (watcher == fd->read_watcher) { /* remove read watcher, kick if we still need a read */ was_polling = 1; - kick |= !got_read; + kick = kick || !got_read; fd->read_watcher = NULL; } if (watcher == fd->write_watcher) { /* remove write watcher, kick if we still need a write */ was_polling = 1; - kick |= !got_write; + kick = kick || !got_write; fd->write_watcher = NULL; } if (!was_polling) { From de91fc1d67582dcfef82489d7dc9ab7548539d3c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 14:42:15 -0700 Subject: [PATCH 028/217] Run qps smoke tests on Travis --- Makefile | 8 ++++++++ build.json | 4 ---- tools/run_tests/tests.json | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 45910714137..ef3cb353be4 100644 --- a/Makefile +++ b/Makefile @@ -1845,6 +1845,10 @@ test_c: buildtests_c test_cxx: buildtests_cxx $(E) "[RUN] Testing async_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/async_end2end_test || ( echo test async_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing async_streaming_ping_pong_test" + $(Q) $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test || ( echo test async_streaming_ping_pong_test failed ; exit 1 ) + $(E) "[RUN] Testing async_unary_ping_pong_test" + $(Q) $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test || ( echo test async_unary_ping_pong_test failed ; exit 1 ) $(E) "[RUN] Testing channel_arguments_test" $(Q) $(BINDIR)/$(CONFIG)/channel_arguments_test || ( echo test channel_arguments_test failed ; exit 1 ) $(E) "[RUN] Testing cli_call_test" @@ -1863,6 +1867,10 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/mock_test || ( echo test mock_test failed ; exit 1 ) $(E) "[RUN] Testing status_test" $(Q) $(BINDIR)/$(CONFIG)/status_test || ( echo test status_test failed ; exit 1 ) + $(E) "[RUN] Testing sync_streaming_ping_pong_test" + $(Q) $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test || ( echo test sync_streaming_ping_pong_test failed ; exit 1 ) + $(E) "[RUN] Testing sync_unary_ping_pong_test" + $(Q) $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test || ( echo test sync_unary_ping_pong_test failed ; exit 1 ) $(E) "[RUN] Testing thread_pool_test" $(Q) $(BINDIR)/$(CONFIG)/thread_pool_test || ( echo test thread_pool_test failed ; exit 1 ) $(E) "[RUN] Testing thread_stress_test" diff --git a/build.json b/build.json index 18c0eb1211d..8a7e65b99ab 100644 --- a/build.json +++ b/build.json @@ -1813,7 +1813,6 @@ { "name": "async_streaming_ping_pong_test", "build": "test", - "run": false, "language": "c++", "src": [ "test/cpp/qps/async_streaming_ping_pong_test.cc" @@ -1831,7 +1830,6 @@ { "name": "async_unary_ping_pong_test", "build": "test", - "run": false, "language": "c++", "src": [ "test/cpp/qps/async_unary_ping_pong_test.cc" @@ -2207,7 +2205,6 @@ { "name": "sync_streaming_ping_pong_test", "build": "test", - "run": false, "language": "c++", "src": [ "test/cpp/qps/sync_streaming_ping_pong_test.cc" @@ -2225,7 +2222,6 @@ { "name": "sync_unary_ping_pong_test", "build": "test", - "run": false, "language": "c++", "src": [ "test/cpp/qps/sync_unary_ping_pong_test.cc" diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index d161041c1f6..398672f3090 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -596,6 +596,24 @@ "posix" ] }, + { + "flaky": false, + "language": "c++", + "name": "async_streaming_ping_pong_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c++", + "name": "async_unary_ping_pong_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c++", @@ -677,6 +695,24 @@ "posix" ] }, + { + "flaky": false, + "language": "c++", + "name": "sync_streaming_ping_pong_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c++", + "name": "sync_unary_ping_pong_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c++", From eadd9a3b8c8e5935edba1bb0dd86f31ca250d3a4 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 14:52:12 -0700 Subject: [PATCH 029/217] Add testing for GRPC_TRACE --- Makefile | 1176 +++++++++++++++-- .../chttp2_socket_pair_with_grpc_trace.c | 156 +++ test/core/end2end/gen_build_json.py | 1 + tools/run_tests/tests.json | 495 +++++++ vsprojects/Grpc.mak | 393 +++++- 5 files changed, 2085 insertions(+), 136 deletions(-) create mode 100644 test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c diff --git a/Makefile b/Makefile index 45910714137..024e54f65ed 100644 --- a/Makefile +++ b/Makefile @@ -893,6 +893,34 @@ chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test: $(BINDIR)/$(CON chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test chttp2_socket_pair_one_byte_at_a_time_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test +chttp2_socket_pair_with_grpc_trace_bad_hostname_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test +chttp2_socket_pair_with_grpc_trace_census_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test +chttp2_socket_pair_with_grpc_trace_disappearing_server_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test +chttp2_socket_pair_with_grpc_trace_empty_batch_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test +chttp2_socket_pair_with_grpc_trace_invoke_large_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test +chttp2_socket_pair_with_grpc_trace_max_message_length_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test +chttp2_socket_pair_with_grpc_trace_no_op_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test +chttp2_socket_pair_with_grpc_trace_registered_call_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test +chttp2_socket_pair_with_grpc_trace_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test +chttp2_socket_pair_with_grpc_trace_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test chttp2_fullstack_bad_hostname_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test chttp2_fullstack_cancel_after_accept_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test @@ -1001,6 +1029,33 @@ chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test: $(BIND chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test +chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test +chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test +chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test +chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test +chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test +chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test +chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test +chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test +chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test +chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test run_dep_checks: $(OPENSSL_ALPN_CHECK_CMD) || true @@ -1087,13 +1142,13 @@ plugins: $(PROTOC_PLUGINS) privatelibs: privatelibs_c privatelibs_cxx -privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a +privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a buildtests: buildtests_c buildtests_cxx -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test @@ -1624,6 +1679,62 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_bad_hostname_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test || ( echo test chttp2_socket_pair_with_grpc_trace_bad_hostname_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_census_simple_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_census_simple_request_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_disappearing_server_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test || ( echo test chttp2_socket_pair_with_grpc_trace_disappearing_server_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test || ( echo test chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test || ( echo test chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_empty_batch_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test || ( echo test chttp2_socket_pair_with_grpc_trace_empty_batch_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test || ( echo test chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_invoke_large_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_invoke_large_request_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test || ( echo test chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_max_message_length_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test || ( echo test chttp2_socket_pair_with_grpc_trace_max_message_length_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_no_op_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test || ( echo test chttp2_socket_pair_with_grpc_trace_no_op_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test || ( echo test chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_registered_call_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test || ( echo test chttp2_socket_pair_with_grpc_trace_registered_call_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_payload_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_request_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_bad_hostname_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test || ( echo test chttp2_fullstack_bad_hostname_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_cancel_after_accept_unsecure_test" @@ -1840,6 +1951,60 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test failed ; exit 1 ) test_cxx: buildtests_cxx @@ -3820,6 +3985,29 @@ ifneq ($(NO_DEPS),true) endif +LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_SRC = \ + test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c \ + + +LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_SRC)))) + +$(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a: $(ZLIB_DEP) $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a + $(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_WITH_GRPC_TRACE_OBJS:.o=.dep) +endif + + LIBEND2END_TEST_BAD_HOSTNAME_SRC = \ test/core/end2end/tests/bad_hostname.c \ @@ -11400,354 +11588,858 @@ endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test + +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test: openssl_dep_error +else -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test +endif -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test +ifeq ($(NO_SECURE),true) +# You can't build secure targets if you don't have OpenSSL with ALPN. +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test: openssl_dep_error -$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test + +endif + + + + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test + +endif + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test @@ -12264,6 +12956,222 @@ $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_hi +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test + + + + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test + + + + diff --git a/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c new file mode 100644 index 00000000000..1f53e581abd --- /dev/null +++ b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c @@ -0,0 +1,156 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "test/core/end2end/end2end_tests.h" + +#include + +#include "src/core/channel/client_channel.h" +#include "src/core/channel/connected_channel.h" +#include "src/core/channel/http_client_filter.h" +#include "src/core/channel/http_server_filter.h" +#include "src/core/iomgr/endpoint_pair.h" +#include "src/core/iomgr/iomgr.h" +#include "src/core/support/env.h" +#include "src/core/surface/channel.h" +#include "src/core/surface/client.h" +#include "src/core/surface/server.h" +#include "src/core/transport/chttp2_transport.h" +#include +#include +#include +#include +#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" + +/* chttp2 transport that is immediately available (used for testing + connected_channel without a client_channel */ + +static grpc_transport_setup_result server_setup_transport( + void *ts, grpc_transport *transport, grpc_mdctx *mdctx) { + grpc_end2end_test_fixture *f = ts; + static grpc_channel_filter const *extra_filters[] = { + &grpc_http_server_filter}; + return grpc_server_setup_transport(f->server, transport, extra_filters, + GPR_ARRAY_SIZE(extra_filters), mdctx); +} + +typedef struct { + grpc_end2end_test_fixture *f; + grpc_channel_args *client_args; +} sp_client_setup; + +static grpc_transport_setup_result client_setup_transport( + void *ts, grpc_transport *transport, grpc_mdctx *mdctx) { + sp_client_setup *cs = ts; + + const grpc_channel_filter *filters[] = {&grpc_client_surface_filter, + &grpc_http_client_filter, + &grpc_connected_channel_filter}; + size_t nfilters = sizeof(filters) / sizeof(*filters); + grpc_channel *channel = grpc_channel_create_from_filters( + filters, nfilters, cs->client_args, mdctx, 1); + + cs->f->client = channel; + + return grpc_connected_channel_bind_transport( + grpc_channel_get_channel_stack(channel), transport); +} + +static grpc_end2end_test_fixture chttp2_create_fixture_socketpair( + grpc_channel_args *client_args, grpc_channel_args *server_args) { + grpc_endpoint_pair *sfd = gpr_malloc(sizeof(grpc_endpoint_pair)); + + grpc_end2end_test_fixture f; + memset(&f, 0, sizeof(f)); + f.fixture_data = sfd; + f.client_cq = grpc_completion_queue_create(); + f.server_cq = grpc_completion_queue_create(); + + *sfd = grpc_iomgr_create_endpoint_pair(65536); + + return f; +} + +static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f, + grpc_channel_args *client_args) { + grpc_endpoint_pair *sfd = f->fixture_data; + sp_client_setup cs; + cs.client_args = client_args; + cs.f = f; + grpc_create_chttp2_transport(client_setup_transport, &cs, client_args, + sfd->client, NULL, 0, grpc_mdctx_create(), 1); + GPR_ASSERT(f->client); +} + +static void chttp2_init_server_socketpair(grpc_end2end_test_fixture *f, + grpc_channel_args *server_args) { + grpc_endpoint_pair *sfd = f->fixture_data; + GPR_ASSERT(!f->server); + f->server = grpc_server_create_from_filters(NULL, 0, server_args); + grpc_server_register_completion_queue(f->server, f->server_cq); + grpc_server_start(f->server); + grpc_create_chttp2_transport(server_setup_transport, f, server_args, + sfd->server, NULL, 0, grpc_mdctx_create(), 0); +} + +static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) { + gpr_free(f->fixture_data); +} + +/* All test configurations */ +static grpc_end2end_test_config configs[] = { + {"chttp2/socketpair", 0, chttp2_create_fixture_socketpair, + chttp2_init_client_socketpair, chttp2_init_server_socketpair, + chttp2_tear_down_socketpair}, +}; + +int main(int argc, char **argv) { + size_t i; + + /* force tracing on, with a value to force many + code paths in trace.c to be taken */ + gpr_setenv("GRPC_TRACE", "doesnt-exist,http,all"); + + grpc_test_init(argc, argv); + grpc_init(); + + for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) { + grpc_end2end_tests(configs[i]); + } + + grpc_shutdown(); + + return 0; +} diff --git a/test/core/end2end/gen_build_json.py b/test/core/end2end/gen_build_json.py index bce2d7a796d..19c1a80896d 100755 --- a/test/core/end2end/gen_build_json.py +++ b/test/core/end2end/gen_build_json.py @@ -49,6 +49,7 @@ END2END_FIXTURES = { 'chttp2_simple_ssl_with_oauth2_fullstack': default_secure_fixture_options, 'chttp2_socket_pair': default_unsecure_fixture_options, 'chttp2_socket_pair_one_byte_at_a_time': default_unsecure_fixture_options, + 'chttp2_socket_pair_with_grpc_trace': default_unsecure_fixture_options, } TestOptions = collections.namedtuple('TestOptions', 'flaky secure') diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index d161041c1f6..e2454c4db40 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -2431,6 +2431,258 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": true, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": true, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_max_message_length_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_no_op_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_registered_call_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_request_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -3375,6 +3627,249 @@ "windows", "posix" ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": true, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test", + "platforms": [ + "windows", + "posix" + ] } ] diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 275ad42d843..2a52e15e5f8 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -54,10 +54,10 @@ all: buildtests $(OUT_DIR): mkdir $(OUT_DIR) -build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib +build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib buildtests: buildtests_c buildtests_cxx -buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe +buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe echo All tests built. buildtests_cxx: interop_client.exe interop_server.exe @@ -1722,6 +1722,202 @@ chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_ chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test: chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe echo Running chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe +chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_bad_hostname_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_bad_hostname_test: chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_bad_hostname_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test: chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test: chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test: chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test: chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test: chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe +chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_census_simple_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_census_simple_request_test: chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_census_simple_request_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe +chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_disappearing_server_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_disappearing_server_test: chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_disappearing_server_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test: chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test: chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe +chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_empty_batch_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_empty_batch.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_empty_batch_test: chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_empty_batch_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test: chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe +chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_invoke_large_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_invoke_large_request_test: chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_invoke_large_request_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test: chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe +chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_max_message_length_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_max_message_length.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_max_message_length_test: chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_max_message_length_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe +chttp2_socket_pair_with_grpc_trace_no_op_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_no_op_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_no_op_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_no_op.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_no_op_test: chttp2_socket_pair_with_grpc_trace_no_op_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_no_op_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_no_op_test.exe +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test: chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe +chttp2_socket_pair_with_grpc_trace_registered_call_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_registered_call_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_registered_call_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_registered_call.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_registered_call_test: chttp2_socket_pair_with_grpc_trace_registered_call_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_registered_call_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_registered_call_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test: chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test: chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test: chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test: chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test: chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test: chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe +chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_with_payload_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_with_payload_test: chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_with_payload_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test: chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe +chttp2_socket_pair_with_grpc_trace_simple_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_request_test: chttp2_socket_pair_with_grpc_trace_simple_request_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_request_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_test.exe +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test: chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe: build_libs $(OUT_DIR) echo Building chttp2_fullstack_bad_hostname_unsecure_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2289,6 +2485,195 @@ chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_ chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test: chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe echo Running chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test: chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_accept.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test: chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test: chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_after_invoke.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test: chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_before_invoke.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test: chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test: chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_census_simple_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test: chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_disappearing_server.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test: chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test: chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test: chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_empty_batch.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test: chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test: chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_invoke_large_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test: chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_max_concurrent_streams.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test: chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_max_message_length.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test: chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_no_op.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test: chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_ping_pong_streaming.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test: chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_registered_call.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test: chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_payload.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_with_large_metadata.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_request_with_payload.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_delayed_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test: chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test: chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test: chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe build_gpr: msbuild grpc.sln /t:gpr /p:Configuration=Debug /p:Linkage-grpc_dependencies_zlib=static build_gpr_test_util: @@ -2325,6 +2710,10 @@ Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib: $(OUT_DIR) echo Building end2end_fixture_chttp2_socket_pair_one_byte_at_a_time $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\fixtures\chttp2_socket_pair_one_byte_at_a_time.c $(LIBTOOL) /OUT:"Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib" $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time.obj +Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib: $(OUT_DIR) + echo Building end2end_fixture_chttp2_socket_pair_with_grpc_trace + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\fixtures\chttp2_socket_pair_with_grpc_trace.c + $(LIBTOOL) /OUT:"Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib" $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace.obj Debug\end2end_test_bad_hostname.lib: $(OUT_DIR) echo Building end2end_test_bad_hostname $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\tests\bad_hostname.c From e454f4afe36eb1f47973c3ac714f453b1920d827 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Sun, 17 May 2015 16:26:17 -0700 Subject: [PATCH 030/217] Fix false positive in server streaming test --- .../Sample/SampleTests/RemoteProtoTests.m | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index f5c444d1719..f4892298341 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -129,6 +129,7 @@ - (void)testServerStreamingRPC { __weak XCTestExpectation *expectation = [self expectationWithDescription:@"ServerStreaming"]; + NSArray *expectedSizes = @[@31415, @9, @2653, @58979]; RMTStreamingOutputCallRequest *request = [RMTStreamingOutputCallRequest message]; @@ -144,15 +145,22 @@ RMTStreamingOutputCallResponse *response, NSError *error){ XCTAssertNil(error, @"Finished with unexpected error: %@", error); - - RMTStreamingOutputCallResponse *expectedResponse = [RMTStreamingOutputCallResponse message]; - expectedResponse.payload.type = RMTPayloadType_Compressable; - int expectedSize = [expectedSizes[index] unsignedIntegerValue]; - expectedResponse.payload.body = [NSMutableData dataWithLength:expectedSize]; - XCTAssertEqualObjects(response, expectedResponse); - - [expectation fulfill]; - index += 1; + XCTAssertTrue(done || response, @"Event handler called without an event."); + + if (response) { + XCTAssertLessThan(index, 4, @"More than 4 responses received."); + RMTStreamingOutputCallResponse * expected = [RMTStreamingOutputCallResponse message]; + expected.payload.type = RMTPayloadType_Compressable; + int expectedSize = [expectedSizes[index] unsignedIntegerValue]; + expected.payload.body = [NSMutableData dataWithLength:expectedSize]; + XCTAssertEqualObjects(response, expected); + index += 1; + } + + if (done) { + XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index); + [expectation fulfill]; + } }]; [self waitForExpectationsWithTimeout:4 handler:nil]; From f98e56c91bc4ffc3fc5c484da0c12fa315a408d8 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 15:00:52 -0700 Subject: [PATCH 031/217] Cheesy attempt to get this working on Travis --- test/cpp/qps/driver.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 9f7d3b56a44..6843e719e1c 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -44,6 +44,7 @@ #include #include #include +#include #include "test/cpp/qps/histogram.h" #include "test/cpp/qps/qps_worker.h" #include "test/core/util/port.h" @@ -89,6 +90,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, return &contexts.back(); }; + srand(time(NULL) ^ getpid()); + // Get client, server lists auto workers = get_hosts("QPS_WORKERS"); ClientConfig client_config = initial_client_config; From cf4124e06aaa666684dd35f3f14fa127465abddf Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Mon, 18 May 2015 15:08:50 -0700 Subject: [PATCH 032/217] Putting tsi util in header so that it can be used elsewhere. --- src/core/security/security_connector.c | 2 +- src/core/security/security_connector.h | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/security/security_connector.c b/src/core/security/security_connector.c index 61cb20f6b92..b17e0e0dfab 100644 --- a/src/core/security/security_connector.c +++ b/src/core/security/security_connector.c @@ -82,7 +82,7 @@ static const char *ssl_cipher_suites(void) { /* -- Common methods. -- */ /* Returns the first property with that name. */ -static const tsi_peer_property *tsi_peer_get_property_by_name( +const tsi_peer_property *tsi_peer_get_property_by_name( const tsi_peer *peer, const char *name) { size_t i; if (peer == NULL) return NULL; diff --git a/src/core/security/security_connector.h b/src/core/security/security_connector.h index 47abe05cffc..87b7ca9b8be 100644 --- a/src/core/security/security_connector.h +++ b/src/core/security/security_connector.h @@ -198,4 +198,8 @@ typedef struct { grpc_security_status grpc_ssl_server_security_connector_create( const grpc_ssl_server_config *config, grpc_security_connector **sc); +/* Util. */ +const tsi_peer_property *tsi_peer_get_property_by_name( + const tsi_peer *peer, const char *name); + #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H */ From 6983d5d2bd55244f38c190c35fa8e4d8a94c9800 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 15:09:59 -0700 Subject: [PATCH 033/217] Exclude test & compiler sources from coveralls reported test coverage --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c1086c17653..3f787787c20 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ script: - if [ ! -z "$USE_GCC" ] ; then export CC=gcc-$USE_GCC ; export CXX=g++-$USE_GCC ; fi - ./tools/run_tests/run_tests.py -l $TEST -t -j 16 -c $CONFIG -s 4.0 after_success: - - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens -b. --gcov-options '\-p' ; fi + - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens --exclude tests --exclude src/compiler -b. --gcov-options '\-p' ; fi notifications: email: false webhooks: From 142acc965e12b950c4b3d52df22ffaa28b6b62e5 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Fri, 15 May 2015 18:43:34 -0700 Subject: [PATCH 034/217] Adds GRXBufferedPipe --- src/objective-c/RxLibrary/GRXBufferedPipe.h | 53 ++++++++ src/objective-c/RxLibrary/GRXBufferedPipe.m | 142 ++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 src/objective-c/RxLibrary/GRXBufferedPipe.h create mode 100644 src/objective-c/RxLibrary/GRXBufferedPipe.m diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.h b/src/objective-c/RxLibrary/GRXBufferedPipe.h new file mode 100644 index 00000000000..02dc6b5fe83 --- /dev/null +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.h @@ -0,0 +1,53 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import + +#import "GRXWriteable.h" +#import "GRXWriter.h" + +// A buffered pipe is a Writeable that also acts as a Writer (to whichever other writeable is passed +// to -startWithWriteable:). +// Once it is started, whatever values are written into it (via -didReceiveValue:) will be +// propagated immediately, unless flow control prevents it. +// If it is throttled and keeps receiving values, as well as if it receives values before being +// started, it will buffer them and propagate them in order as soon as its state becomes +// GRXWriterStateStarted. +// If it receives an error (via -didFinishWithError:), it will drop any buffered values and +// propagate the error immediately. +@interface GRXBufferedPipe : NSObject + +// Convenience constructor. ++ (instancetype)pipe; + +@end diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m new file mode 100644 index 00000000000..e1295cef8ae --- /dev/null +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m @@ -0,0 +1,142 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import "GRXBufferedPipe.h" + +@implementation GRXBufferedPipe { + id _writeable; + NSMutableArray *_queue; + BOOL _inputIsFinished; + NSError *_errorOrNil; +} + +@synthesize state = _state; + ++ (instancetype)pipe { + return [[self alloc] init]; +} + +- (instancetype)init { + if (self = [super init]) { + _queue = [NSMutableArray array]; + _state = GRXWriterStateNotStarted; + } + return self; +} + +- (id)popValue { + id value = _queue[0]; + [_queue removeObjectAtIndex:0]; + return value; +} + +- (void)writeBufferUntilPausedOrStopped { + while (_state == GRXWriterStateStarted && _queue.count > 0) { + [_writeable didReceiveValue:[self popValue]]; + } + if (_inputIsFinished && _queue.count == 0) { + // Our writer finished normally while we were paused or not-started-yet. + [self finishWithError:_errorOrNil]; + } +} + +#pragma mark GRXWriteable implementation + +// Returns whether events can be simply propagated to the other end of the pipe. +- (BOOL)shouldFastForward { + return _state == GRXWriterStateStarted && _queue.count == 0; +} + +- (void)didReceiveValue:(id)value { + if (self.shouldFastForward) { + // Skip the queue. + [_writeable didReceiveValue:value]; + } else { + // Even if we're paused and with enqueued values, we can't excert back-pressure to our writer. + // So just buffer the new value. + [_queue addObject:value]; + } +} + +- (void)didFinishWithError:(NSError *)errorOrNil { + _inputIsFinished = YES; + _errorOrNil = errorOrNil; + if (errorOrNil || self.shouldFastForward) { + // No need to write pending values. + [self finishWithError:_errorOrNil]; + } +} + +#pragma mark GRXWriter implementation + +- (void)setState:(GRXWriterState)newState { + // Manual transitions are only allowed from the started or paused states. + if (_state == GRXWriterStateNotStarted || _state == GRXWriterStateFinished) { + return; + } + + switch (newState) { + case GRXWriterStateFinished: + _state = newState; + _queue = nil; + // Per GRXWriter's contract, setting the state to Finished manually means one doesn't wish the + // writeable to be messaged anymore. + _writeable = nil; + return; + case GRXWriterStatePaused: + _state = newState; + return; + case GRXWriterStateStarted: + if (_state == GRXWriterStatePaused) { + _state = newState; + [self writeBufferUntilPausedOrStopped]; + } + return; + case GRXWriterStateNotStarted: + return; + } +} + +- (void)startWithWriteable:(id)writeable { + _state = GRXWriterStateStarted; + _writeable = writeable; + [self writeBufferUntilPausedOrStopped]; +} + +- (void)finishWithError:(NSError *)errorOrNil { + id writeable = _writeable; + self.state = GRXWriterStateFinished; + [writeable didFinishWithError:errorOrNil]; +} + +@end From 421f6c9488795a1a125770f258b9cf4feef4f293 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 18 May 2015 11:51:12 -0700 Subject: [PATCH 035/217] Use BufferedPipe to add PingPong test and fix Cancel test --- .../Sample/SampleTests/RemoteProtoTests.m | 98 ++++++++++++++++--- 1 file changed, 87 insertions(+), 11 deletions(-) diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index f4892298341..7cebc0c2a74 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -36,13 +36,46 @@ #import #import -#import #import +#import +#import #import #import #import #import +// Convenience constructors for the generated proto messages: + +@interface RMTStreamingOutputCallRequest (Constructors) ++ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize + requestedResponseSize:(NSNumber *)responseSize; +@end + +@implementation RMTStreamingOutputCallRequest (Constructors) ++ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize + requestedResponseSize:(NSNumber *)responseSize { + RMTStreamingOutputCallRequest *request = [self message]; + RMTResponseParameters *parameters = [RMTResponseParameters message]; + parameters.size = responseSize.integerValue; + [request.responseParametersArray addObject:parameters]; + request.payload.body = [NSMutableData dataWithLength:payloadSize.unsignedIntegerValue]; + return request; +} +@end + +@interface RMTStreamingOutputCallResponse (Constructors) ++ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize; +@end + +@implementation RMTStreamingOutputCallResponse (Constructors) ++ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize { + RMTStreamingOutputCallResponse * response = [self message]; + response.payload.type = RMTPayloadType_Compressable; + response.payload.body = [NSMutableData dataWithLength:payloadSize.unsignedIntegerValue]; + return response; +} +@end + @interface RemoteProtoTests : XCTestCase @end @@ -70,7 +103,7 @@ [expectation fulfill]; }]; - [self waitForExpectationsWithTimeout:2. handler:nil]; + [self waitForExpectationsWithTimeout:2 handler:nil]; } - (void)testLargeUnaryRPC { @@ -92,7 +125,7 @@ [expectation fulfill]; }]; - [self waitForExpectationsWithTimeout:4. handler:nil]; + [self waitForExpectationsWithTimeout:4 handler:nil]; } - (void)testClientStreamingRPC { @@ -124,7 +157,7 @@ [expectation fulfill]; }]; - [self waitForExpectationsWithTimeout:4. handler:nil]; + [self waitForExpectationsWithTimeout:4 handler:nil]; } - (void)testServerStreamingRPC { @@ -149,10 +182,7 @@ if (response) { XCTAssertLessThan(index, 4, @"More than 4 responses received."); - RMTStreamingOutputCallResponse * expected = [RMTStreamingOutputCallResponse message]; - expected.payload.type = RMTPayloadType_Compressable; - int expectedSize = [expectedSizes[index] unsignedIntegerValue]; - expected.payload.body = [NSMutableData dataWithLength:expectedSize]; + id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:expectedSizes[index]]; XCTAssertEqualObjects(response, expected); index += 1; } @@ -166,6 +196,49 @@ [self waitForExpectationsWithTimeout:4 handler:nil]; } +- (void)testPingPongRPC { + __weak XCTestExpectation *expectation = [self expectationWithDescription:@"PingPong"]; + + NSArray *requests = @[@27182, @8, @1828, @45904]; + NSArray *responses = @[@31415, @9, @2653, @58979]; + + GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init]; + + __block int index = 0; + + id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index] + requestedResponseSize:responses[index]]; + [requestsBuffer didReceiveValue:request]; + + [_service fullDuplexCallWithRequestsWriter:requestsBuffer + handler:^(BOOL done, + RMTStreamingOutputCallResponse *response, + NSError *error) { + XCTAssertNil(error, @"Finished with unexpected error: %@", error); + XCTAssertTrue(done || response, @"Event handler called without an event."); + + if (response) { + XCTAssertLessThan(index, 4, @"More than 4 responses received."); + id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]]; + XCTAssertEqualObjects(response, expected); + index += 1; + if (index < 4) { + id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index] + requestedResponseSize:responses[index]]; + [requestsBuffer didReceiveValue:request]; + } else { + [requestsBuffer didFinishWithError:nil]; + } + } + + if (done) { + XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index); + [expectation fulfill]; + } + }]; + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + - (void)testEmptyStreamRPC { __weak XCTestExpectation *expectation = [self expectationWithDescription:@"EmptyStream"]; [_service fullDuplexCallWithRequestsWriter:[GRXWriter emptyWriter] @@ -176,13 +249,16 @@ XCTAssert(done, @"Unexpected response: %@", response); [expectation fulfill]; }]; - [self waitForExpectationsWithTimeout:4 handler:nil]; + [self waitForExpectationsWithTimeout:2 handler:nil]; } - (void)testCancelAfterBeginRPC { __weak XCTestExpectation *expectation = [self expectationWithDescription:@"CancelAfterBegin"]; - // TODO(mlumish): change to writing that blocks instead of writing - ProtoRPC *call = [_service RPCToStreamingInputCallWithRequestsWriter:[GRXWriter emptyWriter] + + // A buffered pipe to which we never write any value acts as a writer that just hangs. + GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init]; + + ProtoRPC *call = [_service RPCToStreamingInputCallWithRequestsWriter:requestsBuffer handler:^(RMTStreamingInputCallResponse *response, NSError *error) { XCTAssertEqual(error.code, GRPC_STATUS_CANCELLED); From 778c61b6fc083a951cfa6a939fe04ce8baa656d9 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 18 May 2015 16:52:47 -0700 Subject: [PATCH 036/217] Added failing tests for server bad argument handling --- src/node/test/surface_test.js | 221 +++++++++++++++++++++++----------- 1 file changed, 151 insertions(+), 70 deletions(-) diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js index 9c72c29fab3..ccced741abd 100644 --- a/src/node/test/surface_test.js +++ b/src/node/test/surface_test.js @@ -47,6 +47,8 @@ var mathService = math_proto.lookup('math.Math'); var capitalize = require('underscore.string/capitalize'); +var _ = require('underscore'); + describe('File loader', function() { it('Should load a proto file by default', function() { assert.doesNotThrow(function() { @@ -178,9 +180,10 @@ describe('Generic client and server', function() { }); }); }); -describe('Trailing metadata', function() { +describe('Other conditions', function() { var client; var server; + var port; before(function() { var test_proto = ProtoBuf.loadProtoFile(__dirname + '/test_service.proto'); var test_service = test_proto.lookup('TestService'); @@ -189,6 +192,7 @@ describe('Trailing metadata', function() { TestService: { unary: function(call, cb) { var req = call.request; + debugger; if (req.error) { cb(new Error('Requested error'), null, {metadata: ['yes']}); } else { @@ -246,7 +250,7 @@ describe('Trailing metadata', function() { } } }); - var port = server.bind('localhost:0'); + port = server.bind('localhost:0'); var Client = surface_client.makeProtobufClientConstructor(test_service); client = new Client('localhost:' + port); server.listen(); @@ -254,86 +258,163 @@ describe('Trailing metadata', function() { after(function() { server.shutdown(); }); - it('should be present when a unary call succeeds', function(done) { - var call = client.unary({error: false}, function(err, data) { - assert.ifError(err); + describe('Server recieving bad input', function() { + var misbehavingClient; + var badArg = new Buffer([0xFF]); + before(function() { + var test_service_attrs = { + unary: { + path: '/TestService/Unary', + requestStream: false, + responseStream: false, + requestSerialize: _.identity, + responseDeserialize: _.identity + }, + clientStream: { + path: '/TestService/ClientStream', + requestStream: true, + responseStream: false, + requestSerialize: _.identity, + responseDeserialize: _.identity + }, + serverStream: { + path: '/TestService/ServerStream', + requestStream: false, + responseStream: true, + requestSerialize: _.identity, + responseDeserialize: _.identity + }, + bidiStream: { + path: '/TestService/BidiStream', + requestStream: true, + responseStream: true, + requestSerialize: _.identity, + responseDeserialize: _.identity + } + }; + var Client = surface_client.makeClientConstructor(test_service_attrs, + 'TestService'); + misbehavingClient = new Client('localhost:' + port); }); - call.on('status', function(status) { - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should respond correctly to a unary call', function(done) { + var call = misbehavingClient.unary(badArg, function(err, data) { + assert(err); + assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); + done(); + }); }); - }); - it('should be present when a unary call fails', function(done) { - var call = client.unary({error: true}, function(err, data) { - assert(err); + it('should respond correctly to a client stream', function(done) { + var call = misbehavingClient.clientStream(function(err, data) { + assert(err); + assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); + done(); + }); + call.write(badArg); }); - call.on('status', function(status) { - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should respond correctly to a server stream', function(done) { + var call = misbehavingClient.serverStream(badArg); + call.on('data', function(data) { + assert.fail(data, null, 'Unexpected data', '!='); + }); + call.on('error', function(err) { + assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); + done(); + }); + }); + it('should respond correctly to a bidi stream', function(done) { + var call = misbehavingClient.bidiStream(); + call.on('data', function(data) { + assert.fail(data, null, 'Unexpected data', '!='); + }); + call.on('error', function(err) { + assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); + done(); + }); + call.write(badArg); }); }); - it('should be present when a client stream call succeeds', function(done) { - var call = client.clientStream(function(err, data) { - assert.ifError(err); + describe('Trailing metadata', function() { + it('should be present when a unary call succeeds', function(done) { + var call = client.unary({error: false}, function(err, data) { + assert.ifError(err); + }); + call.on('status', function(status) { + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - call.write({error: false}); - call.write({error: false}); - call.end(); - call.on('status', function(status) { - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should be present when a unary call fails', function(done) { + var call = client.unary({error: true}, function(err, data) { + assert(err); + }); + call.on('status', function(status) { + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - }); - it('should be present when a client stream call fails', function(done) { - var call = client.clientStream(function(err, data) { - assert(err); + it('should be present when a client stream call succeeds', function(done) { + var call = client.clientStream(function(err, data) { + assert.ifError(err); + }); + call.write({error: false}); + call.write({error: false}); + call.end(); + call.on('status', function(status) { + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - call.write({error: false}); - call.write({error: true}); - call.end(); - call.on('status', function(status) { - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should be present when a client stream call fails', function(done) { + var call = client.clientStream(function(err, data) { + assert(err); + }); + call.write({error: false}); + call.write({error: true}); + call.end(); + call.on('status', function(status) { + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - }); - it('should be present when a server stream call succeeds', function(done) { - var call = client.serverStream({error: false}); - call.on('data', function(){}); - call.on('status', function(status) { - assert.strictEqual(status.code, grpc.status.OK); - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should be present when a server stream call succeeds', function(done) { + var call = client.serverStream({error: false}); + call.on('data', function(){}); + call.on('status', function(status) { + assert.strictEqual(status.code, grpc.status.OK); + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - }); - it('should be present when a server stream call fails', function(done) { - var call = client.serverStream({error: true}); - call.on('data', function(){}); - call.on('error', function(error) { - assert.deepEqual(error.metadata.metadata, ['yes']); - done(); + it('should be present when a server stream call fails', function(done) { + var call = client.serverStream({error: true}); + call.on('data', function(){}); + call.on('error', function(error) { + assert.deepEqual(error.metadata.metadata, ['yes']); + done(); + }); }); - }); - it('should be present when a bidi stream succeeds', function(done) { - var call = client.bidiStream(); - call.write({error: false}); - call.write({error: false}); - call.end(); - call.on('data', function(){}); - call.on('status', function(status) { - assert.strictEqual(status.code, grpc.status.OK); - assert.deepEqual(status.metadata.metadata, ['yes']); - done(); + it('should be present when a bidi stream succeeds', function(done) { + var call = client.bidiStream(); + call.write({error: false}); + call.write({error: false}); + call.end(); + call.on('data', function(){}); + call.on('status', function(status) { + assert.strictEqual(status.code, grpc.status.OK); + assert.deepEqual(status.metadata.metadata, ['yes']); + done(); + }); }); - }); - it('should be present when a bidi stream fails', function(done) { - var call = client.bidiStream(); - call.write({error: false}); - call.write({error: true}); - call.end(); - call.on('data', function(){}); - call.on('error', function(error) { - assert.deepEqual(error.metadata.metadata, ['yes']); - done(); + it('should be present when a bidi stream fails', function(done) { + var call = client.bidiStream(); + call.write({error: false}); + call.write({error: true}); + call.end(); + call.on('data', function(){}); + call.on('error', function(error) { + assert.deepEqual(error.metadata.metadata, ['yes']); + done(); + }); }); }); }); From 63e4091dbc0902ea0447bb30940f757478abdef7 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 18 May 2015 17:41:20 -0700 Subject: [PATCH 037/217] Add warning about the perils of buffering without bounds --- src/objective-c/RxLibrary/GRXBufferedPipe.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.h b/src/objective-c/RxLibrary/GRXBufferedPipe.h index 02dc6b5fe83..4147362ba42 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.h +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.h @@ -45,6 +45,12 @@ // GRXWriterStateStarted. // If it receives an error (via -didFinishWithError:), it will drop any buffered values and // propagate the error immediately. +// +// Beware that a pipe of this type can't prevent receiving more values when it is paused (for +// example if used to write data to a congested network connection). Because in such situations the +// pipe will keep buffering all data written to it, your application could run out of memory and +// crash. If you want to react to flow control signals to prevent that, instead of using this class +// you can implement an object that conforms to GRXWriter. @interface GRXBufferedPipe : NSObject // Convenience constructor. From 73b66efa279e7c0eaef5cd7a6aa726d6cc9ed266 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 20:46:47 -0700 Subject: [PATCH 038/217] Do a little better - dont require EXTRACT_ALL --- include/grpc/grpc.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 2868f05400a..7d769d0bc2c 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -31,6 +31,8 @@ * */ +/** \file grpc.h */ + #ifndef GRPC_GRPC_H #define GRPC_GRPC_H @@ -193,8 +195,7 @@ typedef struct grpc_metadata { } internal_data; } grpc_metadata; -/** \enum grpc_completion_type - \brief The type of completion (for grpc_event) */ +/** The type of completion (for grpc_event) */ typedef enum grpc_completion_type { /** Shutting down */ GRPC_QUEUE_SHUTDOWN, From c1f3f2d556313f9d3674bb04b6fa893bb2bcd63a Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Mon, 18 May 2015 21:09:23 -0700 Subject: [PATCH 039/217] Extension should return a const char *. --- include/grpc/support/subprocess.h | 2 +- src/core/support/subprocess_posix.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/grpc/support/subprocess.h b/include/grpc/support/subprocess.h index c59751da83e..1b7431e7d9f 100644 --- a/include/grpc/support/subprocess.h +++ b/include/grpc/support/subprocess.h @@ -37,7 +37,7 @@ typedef struct gpr_subprocess gpr_subprocess; /* .exe on windows, empty on unices */ -char *gpr_subprocess_binary_extension(); +const char *gpr_subprocess_binary_extension(); gpr_subprocess *gpr_subprocess_create(int argc, char **argv); /* if subprocess has not been joined, kill it */ diff --git a/src/core/support/subprocess_posix.c b/src/core/support/subprocess_posix.c index 4580537aa85..642520bb47a 100644 --- a/src/core/support/subprocess_posix.c +++ b/src/core/support/subprocess_posix.c @@ -55,7 +55,7 @@ struct gpr_subprocess { int joined; }; -char *gpr_subprocess_binary_extension() { return ""; } +const char *gpr_subprocess_binary_extension() { return ""; } gpr_subprocess *gpr_subprocess_create(int argc, char **argv) { gpr_subprocess *r; From bf094289206503d502437faf032c514856ae615f Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 18 May 2015 21:47:12 -0700 Subject: [PATCH 040/217] grpc_docker.sh support for running C# server on Windows --- tools/gce_setup/grpc_docker.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index c9a825c3e9a..0d50d2d451c 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -428,6 +428,7 @@ grpc_interop_test_args() { python) grpc_port=8050 ;; ruby) grpc_port=8060 ;; csharp_mono) grpc_port=8070 ;; + csharp_dotnet) grpc_port=8070 ;; *) echo "bad server_type: $1" 1>&2; return 1 ;; esac shift @@ -870,6 +871,23 @@ grpc_launch_servers() { done } +# Launch servers on windows. +grpc_launch_windows_servers() { + local host='jtattermusch-interop-windows2' + local killcmd="ps -e | grep Grpc.IntegrationTesting | awk '{print \\\$1}' | xargs kill -9" + echo "killing all servers and clients on $host with command $killcmd" + gcloud compute $project_opt ssh $zone_opt stoked-keyword-656@grpc-windows-proxy --command "ssh $host \"$killcmd\"" + + local cmd='cd /cygdrive/c/github/grpc/src/csharp/Grpc.IntegrationTesting.Server/bin/Debug && ./Grpc.IntegrationTesting.Server.exe --use_tls=true --port=8070' + # gcloud's auto-uploading of RSA keys doesn't work for Windows VMs. + # So we have a linux machine that is authorized to access the Windows + # machine through ssh and we use gcloud auth support to logon to the proxy. + echo "will run:" + echo " $cmd" + echo "on $host (through grpc-windows-proxy)" + gcloud compute $project_opt ssh $zone_opt stoked-keyword-656@grpc-windows-proxy --command "ssh $host '$cmd'" +} + # Runs a test command on a docker instance # # The test command is issued via gcloud compute @@ -949,6 +967,7 @@ test_runner() { # node: 8040 # python: 8050 # ruby: 8060 +# csharp: 8070 # # each client_type should have an associated bash func: # grpc_interop_gen__cmd From 3b3658ef378102e3d8033a8497b14b1045fe4532 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 18 May 2015 22:35:36 -0700 Subject: [PATCH 041/217] Fix typo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3f787787c20..ee5f50579be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ script: - if [ ! -z "$USE_GCC" ] ; then export CC=gcc-$USE_GCC ; export CXX=g++-$USE_GCC ; fi - ./tools/run_tests/run_tests.py -l $TEST -t -j 16 -c $CONFIG -s 4.0 after_success: - - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens --exclude tests --exclude src/compiler -b. --gcov-options '\-p' ; fi + - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens --exclude test --exclude src/compiler -b. --gcov-options '\-p' ; fi notifications: email: false webhooks: From 42e47b462ea4c45496e2367e3bfc168ab433600b Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 18 May 2015 23:38:17 -0700 Subject: [PATCH 042/217] Copy values before buffering them. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So they aren’t mutated before being written later. --- src/objective-c/RxLibrary/GRXBufferedPipe.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m index e1295cef8ae..3ef470f89ff 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.m +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m @@ -84,6 +84,10 @@ } else { // Even if we're paused and with enqueued values, we can't excert back-pressure to our writer. // So just buffer the new value. + // We need a copy, so that it doesn't mutate before it's written at the other end of the pipe. + if ([value respondsToSelector:@selector(copy)]) { + value = [value copy]; + } [_queue addObject:value]; } } From 49c3b01c3e61efb0128c5ae0175b653a23ea86db Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 08:18:02 -0700 Subject: [PATCH 043/217] Better RNG seeding portability --- test/cpp/qps/driver.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 6843e719e1c..08a32f0823e 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -90,8 +90,6 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, return &contexts.back(); }; - srand(time(NULL) ^ getpid()); - // Get client, server lists auto workers = get_hosts("QPS_WORKERS"); ClientConfig client_config = initial_client_config; @@ -99,6 +97,14 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, // Spawn some local workers if desired vector> local_workers; for (int i = 0; i < abs(spawn_local_worker_count); i++) { + // act as if we're a new test -- gets a good rng seed + static bool called_init = false; + if (!called_init) { + char *args[] = {"some-benchmark"}; + grpc_test_init(1, args); + called_init = true; + } + int driver_port = grpc_pick_unused_port_or_die(); int benchmark_port = grpc_pick_unused_port_or_die(); local_workers.emplace_back(new QpsWorker(driver_port, benchmark_port)); From 882431fff5c06eed97633353016cbcac9361a2e2 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 09:25:37 -0700 Subject: [PATCH 044/217] Compile fix --- test/cpp/qps/driver.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 08a32f0823e..6959f980ae2 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -48,6 +48,7 @@ #include "test/cpp/qps/histogram.h" #include "test/cpp/qps/qps_worker.h" #include "test/core/util/port.h" +#include "test/core/util/test_config.h" using std::list; using std::thread; @@ -100,7 +101,9 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, // act as if we're a new test -- gets a good rng seed static bool called_init = false; if (!called_init) { - char *args[] = {"some-benchmark"}; + char args_buf[100]; + strcpy(args_buf, "some-benchmark"); + char *args[] = {args_buf}; grpc_test_init(1, args); called_init = true; } From 7a317e5c7714c869f2a49c7e073a057bc9b13b82 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 09:38:29 -0700 Subject: [PATCH 045/217] Add crashing client test --- Makefile | 134 +++++++++++++--- build.json | 41 ++++- .../{crash_test.cc => client_crash_test.cc} | 2 +- ..._server.cc => client_crash_test_server.cc} | 0 test/cpp/end2end/server_crash_test.cc | 143 ++++++++++++++++++ test/cpp/end2end/server_crash_test_client.cc | 80 ++++++++++ tools/run_tests/tests.json | 11 +- 7 files changed, 380 insertions(+), 31 deletions(-) rename test/cpp/end2end/{crash_test.cc => client_crash_test.cc} (99%) rename test/cpp/end2end/{crash_test_server.cc => client_crash_test_server.cc} (100%) create mode 100644 test/cpp/end2end/server_crash_test.cc create mode 100644 test/cpp/end2end/server_crash_test_client.cc diff --git a/Makefile b/Makefile index 17eedefeeaf..e287c55fc2a 100644 --- a/Makefile +++ b/Makefile @@ -672,8 +672,8 @@ async_streaming_ping_pong_test: $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_te async_unary_ping_pong_test: $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test cli_call_test: $(BINDIR)/$(CONFIG)/cli_call_test -crash_test: $(BINDIR)/$(CONFIG)/crash_test -crash_test_server: $(BINDIR)/$(CONFIG)/crash_test_server +client_crash_test: $(BINDIR)/$(CONFIG)/client_crash_test +client_crash_test_server: $(BINDIR)/$(CONFIG)/client_crash_test_server credentials_test: $(BINDIR)/$(CONFIG)/credentials_test cxx_time_test: $(BINDIR)/$(CONFIG)/cxx_time_test end2end_test: $(BINDIR)/$(CONFIG)/end2end_test @@ -694,6 +694,8 @@ pubsub_subscriber_test: $(BINDIR)/$(CONFIG)/pubsub_subscriber_test qps_driver: $(BINDIR)/$(CONFIG)/qps_driver qps_test: $(BINDIR)/$(CONFIG)/qps_test qps_worker: $(BINDIR)/$(CONFIG)/qps_worker +server_crash_test: $(BINDIR)/$(CONFIG)/server_crash_test +server_crash_test_client: $(BINDIR)/$(CONFIG)/server_crash_test_client status_test: $(BINDIR)/$(CONFIG)/status_test sync_streaming_ping_pong_test: $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test sync_unary_ping_pong_test: $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test @@ -1152,7 +1154,7 @@ buildtests: buildtests_c buildtests_cxx buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test -buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/crash_test $(BINDIR)/$(CONFIG)/crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test +buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test test: test_c test_cxx @@ -2016,8 +2018,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/channel_arguments_test || ( echo test channel_arguments_test failed ; exit 1 ) $(E) "[RUN] Testing cli_call_test" $(Q) $(BINDIR)/$(CONFIG)/cli_call_test || ( echo test cli_call_test failed ; exit 1 ) - $(E) "[RUN] Testing crash_test" - $(Q) $(BINDIR)/$(CONFIG)/crash_test || ( echo test crash_test failed ; exit 1 ) + $(E) "[RUN] Testing client_crash_test" + $(Q) $(BINDIR)/$(CONFIG)/client_crash_test || ( echo test client_crash_test failed ; exit 1 ) $(E) "[RUN] Testing credentials_test" $(Q) $(BINDIR)/$(CONFIG)/credentials_test || ( echo test credentials_test failed ; exit 1 ) $(E) "[RUN] Testing cxx_time_test" @@ -2030,6 +2032,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/interop_test || ( echo test interop_test failed ; exit 1 ) $(E) "[RUN] Testing mock_test" $(Q) $(BINDIR)/$(CONFIG)/mock_test || ( echo test mock_test failed ; exit 1 ) + $(E) "[RUN] Testing server_crash_test" + $(Q) $(BINDIR)/$(CONFIG)/server_crash_test || ( echo test server_crash_test failed ; exit 1 ) $(E) "[RUN] Testing status_test" $(Q) $(BINDIR)/$(CONFIG)/status_test || ( echo test status_test failed ; exit 1 ) $(E) "[RUN] Testing thread_pool_test" @@ -7148,15 +7152,15 @@ endif endif -CRASH_TEST_SRC = \ - test/cpp/end2end/crash_test.cc \ +CLIENT_CRASH_TEST_SRC = \ + test/cpp/end2end/client_crash_test.cc \ -CRASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CRASH_TEST_SRC)))) +CLIENT_CRASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_CRASH_TEST_SRC)))) ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. -$(BINDIR)/$(CONFIG)/crash_test: openssl_dep_error +$(BINDIR)/$(CONFIG)/client_crash_test: openssl_dep_error else @@ -7165,38 +7169,38 @@ ifeq ($(NO_PROTOBUF),true) # You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. -$(BINDIR)/$(CONFIG)/crash_test: protobuf_dep_error +$(BINDIR)/$(CONFIG)/client_crash_test: protobuf_dep_error else -$(BINDIR)/$(CONFIG)/crash_test: $(PROTOBUF_DEP) $(CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/client_crash_test: $(PROTOBUF_DEP) $(CLIENT_CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/crash_test + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_crash_test endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/crash_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -deps_crash_test: $(CRASH_TEST_OBJS:.o=.dep) +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_crash_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_client_crash_test: $(CLIENT_CRASH_TEST_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) ifneq ($(NO_DEPS),true) --include $(CRASH_TEST_OBJS:.o=.dep) +-include $(CLIENT_CRASH_TEST_OBJS:.o=.dep) endif endif -CRASH_TEST_SERVER_SRC = \ - test/cpp/end2end/crash_test_server.cc \ +CLIENT_CRASH_TEST_SERVER_SRC = \ + test/cpp/end2end/client_crash_test_server.cc \ -CRASH_TEST_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CRASH_TEST_SERVER_SRC)))) +CLIENT_CRASH_TEST_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_CRASH_TEST_SERVER_SRC)))) ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. -$(BINDIR)/$(CONFIG)/crash_test_server: openssl_dep_error +$(BINDIR)/$(CONFIG)/client_crash_test_server: openssl_dep_error else @@ -7205,25 +7209,25 @@ ifeq ($(NO_PROTOBUF),true) # You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. -$(BINDIR)/$(CONFIG)/crash_test_server: protobuf_dep_error +$(BINDIR)/$(CONFIG)/client_crash_test_server: protobuf_dep_error else -$(BINDIR)/$(CONFIG)/crash_test_server: $(PROTOBUF_DEP) $(CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/client_crash_test_server: $(PROTOBUF_DEP) $(CLIENT_CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/crash_test_server + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_CRASH_TEST_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_crash_test_server endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/crash_test_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -deps_crash_test_server: $(CRASH_TEST_SERVER_OBJS:.o=.dep) +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_crash_test_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_client_crash_test_server: $(CLIENT_CRASH_TEST_SERVER_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) ifneq ($(NO_DEPS),true) --include $(CRASH_TEST_SERVER_OBJS:.o=.dep) +-include $(CLIENT_CRASH_TEST_SERVER_OBJS:.o=.dep) endif endif @@ -7946,6 +7950,86 @@ endif endif +SERVER_CRASH_TEST_SRC = \ + test/cpp/end2end/server_crash_test.cc \ + +SERVER_CRASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_CRASH_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/server_crash_test: openssl_dep_error + +else + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/server_crash_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_crash_test: $(PROTOBUF_DEP) $(SERVER_CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_CRASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_crash_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_crash_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_server_crash_test: $(SERVER_CRASH_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_CRASH_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_CRASH_TEST_CLIENT_SRC = \ + test/cpp/end2end/server_crash_test_client.cc \ + +SERVER_CRASH_TEST_CLIENT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_CRASH_TEST_CLIENT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/server_crash_test_client: openssl_dep_error + +else + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/server_crash_test_client: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_crash_test_client: $(PROTOBUF_DEP) $(SERVER_CRASH_TEST_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_CRASH_TEST_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_crash_test_client + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_crash_test_client.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_server_crash_test_client: $(SERVER_CRASH_TEST_CLIENT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_CRASH_TEST_CLIENT_OBJS:.o=.dep) +endif +endif + + STATUS_TEST_SRC = \ test/cpp/util/status_test.cc \ diff --git a/build.json b/build.json index 03593966407..95bf7a623bb 100644 --- a/build.json +++ b/build.json @@ -1877,11 +1877,11 @@ ] }, { - "name": "crash_test", + "name": "client_crash_test", "build": "test", "language": "c++", "src": [ - "test/cpp/end2end/crash_test.cc" + "test/cpp/end2end/client_crash_test.cc" ], "deps": [ "grpc++_test_util", @@ -1893,12 +1893,12 @@ ] }, { - "name": "crash_test_server", + "name": "client_crash_test_server", "build": "test", "run": false, "language": "c++", "src": [ - "test/cpp/end2end/crash_test_server.cc" + "test/cpp/end2end/client_crash_test_server.cc" ], "deps": [ "grpc++_test_util", @@ -2223,6 +2223,39 @@ "grpc++_test_config" ] }, + { + "name": "server_crash_test", + "build": "test", + "language": "c++", + "src": [ + "test/cpp/end2end/server_crash_test.cc" + ], + "deps": [ + "grpc++_test_util", + "grpc_test_util", + "grpc++", + "grpc", + "gpr_test_util", + "gpr" + ] + }, + { + "name": "server_crash_test_client", + "build": "test", + "run": false, + "language": "c++", + "src": [ + "test/cpp/end2end/server_crash_test_client.cc" + ], + "deps": [ + "grpc++_test_util", + "grpc_test_util", + "grpc++", + "grpc", + "gpr_test_util", + "gpr" + ] + }, { "name": "status_test", "build": "test", diff --git a/test/cpp/end2end/crash_test.cc b/test/cpp/end2end/client_crash_test.cc similarity index 99% rename from test/cpp/end2end/crash_test.cc rename to test/cpp/end2end/client_crash_test.cc index 628b3e25438..e86681f75a1 100644 --- a/test/cpp/end2end/crash_test.cc +++ b/test/cpp/end2end/client_crash_test.cc @@ -80,7 +80,7 @@ class CrashTest : public ::testing::Test { addr_stream << "localhost:" << port; auto addr = addr_stream.str(); server_.reset(new SubProcess({ - g_root + "/crash_test_server", + g_root + "/client_crash_test_server", "--address=" + addr, })); GPR_ASSERT(server_); diff --git a/test/cpp/end2end/crash_test_server.cc b/test/cpp/end2end/client_crash_test_server.cc similarity index 100% rename from test/cpp/end2end/crash_test_server.cc rename to test/cpp/end2end/client_crash_test_server.cc diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc new file mode 100644 index 00000000000..8f3954f9211 --- /dev/null +++ b/test/cpp/end2end/server_crash_test.cc @@ -0,0 +1,143 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" +#include "src/cpp/server/thread_pool.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "test/cpp/util/subprocess.h" + +using grpc::cpp::test::util::EchoRequest; +using grpc::cpp::test::util::EchoResponse; +using std::chrono::system_clock; + +static std::string g_root; + +namespace grpc { +namespace testing { + +namespace { + +class ServiceImpl GRPC_FINAL : public ::grpc::cpp::test::util::TestService::Service { + Status BidiStream(ServerContext* context, + ServerReaderWriter* stream) + GRPC_OVERRIDE { + EchoRequest request; + EchoResponse response; + while (stream->Read(&request)) { + gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); + response.set_message(request.message()); + stream->Write(response); + } + return Status::OK; + } +}; + +class CrashTest : public ::testing::Test { + protected: + CrashTest() {} + + std::unique_ptr + CreateServerAndClient() { + auto port = grpc_pick_unused_port_or_die(); + std::ostringstream addr_stream; + addr_stream << "localhost:" << port; + auto addr = addr_stream.str(); + client_.reset(new SubProcess({ + g_root + "/server_crash_test_client", + "--address=" + addr, + })); + GPR_ASSERT(client_); + + ServerBuilder builder; + builder.AddListeningPort(addr, grpc::InsecureServerCredentials()); + builder.RegisterService(&service_); + return builder.BuildAndStart(); + } + + void KillClient() { + client_.reset(); + } + + private: + std::unique_ptr client_; + ServiceImpl service_; +}; + +TEST_F(CrashTest, Kill) { + auto server = CreateServerAndClient(); + + gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(5))); + KillClient(); + server->Shutdown(); +} + +} // namespace + +} // namespace testing +} // namespace grpc + +int main(int argc, char** argv) { + std::string me = argv[0]; + auto lslash = me.rfind('/'); + if (lslash != std::string::npos) { + g_root = me.substr(0, lslash); + } else { + g_root = "."; + } + + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc new file mode 100644 index 00000000000..d4273b8f587 --- /dev/null +++ b/test/cpp/end2end/server_crash_test_client.cc @@ -0,0 +1,80 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include "test/cpp/util/echo.grpc.pb.h" + +DEFINE_string(address, "", "Address to connect to"); + +using grpc::cpp::test::util::EchoRequest; +using grpc::cpp::test::util::EchoResponse; + +// In some distros, gflags is in the namespace google, and in some others, +// in gflags. This hack is enabling us to find both. +namespace google {} +namespace gflags {} +using namespace google; +using namespace gflags; + +int main(int argc, char** argv) { + ParseCommandLineFlags(&argc, &argv, true); + auto stub = grpc::cpp::test::util::TestService::NewStub( + grpc::CreateChannel(FLAGS_address, grpc::InsecureCredentials(), grpc::ChannelArguments())); + + EchoRequest request; + EchoResponse response; + grpc::ClientContext context; + + auto stream = stub->BidiStream(&context); + for (int i = 0;; i++) { + std::ostringstream msg; + msg << "Hello " << i; + request.set_message(msg.str()); + GPR_ASSERT(stream->Write(request)); + GPR_ASSERT(stream->Read(&response)); + GPR_ASSERT(response.message() == request.message()); + } + + return 0; +} diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 41665602730..21434a60074 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -617,7 +617,7 @@ { "flaky": false, "language": "c++", - "name": "crash_test", + "name": "client_crash_test", "platforms": [ "windows", "posix" @@ -677,6 +677,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c++", + "name": "server_crash_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c++", From 04589a7e0cbdb22c3fe10d2a1e2b7e698091f10d Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 19 May 2015 09:51:26 -0700 Subject: [PATCH 046/217] Fixed server to handle invalid arguments without breaking --- src/node/src/server.js | 29 ++++++++++++++++++++++++++--- src/node/test/surface_test.js | 11 +++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/node/src/server.js b/src/node/src/server.js index eef705c44c6..079495afd4c 100644 --- a/src/node/src/server.js +++ b/src/node/src/server.js @@ -291,7 +291,15 @@ function _read(size) { return; } var data = event.read; - if (self.push(self.deserialize(data)) && data !== null) { + var deserialized; + try { + deserialized = self.deserialize(data); + } catch (e) { + e.code = grpc.status.INVALID_ARGUMENT; + self.emit('error', e); + return; + } + if (self.push(deserialized) && data !== null) { var read_batch = {}; read_batch[grpc.opType.RECV_MESSAGE] = true; self.call.startBatch(read_batch, readCallback); @@ -354,7 +362,13 @@ function handleUnary(call, handler, metadata) { handleError(call, err); return; } - emitter.request = handler.deserialize(result.read); + try { + emitter.request = handler.deserialize(result.read); + } catch (e) { + e.code = grpc.status.INVALID_ARGUMENT; + handleError(call, e); + return; + } if (emitter.cancelled) { return; } @@ -388,7 +402,13 @@ function handleServerStreaming(call, handler, metadata) { stream.emit('error', err); return; } - stream.request = handler.deserialize(result.read); + try { + stream.request = handler.deserialize(result.read); + } catch (e) { + e.code = grpc.status.INVALID_ARGUMENT; + stream.emit('error', e); + return; + } handler.func(stream); }); } @@ -401,6 +421,9 @@ function handleServerStreaming(call, handler, metadata) { */ function handleClientStreaming(call, handler, metadata) { var stream = new ServerReadableStream(call, handler.deserialize); + stream.on('error', function(error) { + handleError(call, error); + }); waitForCancel(call, stream); var metadata_batch = {}; metadata_batch[grpc.opType.SEND_INITIAL_METADATA] = metadata; diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js index ccced741abd..b390f8b2a55 100644 --- a/src/node/test/surface_test.js +++ b/src/node/test/surface_test.js @@ -192,7 +192,6 @@ describe('Other conditions', function() { TestService: { unary: function(call, cb) { var req = call.request; - debugger; if (req.error) { cb(new Error('Requested error'), null, {metadata: ['yes']}); } else { @@ -297,7 +296,7 @@ describe('Other conditions', function() { misbehavingClient = new Client('localhost:' + port); }); it('should respond correctly to a unary call', function(done) { - var call = misbehavingClient.unary(badArg, function(err, data) { + misbehavingClient.unary(badArg, function(err, data) { assert(err); assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); done(); @@ -310,11 +309,13 @@ describe('Other conditions', function() { done(); }); call.write(badArg); + // TODO(mlumish): Remove call.end() + call.end(); }); it('should respond correctly to a server stream', function(done) { var call = misbehavingClient.serverStream(badArg); call.on('data', function(data) { - assert.fail(data, null, 'Unexpected data', '!='); + assert.fail(data, null, 'Unexpected data', '==='); }); call.on('error', function(err) { assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); @@ -324,13 +325,15 @@ describe('Other conditions', function() { it('should respond correctly to a bidi stream', function(done) { var call = misbehavingClient.bidiStream(); call.on('data', function(data) { - assert.fail(data, null, 'Unexpected data', '!='); + assert.fail(data, null, 'Unexpected data', '==='); }); call.on('error', function(err) { assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT); done(); }); call.write(badArg); + // TODO(mlumish): Remove call.end() + call.end(); }); }); describe('Trailing metadata', function() { From fd7166d264b4abd9dab4215cdc60a0c9dc635c8e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 10:23:03 -0700 Subject: [PATCH 047/217] Add response streams to server crash test, fix them --- src/core/surface/call.c | 5 ++-- test/cpp/end2end/server_crash_test.cc | 29 ++++++++++++++++++-- test/cpp/end2end/server_crash_test_client.cc | 29 ++++++++++++++------ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 7a30de5f332..8b1ef0f2be0 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -536,9 +536,8 @@ static void finish_live_ioreq_op(grpc_call *call, grpc_ioreq_op op, switch ((grpc_ioreq_op)i) { case GRPC_IOREQ_RECV_MESSAGE: case GRPC_IOREQ_SEND_MESSAGE: - if (master->success) { - call->request_set[i] = REQSET_EMPTY; - } else { + call->request_set[i] = REQSET_EMPTY; + if (!master->success) { call->write_state = WRITE_STATE_WRITE_CLOSED; } break; diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc index 8f3954f9211..11d73aec7d6 100644 --- a/test/cpp/end2end/server_crash_test.cc +++ b/test/cpp/end2end/server_crash_test.cc @@ -79,6 +79,20 @@ class ServiceImpl GRPC_FINAL : public ::grpc::cpp::test::util::TestService::Serv gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); response.set_message(request.message()); stream->Write(response); + gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(1))); + } + return Status::OK; + } + + Status ResponseStream(ServerContext* context, const EchoRequest* request, + ServerWriter* writer) GRPC_OVERRIDE { + EchoResponse response; + for (int i = 0;; i++) { + std::ostringstream msg; + msg << "Hello " << i; + response.set_message(msg.str()); + if (!writer->Write(response)) break; + gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(1))); } return Status::OK; } @@ -89,7 +103,7 @@ class CrashTest : public ::testing::Test { CrashTest() {} std::unique_ptr - CreateServerAndClient() { + CreateServerAndClient(const std::string& mode) { auto port = grpc_pick_unused_port_or_die(); std::ostringstream addr_stream; addr_stream << "localhost:" << port; @@ -97,6 +111,7 @@ class CrashTest : public ::testing::Test { client_.reset(new SubProcess({ g_root + "/server_crash_test_client", "--address=" + addr, + "--mode=" + mode })); GPR_ASSERT(client_); @@ -115,8 +130,16 @@ class CrashTest : public ::testing::Test { ServiceImpl service_; }; -TEST_F(CrashTest, Kill) { - auto server = CreateServerAndClient(); +TEST_F(CrashTest, ResponseStream) { + auto server = CreateServerAndClient("response"); + + gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(5))); + KillClient(); + server->Shutdown(); +} + +TEST_F(CrashTest, BidiStream) { + auto server = CreateServerAndClient("bidi"); gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_seconds(5))); KillClient(); diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc index d4273b8f587..497ccb4cb2b 100644 --- a/test/cpp/end2end/server_crash_test_client.cc +++ b/test/cpp/end2end/server_crash_test_client.cc @@ -46,6 +46,7 @@ #include "test/cpp/util/echo.grpc.pb.h" DEFINE_string(address, "", "Address to connect to"); +DEFINE_string(mode, "", "Test mode to use"); using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; @@ -66,14 +67,26 @@ int main(int argc, char** argv) { EchoResponse response; grpc::ClientContext context; - auto stream = stub->BidiStream(&context); - for (int i = 0;; i++) { - std::ostringstream msg; - msg << "Hello " << i; - request.set_message(msg.str()); - GPR_ASSERT(stream->Write(request)); - GPR_ASSERT(stream->Read(&response)); - GPR_ASSERT(response.message() == request.message()); + if (FLAGS_mode == "bidi") { + auto stream = stub->BidiStream(&context); + for (int i = 0;; i++) { + std::ostringstream msg; + msg << "Hello " << i; + request.set_message(msg.str()); + GPR_ASSERT(stream->Write(request)); + GPR_ASSERT(stream->Read(&response)); + GPR_ASSERT(response.message() == request.message()); + } + } else if (FLAGS_mode == "response") { + EchoRequest request; + request.set_message("Hello"); + auto stream = stub->ResponseStream(&context, request); + for (;;) { + GPR_ASSERT(stream->Read(&response)); + } + } else { + gpr_log(GPR_ERROR, "invalid test mode '%s'", FLAGS_mode.c_str()); + return 1; } return 0; From 69eed29b7e1829b2602034e4de7889ea5398ae3e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 10:43:05 -0700 Subject: [PATCH 048/217] Add clarifying comment --- include/grpc/grpc.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index ce01b2d855a..6e26dd07c90 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -244,7 +244,10 @@ typedef enum { GRPC_OP_RECV_INITIAL_METADATA, /* Receive a message: 0 or more of these operations can occur for each call */ GRPC_OP_RECV_MESSAGE, - /* Receive status on the client: one and only one must be made on the client + /* Receive status on the client: one and only one must be made on the client. + This operation always succeeds, meaning ops paired with this operation + will also appear to succeed, even though they may not have. In that case + the status will indicate some failure. */ GRPC_OP_RECV_STATUS_ON_CLIENT, /* Receive status on the server: one and only one must be made on the server From b98188e826b3c86b84034529951de5206e885b21 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Sun, 3 May 2015 08:37:46 +0200 Subject: [PATCH 049/217] Upgrading third_party/protobuf to version v3.0.0-alpha-1-150-g7d5cf8d. --- src/python/requirements.txt | 2 +- src/python/src/setup.py | 2 +- third_party/protobuf | 2 +- tools/dockerfile/grpc_python_base/Dockerfile | 2 +- tools/run_tests/build_python.sh | 2 +- tools/run_tests/run_sanity.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/python/requirements.txt b/src/python/requirements.txt index 06a42e1c9ff..d32d436d3c4 100644 --- a/src/python/requirements.txt +++ b/src/python/requirements.txt @@ -1,3 +1,3 @@ enum34==1.0.4 futures==2.2.0 -protobuf==3.0.0-alpha-1 +protobuf==3.0.0a2 diff --git a/src/python/src/setup.py b/src/python/src/setup.py index a13dc4ec19d..e936913cfd0 100644 --- a/src/python/src/setup.py +++ b/src/python/src/setup.py @@ -93,6 +93,6 @@ setuptools.setup( install_requires=[ 'enum34==1.0.4', 'futures==2.2.0', - 'protobuf==3.0.0-alpha-1' + 'protobuf==3.0.0a2' ] ) diff --git a/third_party/protobuf b/third_party/protobuf index 644a6a1da71..7d5cf8d7a1b 160000 --- a/third_party/protobuf +++ b/third_party/protobuf @@ -1 +1 @@ -Subproject commit 644a6a1da71385e9d7a7a26b3476c93fdd71788c +Subproject commit 7d5cf8d7a1bd24acce56296747731051ebe1b180 diff --git a/tools/dockerfile/grpc_python_base/Dockerfile b/tools/dockerfile/grpc_python_base/Dockerfile index 0d45f402429..90a57bf3414 100644 --- a/tools/dockerfile/grpc_python_base/Dockerfile +++ b/tools/dockerfile/grpc_python_base/Dockerfile @@ -43,7 +43,7 @@ RUN apt-get update && apt-get install -y \ python-virtualenv # Install Python packages from PyPI -RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0-alpha-1 +RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0a2 # Get the GRPC source from GitHub RUN git clone --recursive https://github.com/grpc/grpc.git /var/local/git/grpc diff --git a/tools/run_tests/build_python.sh b/tools/run_tests/build_python.sh index b14597804fe..dc5baccf9f3 100755 --- a/tools/run_tests/build_python.sh +++ b/tools/run_tests/build_python.sh @@ -37,6 +37,6 @@ root=`pwd` rm -rf python2.7_virtual_environment virtualenv -p /usr/bin/python2.7 python2.7_virtual_environment source python2.7_virtual_environment/bin/activate -pip install enum34==1.0.4 futures==2.2.0 protobuf==3.0.0-alpha-1 +pip install enum34==1.0.4 futures==2.2.0 protobuf==3.0.0a2 CFLAGS=-I$root/include LDFLAGS=-L$root/libs/$CONFIG pip install src/python/src pip install src/python/interop diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh index 959197eb3d9..aa241b03dd0 100755 --- a/tools/run_tests/run_sanity.sh +++ b/tools/run_tests/run_sanity.sh @@ -45,6 +45,6 @@ git submodule > $submodules diff -u $submodules - << EOF 05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f) 3df69d3aefde7671053d4e3c242b228e5d79c83f third_party/openssl (OpenSSL_1_0_2a) - 644a6a1da71385e9d7a7a26b3476c93fdd71788c third_party/protobuf (v3.0.0-alpha-1-35-g644a6a1) + 7d5cf8d7a1bd24acce56296747731051ebe1b180 third_party/protobuf (v3.0.0-alpha-1-150-g7d5cf8d) 50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8) EOF From 6ab757bc9471df9edc6d95448aa8719a26ae99c4 Mon Sep 17 00:00:00 2001 From: Jayant Kolhe Date: Tue, 19 May 2015 10:19:47 -0700 Subject: [PATCH 050/217] Update README.md --- README.md | 3 ++- src/python/README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bba316cee35..f407bc306fa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![Build Status](https://travis-ci.org/grpc/grpc.svg?branch=master)](https://travis-ci.org/grpc/grpc) +[![Coverage Status](https://img.shields.io/coveralls/grpc/grpc.svg)](https://coveralls.io/r/grpc/grpc?branch=master) [gRPC - An RPC library and framework](http://github.com/grpc/grpc) =================================== @@ -37,7 +38,7 @@ Libraries in different languages are in different state of development. We are s * C++ Library: [src/cpp] (src/cpp) : Early adopter ready - Alpha. * Ruby Library: [src/ruby] (src/ruby) : Early adopter ready - Alpha. * NodeJS Library: [src/node] (src/node) : Early adopter ready - Alpha. - * Python Library: [src/python] (src/python) : Usable with limitations - Alpha. + * Python Library: [src/python] (src/python) : Early adopter ready - Alpha. * PHP Library: [src/php] (src/php) : Pre-Alpha. * C# Library: [src/csharp] (src/csharp) : Pre-Alpha. * Objective-C Library: [src/objective-c] (src/objective-c): Pre-Alpha. diff --git a/src/python/README.md b/src/python/README.md index b5eea239f33..c67201b6708 100644 --- a/src/python/README.md +++ b/src/python/README.md @@ -7,7 +7,7 @@ The Python facility of gRPC. Status ------- -Usable with limitations, Alpha +Alpha : Ready for early adopters Prerequisites ----------------------- From 15514b557c4714572a7c628fd3bad4fb188f7e9b Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 19 May 2015 11:47:45 -0700 Subject: [PATCH 051/217] upgrade protobuf latest version containing objectiveC and csharp --- third_party/protobuf | 2 +- tools/run_tests/run_sanity.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/third_party/protobuf b/third_party/protobuf index 7d5cf8d7a1b..a8b38c598d7 160000 --- a/third_party/protobuf +++ b/third_party/protobuf @@ -1 +1 @@ -Subproject commit 7d5cf8d7a1bd24acce56296747731051ebe1b180 +Subproject commit a8b38c598d7f65b281a72809b28117afdb760931 diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh index aa241b03dd0..07e559fb038 100755 --- a/tools/run_tests/run_sanity.sh +++ b/tools/run_tests/run_sanity.sh @@ -45,6 +45,6 @@ git submodule > $submodules diff -u $submodules - << EOF 05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f) 3df69d3aefde7671053d4e3c242b228e5d79c83f third_party/openssl (OpenSSL_1_0_2a) - 7d5cf8d7a1bd24acce56296747731051ebe1b180 third_party/protobuf (v3.0.0-alpha-1-150-g7d5cf8d) + a8b38c598d7f65b281a72809b28117afdb760931 third_party/protobuf (v3.0.0-alpha-1-978-ga8b38c5) 50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8) EOF From 7a29098b714e25313f3ed2f3b00768b11a46fb4a Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 12:49:54 -0700 Subject: [PATCH 052/217] Send RST_STREAM when closing from the server without getting a client half-close first --- Makefile | 250 +++++++++++++++++- src/core/transport/chttp2/frame.h | 2 + src/core/transport/chttp2/frame_rst_stream.c | 40 +++ src/core/transport/chttp2/frame_rst_stream.h | 11 + src/core/transport/chttp2_transport.c | 116 +++++--- test/core/end2end/gen_build_json.py | 1 + .../end2end/tests/server_finishes_request.c | 200 ++++++++++++++ tools/run_tests/tests.json | 115 ++++++++ vsprojects/Grpc.mak | 85 +++++- 9 files changed, 775 insertions(+), 45 deletions(-) create mode 100644 test/core/end2end/tests/server_finishes_request.c diff --git a/Makefile b/Makefile index 024e54f65ed..d163a1286aa 100644 --- a/Makefile +++ b/Makefile @@ -722,6 +722,7 @@ chttp2_fake_security_request_response_with_payload_and_call_creds_test: $(BINDIR chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test chttp2_fake_security_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test chttp2_fake_security_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test +chttp2_fake_security_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test chttp2_fake_security_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test chttp2_fake_security_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test chttp2_fake_security_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test @@ -750,6 +751,7 @@ chttp2_fullstack_request_response_with_payload_and_call_creds_test: $(BINDIR)/$( chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test chttp2_fullstack_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test chttp2_fullstack_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test +chttp2_fullstack_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test chttp2_fullstack_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test chttp2_fullstack_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test chttp2_fullstack_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test @@ -778,6 +780,7 @@ chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test: $( chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test chttp2_fullstack_uds_posix_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test chttp2_fullstack_uds_posix_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test +chttp2_fullstack_uds_posix_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test chttp2_fullstack_uds_posix_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test chttp2_fullstack_uds_posix_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test @@ -806,6 +809,7 @@ chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test: $ chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test chttp2_simple_ssl_fullstack_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test chttp2_simple_ssl_fullstack_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test +chttp2_simple_ssl_fullstack_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test chttp2_simple_ssl_fullstack_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test chttp2_simple_ssl_fullstack_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test @@ -834,6 +838,7 @@ chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_c chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test +chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test @@ -862,6 +867,7 @@ chttp2_socket_pair_request_response_with_payload_and_call_creds_test: $(BINDIR)/ chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test chttp2_socket_pair_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test chttp2_socket_pair_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test +chttp2_socket_pair_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test chttp2_socket_pair_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test chttp2_socket_pair_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test @@ -890,6 +896,7 @@ chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_cre chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test chttp2_socket_pair_one_byte_at_a_time_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test @@ -918,6 +925,7 @@ chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_ chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test chttp2_socket_pair_with_grpc_trace_request_with_payload_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test +chttp2_socket_pair_with_grpc_trace_server_finishes_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test chttp2_socket_pair_with_grpc_trace_simple_request_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test @@ -945,6 +953,7 @@ chttp2_fullstack_request_response_with_payload_unsecure_test: $(BINDIR)/$(CONFIG chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test chttp2_fullstack_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test chttp2_fullstack_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test +chttp2_fullstack_server_finishes_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test chttp2_fullstack_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test chttp2_fullstack_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test @@ -972,6 +981,7 @@ chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test: $(BINDIR chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test chttp2_fullstack_uds_posix_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test +chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test chttp2_fullstack_uds_posix_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test @@ -999,6 +1009,7 @@ chttp2_socket_pair_request_response_with_payload_unsecure_test: $(BINDIR)/$(CONF chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test chttp2_socket_pair_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test chttp2_socket_pair_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test +chttp2_socket_pair_server_finishes_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test chttp2_socket_pair_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test chttp2_socket_pair_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test @@ -1026,6 +1037,7 @@ chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_tes chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test @@ -1053,6 +1065,7 @@ chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test +chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test: $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test @@ -1142,13 +1155,13 @@ plugins: $(PROTOC_PLUGINS) privatelibs: privatelibs_c privatelibs_cxx -privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a +privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a buildtests: buildtests_c buildtests_cxx -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test @@ -1337,6 +1350,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test || ( echo test chttp2_fake_security_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fake_security_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test || ( echo test chttp2_fake_security_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_fake_security_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test || ( echo test chttp2_fake_security_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fake_security_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test || ( echo test chttp2_fake_security_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fake_security_simple_request_test" @@ -1393,6 +1408,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test || ( echo test chttp2_fullstack_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test || ( echo test chttp2_fullstack_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_fullstack_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test || ( echo test chttp2_fullstack_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test || ( echo test chttp2_fullstack_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_simple_request_test" @@ -1449,6 +1466,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test || ( echo test chttp2_fullstack_uds_posix_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test || ( echo test chttp2_fullstack_uds_posix_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_fullstack_uds_posix_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test || ( echo test chttp2_fullstack_uds_posix_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test || ( echo test chttp2_fullstack_uds_posix_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_simple_request_test" @@ -1505,6 +1524,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test || ( echo test chttp2_simple_ssl_fullstack_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_fullstack_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test || ( echo test chttp2_simple_ssl_fullstack_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_simple_ssl_fullstack_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test || ( echo test chttp2_simple_ssl_fullstack_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_fullstack_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test || ( echo test chttp2_simple_ssl_fullstack_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_fullstack_simple_request_test" @@ -1561,6 +1582,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test || ( echo test chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test || ( echo test chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test || ( echo test chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test || ( echo test chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test" @@ -1617,6 +1640,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test || ( echo test chttp2_socket_pair_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test || ( echo test chttp2_socket_pair_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test || ( echo test chttp2_socket_pair_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test || ( echo test chttp2_socket_pair_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_simple_request_test" @@ -1673,6 +1698,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_request_test" @@ -1729,6 +1756,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_payload_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_payload_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_server_finishes_request_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_server_finishes_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_test" @@ -1783,6 +1812,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test || ( echo test chttp2_fullstack_request_with_large_metadata_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_request_with_payload_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test || ( echo test chttp2_fullstack_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_fullstack_server_finishes_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test || ( echo test chttp2_fullstack_server_finishes_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_simple_delayed_request_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test || ( echo test chttp2_fullstack_simple_delayed_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_simple_request_unsecure_test" @@ -1837,6 +1868,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test || ( echo test chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_request_with_payload_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test || ( echo test chttp2_fullstack_uds_posix_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test || ( echo test chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test || ( echo test chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_fullstack_uds_posix_simple_request_unsecure_test" @@ -1891,6 +1924,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test || ( echo test chttp2_socket_pair_request_with_large_metadata_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_request_with_payload_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test || ( echo test chttp2_socket_pair_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_server_finishes_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test || ( echo test chttp2_socket_pair_server_finishes_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_simple_delayed_request_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test || ( echo test chttp2_socket_pair_simple_delayed_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_simple_request_unsecure_test" @@ -1945,6 +1980,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test || ( echo test chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test" @@ -1999,6 +2036,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test failed ; exit 1 ) + $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test" + $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test" $(Q) $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test || ( echo test chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test failed ; exit 1 ) $(E) "[RUN] Testing chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test" @@ -4597,6 +4636,29 @@ ifneq ($(NO_DEPS),true) endif +LIBEND2END_TEST_SERVER_FINISHES_REQUEST_SRC = \ + test/core/end2end/tests/server_finishes_request.c \ + + +LIBEND2END_TEST_SERVER_FINISHES_REQUEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBEND2END_TEST_SERVER_FINISHES_REQUEST_SRC)))) + +$(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a: $(ZLIB_DEP) $(LIBEND2END_TEST_SERVER_FINISHES_REQUEST_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a + $(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBEND2END_TEST_SERVER_FINISHES_REQUEST_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBEND2END_TEST_SERVER_FINISHES_REQUEST_OBJS:.o=.dep) +endif + + LIBEND2END_TEST_SIMPLE_DELAYED_REQUEST_SRC = \ test/core/end2end/tests/simple_delayed_request.c \ @@ -8510,6 +8572,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -9014,6 +9094,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -9518,6 +9616,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -10022,6 +10138,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -10526,6 +10660,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -11030,6 +11182,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -11534,6 +11704,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -12038,6 +12226,24 @@ endif +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test + +endif + + + + ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. @@ -12284,6 +12490,14 @@ $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test: $(LIBD +$(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test + + + + $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` @@ -12500,6 +12714,14 @@ $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_tes +$(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test + + + + $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` @@ -12716,6 +12938,14 @@ $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test: $(LI +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test + + + + $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` @@ -12932,6 +13162,14 @@ $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_u +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test + + + + $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` @@ -13148,6 +13386,14 @@ $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unse +$(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test + + + + $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test: $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` diff --git a/src/core/transport/chttp2/frame.h b/src/core/transport/chttp2/frame.h index ac76c4cc9cd..c9e3e130426 100644 --- a/src/core/transport/chttp2/frame.h +++ b/src/core/transport/chttp2/frame.h @@ -53,12 +53,14 @@ typedef struct { gpr_uint8 send_ping_ack; gpr_uint8 process_ping_reply; gpr_uint8 goaway; + gpr_uint8 rst_stream; gpr_int64 initial_window_update; gpr_uint32 window_update; gpr_uint32 goaway_last_stream_index; gpr_uint32 goaway_error; gpr_slice goaway_text; + gpr_uint32 rst_stream_reason; } grpc_chttp2_parse_state; #define GRPC_CHTTP2_FRAME_DATA 0 diff --git a/src/core/transport/chttp2/frame_rst_stream.c b/src/core/transport/chttp2/frame_rst_stream.c index 368ca864816..3016aac7a20 100644 --- a/src/core/transport/chttp2/frame_rst_stream.c +++ b/src/core/transport/chttp2/frame_rst_stream.c @@ -32,6 +32,9 @@ */ #include "src/core/transport/chttp2/frame_rst_stream.h" + +#include + #include "src/core/transport/chttp2/frame.h" gpr_slice grpc_chttp2_rst_stream_create(gpr_uint32 id, gpr_uint32 code) { @@ -54,3 +57,40 @@ gpr_slice grpc_chttp2_rst_stream_create(gpr_uint32 id, gpr_uint32 code) { return slice; } + +grpc_chttp2_parse_error grpc_chttp2_rst_stream_parser_begin_frame( + grpc_chttp2_rst_stream_parser *parser, gpr_uint32 length, gpr_uint8 flags) { + if (length != 4) { + gpr_log(GPR_ERROR, "invalid rst_stream: length=%d, flags=%02x", length, flags); + return GRPC_CHTTP2_CONNECTION_ERROR; + } + parser->byte = 0; + return GRPC_CHTTP2_PARSE_OK; +} + +grpc_chttp2_parse_error grpc_chttp2_rst_stream_parser_parse( + void *parser, grpc_chttp2_parse_state *state, gpr_slice slice, + int is_last) { + gpr_uint8 *const beg = GPR_SLICE_START_PTR(slice); + gpr_uint8 *const end = GPR_SLICE_END_PTR(slice); + gpr_uint8 *cur = beg; + grpc_chttp2_rst_stream_parser *p = parser; + + while (p->byte != 4 && cur != end) { + p->reason_bytes[p->byte] = *cur; + cur++; + p->byte++; + } + + if (p->byte == 4) { + GPR_ASSERT(is_last); + state->rst_stream = 1; + state->rst_stream_reason = + (((gpr_uint32)p->reason_bytes[0]) << 24) | + (((gpr_uint32)p->reason_bytes[1]) << 16) | + (((gpr_uint32)p->reason_bytes[2]) << 8) | + (((gpr_uint32)p->reason_bytes[3])); + } + + return GRPC_CHTTP2_PARSE_OK; +} diff --git a/src/core/transport/chttp2/frame_rst_stream.h b/src/core/transport/chttp2/frame_rst_stream.h index 2d3ee18637b..07a3c98d032 100644 --- a/src/core/transport/chttp2/frame_rst_stream.h +++ b/src/core/transport/chttp2/frame_rst_stream.h @@ -35,7 +35,18 @@ #define GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_FRAME_RST_STREAM_H #include +#include "src/core/transport/chttp2/frame.h" + +typedef struct { + gpr_uint8 byte; + gpr_uint8 reason_bytes[4]; +} grpc_chttp2_rst_stream_parser; gpr_slice grpc_chttp2_rst_stream_create(gpr_uint32 stream_id, gpr_uint32 code); +grpc_chttp2_parse_error grpc_chttp2_rst_stream_parser_begin_frame( + grpc_chttp2_rst_stream_parser *parser, gpr_uint32 length, gpr_uint8 flags); +grpc_chttp2_parse_error grpc_chttp2_rst_stream_parser_parse( + void *parser, grpc_chttp2_parse_state *state, gpr_slice slice, int is_last); + #endif /* GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_FRAME_RST_STREAM_H */ diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c index a6f9f782a18..678b3610363 100644 --- a/src/core/transport/chttp2_transport.c +++ b/src/core/transport/chttp2_transport.c @@ -154,7 +154,13 @@ typedef enum { WRITE_STATE_OPEN, WRITE_STATE_QUEUED_CLOSE, WRITE_STATE_SENT_CLOSE -} WRITE_STATE; +} write_state; + +typedef enum { + DONT_SEND_CLOSED = 0, + SEND_CLOSED, + SEND_CLOSED_WITH_RST_STREAM +} send_closed; typedef struct { stream *head; @@ -267,6 +273,7 @@ struct transport { grpc_chttp2_window_update_parser window_update; grpc_chttp2_settings_parser settings; grpc_chttp2_ping_parser ping; + grpc_chttp2_rst_stream_parser rst_stream; } simple_parsers; /* goaway */ @@ -312,8 +319,8 @@ struct stream { /* when the application requests writes be closed, the write_closed is 'queued'; when the close is flow controlled into the send path, we are 'sending' it; when the write has been performed it is 'sent' */ - WRITE_STATE write_state; - gpr_uint8 send_closed; + write_state write_state; + send_closed send_closed; gpr_uint8 read_closed; gpr_uint8 cancelled; @@ -937,7 +944,11 @@ static int prepare_write(transport *t) { if (s->write_state == WRITE_STATE_QUEUED_CLOSE && s->outgoing_sopb->nops == 0) { - s->send_closed = 1; + if (!t->is_client && !s->read_closed) { + s->send_closed = SEND_CLOSED_WITH_RST_STREAM; + } else { + s->send_closed = SEND_CLOSED; + } } if (s->writing_sopb.nops > 0 || s->send_closed) { stream_list_join(t, s, WRITING); @@ -982,9 +993,12 @@ static void finalize_outbuf(transport *t) { while ((s = stream_list_remove_head(t, WRITING))) { grpc_chttp2_encode(s->writing_sopb.ops, s->writing_sopb.nops, - s->send_closed, s->id, &t->hpack_compressor, &t->outbuf); + s->send_closed != DONT_SEND_CLOSED, s->id, &t->hpack_compressor, &t->outbuf); s->writing_sopb.nops = 0; - if (s->send_closed) { + if (s->send_closed == SEND_CLOSED_WITH_RST_STREAM) { + gpr_slice_buffer_add(&t->outbuf, grpc_chttp2_rst_stream_create(s->id, GRPC_CHTTP2_NO_ERROR)); + } + if (s->send_closed != DONT_SEND_CLOSED) { stream_list_join(t, s, WRITTEN_CLOSED); } } @@ -999,9 +1013,10 @@ static void finish_write_common(transport *t, int success) { } while ((s = stream_list_remove_head(t, WRITTEN_CLOSED))) { s->write_state = WRITE_STATE_SENT_CLOSE; - if (1||!s->cancelled) { - maybe_finish_read(t, s); + if (!t->is_client) { + s->read_closed = 1; } + maybe_finish_read(t, s); } t->outbuf.count = 0; t->outbuf.length = 0; @@ -1214,12 +1229,14 @@ static void cancel_stream_inner(transport *t, stream *s, gpr_uint32 id, if (s) { /* clear out any unreported input & output: nobody cares anymore */ had_outgoing = s->outgoing_sopb && s->outgoing_sopb->nops != 0; - schedule_nuke_sopb(t, &s->parser.incoming_sopb); - if (s->outgoing_sopb) { - schedule_nuke_sopb(t, s->outgoing_sopb); - s->outgoing_sopb = NULL; - stream_list_remove(t, s, WRITABLE); - schedule_cb(t, s->send_done_closure, 0); + if (error_code != GRPC_CHTTP2_NO_ERROR) { + schedule_nuke_sopb(t, &s->parser.incoming_sopb); + if (s->outgoing_sopb) { + schedule_nuke_sopb(t, s->outgoing_sopb); + s->outgoing_sopb = NULL; + stream_list_remove(t, s, WRITABLE); + schedule_cb(t, s->send_done_closure, 0); + } } if (s->cancelled) { send_rst = 0; @@ -1228,31 +1245,34 @@ static void cancel_stream_inner(transport *t, stream *s, gpr_uint32 id, s->cancelled = 1; stream_list_join(t, s, CANCELLED); - gpr_ltoa(local_status, buffer); - add_incoming_metadata( - t, s, - grpc_mdelem_from_strings(t->metadata_context, "grpc-status", buffer)); - if (!optional_message) { - switch (local_status) { - case GRPC_STATUS_CANCELLED: - add_incoming_metadata( - t, s, grpc_mdelem_from_strings(t->metadata_context, - "grpc-message", "Cancelled")); - break; - default: - break; - } - } else { + if (error_code != GRPC_CHTTP2_NO_ERROR) { + /* synthesize a status if we don't believe we'll get one */ + gpr_ltoa(local_status, buffer); add_incoming_metadata( t, s, - grpc_mdelem_from_metadata_strings( - t->metadata_context, - grpc_mdstr_from_string(t->metadata_context, "grpc-message"), - grpc_mdstr_ref(optional_message))); + grpc_mdelem_from_strings(t->metadata_context, "grpc-status", buffer)); + if (!optional_message) { + switch (local_status) { + case GRPC_STATUS_CANCELLED: + add_incoming_metadata( + t, s, grpc_mdelem_from_strings(t->metadata_context, + "grpc-message", "Cancelled")); + break; + default: + break; + } + } else { + add_incoming_metadata( + t, s, + grpc_mdelem_from_metadata_strings( + t->metadata_context, + grpc_mdstr_from_string(t->metadata_context, "grpc-message"), + grpc_mdstr_ref(optional_message))); + } + add_metadata_batch(t, s); } - add_metadata_batch(t, s); - maybe_finish_read(t, s); } + maybe_finish_read(t, s); } if (!id) send_rst = 0; if (send_rst) { @@ -1527,6 +1547,19 @@ static int init_ping_parser(transport *t) { return ok; } +static int init_rst_stream_parser(transport *t) { + int ok = GRPC_CHTTP2_PARSE_OK == + grpc_chttp2_rst_stream_parser_begin_frame(&t->simple_parsers.rst_stream, + t->incoming_frame_size, + t->incoming_frame_flags); + if (!ok) { + drop_connection(t); + } + t->parser = grpc_chttp2_rst_stream_parser_parse; + t->parser_data = &t->simple_parsers.rst_stream; + return ok; +} + static int init_goaway_parser(transport *t) { int ok = GRPC_CHTTP2_PARSE_OK == @@ -1581,12 +1614,7 @@ static int init_frame_parser(transport *t) { gpr_log(GPR_ERROR, "Unexpected CONTINUATION frame"); return 0; case GRPC_CHTTP2_FRAME_RST_STREAM: - /* TODO(ctiller): actually parse the reason */ - cancel_stream_id( - t, t->incoming_stream_id, - grpc_chttp2_http2_error_to_grpc_status(GRPC_CHTTP2_CANCEL), - GRPC_CHTTP2_CANCEL, 0); - return init_skip_frame(t, 0); + return init_rst_stream_parser(t); case GRPC_CHTTP2_FRAME_SETTINGS: return init_settings_frame_parser(t); case GRPC_CHTTP2_FRAME_WINDOW_UPDATE: @@ -1650,6 +1678,12 @@ static int parse_frame_slice(transport *t, gpr_slice slice, int is_last) { if (st.goaway) { add_goaway(t, st.goaway_error, st.goaway_text); } + if (st.rst_stream) { + cancel_stream_id( + t, t->incoming_stream_id, + grpc_chttp2_http2_error_to_grpc_status(st.rst_stream_reason), + st.rst_stream_reason, 0); + } if (st.process_ping_reply) { for (i = 0; i < t->ping_count; i++) { if (0 == diff --git a/test/core/end2end/gen_build_json.py b/test/core/end2end/gen_build_json.py index 19c1a80896d..960ec51b5d9 100755 --- a/test/core/end2end/gen_build_json.py +++ b/test/core/end2end/gen_build_json.py @@ -82,6 +82,7 @@ END2END_TESTS = { 'request_response_with_payload_and_call_creds': TestOptions(flaky=False, secure=True), 'request_with_large_metadata': default_test_options, 'request_with_payload': default_test_options, + 'server_finishes_request': default_test_options, 'simple_delayed_request': default_test_options, 'simple_request': default_test_options, 'simple_request_with_high_initial_sequence_number': default_test_options, diff --git a/test/core/end2end/tests/server_finishes_request.c b/test/core/end2end/tests/server_finishes_request.c new file mode 100644 index 00000000000..c19871c581d --- /dev/null +++ b/test/core/end2end/tests/server_finishes_request.c @@ -0,0 +1,200 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "test/core/end2end/end2end_tests.h" + +#include +#include + +#include "src/core/support/string.h" +#include +#include +#include +#include +#include +#include +#include "test/core/end2end/cq_verifier.h" + +enum { TIMEOUT = 200000 }; + +static void *tag(gpr_intptr t) { return (void *)t; } + +static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, + const char *test_name, + grpc_channel_args *client_args, + grpc_channel_args *server_args) { + grpc_end2end_test_fixture f; + gpr_log(GPR_INFO, "%s/%s", test_name, config.name); + f = config.create_fixture(client_args, server_args); + config.init_client(&f, client_args); + config.init_server(&f, server_args); + return f; +} + +static gpr_timespec n_seconds_time(int n) { + return GRPC_TIMEOUT_SECONDS_TO_DEADLINE(n); +} + +static gpr_timespec five_seconds_time(void) { return n_seconds_time(5); } + +static void drain_cq(grpc_completion_queue *cq) { + grpc_event ev; + do { + ev = grpc_completion_queue_next(cq, five_seconds_time()); + } while (ev.type != GRPC_QUEUE_SHUTDOWN); +} + +static void shutdown_server(grpc_end2end_test_fixture *f) { + if (!f->server) return; + grpc_server_shutdown(f->server); + grpc_server_destroy(f->server); + f->server = NULL; +} + +static void shutdown_client(grpc_end2end_test_fixture *f) { + if (!f->client) return; + grpc_channel_destroy(f->client); + f->client = NULL; +} + +static void end_test(grpc_end2end_test_fixture *f) { + shutdown_server(f); + shutdown_client(f); + + grpc_completion_queue_shutdown(f->server_cq); + drain_cq(f->server_cq); + grpc_completion_queue_destroy(f->server_cq); + grpc_completion_queue_shutdown(f->client_cq); + drain_cq(f->client_cq); + grpc_completion_queue_destroy(f->client_cq); +} + +static void simple_request_body(grpc_end2end_test_fixture f) { + grpc_call *c; + grpc_call *s; + gpr_timespec deadline = five_seconds_time(); + cq_verifier *v_client = cq_verifier_create(f.client_cq); + cq_verifier *v_server = cq_verifier_create(f.server_cq); + grpc_op ops[6]; + grpc_op *op; + grpc_metadata_array initial_metadata_recv; + grpc_metadata_array trailing_metadata_recv; + grpc_metadata_array request_metadata_recv; + grpc_call_details call_details; + grpc_status_code status; + char *details = NULL; + size_t details_capacity = 0; + int was_cancelled = 2; + + c = grpc_channel_create_call(f.client, f.client_cq, "/foo", + "foo.test.google.fr:1234", deadline); + GPR_ASSERT(c); + + grpc_metadata_array_init(&initial_metadata_recv); + grpc_metadata_array_init(&trailing_metadata_recv); + grpc_metadata_array_init(&request_metadata_recv); + grpc_call_details_init(&call_details); + + op = ops; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->data.send_initial_metadata.count = 0; + op++; + op->op = GRPC_OP_RECV_INITIAL_METADATA; + op->data.recv_initial_metadata = &initial_metadata_recv; + op++; + op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; + op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; + op->data.recv_status_on_client.status = &status; + op->data.recv_status_on_client.status_details = &details; + op->data.recv_status_on_client.status_details_capacity = &details_capacity; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(c, ops, op - ops, tag(1))); + + GPR_ASSERT(GRPC_CALL_OK == + grpc_server_request_call(f.server, &s, &call_details, + &request_metadata_recv, f.server_cq, + f.server_cq, tag(101))); + cq_expect_completion(v_server, tag(101), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->data.send_initial_metadata.count = 0; + op++; + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = 0; + op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED; + op->data.send_status_from_server.status_details = "xyz"; + op++; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + cq_expect_completion(v_client, tag(1), 1); + cq_verify(v_client); + + GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED); + GPR_ASSERT(0 == strcmp(details, "xyz")); + GPR_ASSERT(0 == strcmp(call_details.method, "/foo")); + GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234")); + GPR_ASSERT(was_cancelled == 0); + + gpr_free(details); + grpc_metadata_array_destroy(&initial_metadata_recv); + grpc_metadata_array_destroy(&trailing_metadata_recv); + grpc_metadata_array_destroy(&request_metadata_recv); + grpc_call_details_destroy(&call_details); + + grpc_call_destroy(c); + grpc_call_destroy(s); + + cq_verifier_destroy(v_client); + cq_verifier_destroy(v_server); +} + +static void test_invoke_simple_request(grpc_end2end_test_config config) { + grpc_end2end_test_fixture f; + + f = begin_test(config, __FUNCTION__, NULL, NULL); + simple_request_body(f); + end_test(&f); + config.tear_down_data(&f); +} + +void grpc_end2end_tests(grpc_end2end_test_config config) { + test_invoke_simple_request(config); +} diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index e2454c4db40..30ddb2bee23 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -920,6 +920,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_fake_security_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -1172,6 +1181,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_fullstack_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -1399,6 +1417,14 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_fullstack_uds_posix_server_finishes_request_test", + "platforms": [ + "posix" + ] + }, { "flaky": false, "language": "c", @@ -1648,6 +1674,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_simple_ssl_fullstack_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -1900,6 +1935,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -2152,6 +2196,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -2404,6 +2457,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -2656,6 +2718,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_server_finishes_request_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -2899,6 +2970,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_fullstack_server_finishes_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -3118,6 +3198,14 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test", + "platforms": [ + "posix" + ] + }, { "flaky": false, "language": "c", @@ -3358,6 +3446,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_server_finishes_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -3601,6 +3698,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", @@ -3844,6 +3950,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 2a52e15e5f8..119a00f319f 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -54,10 +54,10 @@ all: buildtests $(OUT_DIR): mkdir $(OUT_DIR) -build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib +build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib buildtests: buildtests_c buildtests_cxx -buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe +buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_server_finishes_request_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_server_finishes_request_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_server_finishes_request_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_server_finishes_request_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_server_finishes_request_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe echo All tests built. buildtests_cxx: interop_client.exe interop_server.exe @@ -721,6 +721,13 @@ chttp2_fake_security_request_with_payload_test.exe: build_libs $(OUT_DIR) chttp2_fake_security_request_with_payload_test: chttp2_fake_security_request_with_payload_test.exe echo Running chttp2_fake_security_request_with_payload_test $(OUT_DIR)\chttp2_fake_security_request_with_payload_test.exe +chttp2_fake_security_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_fake_security_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_fake_security_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_fake_security_server_finishes_request_test: chttp2_fake_security_server_finishes_request_test.exe + echo Running chttp2_fake_security_server_finishes_request_test + $(OUT_DIR)\chttp2_fake_security_server_finishes_request_test.exe chttp2_fake_security_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_fake_security_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -917,6 +924,13 @@ chttp2_fullstack_request_with_payload_test.exe: build_libs $(OUT_DIR) chttp2_fullstack_request_with_payload_test: chttp2_fullstack_request_with_payload_test.exe echo Running chttp2_fullstack_request_with_payload_test $(OUT_DIR)\chttp2_fullstack_request_with_payload_test.exe +chttp2_fullstack_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_fullstack_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_fullstack_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_fullstack_server_finishes_request_test: chttp2_fullstack_server_finishes_request_test.exe + echo Running chttp2_fullstack_server_finishes_request_test + $(OUT_DIR)\chttp2_fullstack_server_finishes_request_test.exe chttp2_fullstack_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_fullstack_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -1113,6 +1127,13 @@ chttp2_simple_ssl_fullstack_request_with_payload_test.exe: build_libs $(OUT_DIR) chttp2_simple_ssl_fullstack_request_with_payload_test: chttp2_simple_ssl_fullstack_request_with_payload_test.exe echo Running chttp2_simple_ssl_fullstack_request_with_payload_test $(OUT_DIR)\chttp2_simple_ssl_fullstack_request_with_payload_test.exe +chttp2_simple_ssl_fullstack_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_simple_ssl_fullstack_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_simple_ssl_fullstack_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_simple_ssl_fullstack_server_finishes_request_test: chttp2_simple_ssl_fullstack_server_finishes_request_test.exe + echo Running chttp2_simple_ssl_fullstack_server_finishes_request_test + $(OUT_DIR)\chttp2_simple_ssl_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_simple_ssl_fullstack_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -1309,6 +1330,13 @@ chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe: build_lib chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test: chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe echo Running chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(OUT_DIR)\chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe +chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test: chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe + echo Running chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test + $(OUT_DIR)\chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -1505,6 +1533,13 @@ chttp2_socket_pair_request_with_payload_test.exe: build_libs $(OUT_DIR) chttp2_socket_pair_request_with_payload_test: chttp2_socket_pair_request_with_payload_test.exe echo Running chttp2_socket_pair_request_with_payload_test $(OUT_DIR)\chttp2_socket_pair_request_with_payload_test.exe +chttp2_socket_pair_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_server_finishes_request_test: chttp2_socket_pair_server_finishes_request_test.exe + echo Running chttp2_socket_pair_server_finishes_request_test + $(OUT_DIR)\chttp2_socket_pair_server_finishes_request_test.exe chttp2_socket_pair_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -1701,6 +1736,13 @@ chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe: build_libs chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test: chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe echo Running chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test: chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe + echo Running chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test + $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -1897,6 +1939,13 @@ chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe: build_libs $(O chttp2_socket_pair_with_grpc_trace_request_with_payload_test: chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe echo Running chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe +chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_server_finishes_request_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_certs.lib Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_server_finishes_request_test: chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_server_finishes_request_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2086,6 +2135,13 @@ chttp2_fullstack_request_with_payload_unsecure_test.exe: build_libs $(OUT_DIR) chttp2_fullstack_request_with_payload_unsecure_test: chttp2_fullstack_request_with_payload_unsecure_test.exe echo Running chttp2_fullstack_request_with_payload_unsecure_test $(OUT_DIR)\chttp2_fullstack_request_with_payload_unsecure_test.exe +chttp2_fullstack_server_finishes_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_fullstack_server_finishes_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_fullstack_server_finishes_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_test_server_finishes_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_fullstack_server_finishes_request_unsecure_test: chttp2_fullstack_server_finishes_request_unsecure_test.exe + echo Running chttp2_fullstack_server_finishes_request_unsecure_test + $(OUT_DIR)\chttp2_fullstack_server_finishes_request_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe: build_libs $(OUT_DIR) echo Building chttp2_fullstack_simple_delayed_request_unsecure_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2275,6 +2331,13 @@ chttp2_socket_pair_request_with_payload_unsecure_test.exe: build_libs $(OUT_DIR) chttp2_socket_pair_request_with_payload_unsecure_test: chttp2_socket_pair_request_with_payload_unsecure_test.exe echo Running chttp2_socket_pair_request_with_payload_unsecure_test $(OUT_DIR)\chttp2_socket_pair_request_with_payload_unsecure_test.exe +chttp2_socket_pair_server_finishes_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_server_finishes_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_server_finishes_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_test_server_finishes_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_server_finishes_request_unsecure_test: chttp2_socket_pair_server_finishes_request_unsecure_test.exe + echo Running chttp2_socket_pair_server_finishes_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_server_finishes_request_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_simple_delayed_request_unsecure_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2464,6 +2527,13 @@ chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe: bu chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test: chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe echo Running chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_test_server_finishes_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test: chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe + echo Running chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2653,6 +2723,13 @@ chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe: build chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test: chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe echo Running chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe +chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe: build_libs $(OUT_DIR) + echo Building chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe" Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_server_finishes_request.lib Debug\grpc_test_util_unsecure.lib Debug\grpc_unsecure.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dummy.obj +chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test: chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe + echo Running chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test + $(OUT_DIR)\chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe: build_libs $(OUT_DIR) echo Building chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\vsprojects\dummy.c @@ -2814,6 +2891,10 @@ Debug\end2end_test_request_with_payload.lib: $(OUT_DIR) echo Building end2end_test_request_with_payload $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\tests\request_with_payload.c $(LIBTOOL) /OUT:"Debug\end2end_test_request_with_payload.lib" $(OUT_DIR)\request_with_payload.obj +Debug\end2end_test_server_finishes_request.lib: $(OUT_DIR) + echo Building end2end_test_server_finishes_request + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\tests\server_finishes_request.c + $(LIBTOOL) /OUT:"Debug\end2end_test_server_finishes_request.lib" $(OUT_DIR)\server_finishes_request.obj Debug\end2end_test_simple_delayed_request.lib: $(OUT_DIR) echo Building end2end_test_simple_delayed_request $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\end2end\tests\simple_delayed_request.c From 3891bf11ff94f0f8afb05ebd49f1ccca2e3803e3 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 13:27:29 -0700 Subject: [PATCH 053/217] Fix test --- test/core/end2end/tests/max_message_length.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c index 99aeb9d0492..cee8306213c 100644 --- a/test/core/end2end/tests/max_message_length.c +++ b/test/core/end2end/tests/max_message_length.c @@ -178,8 +178,7 @@ static void test_max_message_length(grpc_end2end_test_config config) { cq_expect_completion(v_client, tag(1), 1); cq_verify(v_client); - GPR_ASSERT(status == GRPC_STATUS_CANCELLED); - GPR_ASSERT(0 == strcmp(details, "Cancelled")); + GPR_ASSERT(status != GRPC_STATUS_OK); GPR_ASSERT(0 == strcmp(call_details.method, "/foo")); GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234")); GPR_ASSERT(was_cancelled == 1); From 012d43b61ad145fe4795ea875a48c4726b16fcab Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 19 May 2015 14:13:21 -0700 Subject: [PATCH 054/217] Fixed client handling of failed batches --- src/node/src/client.js | 56 ++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/src/node/src/client.js b/src/node/src/client.js index 46d476b9f4f..efec05bbf3d 100644 --- a/src/node/src/client.js +++ b/src/node/src/client.js @@ -81,7 +81,8 @@ function _write(chunk, encoding, callback) { batch[grpc.opType.SEND_MESSAGE] = this.serialize(chunk); this.call.startBatch(batch, function(err, event) { if (err) { - throw err; + // Something has gone wrong. Stop writing by failing to call callback + return; } callback(); }); @@ -120,7 +121,9 @@ function _read(size) { */ function readCallback(err, event) { if (err) { - throw err; + // Something has gone wrong. Stop reading and wait for status + self.finished = true; + return; } if (self.finished) { self.push(null); @@ -237,10 +240,6 @@ function makeUnaryRequestFunction(method, serialize, deserialize) { client_batch[grpc.opType.RECV_MESSAGE] = true; client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; call.startBatch(client_batch, function(err, response) { - if (err) { - callback(err); - return; - } emitter.emit('status', response.status); if (response.status.code !== grpc.status.OK) { var error = new Error(response.status.details); @@ -248,6 +247,12 @@ function makeUnaryRequestFunction(method, serialize, deserialize) { error.metadata = response.status.metadata; callback(error); return; + } else { + if (err) { + // Got a batch error, but OK status. Something went wrong + callback(err); + return; + } } emitter.emit('metadata', response.metadata); callback(null, deserialize(response.read)); @@ -300,7 +305,8 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) { metadata_batch[grpc.opType.RECV_INITIAL_METADATA] = true; call.startBatch(metadata_batch, function(err, response) { if (err) { - callback(err); + // The call has stopped for some reason. A non-OK status will arrive + // in the other batch. return; } stream.emit('metadata', response.metadata); @@ -309,10 +315,6 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) { client_batch[grpc.opType.RECV_MESSAGE] = true; client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; call.startBatch(client_batch, function(err, response) { - if (err) { - callback(err); - return; - } stream.emit('status', response.status); if (response.status.code !== grpc.status.OK) { var error = new Error(response.status.details); @@ -320,6 +322,12 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) { error.metadata = response.status.metadata; callback(error); return; + } else { + if (err) { + // Got a batch error, but OK status. Something went wrong + callback(err); + return; + } } callback(null, deserialize(response.read)); }); @@ -373,16 +381,15 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) { start_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true; call.startBatch(start_batch, function(err, response) { if (err) { - throw err; + // The call has stopped for some reason. A non-OK status will arrive + // in the other batch. + return; } stream.emit('metadata', response.metadata); }); var status_batch = {}; status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; call.startBatch(status_batch, function(err, response) { - if (err) { - throw err; - } stream.emit('status', response.status); if (response.status.code !== grpc.status.OK) { var error = new Error(response.status.details); @@ -390,6 +397,12 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) { error.metadata = response.status.metadata; stream.emit('error', error); return; + } else { + if (err) { + // Got a batch error, but OK status. Something went wrong + stream.emit('error', err); + return; + } } }); }); @@ -438,16 +451,15 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) { start_batch[grpc.opType.RECV_INITIAL_METADATA] = true; call.startBatch(start_batch, function(err, response) { if (err) { - throw err; + // The call has stopped for some reason. A non-OK status will arrive + // in the other batch. + return; } stream.emit('metadata', response.metadata); }); var status_batch = {}; status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; call.startBatch(status_batch, function(err, response) { - if (err) { - throw err; - } stream.emit('status', response.status); if (response.status.code !== grpc.status.OK) { var error = new Error(response.status.details); @@ -455,6 +467,12 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) { error.metadata = response.status.metadata; stream.emit('error', error); return; + } else { + if (err) { + // Got a batch error, but OK status. Something went wrong + stream.emit('error', err); + return; + } } }); }); From d014f02421e6996f88187d263fc2b1e1932405d0 Mon Sep 17 00:00:00 2001 From: Yang Gao Date: Tue, 19 May 2015 15:46:44 -0700 Subject: [PATCH 055/217] Fix a potential leak --- src/core/iomgr/tcp_posix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/iomgr/tcp_posix.c b/src/core/iomgr/tcp_posix.c index f7dae5f86ce..cd6b2ecae6f 100644 --- a/src/core/iomgr/tcp_posix.c +++ b/src/core/iomgr/tcp_posix.c @@ -138,8 +138,10 @@ static void slice_state_remove_prefix(grpc_tcp_slice_state *state, native "trim the first N bytes" operation to splice */ /* TODO(klempner): This really shouldn't be modifying the current slice unless we own the slices array. */ - *current_slice = gpr_slice_split_tail(current_slice, prefix_bytes); + gpr_slice tail; + tail = gpr_slice_split_tail(current_slice, prefix_bytes); gpr_slice_unref(*current_slice); + *current_slice = tail; return; } else { gpr_slice_unref(*current_slice); From c259988357f3722b9d0ee7b55bcb818425d15ece Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 15:47:19 -0700 Subject: [PATCH 056/217] Fix comparison to not crash --- test/core/end2end/cq_verifier.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/core/end2end/cq_verifier.c b/test/core/end2end/cq_verifier.c index 66480254d2b..7822d001d10 100644 --- a/test/core/end2end/cq_verifier.c +++ b/test/core/end2end/cq_verifier.c @@ -127,11 +127,15 @@ static gpr_slice merge_slices(gpr_slice *slices, size_t nslices) { } static int byte_buffer_eq_slice(grpc_byte_buffer *bb, gpr_slice b) { - gpr_slice a = - merge_slices(bb->data.slice_buffer.slices, bb->data.slice_buffer.count); - int ok = GPR_SLICE_LENGTH(a) == GPR_SLICE_LENGTH(b) && - 0 == memcmp(GPR_SLICE_START_PTR(a), GPR_SLICE_START_PTR(b), - GPR_SLICE_LENGTH(a)); + gpr_slice a; + int ok; + + if (!bb) return 0; + + a = merge_slices(bb->data.slice_buffer.slices, bb->data.slice_buffer.count); + ok = GPR_SLICE_LENGTH(a) == GPR_SLICE_LENGTH(b) && + 0 == memcmp(GPR_SLICE_START_PTR(a), GPR_SLICE_START_PTR(b), + GPR_SLICE_LENGTH(a)); gpr_slice_unref(a); gpr_slice_unref(b); return ok; From a90a9c395d86b5f1e6b123ae25de14c7f0362040 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 18 May 2015 17:12:41 -0700 Subject: [PATCH 057/217] s/didReceiveValue/writeValue --- src/objective-c/GRPCClient/GRPCCall.m | 2 +- src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h | 5 ++--- src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m | 2 +- src/objective-c/ProtoRPC/ProtoRPC.m | 2 +- src/objective-c/RxLibrary/GRXBufferedPipe.h | 4 ++-- src/objective-c/RxLibrary/GRXBufferedPipe.m | 6 +++--- src/objective-c/RxLibrary/GRXImmediateWriter.m | 2 +- src/objective-c/RxLibrary/GRXWriteable.h | 5 ++--- src/objective-c/RxLibrary/GRXWriteable.m | 2 +- src/objective-c/RxLibrary/GRXWriter.m | 4 ++-- .../RxLibrary/transformations/GRXMappingWriter.m | 4 ++-- .../examples/Sample/SampleTests/RemoteProtoTests.m | 4 ++-- 12 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m index 0f458b40cde..b909c0944bd 100644 --- a/src/objective-c/GRPCClient/GRPCCall.m +++ b/src/objective-c/GRPCClient/GRPCCall.m @@ -231,7 +231,7 @@ handler:resumingHandler]] errorHandler:errorHandler]; } -- (void)didReceiveValue:(id)value { +- (void)writeValue:(id)value { // TODO(jcanizales): Throw/assert if value isn't NSData. // Pause the input and only resume it when the C layer notifies us that writes diff --git a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h index 24c2b96729d..6103d4829d5 100644 --- a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h +++ b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h @@ -57,9 +57,8 @@ - (instancetype)initWithWriteable:(id)writeable writer:(id)writer NS_DESIGNATED_INITIALIZER; -// Enqueues didReceiveValue: to be sent to the writeable in the main thread. -// The passed handler is invoked from the main thread after didReceiveValue: -// returns. +// Enqueues writeValue: to be sent to the writeable in the main thread. +// The passed handler is invoked from the main thread after writeValue: returns. - (void)enqueueMessage:(NSData *)message completionHandler:(void (^)())handler; // Enqueues didFinishWithError:nil to be sent to the writeable in the main diff --git a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m index ac444ef4063..b8f206ad234 100644 --- a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m +++ b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m @@ -69,7 +69,7 @@ // the race. id writeable = self.writeable; if (writeable) { - [writeable didReceiveValue:message]; + [writeable writeValue:message]; handler(); } }); diff --git a/src/objective-c/ProtoRPC/ProtoRPC.m b/src/objective-c/ProtoRPC/ProtoRPC.m index c5051c0123d..e4bc48a69f6 100644 --- a/src/objective-c/ProtoRPC/ProtoRPC.m +++ b/src/objective-c/ProtoRPC/ProtoRPC.m @@ -71,7 +71,7 @@ if ((self = [super initWithHost:host method:method requestsWriter:bytesWriter])) { // A writeable that parses the proto messages received. _responseWriteable = [[GRXWriteable alloc] initWithValueHandler:^(NSData *value) { - [responsesWriteable didReceiveValue:[responseClass parseFromData:value]]; + [responsesWriteable writeValue:[responseClass parseFromData:value]]; } completionHandler:^(NSError *errorOrNil) { [responsesWriteable didFinishWithError:errorOrNil]; }]; diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.h b/src/objective-c/RxLibrary/GRXBufferedPipe.h index 02dc6b5fe83..86d12853b0e 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.h +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.h @@ -38,8 +38,8 @@ // A buffered pipe is a Writeable that also acts as a Writer (to whichever other writeable is passed // to -startWithWriteable:). -// Once it is started, whatever values are written into it (via -didReceiveValue:) will be -// propagated immediately, unless flow control prevents it. +// Once it is started, whatever values are written into it (via -writeValue:) will be propagated +// immediately, unless flow control prevents it. // If it is throttled and keeps receiving values, as well as if it receives values before being // started, it will buffer them and propagate them in order as soon as its state becomes // GRXWriterStateStarted. diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m index e1295cef8ae..0230f14c36f 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.m +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m @@ -62,7 +62,7 @@ - (void)writeBufferUntilPausedOrStopped { while (_state == GRXWriterStateStarted && _queue.count > 0) { - [_writeable didReceiveValue:[self popValue]]; + [_writeable writeValue:[self popValue]]; } if (_inputIsFinished && _queue.count == 0) { // Our writer finished normally while we were paused or not-started-yet. @@ -77,10 +77,10 @@ return _state == GRXWriterStateStarted && _queue.count == 0; } -- (void)didReceiveValue:(id)value { +- (void)writeValue:(id)value { if (self.shouldFastForward) { // Skip the queue. - [_writeable didReceiveValue:value]; + [_writeable writeValue:value]; } else { // Even if we're paused and with enqueued values, we can't excert back-pressure to our writer. // So just buffer the new value. diff --git a/src/objective-c/RxLibrary/GRXImmediateWriter.m b/src/objective-c/RxLibrary/GRXImmediateWriter.m index 7468af557f0..7108a565846 100644 --- a/src/objective-c/RxLibrary/GRXImmediateWriter.m +++ b/src/objective-c/RxLibrary/GRXImmediateWriter.m @@ -109,7 +109,7 @@ - (void)writeUntilPausedOrStopped { id value; while (value = [_enumerator nextObject]) { - [_writeable didReceiveValue:value]; + [_writeable writeValue:value]; // If the writeable has a reference to us, it might change our state to paused or finished. if (_state == GRXWriterStatePaused || _state == GRXWriterStateFinished) { return; diff --git a/src/objective-c/RxLibrary/GRXWriteable.h b/src/objective-c/RxLibrary/GRXWriteable.h index 6f6ea142e01..d1bcb51799f 100644 --- a/src/objective-c/RxLibrary/GRXWriteable.h +++ b/src/objective-c/RxLibrary/GRXWriteable.h @@ -38,11 +38,10 @@ @protocol GRXWriteable // Push the next value of the sequence to the receiving object. -// TODO(jcanizales): Name it enumerator:(id) didProduceValue:(id)? -- (void)didReceiveValue:(id)value; +- (void)writeValue:(id)value; // Signal that the sequence is completed, or that an error ocurred. After this -// message is sent to the instance, neither it nor didReceiveValue: may be +// message is sent to the instance, neither it nor writeValue: may be // called again. // TODO(jcanizales): enumerator:(id) didFinishWithError:(NSError*)? - (void)didFinishWithError:(NSError *)errorOrNil; diff --git a/src/objective-c/RxLibrary/GRXWriteable.m b/src/objective-c/RxLibrary/GRXWriteable.m index 7000a078d1e..d3ee7fa1707 100644 --- a/src/objective-c/RxLibrary/GRXWriteable.m +++ b/src/objective-c/RxLibrary/GRXWriteable.m @@ -76,7 +76,7 @@ return self; } -- (void)didReceiveValue:(id)value { +- (void)writeValue:(id)value { if (_valueHandler) { _valueHandler(value); } diff --git a/src/objective-c/RxLibrary/GRXWriter.m b/src/objective-c/RxLibrary/GRXWriter.m index b48a44f3a72..140284b9387 100644 --- a/src/objective-c/RxLibrary/GRXWriter.m +++ b/src/objective-c/RxLibrary/GRXWriter.m @@ -75,8 +75,8 @@ #pragma mark GRXWriteable implementation -- (void)didReceiveValue:(id)value { - [_writeable didReceiveValue:value]; +- (void)writeValue:(id)value { + [_writeable writeValue:value]; } - (void)didFinishWithError:(NSError *)errorOrNil { diff --git a/src/objective-c/RxLibrary/transformations/GRXMappingWriter.m b/src/objective-c/RxLibrary/transformations/GRXMappingWriter.m index 8a41c819a68..2cdfea1b675 100644 --- a/src/objective-c/RxLibrary/transformations/GRXMappingWriter.m +++ b/src/objective-c/RxLibrary/transformations/GRXMappingWriter.m @@ -57,7 +57,7 @@ static id (^kIdentity)(id value) = ^id(id value) { } // Override -- (void)didReceiveValue:(id)value { - [super didReceiveValue:_map(value)]; +- (void)writeValue:(id)value { + [super writeValue:_map(value)]; } @end diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index 7cebc0c2a74..51965a1dd70 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -208,7 +208,7 @@ id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index] requestedResponseSize:responses[index]]; - [requestsBuffer didReceiveValue:request]; + [requestsBuffer writeValue:request]; [_service fullDuplexCallWithRequestsWriter:requestsBuffer handler:^(BOOL done, @@ -225,7 +225,7 @@ if (index < 4) { id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index] requestedResponseSize:responses[index]]; - [requestsBuffer didReceiveValue:request]; + [requestsBuffer writeValue:request]; } else { [requestsBuffer didFinishWithError:nil]; } From b2c300c4be537c54f3adcaf3ca190b9bce002fab Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Mon, 18 May 2015 17:19:16 -0700 Subject: [PATCH 058/217] s/didFinishWithError/writesFinishedWithError --- src/objective-c/GRPCClient/GRPCCall.m | 4 ++-- .../GRPCClient/private/GRPCDelegateWrapper.h | 12 ++++++------ .../GRPCClient/private/GRPCDelegateWrapper.m | 6 +++--- src/objective-c/ProtoRPC/ProtoRPC.m | 2 +- src/objective-c/RxLibrary/GRXBufferedPipe.h | 2 +- src/objective-c/RxLibrary/GRXBufferedPipe.m | 4 ++-- src/objective-c/RxLibrary/GRXImmediateWriter.m | 2 +- src/objective-c/RxLibrary/GRXWriteable.h | 3 +-- src/objective-c/RxLibrary/GRXWriteable.m | 2 +- src/objective-c/RxLibrary/GRXWriter.h | 6 +++--- src/objective-c/RxLibrary/GRXWriter.m | 4 ++-- .../examples/Sample/SampleTests/RemoteProtoTests.m | 2 +- 12 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m index b909c0944bd..a4a0ddb3246 100644 --- a/src/objective-c/GRPCClient/GRPCCall.m +++ b/src/objective-c/GRPCClient/GRPCCall.m @@ -255,7 +255,7 @@ errorHandler:errorHandler]; } -- (void)didFinishWithError:(NSError *)errorOrNil { +- (void)writesFinishedWithError:(NSError *)errorOrNil { if (errorOrNil) { [self cancel]; } else { @@ -306,7 +306,7 @@ - (void)startWithWriteable:(id)writeable { // The following produces a retain cycle self:_responseWriteable:self, which is only - // broken when didFinishWithError: is sent to the wrapped writeable. + // broken when writesFinishedWithError: is sent to the wrapped writeable. // Care is taken not to retain self strongly in any of the blocks used in // the implementation of GRPCCall, so that the life of the instance is // determined by this retain cycle. diff --git a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h index 6103d4829d5..1ef245fe37b 100644 --- a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h +++ b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.h @@ -38,11 +38,11 @@ // This is a thread-safe wrapper over a GRXWriteable instance. It lets one // enqueue calls to a GRXWriteable instance for the main thread, guaranteeing -// that didFinishWithError: is the last message sent to it (no matter what +// that writesFinishedWithError: is the last message sent to it (no matter what // messages are sent to the wrapper, in what order, nor from which thread). It // also guarantees that, if cancelWithError: is called from the main thread // (e.g. by the app cancelling the writes), no further messages are sent to the -// writeable except didFinishWithError:. +// writeable except writesFinishedWithError:. // // TODO(jcanizales): Let the user specify another queue for the writeable // callbacks. @@ -51,7 +51,7 @@ // The GRXWriteable passed is the wrapped writeable. // Both the GRXWriter instance and the GRXWriteable instance are retained until -// didFinishWithError: is sent to the writeable, and released after that. +// writesFinishedWithError: is sent to the writeable, and released after that. // This is used to create a retain cycle that keeps both objects alive until the // writing is explicitly finished. - (instancetype)initWithWriteable:(id)writeable writer:(id)writer @@ -61,12 +61,12 @@ // The passed handler is invoked from the main thread after writeValue: returns. - (void)enqueueMessage:(NSData *)message completionHandler:(void (^)())handler; -// Enqueues didFinishWithError:nil to be sent to the writeable in the main +// Enqueues writesFinishedWithError:nil to be sent to the writeable in the main // thread. After that message is sent to the writeable, all other methods of // this object are effectively noops. - (void)enqueueSuccessfulCompletion; -// If the writeable has not yet received a didFinishWithError: message, this +// If the writeable has not yet received a writesFinishedWithError: message, this // will enqueue one to be sent to it in the main thread, and cancel all other // pending messages to the writeable enqueued by this object (both past and // future). @@ -74,7 +74,7 @@ - (void)cancelWithError:(NSError *)error; // Cancels all pending messages to the writeable enqueued by this object (both -// past and future). Because the writeable won't receive didFinishWithError:, +// past and future). Because the writeable won't receive writesFinishedWithError:, // this also releases the writeable and the writer. - (void)cancelSilently; @end diff --git a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m index b8f206ad234..7d5ecb56d9a 100644 --- a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m +++ b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m @@ -43,7 +43,7 @@ @implementation GRPCDelegateWrapper { dispatch_queue_t _writeableQueue; - // This ensures that didFinishWithError: is only sent once to the writeable. + // This ensures that writesFinishedWithError: is only sent once to the writeable. dispatch_once_t _alreadyFinished; } @@ -80,7 +80,7 @@ dispatch_once(&_alreadyFinished, ^{ // Cancellation is now impossible. None of the other three blocks can run // concurrently with this one. - [self.writeable didFinishWithError:nil]; + [self.writeable writesFinishedWithError:nil]; // Break the retain cycle with writer, and skip any possible message to the // wrapped writeable enqueued after this one. self.writeable = nil; @@ -100,7 +100,7 @@ self.writeable = nil; dispatch_async(_writeableQueue, ^{ - [writeable didFinishWithError:error]; + [writeable writesFinishedWithError:error]; // Break the retain cycle with writer. self.writer = nil; }); diff --git a/src/objective-c/ProtoRPC/ProtoRPC.m b/src/objective-c/ProtoRPC/ProtoRPC.m index e4bc48a69f6..96608f28989 100644 --- a/src/objective-c/ProtoRPC/ProtoRPC.m +++ b/src/objective-c/ProtoRPC/ProtoRPC.m @@ -73,7 +73,7 @@ _responseWriteable = [[GRXWriteable alloc] initWithValueHandler:^(NSData *value) { [responsesWriteable writeValue:[responseClass parseFromData:value]]; } completionHandler:^(NSError *errorOrNil) { - [responsesWriteable didFinishWithError:errorOrNil]; + [responsesWriteable writesFinishedWithError:errorOrNil]; }]; } return self; diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.h b/src/objective-c/RxLibrary/GRXBufferedPipe.h index 86d12853b0e..68a1695a4b1 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.h +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.h @@ -43,7 +43,7 @@ // If it is throttled and keeps receiving values, as well as if it receives values before being // started, it will buffer them and propagate them in order as soon as its state becomes // GRXWriterStateStarted. -// If it receives an error (via -didFinishWithError:), it will drop any buffered values and +// If it receives an error (via -writesFinishedWithError:), it will drop any buffered values and // propagate the error immediately. @interface GRXBufferedPipe : NSObject diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m index 0230f14c36f..e14e15df705 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.m +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m @@ -88,7 +88,7 @@ } } -- (void)didFinishWithError:(NSError *)errorOrNil { +- (void)writesFinishedWithError:(NSError *)errorOrNil { _inputIsFinished = YES; _errorOrNil = errorOrNil; if (errorOrNil || self.shouldFastForward) { @@ -136,7 +136,7 @@ - (void)finishWithError:(NSError *)errorOrNil { id writeable = _writeable; self.state = GRXWriterStateFinished; - [writeable didFinishWithError:errorOrNil]; + [writeable writesFinishedWithError:errorOrNil]; } @end diff --git a/src/objective-c/RxLibrary/GRXImmediateWriter.m b/src/objective-c/RxLibrary/GRXImmediateWriter.m index 7108a565846..0b4979872e2 100644 --- a/src/objective-c/RxLibrary/GRXImmediateWriter.m +++ b/src/objective-c/RxLibrary/GRXImmediateWriter.m @@ -130,7 +130,7 @@ _errorOrNil = nil; id writeable = _writeable; _writeable = nil; - [writeable didFinishWithError:errorOrNil]; + [writeable writesFinishedWithError:errorOrNil]; } - (void)setState:(GRXWriterState)newState { diff --git a/src/objective-c/RxLibrary/GRXWriteable.h b/src/objective-c/RxLibrary/GRXWriteable.h index d1bcb51799f..216de30735b 100644 --- a/src/objective-c/RxLibrary/GRXWriteable.h +++ b/src/objective-c/RxLibrary/GRXWriteable.h @@ -43,8 +43,7 @@ // Signal that the sequence is completed, or that an error ocurred. After this // message is sent to the instance, neither it nor writeValue: may be // called again. -// TODO(jcanizales): enumerator:(id) didFinishWithError:(NSError*)? -- (void)didFinishWithError:(NSError *)errorOrNil; +- (void)writesFinishedWithError:(NSError *)errorOrNil; @end typedef void (^GRXValueHandler)(id value); diff --git a/src/objective-c/RxLibrary/GRXWriteable.m b/src/objective-c/RxLibrary/GRXWriteable.m index d3ee7fa1707..63f7c3e7f32 100644 --- a/src/objective-c/RxLibrary/GRXWriteable.m +++ b/src/objective-c/RxLibrary/GRXWriteable.m @@ -82,7 +82,7 @@ } } -- (void)didFinishWithError:(NSError *)errorOrNil { +- (void)writesFinishedWithError:(NSError *)errorOrNil { if (_completionHandler) { _completionHandler(errorOrNil); } diff --git a/src/objective-c/RxLibrary/GRXWriter.h b/src/objective-c/RxLibrary/GRXWriter.h index 68c294f0073..dcf44e31433 100644 --- a/src/objective-c/RxLibrary/GRXWriter.h +++ b/src/objective-c/RxLibrary/GRXWriter.h @@ -50,7 +50,7 @@ typedef NS_ENUM(NSInteger, GRXWriterState) { // The writer is temporarily paused, and won't send any more values to the // writeable unless its state is set back to Started. The writer might still // transition to the Finished state at any moment, and is allowed to send - // didFinishWithError: to its writeable. + // writesFinishedWithError: to its writeable. // // Not all implementations of writer have to support pausing, and thus // trying to set an writer's state to this value might have no effect. @@ -59,7 +59,7 @@ typedef NS_ENUM(NSInteger, GRXWriterState) { // The writer has released its writeable and won't interact with it anymore. // // One seldomly wants to set an writer's state to this value, as its - // writeable isn't notified with a didFinishWithError: message. Instead, sending + // writeable isn't notified with a writesFinishedWithError: message. Instead, sending // finishWithError: to the writer will make it notify the writeable and then // transition to this state. GRXWriterStateFinished @@ -105,7 +105,7 @@ typedef NS_ENUM(NSInteger, GRXWriterState) { // This method might only be called on writers in the NotStarted state. - (void)startWithWriteable:(id)writeable; -// Send didFinishWithError:errorOrNil immediately to the writeable, and don't send +// Send writesFinishedWithError:errorOrNil immediately to the writeable, and don't send // any more messages to it. // // This method might only be called on writers in the Started or Paused diff --git a/src/objective-c/RxLibrary/GRXWriter.m b/src/objective-c/RxLibrary/GRXWriter.m index 140284b9387..cc143835605 100644 --- a/src/objective-c/RxLibrary/GRXWriter.m +++ b/src/objective-c/RxLibrary/GRXWriter.m @@ -62,7 +62,7 @@ - (void)finishOutputWithError:(NSError *)errorOrNil { id writeable = _writeable; _writeable = nil; - [writeable didFinishWithError:errorOrNil]; + [writeable writesFinishedWithError:errorOrNil]; } // This is used to stop the input writer. It nillifies our reference to it @@ -79,7 +79,7 @@ [_writeable writeValue:value]; } -- (void)didFinishWithError:(NSError *)errorOrNil { +- (void)writesFinishedWithError:(NSError *)errorOrNil { _writer = nil; [self finishOutputWithError:errorOrNil]; } diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index 51965a1dd70..7e063fddb4e 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -227,7 +227,7 @@ requestedResponseSize:responses[index]]; [requestsBuffer writeValue:request]; } else { - [requestsBuffer didFinishWithError:nil]; + [requestsBuffer writesFinishedWithError:nil]; } } From 4541f335697f6b266cb4c88b5d390b5a2ef9a1b5 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 16:26:33 -0700 Subject: [PATCH 059/217] Fix tests: stage server sends so that we dont inadvertently abbreviate streams --- .../core/end2end/tests/invoke_large_request.c | 23 ++++++++++++------- ...esponse_with_binary_metadata_and_payload.c | 22 +++++++++++------- ...quest_response_with_metadata_and_payload.c | 22 +++++++++++------- .../tests/request_response_with_payload.c | 22 +++++++++++------- ...est_response_with_payload_and_call_creds.c | 22 +++++++++++------- ...ponse_with_trailing_metadata_and_payload.c | 22 +++++++++++------- .../tests/request_with_large_metadata.c | 20 ++++++++++------ .../core/end2end/tests/request_with_payload.c | 20 ++++++++++------ 8 files changed, 111 insertions(+), 62 deletions(-) diff --git a/test/core/end2end/tests/invoke_large_request.c b/test/core/end2end/tests/invoke_large_request.c index f369e7805e5..a5d8faad3af 100644 --- a/test/core/end2end/tests/invoke_large_request.c +++ b/test/core/end2end/tests/invoke_large_request.c @@ -171,23 +171,30 @@ static void test_invoke_large_request(grpc_end2end_test_config config) { op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; + op = ops; op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; op->data.send_status_from_server.trailing_metadata_count = 0; op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c index 709dc47b722..868b5f078b0 100644 --- a/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c +++ b/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c @@ -188,6 +188,18 @@ static void test_request_response_with_metadata_and_payload( op->data.send_initial_metadata.count = 2; op->data.send_initial_metadata.metadata = meta_s; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; @@ -196,15 +208,9 @@ static void test_request_response_with_metadata_and_payload( op->data.send_status_from_server.status = GRPC_STATUS_OK; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_response_with_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_metadata_and_payload.c index bc32a503dd4..9c5d2902199 100644 --- a/test/core/end2end/tests/request_response_with_metadata_and_payload.c +++ b/test/core/end2end/tests/request_response_with_metadata_and_payload.c @@ -174,6 +174,18 @@ static void test_request_response_with_metadata_and_payload( op->data.send_initial_metadata.count = 2; op->data.send_initial_metadata.metadata = meta_s; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; @@ -182,15 +194,9 @@ static void test_request_response_with_metadata_and_payload( op->data.send_status_from_server.status = GRPC_STATUS_OK; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_response_with_payload.c b/test/core/end2end/tests/request_response_with_payload.c index be0cca696b2..7db202754e7 100644 --- a/test/core/end2end/tests/request_response_with_payload.c +++ b/test/core/end2end/tests/request_response_with_payload.c @@ -165,6 +165,18 @@ static void request_response_with_payload(grpc_end2end_test_fixture f) { op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; @@ -173,15 +185,9 @@ static void request_response_with_payload(grpc_end2end_test_fixture f) { op->data.send_status_from_server.status = GRPC_STATUS_OK; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c index 01554bed8c4..0ebea438c69 100644 --- a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c +++ b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c @@ -224,6 +224,18 @@ static void request_response_with_payload_and_call_creds( op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; @@ -232,15 +244,9 @@ static void request_response_with_payload_and_call_creds( op->data.send_status_from_server.status = GRPC_STATUS_OK; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c index 12f289cfddc..2f7b53ccf33 100644 --- a/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c +++ b/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c @@ -174,6 +174,18 @@ static void test_request_response_with_metadata_and_payload( op->data.send_initial_metadata.count = 2; op->data.send_initial_metadata.metadata = meta_s; op++; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message = &request_payload_recv; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op++; op->op = GRPC_OP_SEND_MESSAGE; op->data.send_message = response_payload; op++; @@ -183,15 +195,9 @@ static void test_request_response_with_metadata_and_payload( op->data.send_status_from_server.status = GRPC_STATUS_OK; op->data.send_status_from_server.status_details = "xyz"; op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = &request_payload_recv; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_with_large_metadata.c b/test/core/end2end/tests/request_with_large_metadata.c index 08a16213a11..81a15725012 100644 --- a/test/core/end2end/tests/request_with_large_metadata.c +++ b/test/core/end2end/tests/request_with_large_metadata.c @@ -169,20 +169,26 @@ static void test_request_with_large_metadata(grpc_end2end_test_config config) { op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op++; - op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; - op->data.send_status_from_server.trailing_metadata_count = 0; - op->data.send_status_from_server.status = GRPC_STATUS_OK; - op->data.send_status_from_server.status_details = "xyz"; - op++; op->op = GRPC_OP_RECV_MESSAGE; op->data.recv_message = &request_payload_recv; op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; op->data.recv_close_on_server.cancelled = &was_cancelled; op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = 0; + op->data.send_status_from_server.status = GRPC_STATUS_OK; + op->data.send_status_from_server.status_details = "xyz"; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); diff --git a/test/core/end2end/tests/request_with_payload.c b/test/core/end2end/tests/request_with_payload.c index bba50b31136..0d527b4de5c 100644 --- a/test/core/end2end/tests/request_with_payload.c +++ b/test/core/end2end/tests/request_with_payload.c @@ -160,20 +160,26 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) { op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op++; - op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; - op->data.send_status_from_server.trailing_metadata_count = 0; - op->data.send_status_from_server.status = GRPC_STATUS_OK; - op->data.send_status_from_server.status_details = "xyz"; - op++; op->op = GRPC_OP_RECV_MESSAGE; op->data.recv_message = &request_payload_recv; op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + + cq_expect_completion(v_server, tag(102), 1); + cq_verify(v_server); + + op = ops; op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; op->data.recv_close_on_server.cancelled = &was_cancelled; op++; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(102))); + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = 0; + op->data.send_status_from_server.status = GRPC_STATUS_OK; + op->data.send_status_from_server.status_details = "xyz"; + op++; + GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(s, ops, op - ops, tag(103))); - cq_expect_completion(v_server, tag(102), 1); + cq_expect_completion(v_server, tag(103), 1); cq_verify(v_server); cq_expect_completion(v_client, tag(1), 1); From c5e639f43e990038869cc3332e0b9060a35a12ad Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Tue, 19 May 2015 17:16:43 -0700 Subject: [PATCH 060/217] Removes spurious change to Test.pb.m That file is already deleted on master --- src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m | 1 - 1 file changed, 1 deletion(-) diff --git a/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m b/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m index 5c2b98890b5..31a3ba3a611 100644 --- a/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m +++ b/src/objective-c/examples/Sample/RemoteTestClient/Test.pb.m @@ -44,7 +44,6 @@ static NSString *const kServiceName = @"TestService"; return [self initWithHost:host]; } - #pragma mark EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty) // One empty request followed by one empty response. From 1ab1ab995e7ac1ed9b9cc2f9fd11bdad5b8ba93a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 19 May 2015 17:17:03 -0700 Subject: [PATCH 061/217] change default instance used as windows interop server --- tools/gce_setup/grpc_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index 0d50d2d451c..123d0615b41 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -873,7 +873,7 @@ grpc_launch_servers() { # Launch servers on windows. grpc_launch_windows_servers() { - local host='jtattermusch-interop-windows2' + local host='grpc-windows-interop1' local killcmd="ps -e | grep Grpc.IntegrationTesting | awk '{print \\\$1}' | xargs kill -9" echo "killing all servers and clients on $host with command $killcmd" gcloud compute $project_opt ssh $zone_opt stoked-keyword-656@grpc-windows-proxy --command "ssh $host \"$killcmd\"" From 6ba29ba3fbfd2870ce57413f560f5470dfad2a7c Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Tue, 19 May 2015 18:29:35 -0700 Subject: [PATCH 062/217] Added the client and server configurations to the bench results proto. The added configurations also include the host of both parties. This is useful for reporting. --- test/cpp/qps/driver.cc | 11 +++++++++++ test/cpp/qps/driver.h | 2 ++ test/cpp/qps/qpstest.proto | 2 ++ 3 files changed, 15 insertions(+) diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 9f7d3b56a44..83f70e612d7 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -89,6 +89,11 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, return &contexts.back(); }; + // To be added to the result, containing the final configuration used for + // client and config (incluiding host, etc.) + ClientConfig result_client_config; + ServerConfig result_server_config; + // Get client, server lists auto workers = get_hosts("QPS_WORKERS"); ClientConfig client_config = initial_client_config; @@ -127,6 +132,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, sd.stub = std::move(Worker::NewStub( CreateChannel(workers[i], InsecureCredentials(), ChannelArguments()))); ServerArgs args; + result_server_config = server_config; + result_server_config.set_host(workers[i]); *args.mutable_setup() = server_config; sd.stream = std::move(sd.stub->RunServer(alloc_context())); GPR_ASSERT(sd.stream->Write(args)); @@ -156,6 +163,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, cd.stub = std::move(Worker::NewStub(CreateChannel( workers[i + num_servers], InsecureCredentials(), ChannelArguments()))); ClientArgs args; + result_client_config = client_config; + result_client_config.set_host(workers[i + num_servers]); *args.mutable_setup() = client_config; cd.stream = std::move(cd.stub->RunTest(alloc_context())); GPR_ASSERT(cd.stream->Write(args)); @@ -197,6 +206,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, // Finish a run ScenarioResult result; + result.client_config = result_client_config; + result.server_config = result_server_config; gpr_log(GPR_INFO, "Finishing"); for (auto server = servers.begin(); server != servers.end(); server++) { GPR_ASSERT(server->stream->Write(server_mark)); diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h index eb7119a89dd..4c7d52f1ea7 100644 --- a/test/cpp/qps/driver.h +++ b/test/cpp/qps/driver.h @@ -49,6 +49,8 @@ struct ScenarioResult { Histogram latencies; std::vector client_resources; std::vector server_resources; + ClientConfig client_config; + ServerConfig server_config; }; ScenarioResult RunScenario(const grpc::testing::ClientConfig& client_config, diff --git a/test/cpp/qps/qpstest.proto b/test/cpp/qps/qpstest.proto index 1553ef5f07e..122a7df1ac9 100644 --- a/test/cpp/qps/qpstest.proto +++ b/test/cpp/qps/qpstest.proto @@ -102,6 +102,7 @@ message ClientConfig { // only for async client: optional int32 async_client_threads = 7; optional RpcType rpc_type = 8 [default=UNARY]; + optional string host = 9; } // Request current stats @@ -129,6 +130,7 @@ message ServerConfig { required ServerType server_type = 1; optional int32 threads = 2 [default=1]; optional bool enable_ssl = 3 [default=false]; + optional string host = 4; } message ServerArgs { From d0ffe1431728f59556dd535df8edf0f3003649ae Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 21:51:13 -0700 Subject: [PATCH 063/217] Include pid in failures --- tools/run_tests/jobset.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index 28b7d303718..a58071ee355 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -209,8 +209,9 @@ class Job(object): self._state = _FAILURE self._tempfile.seek(0) stdout = self._tempfile.read() - message('FAILED', '%s [ret=%d]' % ( - self._spec.shortname, self._process.returncode), stdout, do_newline=True) + message('FAILED', '%s [ret=%d, pid=%d]' % ( + self._spec.shortname, self._process.returncode, self._process.pid), + stdout, do_newline=True) else: self._state = _SUCCESS message('PASSED', '%s [time=%.1fsec]' % (self._spec.shortname, elapsed), From d17403c6d235a5a3a6dfddd8f3c741871b70256a Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 19 May 2015 21:54:40 -0700 Subject: [PATCH 064/217] Correctly handle reading the final message and then sending status --- src/node/test/end_to_end_test.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/node/test/end_to_end_test.js b/src/node/test/end_to_end_test.js index 60e9861bc86..667852f3826 100644 --- a/src/node/test/end_to_end_test.js +++ b/src/node/test/end_to_end_test.js @@ -286,20 +286,24 @@ describe('end-to-end', function() { assert.ifError(err); assert(response['send metadata']); assert.strictEqual(response.read.toString(), requests[0]); - var end_batch = {}; - end_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true; - end_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = { - 'metadata': {}, - 'code': grpc.status.OK, - 'details': status_text - }; - end_batch[grpc.opType.RECV_MESSAGE] = true; - server_call.startBatch(end_batch, function(err, response) { + var snd_batch = {}; + snd_batch[grpc.opType.RECV_MESSAGE] = true; + server_call.startBatch(snd_batch, function(err, response) { assert.ifError(err); - assert(response['send status']); - assert(!response.cancelled); assert.strictEqual(response.read.toString(), requests[1]); - done(); + var end_batch = {}; + end_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true; + end_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = { + 'metadata': {}, + 'code': grpc.status.OK, + 'details': status_text + }; + server_call.startBatch(end_batch, function(err, response) { + assert.ifError(err); + assert(response['send status']); + assert(!response.cancelled); + done(); + }); }); }); }); From c5c65aae2ed3db08811efa477f7467aa1ed71936 Mon Sep 17 00:00:00 2001 From: Jorge Canizales Date: Tue, 19 May 2015 22:40:02 -0700 Subject: [PATCH 065/217] Add instructions to generate code and integrate it --- src/objective-c/README.md | 48 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/objective-c/README.md b/src/objective-c/README.md index 05e9f2b4dc9..cdba3777ddb 100644 --- a/src/objective-c/README.md +++ b/src/objective-c/README.md @@ -1,3 +1,47 @@ -gRPC implementation for Objective-C on iOS +# gRPC for Objective-C -This is a work in progress. +## How to generate a client library from a Protocol Buffers definition + +First install v3 of the Protocol Buffers compiler (_protoc_), by cloning [its Git repository](https://github.com/google/protobuf) and following these [installation instructions](https://github.com/google/protobuf#c-installation---unix) (the ones titled C++; don't miss the note for Mac users). + +Then clone this repository and execute the following commands from the root directory where it was cloned. + +Compile the gRPC plugins for _protoc_: +```sh +make plugins +``` + +Create a symbolic link to the compiled plugin binary somewhere in your `$PATH`: +```sh +ln -s `pwd`/bins/opt/grpc_objective_c_plugin /usr/local/bin/protoc-gen-objcgrpc +``` +(Notice that the name of the created link must begin with "protoc-gen-" for _protoc_ to recognize it as a plugin). + +If you don't want to create the symbolic link, you can alternatively copy the binary (with the appropriate name). Or you might prefer instead to specify the plugin's path as a flag when invoking _protoc_, in which case no system modification nor renaming is necessary. + +Finally, run _protoc_ with the following flags to generate the client library for your `.proto` files: + +```sh +protoc --objc_out=. --objcrpc_out=. *.proto +``` + +This will generate a pair of `.pbobjc.h`/`.pbobjc.m` files for each `.proto` file, with the messages and enums defined in them. And a pair of `.pbrpc.h`/`.pbrpc.m` files for each `.proto` file with services defined. The latter contains the code to make remote calls to the specified API. + +## How to integrate a generated gRPC library in your project + +### If you use Cocoapods + +This is the recommended approach. + +You need to create a Podspec file for the generated library. This is simply a matter of copying an example like [this one](https://github.com/grpc/grpc/blob/master/src/objective-c/examples/Sample/RemoteTestClient/RemoteTest.podspec) to the directory where the source files were generated. Update the name and other metadata of the Podspec as suitable. + +Once your library has a Podspec, refer to it from your Podfile using `:path` as described [here](https://guides.cocoapods.org/using/the-podfile.html#using-the-files-from-a-folder-local-to-the-machine). + +### If you don't use Cocoapods + +You need to compile the generated `.pbpbjc.*` files (the enums and messages) without ARC support, and the generated `.pbrpc.*` files (the services) with ARC support. The generated code depends on v0.3+ of the Objective-C gRPC runtime library and v3.0+ of the Objective-C Protobuf runtime library. + +These libraries need to be integrated into your project as described in their respective Podspec files: + +* [Podspec](https://github.com/grpc/grpc/blob/master/gRPC.podspec) for the Objective-C gRPC runtime library. This can be tedious to configure manually. +* [Podspec](https://github.com/jcanizales/protobuf/blob/add-podspec/Protobuf.podspec) for the Objective-C Protobuf runtime library. From c6f8d0a4c6bd70cc4f48b2f6ddd3ca15d76cec06 Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Mon, 11 May 2015 22:40:02 -0700 Subject: [PATCH 066/217] Starting on low level changes to support server side authentication. --- BUILD | 5 +- Makefile | 6 +- build.json | 5 +- src/core/channel/context.h | 7 +- src/core/security/{auth.h => auth_filters.h} | 7 +- .../security/{auth.c => client_auth_filter.c} | 14 +- src/core/security/security_connector.c | 1 + src/core/security/server_auth_filter.c | 144 ++++++++++++++++++ src/core/security/server_secure_chttp2.c | 25 ++- src/core/surface/call.c | 22 +-- src/core/surface/secure_channel_create.c | 2 +- src/core/surface/server.c | 6 +- src/core/surface/server.h | 2 +- src/core/surface/server_chttp2.c | 3 +- src/core/transport/transport.h | 3 +- .../end2end/fixtures/chttp2_socket_pair.c | 3 +- .../chttp2_socket_pair_one_byte_at_a_time.c | 3 +- vsprojects/grpc/grpc.vcxproj | 8 +- vsprojects/grpc/grpc.vcxproj.filters | 9 +- 19 files changed, 224 insertions(+), 51 deletions(-) rename src/core/security/{auth.h => auth_filters.h} (88%) rename src/core/security/{auth.c => client_auth_filter.c} (97%) create mode 100644 src/core/security/server_auth_filter.c diff --git a/BUILD b/BUILD index bcee870bd3c..ce7f9e78f9d 100644 --- a/BUILD +++ b/BUILD @@ -131,7 +131,7 @@ cc_library( "src/core/httpcli/httpcli.h", "src/core/httpcli/httpcli_security_connector.h", "src/core/httpcli/parser.h", - "src/core/security/auth.h", + "src/core/security/auth_filters.h", "src/core/security/base64.h", "src/core/security/credentials.h", "src/core/security/json_token.h", @@ -234,8 +234,8 @@ cc_library( "src/core/httpcli/httpcli.c", "src/core/httpcli/httpcli_security_connector.c", "src/core/httpcli/parser.c", - "src/core/security/auth.c", "src/core/security/base64.c", + "src/core/security/client_auth_filter.c", "src/core/security/credentials.c", "src/core/security/credentials_posix.c", "src/core/security/credentials_win32.c", @@ -245,6 +245,7 @@ cc_library( "src/core/security/secure_transport_setup.c", "src/core/security/security_connector.c", "src/core/security/security_context.c", + "src/core/security/server_auth_filter.c", "src/core/security/server_secure_chttp2.c", "src/core/surface/init_secure.c", "src/core/surface/secure_channel_create.c", diff --git a/Makefile b/Makefile index 024e54f65ed..85a8c8fb075 100644 --- a/Makefile +++ b/Makefile @@ -2616,8 +2616,8 @@ LIBGRPC_SRC = \ src/core/httpcli/httpcli.c \ src/core/httpcli/httpcli_security_connector.c \ src/core/httpcli/parser.c \ - src/core/security/auth.c \ src/core/security/base64.c \ + src/core/security/client_auth_filter.c \ src/core/security/credentials.c \ src/core/security/credentials_posix.c \ src/core/security/credentials_win32.c \ @@ -2627,6 +2627,7 @@ LIBGRPC_SRC = \ src/core/security/secure_transport_setup.c \ src/core/security/security_connector.c \ src/core/security/security_context.c \ + src/core/security/server_auth_filter.c \ src/core/security/server_secure_chttp2.c \ src/core/surface/init_secure.c \ src/core/surface/secure_channel_create.c \ @@ -13184,8 +13185,8 @@ src/core/httpcli/format_request.c: $(OPENSSL_DEP) src/core/httpcli/httpcli.c: $(OPENSSL_DEP) src/core/httpcli/httpcli_security_connector.c: $(OPENSSL_DEP) src/core/httpcli/parser.c: $(OPENSSL_DEP) -src/core/security/auth.c: $(OPENSSL_DEP) src/core/security/base64.c: $(OPENSSL_DEP) +src/core/security/client_auth_filter.c: $(OPENSSL_DEP) src/core/security/credentials.c: $(OPENSSL_DEP) src/core/security/credentials_posix.c: $(OPENSSL_DEP) src/core/security/credentials_win32.c: $(OPENSSL_DEP) @@ -13195,6 +13196,7 @@ src/core/security/secure_endpoint.c: $(OPENSSL_DEP) src/core/security/secure_transport_setup.c: $(OPENSSL_DEP) src/core/security/security_connector.c: $(OPENSSL_DEP) src/core/security/security_context.c: $(OPENSSL_DEP) +src/core/security/server_auth_filter.c: $(OPENSSL_DEP) src/core/security/server_secure_chttp2.c: $(OPENSSL_DEP) src/core/surface/init_secure.c: $(OPENSSL_DEP) src/core/surface/secure_channel_create.c: $(OPENSSL_DEP) diff --git a/build.json b/build.json index 18c0eb1211d..85cd13437d8 100644 --- a/build.json +++ b/build.json @@ -405,7 +405,7 @@ "src/core/httpcli/httpcli.h", "src/core/httpcli/httpcli_security_connector.h", "src/core/httpcli/parser.h", - "src/core/security/auth.h", + "src/core/security/auth_filters.h", "src/core/security/base64.h", "src/core/security/credentials.h", "src/core/security/json_token.h", @@ -423,8 +423,8 @@ "src/core/httpcli/httpcli.c", "src/core/httpcli/httpcli_security_connector.c", "src/core/httpcli/parser.c", - "src/core/security/auth.c", "src/core/security/base64.c", + "src/core/security/client_auth_filter.c", "src/core/security/credentials.c", "src/core/security/credentials_posix.c", "src/core/security/credentials_win32.c", @@ -434,6 +434,7 @@ "src/core/security/secure_transport_setup.c", "src/core/security/security_connector.c", "src/core/security/security_context.c", + "src/core/security/server_auth_filter.c", "src/core/security/server_secure_chttp2.c", "src/core/surface/init_secure.c", "src/core/surface/secure_channel_create.c", diff --git a/src/core/channel/context.h b/src/core/channel/context.h index e2e5e805135..85de60d81ae 100644 --- a/src/core/channel/context.h +++ b/src/core/channel/context.h @@ -41,4 +41,9 @@ typedef enum { GRPC_CONTEXT_COUNT } grpc_context_index; -#endif +typedef struct { + void *value; + void (*destroy)(void *); +} grpc_call_context; + +#endif /* GRPC_INTERNAL_CORE_CHANNEL_CONTEXT_H */ diff --git a/src/core/security/auth.h b/src/core/security/auth_filters.h similarity index 88% rename from src/core/security/auth.h rename to src/core/security/auth_filters.h index 08dc4152ba4..ff921690e09 100644 --- a/src/core/security/auth.h +++ b/src/core/security/auth_filters.h @@ -31,11 +31,12 @@ * */ -#ifndef GRPC_INTERNAL_CORE_SECURITY_AUTH_H -#define GRPC_INTERNAL_CORE_SECURITY_AUTH_H +#ifndef GRPC_INTERNAL_CORE_SECURITY_AUTH_FILTERS_H +#define GRPC_INTERNAL_CORE_SECURITY_AUTH_FILTERS_H #include "src/core/channel/channel_stack.h" extern const grpc_channel_filter grpc_client_auth_filter; +extern const grpc_channel_filter grpc_server_auth_filter; -#endif /* GRPC_INTERNAL_CORE_SECURITY_AUTH_H */ +#endif /* GRPC_INTERNAL_CORE_SECURITY_AUTH_FILTERS_H */ diff --git a/src/core/security/auth.c b/src/core/security/client_auth_filter.c similarity index 97% rename from src/core/security/auth.c rename to src/core/security/client_auth_filter.c index faf12d8f144..1d9788b8dd7 100644 --- a/src/core/security/auth.c +++ b/src/core/security/client_auth_filter.c @@ -31,7 +31,7 @@ * */ -#include "src/core/security/auth.h" +#include "src/core/security/auth_filters.h" #include @@ -125,7 +125,7 @@ static void send_security_metadata(grpc_call_element *elem, call_data *calld = elem->call_data; channel_data *chand = elem->channel_data; grpc_client_security_context *ctx = - (grpc_client_security_context *)op->context[GRPC_CONTEXT_SECURITY]; + (grpc_client_security_context *)op->contexts[GRPC_CONTEXT_SECURITY].value; char *service_url = NULL; grpc_credentials *channel_creds = chand->security_connector->request_metadata_creds; @@ -273,7 +273,7 @@ static void init_channel_elem(grpc_channel_element *elem, const grpc_channel_args *args, grpc_mdctx *metadata_context, int is_first, int is_last) { - grpc_security_connector *ctx = grpc_find_security_connector_in_args(args); + grpc_security_connector *sc = grpc_find_security_connector_in_args(args); /* grab pointers to our data from the channel element */ channel_data *chand = elem->channel_data; @@ -282,12 +282,12 @@ static void init_channel_elem(grpc_channel_element *elem, path */ GPR_ASSERT(!is_first); GPR_ASSERT(!is_last); - GPR_ASSERT(ctx != NULL); + GPR_ASSERT(sc != NULL); /* initialize members */ - GPR_ASSERT(ctx->is_client_side); + GPR_ASSERT(sc->is_client_side); chand->security_connector = - (grpc_channel_security_connector *)grpc_security_connector_ref(ctx); + (grpc_channel_security_connector *)grpc_security_connector_ref(sc); chand->md_ctx = metadata_context; chand->authority_string = grpc_mdstr_from_string(chand->md_ctx, ":authority"); @@ -321,4 +321,4 @@ static void destroy_channel_elem(grpc_channel_element *elem) { const grpc_channel_filter grpc_client_auth_filter = { auth_start_transport_op, channel_op, sizeof(call_data), init_call_elem, destroy_call_elem, sizeof(channel_data), init_channel_elem, - destroy_channel_elem, "auth"}; + destroy_channel_elem, "client-auth"}; diff --git a/src/core/security/security_connector.c b/src/core/security/security_connector.c index b17e0e0dfab..035f3735e34 100644 --- a/src/core/security/security_connector.c +++ b/src/core/security/security_connector.c @@ -278,6 +278,7 @@ grpc_channel_security_connector *grpc_fake_channel_security_connector_create( grpc_security_connector *grpc_fake_server_security_connector_create(void) { grpc_security_connector *c = gpr_malloc(sizeof(grpc_security_connector)); gpr_ref_init(&c->refcount, 1); + c->is_client_side = 0; c->vtable = &fake_server_vtable; c->url_scheme = GRPC_FAKE_SECURITY_URL_SCHEME; return c; diff --git a/src/core/security/server_auth_filter.c b/src/core/security/server_auth_filter.c new file mode 100644 index 00000000000..7779bcc407a --- /dev/null +++ b/src/core/security/server_auth_filter.c @@ -0,0 +1,144 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/security/auth_filters.h" +#include "src/core/security/security_connector.h" + +#include + +typedef struct call_data { + int unused; /* C89 requires at least one struct element */ +} call_data; + +typedef struct channel_data { + grpc_security_connector *security_connector; +} channel_data; + +/* used to silence 'variable not used' warnings */ +static void ignore_unused(void *ignored) {} + +static void noop_mutate_op(grpc_call_element *elem, grpc_transport_op *op) { + /* grab pointers to our data from the call element */ + call_data *calld = elem->call_data; + channel_data *chand = elem->channel_data; + + ignore_unused(calld); + ignore_unused(chand); + + /* do nothing */ +} + +/* Called either: + - in response to an API call (or similar) from above, to send something + - a network event (or similar) from below, to receive something + op contains type and call direction information, in addition to the data + that is being sent or received. */ +static void auth_start_transport_op(grpc_call_element *elem, + grpc_transport_op *op) { + noop_mutate_op(elem, op); + + /* pass control down the stack */ + grpc_call_next_op(elem, op); +} + +/* Called on special channel events, such as disconnection or new incoming + calls on the server */ +static void channel_op(grpc_channel_element *elem, + grpc_channel_element *from_elem, grpc_channel_op *op) { + /* grab pointers to our data from the channel element */ + channel_data *chand = elem->channel_data; + + ignore_unused(chand); + + switch (op->type) { + default: + /* pass control up or down the stack depending on op->dir */ + grpc_channel_next_op(elem, op); + break; + } +} + +/* Constructor for call_data */ +static void init_call_elem(grpc_call_element *elem, + const void *server_transport_data, + grpc_transport_op *initial_op) { + /* grab pointers to our data from the call element */ + call_data *calld = elem->call_data; + + /* initialize members */ + calld->unused = 0; + + if (initial_op) noop_mutate_op(elem, initial_op); +} + +/* Destructor for call_data */ +static void destroy_call_elem(grpc_call_element *elem) { + /* grab pointers to our data from the call element */ + call_data *calld = elem->call_data; + channel_data *chand = elem->channel_data; + + ignore_unused(calld); + ignore_unused(chand); +} + +/* Constructor for channel_data */ +static void init_channel_elem(grpc_channel_element *elem, + const grpc_channel_args *args, grpc_mdctx *mdctx, + int is_first, int is_last) { + grpc_security_connector *sc = grpc_find_security_connector_in_args(args); + /* grab pointers to our data from the channel element */ + channel_data *chand = elem->channel_data; + + /* The first and the last filters tend to be implemented differently to + handle the case that there's no 'next' filter to call on the up or down + path */ + GPR_ASSERT(!is_first); + GPR_ASSERT(!is_last); + GPR_ASSERT(sc != NULL); + + /* initialize members */ + GPR_ASSERT(!sc->is_client_side); + chand->security_connector = grpc_security_connector_ref(sc); +} + +/* Destructor for channel data */ +static void destroy_channel_elem(grpc_channel_element *elem) { + /* grab pointers to our data from the channel element */ + channel_data *chand = elem->channel_data; + grpc_security_connector_unref(chand->security_connector); +} + +const grpc_channel_filter grpc_server_auth_filter = { + auth_start_transport_op, channel_op, sizeof(call_data), init_call_elem, + destroy_call_elem, sizeof(channel_data), init_channel_elem, + destroy_channel_elem, "server-auth"}; diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c index db9d545c0e6..3519930f38d 100644 --- a/src/core/security/server_secure_chttp2.c +++ b/src/core/security/server_secure_chttp2.c @@ -35,10 +35,12 @@ #include +#include "src/core/channel/channel_args.h" #include "src/core/channel/http_server_filter.h" #include "src/core/iomgr/endpoint.h" #include "src/core/iomgr/resolve_address.h" #include "src/core/iomgr/tcp_server.h" +#include "src/core/security/auth_filters.h" #include "src/core/security/credentials.h" #include "src/core/security/security_connector.h" #include "src/core/security/secure_transport_setup.h" @@ -69,13 +71,21 @@ static void state_unref(grpc_server_secure_state *state) { } } -static grpc_transport_setup_result setup_transport(void *server, +static grpc_transport_setup_result setup_transport(void *statep, grpc_transport *transport, grpc_mdctx *mdctx) { static grpc_channel_filter const *extra_filters[] = { - &grpc_http_server_filter}; - return grpc_server_setup_transport(server, transport, extra_filters, - GPR_ARRAY_SIZE(extra_filters), mdctx); + &grpc_server_auth_filter, &grpc_http_server_filter}; + grpc_server_secure_state *state = statep; + grpc_transport_setup_result result; + grpc_arg connector_arg = grpc_security_connector_to_arg(state->sc); + grpc_channel_args *args_copy = grpc_channel_args_copy_and_add( + grpc_server_get_channel_args(state->server), &connector_arg); + result = grpc_server_setup_transport(state->server, transport, extra_filters, + GPR_ARRAY_SIZE(extra_filters), mdctx, + args_copy); + grpc_channel_args_destroy(args_copy); + return result; } static void on_secure_transport_setup_done(void *statep, @@ -85,10 +95,9 @@ static void on_secure_transport_setup_done(void *statep, if (status == GRPC_SECURITY_OK) { gpr_mu_lock(&state->mu); if (!state->is_shutdown) { - grpc_create_chttp2_transport(setup_transport, state->server, - grpc_server_get_channel_args(state->server), - secure_endpoint, NULL, 0, - grpc_mdctx_create(), 0); + grpc_create_chttp2_transport( + setup_transport, state, grpc_server_get_channel_args(state->server), + secure_endpoint, NULL, 0, grpc_mdctx_create(), 0); } else { /* We need to consume this here, because the server may already have gone * away. */ diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 50df36cae9f..0169ce31588 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -205,8 +205,8 @@ struct grpc_call { /* Received call statuses from various sources */ received_status status[STATUS_SOURCE_COUNT]; - void *context[GRPC_CONTEXT_COUNT]; - void (*destroy_context[GRPC_CONTEXT_COUNT])(void *); + /* Contexts for various subsystems (security, tracing, ...). */ + grpc_call_context contexts[GRPC_CONTEXT_COUNT]; /* Deadline alarm - if have_alarm is non-zero */ grpc_alarm alarm; @@ -290,7 +290,7 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, initial_op.recv_state = &call->recv_state; initial_op.on_done_recv = call_on_done_recv; initial_op.recv_user_data = call; - initial_op.context = call->context; + initial_op.contexts = call->contexts; call->receiving = 1; GRPC_CALL_INTERNAL_REF(call, "receiving"); initial_op_ptr = &initial_op; @@ -344,8 +344,8 @@ static void destroy_call(void *call, int ignored_success) { grpc_mdelem_unref(c->send_initial_metadata[i].md); } for (i = 0; i < GRPC_CONTEXT_COUNT; i++) { - if (c->destroy_context[i]) { - c->destroy_context[i](c->context[i]); + if (c->contexts[i].destroy) { + c->contexts[i].destroy(c->contexts[i].value); } } grpc_sopb_destroy(&c->send_ops); @@ -1048,7 +1048,7 @@ static grpc_call_error cancel_with_status( static void execute_op(grpc_call *call, grpc_transport_op *op) { grpc_call_element *elem; elem = CALL_ELEM_FROM_CALL(call, 0); - op->context = call->context; + op->contexts = call->contexts; elem->filter->start_transport_op(elem, op); } @@ -1289,15 +1289,15 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, void grpc_call_context_set(grpc_call *call, grpc_context_index elem, void *value, void (*destroy)(void *value)) { - if (call->destroy_context[elem]) { - call->destroy_context[elem](value); + if (call->contexts[elem].destroy) { + call->contexts[elem].destroy(call->contexts[elem].value); } - call->context[elem] = value; - call->destroy_context[elem] = destroy; + call->contexts[elem].value = value; + call->contexts[elem].destroy = destroy; } void *grpc_call_context_get(grpc_call *call, grpc_context_index elem) { - return call->context[elem]; + return call->contexts[elem].value; } gpr_uint8 grpc_call_is_client(grpc_call *call) { return call->is_client; } diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index 3e331293b5d..3b9ed242e49 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -46,7 +46,7 @@ #include "src/core/channel/http_client_filter.h" #include "src/core/iomgr/resolve_address.h" #include "src/core/iomgr/tcp_client.h" -#include "src/core/security/auth.h" +#include "src/core/security/auth_filters.h" #include "src/core/security/credentials.h" #include "src/core/security/secure_transport_setup.h" #include "src/core/support/string.h" diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 351ed5b7586..1b80a56d3d2 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -699,7 +699,7 @@ void grpc_server_start(grpc_server *server) { grpc_transport_setup_result grpc_server_setup_transport( grpc_server *s, grpc_transport *transport, grpc_channel_filter const **extra_filters, size_t num_extra_filters, - grpc_mdctx *mdctx) { + grpc_mdctx *mdctx, const grpc_channel_args *args) { size_t num_filters = s->channel_filter_count + num_extra_filters + 1; grpc_channel_filter const **filters = gpr_malloc(sizeof(grpc_channel_filter *) * num_filters); @@ -730,8 +730,8 @@ grpc_transport_setup_result grpc_server_setup_transport( grpc_transport_add_to_pollset(transport, grpc_cq_pollset(s->cqs[i])); } - channel = grpc_channel_create_from_filters(filters, num_filters, - s->channel_args, mdctx, 0); + channel = + grpc_channel_create_from_filters(filters, num_filters, args, mdctx, 0); chand = (channel_data *)grpc_channel_stack_element( grpc_channel_get_channel_stack(channel), 0) ->channel_data; diff --git a/src/core/surface/server.h b/src/core/surface/server.h index c6331033e01..e32254ed8fc 100644 --- a/src/core/surface/server.h +++ b/src/core/surface/server.h @@ -58,7 +58,7 @@ void grpc_server_listener_destroy_done(void *server); grpc_transport_setup_result grpc_server_setup_transport( grpc_server *server, grpc_transport *transport, grpc_channel_filter const **extra_filters, size_t num_extra_filters, - grpc_mdctx *mdctx); + grpc_mdctx *mdctx, const grpc_channel_args *args); const grpc_channel_args *grpc_server_get_channel_args(grpc_server *server); diff --git a/src/core/surface/server_chttp2.c b/src/core/surface/server_chttp2.c index 7b5c2f227b3..7e49a531df2 100644 --- a/src/core/surface/server_chttp2.c +++ b/src/core/surface/server_chttp2.c @@ -48,7 +48,8 @@ static grpc_transport_setup_result setup_transport(void *server, static grpc_channel_filter const *extra_filters[] = { &grpc_http_server_filter}; return grpc_server_setup_transport(server, transport, extra_filters, - GPR_ARRAY_SIZE(extra_filters), mdctx); + GPR_ARRAY_SIZE(extra_filters), mdctx, + grpc_server_get_channel_args(server)); } static void new_transport(void *server, grpc_endpoint *tcp) { diff --git a/src/core/transport/transport.h b/src/core/transport/transport.h index 7a389ea393d..dd6bee8ce95 100644 --- a/src/core/transport/transport.h +++ b/src/core/transport/transport.h @@ -38,6 +38,7 @@ #include "src/core/iomgr/pollset.h" #include "src/core/transport/stream_op.h" +#include "src/core/channel/context.h" /* forward declarations */ typedef struct grpc_transport grpc_transport; @@ -78,7 +79,7 @@ typedef struct grpc_transport_op { grpc_mdstr *cancel_message; /* Indexes correspond to grpc_context_index enum values */ - void *const *context; + grpc_call_context *contexts; } grpc_transport_op; /* Callbacks made from the transport to the upper layers of grpc. */ diff --git a/test/core/end2end/fixtures/chttp2_socket_pair.c b/test/core/end2end/fixtures/chttp2_socket_pair.c index 43ebf7eed58..e0221d0452a 100644 --- a/test/core/end2end/fixtures/chttp2_socket_pair.c +++ b/test/core/end2end/fixtures/chttp2_socket_pair.c @@ -62,7 +62,8 @@ static grpc_transport_setup_result server_setup_transport( static grpc_channel_filter const *extra_filters[] = { &grpc_http_server_filter}; return grpc_server_setup_transport(f->server, transport, extra_filters, - GPR_ARRAY_SIZE(extra_filters), mdctx); + GPR_ARRAY_SIZE(extra_filters), mdctx, + grpc_server_get_channel_args(f->server)); } typedef struct { diff --git a/test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.c b/test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.c index 385d5a4e811..37b5529d7f5 100644 --- a/test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.c +++ b/test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.c @@ -62,7 +62,8 @@ static grpc_transport_setup_result server_setup_transport( static grpc_channel_filter const *extra_filters[] = { &grpc_http_server_filter}; return grpc_server_setup_transport(f->server, transport, extra_filters, - GPR_ARRAY_SIZE(extra_filters), mdctx); + GPR_ARRAY_SIZE(extra_filters), mdctx, + grpc_server_get_channel_args(f->server)); } typedef struct { diff --git a/vsprojects/grpc/grpc.vcxproj b/vsprojects/grpc/grpc.vcxproj index 1c965388bba..3ae187cba16 100644 --- a/vsprojects/grpc/grpc.vcxproj +++ b/vsprojects/grpc/grpc.vcxproj @@ -158,7 +158,7 @@ - + @@ -267,10 +267,10 @@ - - + + @@ -289,6 +289,8 @@ + + diff --git a/vsprojects/grpc/grpc.vcxproj.filters b/vsprojects/grpc/grpc.vcxproj.filters index ff6afb2ecaa..7a9df84318d 100644 --- a/vsprojects/grpc/grpc.vcxproj.filters +++ b/vsprojects/grpc/grpc.vcxproj.filters @@ -13,10 +13,10 @@ src\core\httpcli - + src\core\security - + src\core\security @@ -46,6 +46,9 @@ src\core\security + + src\core\security + src\core\security @@ -386,7 +389,7 @@ src\core\httpcli - + src\core\security From 84d964a8df03b4bb40e7d510f517fc65633e03f8 Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Wed, 29 Apr 2015 11:31:06 -0700 Subject: [PATCH 067/217] API for auth context and server-side secure transport only impl. Still TODO: - a way to plug a metadata processing (somewhat elsewhere but did not one to overload this already large PR). - plug-in the auth context on the client side. - Better end to end testing. --- Makefile | 34 +++- build.json | 14 ++ include/grpc/grpc_security.h | 49 ++++++ src/core/security/client_auth_filter.c | 2 + src/core/security/security_connector.c | 74 ++++++++- src/core/security/security_connector.h | 1 + src/core/security/security_context.c | 150 +++++++++++++++++ src/core/security/security_context.h | 54 +++++- src/core/security/server_auth_filter.c | 50 ++---- ...est_response_with_payload_and_call_creds.c | 27 ++- test/core/security/auth_context_test.c | 156 ++++++++++++++++++ tools/run_tests/tests.json | 9 + vsprojects/Grpc.mak | 9 +- 13 files changed, 584 insertions(+), 45 deletions(-) create mode 100644 test/core/security/auth_context_test.c diff --git a/Makefile b/Makefile index 85a8c8fb075..1509cdcfeb2 100644 --- a/Makefile +++ b/Makefile @@ -630,6 +630,7 @@ gpr_thd_test: $(BINDIR)/$(CONFIG)/gpr_thd_test gpr_time_test: $(BINDIR)/$(CONFIG)/gpr_time_test gpr_tls_test: $(BINDIR)/$(CONFIG)/gpr_tls_test gpr_useful_test: $(BINDIR)/$(CONFIG)/gpr_useful_test +grpc_auth_context_test: $(BINDIR)/$(CONFIG)/grpc_auth_context_test grpc_base64_test: $(BINDIR)/$(CONFIG)/grpc_base64_test grpc_byte_buffer_reader_test: $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test grpc_channel_stack_test: $(BINDIR)/$(CONFIG)/grpc_channel_stack_test @@ -1148,7 +1149,7 @@ privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG buildtests: buildtests_c buildtests_cxx -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_pool_test $(BINDIR)/$(CONFIG)/thread_stress_test @@ -1225,6 +1226,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/gpr_tls_test || ( echo test gpr_tls_test failed ; exit 1 ) $(E) "[RUN] Testing gpr_useful_test" $(Q) $(BINDIR)/$(CONFIG)/gpr_useful_test || ( echo test gpr_useful_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_auth_context_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_auth_context_test || ( echo test grpc_auth_context_test failed ; exit 1 ) $(E) "[RUN] Testing grpc_base64_test" $(Q) $(BINDIR)/$(CONFIG)/grpc_base64_test || ( echo test grpc_base64_test failed ; exit 1 ) $(E) "[RUN] Testing grpc_byte_buffer_reader_test" @@ -5870,6 +5873,35 @@ endif endif +GRPC_AUTH_CONTEXT_TEST_SRC = \ + test/core/security/auth_context_test.c \ + +GRPC_AUTH_CONTEXT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_AUTH_CONTEXT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/grpc_auth_context_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_auth_context_test: $(GRPC_AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(GRPC_AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_auth_context_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/auth_context_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_grpc_auth_context_test: $(GRPC_AUTH_CONTEXT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_AUTH_CONTEXT_TEST_OBJS:.o=.dep) +endif +endif + + GRPC_BASE64_TEST_SRC = \ test/core/security/base64_test.c \ diff --git a/build.json b/build.json index 85cd13437d8..2fce8cdaf70 100644 --- a/build.json +++ b/build.json @@ -1267,6 +1267,20 @@ "gpr" ] }, + { + "name": "grpc_auth_context_test", + "build": "test", + "language": "c", + "src": [ + "test/core/security/auth_context_test.c" + ], + "deps": [ + "grpc_test_util", + "grpc", + "gpr_test_util", + "gpr" + ] + }, { "name": "grpc_base64_test", "build": "test", diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h index 2f9ec1c67b9..a6760a1400e 100644 --- a/include/grpc/grpc_security.h +++ b/include/grpc/grpc_security.h @@ -191,6 +191,55 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, grpc_call_error grpc_call_set_credentials(grpc_call *call, grpc_credentials *creds); +/* --- Authentication Context. --- */ + +/* TODO(jboeuf): Define some well-known property names. */ + +#define GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME \ + "transport_security_type" +#define GRPC_FAKE_TRANSPORT_SECURITY_TYPE "fake" +#define GRPC_SSL_TRANSPORT_SECURITY_TYPE "ssl" + +#define GRPC_X509_CN_PROPERTY_NAME "x509_common_name" +#define GRPC_X509_SAN_PROPERTY_NAME "x509_subject_alternative_name" + +typedef struct grpc_auth_context grpc_auth_context; +typedef struct grpc_auth_property_iterator grpc_auth_property_iterator; + +/* value, if not NULL, is guaranteed to be NULL terminated. */ +typedef struct grpc_auth_property { + char *name; + char *value; + size_t value_length; +} grpc_auth_property; + +/* Returns NULL when the iterator is at the end. */ +const grpc_auth_property *grpc_auth_property_iterator_next( + grpc_auth_property_iterator *it); +void grpc_auth_property_iterator_destroy(grpc_auth_property_iterator *it); + +grpc_auth_property_iterator *grpc_auth_context_property_iterator( + const grpc_auth_context *ctx); + +/* Gets the peer identity. Returns NULL if the peer is not authenticated. + An identity may consist of multiple values (e.g. Subject Alternative Names + in X509 SSL certificates). */ +grpc_auth_property_iterator *grpc_auth_context_peer_identity( + const grpc_auth_context *ctx); + +/* Finds a property in the context. May return an empty iterator if no property + with this name was found in the context. Will return NULL on NULL input. */ +grpc_auth_property_iterator *grpc_auth_context_find_properties_by_name( + const grpc_auth_context *ctx, const char *name); + +/* Gets the name of the property that indicates the peer identity. Will return + NULL if the peer is not authenticated. */ +const char *grpc_auth_context_peer_identity_property_name( + const grpc_auth_context *ctx); + +/* Gets the auth context from the call. */ +const grpc_auth_context *grpc_call_auth_context(grpc_call *call); + #ifdef __cplusplus } #endif diff --git a/src/core/security/client_auth_filter.c b/src/core/security/client_auth_filter.c index 1d9788b8dd7..9e1198919bf 100644 --- a/src/core/security/client_auth_filter.c +++ b/src/core/security/client_auth_filter.c @@ -189,6 +189,8 @@ static void auth_start_transport_op(grpc_call_element *elem, grpc_linked_mdelem *l; size_t i; + /* TODO(jboeuf): write the call auth context. */ + if (op->send_ops && !calld->sent_initial_metadata) { size_t nops = op->send_ops->nops; grpc_stream_op *ops = op->send_ops->ops; diff --git a/src/core/security/security_connector.c b/src/core/security/security_connector.c index 035f3735e34..11505f8cb0b 100644 --- a/src/core/security/security_connector.c +++ b/src/core/security/security_connector.c @@ -37,6 +37,7 @@ #include "src/core/security/credentials.h" #include "src/core/security/secure_endpoint.h" +#include "src/core/security/security_context.h" #include "src/core/support/env.h" #include "src/core/support/file.h" #include "src/core/support/string.h" @@ -194,10 +195,14 @@ typedef struct { static void fake_channel_destroy(grpc_security_connector *sc) { grpc_channel_security_connector *c = (grpc_channel_security_connector *)sc; grpc_credentials_unref(c->request_metadata_creds); + grpc_auth_context_unref(sc->auth_context); gpr_free(sc); } -static void fake_server_destroy(grpc_security_connector *sc) { gpr_free(sc); } +static void fake_server_destroy(grpc_security_connector *sc) { + grpc_auth_context_unref(sc->auth_context); + gpr_free(sc); +} static grpc_security_status fake_channel_create_handshaker( grpc_security_connector *sc, tsi_handshaker **handshaker) { @@ -236,6 +241,12 @@ static grpc_security_status fake_check_peer(grpc_security_connector *sc, status = GRPC_SECURITY_ERROR; goto end; } + grpc_auth_context_unref(sc->auth_context); + sc->auth_context = grpc_auth_context_create(NULL, 1); + sc->auth_context->properties[0] = grpc_auth_property_init_from_cstring( + GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME, + GRPC_FAKE_TRANSPORT_SECURITY_TYPE); + end: tsi_peer_destruct(&peer); return status; @@ -264,6 +275,7 @@ grpc_channel_security_connector *grpc_fake_channel_security_connector_create( grpc_credentials *request_metadata_creds, int call_host_check_is_async) { grpc_fake_channel_security_connector *c = gpr_malloc(sizeof(grpc_fake_channel_security_connector)); + memset(c, 0, sizeof(grpc_fake_channel_security_connector)); gpr_ref_init(&c->base.base.refcount, 1); c->base.base.is_client_side = 1; c->base.base.url_scheme = GRPC_FAKE_SECURITY_URL_SCHEME; @@ -277,6 +289,7 @@ grpc_channel_security_connector *grpc_fake_channel_security_connector_create( grpc_security_connector *grpc_fake_server_security_connector_create(void) { grpc_security_connector *c = gpr_malloc(sizeof(grpc_security_connector)); + memset(c, 0, sizeof(grpc_security_connector)); gpr_ref_init(&c->refcount, 1); c->is_client_side = 0; c->vtable = &fake_server_vtable; @@ -309,6 +322,7 @@ static void ssl_channel_destroy(grpc_security_connector *sc) { if (c->target_name != NULL) gpr_free(c->target_name); if (c->overridden_target_name != NULL) gpr_free(c->overridden_target_name); tsi_peer_destruct(&c->peer); + grpc_auth_context_unref(sc->auth_context); gpr_free(sc); } @@ -318,6 +332,7 @@ static void ssl_server_destroy(grpc_security_connector *sc) { if (c->handshaker_factory != NULL) { tsi_ssl_handshaker_factory_destroy(c->handshaker_factory); } + grpc_auth_context_unref(sc->auth_context); gpr_free(sc); } @@ -370,7 +385,51 @@ static int ssl_host_matches_name(const tsi_peer *peer, const char *peer_name) { return r; } -static grpc_security_status ssl_check_peer(const char *peer_name, +static grpc_auth_context *tsi_ssl_peer_to_auth_context(const tsi_peer *peer) { + /* We bet that iterating over a handful of properties twice will be faster + than having to realloc on average . */ + size_t auth_prop_count = 1; /* for transport_security_type. */ + size_t i; + const char *peer_identity_property_name = NULL; + grpc_auth_context *ctx = NULL; + for (i = 0; i < peer->property_count; i++) { + const tsi_peer_property *prop = &peer->properties[i]; + if (prop->name == NULL) continue; + if (strcmp(prop->name, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY) == 0) { + auth_prop_count++; + /* If there is no subject alt name, have the CN as the identity. */ + if (peer_identity_property_name == NULL) { + peer_identity_property_name = prop->name; + } + } else if (strcmp(prop->name, + TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) == 0) { + auth_prop_count++; + peer_identity_property_name = prop->name; + } + } + ctx = grpc_auth_context_create(NULL, auth_prop_count); + ctx->properties[0] = grpc_auth_property_init_from_cstring( + GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME, + GRPC_SSL_TRANSPORT_SECURITY_TYPE); + ctx->property_count = 1; + for (i = 0; i < peer->property_count; i++) { + const tsi_peer_property *prop = &peer->properties[i]; + if (prop->name == NULL) continue; + if (strcmp(prop->name, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY) == 0) { + ctx->properties[ctx->property_count++] = grpc_auth_property_init( + GRPC_X509_CN_PROPERTY_NAME, prop->value.data, prop->value.length); + } else if (strcmp(prop->name, + TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) == 0) { + ctx->properties[ctx->property_count++] = grpc_auth_property_init( + GRPC_X509_SAN_PROPERTY_NAME, prop->value.data, prop->value.length); + } + } + GPR_ASSERT(auth_prop_count == ctx->property_count); + return ctx; +} + +static grpc_security_status ssl_check_peer(grpc_security_connector *sc, + const char *peer_name, const tsi_peer *peer) { /* Check the ALPN. */ const tsi_peer_property *p = @@ -389,7 +448,7 @@ static grpc_security_status ssl_check_peer(const char *peer_name, gpr_log(GPR_ERROR, "Peer name %s is not in peer certificate", peer_name); return GRPC_SECURITY_ERROR; } - + sc->auth_context = tsi_ssl_peer_to_auth_context(peer); return GRPC_SECURITY_OK; } @@ -402,9 +461,9 @@ static grpc_security_status ssl_channel_check_peer(grpc_security_connector *sc, grpc_security_status status; tsi_peer_destruct(&c->peer); c->peer = peer; - status = ssl_check_peer(c->overridden_target_name != NULL - ? c->overridden_target_name - : c->target_name, + status = ssl_check_peer(sc, c->overridden_target_name != NULL + ? c->overridden_target_name + : c->target_name, &peer); return status; } @@ -413,8 +472,7 @@ static grpc_security_status ssl_server_check_peer(grpc_security_connector *sc, tsi_peer peer, grpc_security_check_cb cb, void *user_data) { - /* TODO(jboeuf): Find a way to expose the peer to the authorization layer. */ - grpc_security_status status = ssl_check_peer(NULL, &peer); + grpc_security_status status = ssl_check_peer(sc, NULL, &peer); tsi_peer_destruct(&peer); return status; } diff --git a/src/core/security/security_connector.h b/src/core/security/security_connector.h index 87b7ca9b8be..06170414483 100644 --- a/src/core/security/security_connector.h +++ b/src/core/security/security_connector.h @@ -77,6 +77,7 @@ struct grpc_security_connector { gpr_refcount refcount; int is_client_side; const char *url_scheme; + grpc_auth_context *auth_context; /* Populated after the peer is checked. */ }; /* Increments the refcount. */ diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c index b90dc5097af..c9fcff661f5 100644 --- a/src/core/security/security_context.c +++ b/src/core/security/security_context.c @@ -35,11 +35,14 @@ #include "src/core/security/security_context.h" #include "src/core/surface/call.h" +#include "src/core/support/string.h" #include #include #include +/* --- grpc_call --- */ + grpc_call_error grpc_call_set_credentials(grpc_call *call, grpc_credentials *creds) { grpc_client_security_context *ctx = NULL; @@ -65,6 +68,16 @@ grpc_call_error grpc_call_set_credentials(grpc_call *call, return GRPC_CALL_OK; } +const grpc_auth_context *grpc_call_auth_context(grpc_call *call) { + void *sec_ctx = grpc_call_context_get(call, GRPC_CONTEXT_SECURITY); + if (sec_ctx == NULL) return NULL; + return grpc_call_is_client(call) + ? ((grpc_client_security_context *)sec_ctx)->auth_context + : ((grpc_server_security_context *)sec_ctx)->auth_context; +} + +/* --- grpc_client_security_context --- */ + grpc_client_security_context *grpc_client_security_context_create(void) { grpc_client_security_context *ctx = gpr_malloc(sizeof(grpc_client_security_context)); @@ -75,5 +88,142 @@ grpc_client_security_context *grpc_client_security_context_create(void) { void grpc_client_security_context_destroy(void *ctx) { grpc_client_security_context *c = (grpc_client_security_context *)ctx; grpc_credentials_unref(c->creds); + grpc_auth_context_unref(c->auth_context); + gpr_free(ctx); +} + +/* --- grpc_server_security_context --- */ + +grpc_server_security_context *grpc_server_security_context_create(void) { + grpc_server_security_context *ctx = + gpr_malloc(sizeof(grpc_server_security_context)); + memset(ctx, 0, sizeof(grpc_server_security_context)); + return ctx; +} + +void grpc_server_security_context_destroy(void *ctx) { + grpc_server_security_context *c = (grpc_server_security_context *)ctx; + grpc_auth_context_unref(c->auth_context); gpr_free(ctx); } + +/* --- grpc_auth_context --- */ + +grpc_auth_context *grpc_auth_context_create(grpc_auth_context *chained, + size_t property_count) { + grpc_auth_context *ctx = gpr_malloc(sizeof(grpc_auth_context)); + memset(ctx, 0, sizeof(grpc_auth_context)); + ctx->properties = gpr_malloc(property_count * sizeof(grpc_auth_property)); + memset(ctx->properties, 0, property_count * sizeof(grpc_auth_property)); + ctx->property_count = property_count; + gpr_ref_init(&ctx->refcount, 1); + if (chained != NULL) ctx->chained = grpc_auth_context_ref(chained); + return ctx; +} + +grpc_auth_context *grpc_auth_context_ref(grpc_auth_context *ctx) { + if (ctx == NULL) return NULL; + gpr_ref(&ctx->refcount); + return ctx; +} + +void grpc_auth_context_unref(grpc_auth_context *ctx) { + if (ctx == NULL) return; + if (gpr_unref(&ctx->refcount)) { + size_t i; + grpc_auth_context_unref(ctx->chained); + if (ctx->properties != NULL) { + for (i = 0; i < ctx->property_count; i++) { + grpc_auth_property_reset(&ctx->properties[i]); + } + gpr_free(ctx->properties); + } + } +} + +const char *grpc_auth_context_peer_identity_property_name( + const grpc_auth_context *ctx) { + return ctx->peer_identity_property_name; +} + +grpc_auth_property_iterator *grpc_auth_context_property_iterator( + const grpc_auth_context *ctx) { + grpc_auth_property_iterator *it; + if (ctx == NULL) return NULL; + it = gpr_malloc(sizeof(grpc_auth_property_iterator)); + memset(it, 0, sizeof(grpc_auth_property_iterator)); + it->ctx = ctx; + return it; +} + +const grpc_auth_property *grpc_auth_property_iterator_next( + grpc_auth_property_iterator *it) { + if (it == NULL) return NULL; + while (it->index == it->ctx->property_count) { + if (it->ctx->chained == NULL) return NULL; + it->ctx = it->ctx->chained; + it->index = 0; + } + if (it->name == NULL) { + return &it->ctx->properties[it->index++]; + } else { + while (it->index < it->ctx->property_count) { + const grpc_auth_property *prop = &it->ctx->properties[it->index++]; + GPR_ASSERT(prop->name != NULL); + if (strcmp(it->name, prop->name) == 0) { + return prop; + } + } + /* We could not find the name, try another round. */ + return grpc_auth_property_iterator_next(it); + } +} + +grpc_auth_property_iterator *grpc_auth_context_find_properties_by_name( + const grpc_auth_context *ctx, const char *name) { + grpc_auth_property_iterator *it; + if (ctx == NULL || name == NULL) return NULL; + it = grpc_auth_context_property_iterator(ctx); + it->name = gpr_strdup(name); + return it; +} + +grpc_auth_property_iterator *grpc_auth_context_peer_identity( + const grpc_auth_context *ctx) { + if (ctx == NULL || ctx->peer_identity_property_name == NULL) return NULL; + return grpc_auth_context_find_properties_by_name( + ctx, ctx->peer_identity_property_name); +} + +void grpc_auth_property_iterator_destroy(grpc_auth_property_iterator *it) { + if (it == NULL) return; + if (it->name != NULL) gpr_free(it->name); + gpr_free(it); +} + +grpc_auth_property grpc_auth_property_init_from_cstring(const char *name, + const char *value) { + grpc_auth_property prop; + prop.name = gpr_strdup(name); + prop.value = gpr_strdup(value); + prop.value_length = strlen(value); + return prop; +} + +grpc_auth_property grpc_auth_property_init(const char *name, const char *value, + size_t value_length) { + grpc_auth_property prop; + prop.name = gpr_strdup(name); + prop.value = gpr_malloc(value_length + 1); + memcpy(prop.value, value, value_length); + prop.value[value_length] = '\0'; + prop.value_length = value_length; + return prop; +} + +void grpc_auth_property_reset(grpc_auth_property *property) { + if (property->name != NULL) gpr_free(property->name); + if (property->value != NULL) gpr_free(property->value); + memset(property, 0, sizeof(grpc_auth_property)); +} + diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h index 561633b452f..60a31777736 100644 --- a/src/core/security/security_context.h +++ b/src/core/security/security_context.h @@ -36,13 +36,65 @@ #include "src/core/security/credentials.h" -/* Security context attached to a client-side call. */ +/* --- grpc_auth_context --- + + High level authentication context object. Can optionally be chained. */ + +/* Property names are always NULL terminated. */ + +struct grpc_auth_property_iterator { + const grpc_auth_context *ctx; + size_t index; + char *name; +}; + +struct grpc_auth_context { + struct grpc_auth_context *chained; + grpc_auth_property *properties; + size_t property_count; + gpr_refcount refcount; + const char *peer_identity_property_name; +}; + +/* Constructor. */ +grpc_auth_context *grpc_auth_context_create(grpc_auth_context *chained, + size_t property_count); + +/* Refcounting. */ +grpc_auth_context *grpc_auth_context_ref( + grpc_auth_context *ctx); +void grpc_auth_context_unref(grpc_auth_context *ctx); + +grpc_auth_property grpc_auth_property_init_from_cstring(const char *name, + const char *value); + +grpc_auth_property grpc_auth_property_init(const char *name, const char *value, + size_t value_length); + +void grpc_auth_property_reset(grpc_auth_property *property); + +/* --- grpc_client_security_context --- + + Internal client-side security context. */ + typedef struct { grpc_credentials *creds; + grpc_auth_context *auth_context; } grpc_client_security_context; grpc_client_security_context *grpc_client_security_context_create(void); void grpc_client_security_context_destroy(void *ctx); +/* --- grpc_server_security_context --- + + Internal server-side security context. */ + +typedef struct { + grpc_auth_context *auth_context; +} grpc_server_security_context; + +grpc_server_security_context *grpc_server_security_context_create(void); +void grpc_server_security_context_destroy(void *ctx); + #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */ diff --git a/src/core/security/server_auth_filter.c b/src/core/security/server_auth_filter.c index 7779bcc407a..03372328edb 100644 --- a/src/core/security/server_auth_filter.c +++ b/src/core/security/server_auth_filter.c @@ -33,6 +33,7 @@ #include "src/core/security/auth_filters.h" #include "src/core/security/security_connector.h" +#include "src/core/security/security_context.h" #include @@ -44,20 +45,6 @@ typedef struct channel_data { grpc_security_connector *security_connector; } channel_data; -/* used to silence 'variable not used' warnings */ -static void ignore_unused(void *ignored) {} - -static void noop_mutate_op(grpc_call_element *elem, grpc_transport_op *op) { - /* grab pointers to our data from the call element */ - call_data *calld = elem->call_data; - channel_data *chand = elem->channel_data; - - ignore_unused(calld); - ignore_unused(chand); - - /* do nothing */ -} - /* Called either: - in response to an API call (or similar) from above, to send something - a network event (or similar) from below, to receive something @@ -65,7 +52,7 @@ static void noop_mutate_op(grpc_call_element *elem, grpc_transport_op *op) { that is being sent or received. */ static void auth_start_transport_op(grpc_call_element *elem, grpc_transport_op *op) { - noop_mutate_op(elem, op); + /* TODO(jboeuf): Get the metadata and get a new context from it. */ /* pass control down the stack */ grpc_call_next_op(elem, op); @@ -75,17 +62,7 @@ static void auth_start_transport_op(grpc_call_element *elem, calls on the server */ static void channel_op(grpc_channel_element *elem, grpc_channel_element *from_elem, grpc_channel_op *op) { - /* grab pointers to our data from the channel element */ - channel_data *chand = elem->channel_data; - - ignore_unused(chand); - - switch (op->type) { - default: - /* pass control up or down the stack depending on op->dir */ - grpc_channel_next_op(elem, op); - break; - } + grpc_channel_next_op(elem, op); } /* Constructor for call_data */ @@ -94,21 +71,28 @@ static void init_call_elem(grpc_call_element *elem, grpc_transport_op *initial_op) { /* grab pointers to our data from the call element */ call_data *calld = elem->call_data; + channel_data *chand = elem->channel_data; + grpc_server_security_context *server_ctx = NULL; /* initialize members */ calld->unused = 0; - if (initial_op) noop_mutate_op(elem, initial_op); + GPR_ASSERT(initial_op && initial_op->contexts != NULL && + chand->security_connector->auth_context != NULL && + initial_op->contexts[GRPC_CONTEXT_SECURITY].value == NULL); + + /* Create a security context for the call and reference the auth context from + the channel. */ + server_ctx = grpc_server_security_context_create(); + server_ctx->auth_context = + grpc_auth_context_ref(chand->security_connector->auth_context); + initial_op->contexts[GRPC_CONTEXT_SECURITY].value = server_ctx; + initial_op->contexts[GRPC_CONTEXT_SECURITY].destroy = + grpc_server_security_context_destroy; } /* Destructor for call_data */ static void destroy_call_elem(grpc_call_element *elem) { - /* grab pointers to our data from the call element */ - call_data *calld = elem->call_data; - channel_data *chand = elem->channel_data; - - ignore_unused(calld); - ignore_unused(chand); } /* Constructor for channel_data */ diff --git a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c index 01554bed8c4..8e1fb63d744 100644 --- a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c +++ b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c @@ -111,6 +111,27 @@ static void end_test(grpc_end2end_test_fixture *f) { grpc_completion_queue_destroy(f->client_cq); } +static void print_auth_context(int is_client, const grpc_auth_context *ctx) { + const grpc_auth_property *p; + grpc_auth_property_iterator *it; + gpr_log(GPR_INFO, "%s peer:", is_client ? "client" : "server"); + it = grpc_auth_context_peer_identity(ctx); + gpr_log(GPR_INFO, "\tauthenticated: %s", it != NULL ? "YES" : "NO"); + if (it != NULL) { + while ((p = grpc_auth_property_iterator_next(it)) != NULL) { + gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value); + } + grpc_auth_property_iterator_destroy(it); + } + gpr_log(GPR_INFO, "\tall properties:"); + it = grpc_auth_context_property_iterator(ctx); + GPR_ASSERT(it != NULL); + while ((p = grpc_auth_property_iterator_next(it)) != NULL) { + gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value); + } + grpc_auth_property_iterator_destroy(it); +} + static void test_call_creds_failure(grpc_end2end_test_config config) { grpc_call *c; grpc_credentials *creds = NULL; @@ -158,6 +179,7 @@ static void request_response_with_payload_and_call_creds( size_t details_capacity = 0; int was_cancelled = 2; grpc_credentials *creds = NULL; + const grpc_auth_context *s_auth_context = NULL; c = grpc_channel_create_call(f.client, f.client_cq, "/foo", "foo.test.google.fr", deadline); @@ -212,10 +234,13 @@ static void request_response_with_payload_and_call_creds( GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, &s, &call_details, &request_metadata_recv, - f.server_cq, f.server_cq, + f.server_cq, f.server_cq, tag(101))); cq_expect_completion(v_server, tag(101), 1); cq_verify(v_server); + s_auth_context = grpc_call_auth_context(s); + GPR_ASSERT(s_auth_context != NULL); + print_auth_context(0, s_auth_context); /* Cannot set creds on the server call object. */ GPR_ASSERT(grpc_call_set_credentials(s, NULL) != GRPC_CALL_OK); diff --git a/test/core/security/auth_context_test.c b/test/core/security/auth_context_test.c new file mode 100644 index 00000000000..88f7522fce3 --- /dev/null +++ b/test/core/security/auth_context_test.c @@ -0,0 +1,156 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#include "src/core/security/security_context.h" +#include "src/core/support/string.h" +#include "test/core/util/test_config.h" + +#include + +static void test_empty_context(void) { + grpc_auth_context *ctx = grpc_auth_context_create(NULL, 0); + grpc_auth_property_iterator *it; + + gpr_log(GPR_INFO, __FUNCTION__); + GPR_ASSERT(ctx != NULL); + GPR_ASSERT(grpc_auth_context_peer_identity_property_name(ctx) == NULL); + GPR_ASSERT(grpc_auth_context_peer_identity(ctx) == NULL); + it = grpc_auth_context_property_iterator(ctx); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + it = grpc_auth_context_find_properties_by_name(ctx, "foo"); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + grpc_auth_context_unref(ctx); +} + +static void test_simple_context(void) { + grpc_auth_context *ctx = grpc_auth_context_create(NULL, 3); + grpc_auth_property_iterator *it; + size_t i; + + gpr_log(GPR_INFO, __FUNCTION__); + GPR_ASSERT(ctx != NULL); + GPR_ASSERT(ctx->property_count == 3); + ctx->properties[0] = grpc_auth_property_init_from_cstring("name", "chapi"); + ctx->properties[1] = grpc_auth_property_init_from_cstring("name", "chapo"); + ctx->properties[2] = grpc_auth_property_init_from_cstring("foo", "bar"); + ctx->peer_identity_property_name = ctx->properties[0].name; + + GPR_ASSERT( + strcmp(grpc_auth_context_peer_identity_property_name(ctx), "name") == 0); + it = grpc_auth_context_property_iterator(ctx); + for (i = 0; i < ctx->property_count; i++) { + const grpc_auth_property *p = grpc_auth_property_iterator_next(it); + GPR_ASSERT(p == &ctx->properties[i]); + } + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + it = grpc_auth_context_find_properties_by_name(ctx, "foo"); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[2]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + it = grpc_auth_context_peer_identity(ctx); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[0]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[1]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + grpc_auth_context_unref(ctx); +} + +static void test_chained_context(void) { + grpc_auth_context *chained = grpc_auth_context_create(NULL, 2); + grpc_auth_context *ctx = grpc_auth_context_create(chained, 3); + grpc_auth_property_iterator *it; + size_t i; + + gpr_log(GPR_INFO, __FUNCTION__); + grpc_auth_context_unref(chained); + chained->properties[0] = + grpc_auth_property_init_from_cstring("name", "padapo"); + chained->properties[1] = grpc_auth_property_init_from_cstring("foo", "baz"); + ctx->properties[0] = grpc_auth_property_init_from_cstring("name", "chapi"); + ctx->properties[1] = grpc_auth_property_init_from_cstring("name", "chapo"); + ctx->properties[2] = grpc_auth_property_init_from_cstring("foo", "bar"); + ctx->peer_identity_property_name = ctx->properties[0].name; + + GPR_ASSERT( + strcmp(grpc_auth_context_peer_identity_property_name(ctx), "name") == 0); + it = grpc_auth_context_property_iterator(ctx); + for (i = 0; i < ctx->property_count; i++) { + const grpc_auth_property *p = grpc_auth_property_iterator_next(it); + GPR_ASSERT(p == &ctx->properties[i]); + } + for (i = 0; i < chained->property_count; i++) { + const grpc_auth_property *p = grpc_auth_property_iterator_next(it); + GPR_ASSERT(p == &chained->properties[i]); + } + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + it = grpc_auth_context_find_properties_by_name(ctx, "foo"); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[2]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &chained->properties[1]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + it = grpc_auth_context_peer_identity(ctx); + GPR_ASSERT(it != NULL); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[0]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &ctx->properties[1]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == &chained->properties[0]); + GPR_ASSERT(grpc_auth_property_iterator_next(it) == NULL); + grpc_auth_property_iterator_destroy(it); + + grpc_auth_context_unref(ctx); +} + + +int main(int argc, char **argv) { + grpc_test_init(argc, argv); + test_empty_context(); + test_simple_context(); + test_chained_context(); + return 0; +} + diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index e2454c4db40..64d0c8730da 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -312,6 +312,15 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "grpc_auth_context_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 2a52e15e5f8..d1955df31e3 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -57,7 +57,7 @@ $(OUT_DIR): build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib buildtests: buildtests_c buildtests_cxx -buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe +buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe fling_client.exe fling_server.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_auth_context_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_disappearing_server_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_simple_delayed_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_disappearing_server_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_disappearing_server_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_disappearing_server_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_delayed_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe echo All tests built. buildtests_cxx: interop_client.exe interop_server.exe @@ -301,6 +301,13 @@ gpr_useful_test.exe: build_libs $(OUT_DIR) gpr_useful_test: gpr_useful_test.exe echo Running gpr_useful_test $(OUT_DIR)\gpr_useful_test.exe +grpc_auth_context_test.exe: build_libs $(OUT_DIR) + echo Building grpc_auth_context_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\security\auth_context_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_auth_context_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\auth_context_test.obj +grpc_auth_context_test: grpc_auth_context_test.exe + echo Running grpc_auth_context_test + $(OUT_DIR)\grpc_auth_context_test.exe grpc_base64_test.exe: build_libs $(OUT_DIR) echo Building grpc_base64_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\security\base64_test.c From ae5b17015554da18e9d49ba0069d6e88d6835eac Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Wed, 20 May 2015 07:54:36 +0200 Subject: [PATCH 068/217] Fixing test. --- .../core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c | 3 ++- third_party/protobuf | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c index 1f53e581abd..b15a18f1a73 100644 --- a/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c +++ b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c @@ -63,7 +63,8 @@ static grpc_transport_setup_result server_setup_transport( static grpc_channel_filter const *extra_filters[] = { &grpc_http_server_filter}; return grpc_server_setup_transport(f->server, transport, extra_filters, - GPR_ARRAY_SIZE(extra_filters), mdctx); + GPR_ARRAY_SIZE(extra_filters), mdctx, + grpc_server_get_channel_args(f->server)); } typedef struct { diff --git a/third_party/protobuf b/third_party/protobuf index a8b38c598d7..644a6a1da71 160000 --- a/third_party/protobuf +++ b/third_party/protobuf @@ -1 +1 @@ -Subproject commit a8b38c598d7f65b281a72809b28117afdb760931 +Subproject commit 644a6a1da71385e9d7a7a26b3476c93fdd71788c From 41f9f33e372fab01dd06888d3728abd6cd5101a5 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 20 May 2015 08:52:00 -0700 Subject: [PATCH 069/217] use full name when referencing protobuf messages --- src/compiler/csharp_generator.cc | 77 ++++++++++++++++++++++---------- src/compiler/generator_helpers.h | 11 +++-- 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc index 82dd06bcec4..5dd078b303b 100644 --- a/src/compiler/csharp_generator.cc +++ b/src/compiler/csharp_generator.cc @@ -51,20 +51,49 @@ using grpc_generator::METHODTYPE_NO_STREAMING; using grpc_generator::METHODTYPE_CLIENT_STREAMING; using grpc_generator::METHODTYPE_SERVER_STREAMING; using grpc_generator::METHODTYPE_BIDI_STREAMING; +using grpc_generator::StringReplace; using std::map; using std::vector; namespace grpc_csharp_generator { namespace { -std::string GetCSharpNamespace(const FileDescriptor* file) { - // TODO(jtattermusch): this should be based on csharp_namespace option +// TODO(jtattermusch): make GetFileNamespace part of libprotoc public API. +// NOTE: Implementation needs to match exactly to GetFileNamespace +// defined in csharp_helpers.h in protoc csharp plugin. +// We cannot reference it directly because google3 protobufs +// don't have a csharp protoc plugin. +std::string GetFileNamespace(const FileDescriptor* file) { + if (file->options().has_csharp_namespace()) { + return file->options().csharp_namespace(); + } return file->package(); } -std::string GetMessageType(const Descriptor* message) { - // TODO(jtattermusch): this has to match with C# protobuf generator - return message->name(); +std::string ToCSharpName(const std::string& name, const FileDescriptor* file) { + std::string result = GetFileNamespace(file); + if (result != "") { + result += '.'; + } + std::string classname; + if (file->package().empty()) { + classname = name; + } else { + // Strip the proto package from full_name since we've replaced it with + // the C# namespace. + classname = name.substr(file->package().size() + 1); + } + result += StringReplace(classname, ".", ".Types.", false); + return "global::" + result; +} + +// TODO(jtattermusch): make GetClassName part of libprotoc public API. +// NOTE: Implementation needs to match exactly to GetClassName +// defined in csharp_helpers.h in protoc csharp plugin. +// We cannot reference it directly because google3 protobufs +// don't have a csharp protoc plugin. +std::string GetClassName(const Descriptor* message) { + return ToCSharpName(message->full_name(), message->file()); } std::string GetServiceClassName(const ServiceDescriptor* service) { @@ -114,22 +143,22 @@ std::string GetMethodRequestParamMaybe(const MethodDescriptor *method) { if (method->client_streaming()) { return ""; } - return GetMessageType(method->input_type()) + " request, "; + return GetClassName(method->input_type()) + " request, "; } std::string GetMethodReturnTypeClient(const MethodDescriptor *method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: - return "Task<" + GetMessageType(method->output_type()) + ">"; + return "Task<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_CLIENT_STREAMING: - return "AsyncClientStreamingCall<" + GetMessageType(method->input_type()) - + ", " + GetMessageType(method->output_type()) + ">"; + return "AsyncClientStreamingCall<" + GetClassName(method->input_type()) + + ", " + GetClassName(method->output_type()) + ">"; case METHODTYPE_SERVER_STREAMING: - return "AsyncServerStreamingCall<" + GetMessageType(method->output_type()) + return "AsyncServerStreamingCall<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_BIDI_STREAMING: - return "AsyncDuplexStreamingCall<" + GetMessageType(method->input_type()) - + ", " + GetMessageType(method->output_type()) + ">"; + return "AsyncDuplexStreamingCall<" + GetClassName(method->input_type()) + + ", " + GetClassName(method->output_type()) + ">"; } GOOGLE_LOG(FATAL)<< "Can't get here."; return ""; @@ -139,10 +168,10 @@ std::string GetMethodRequestParamServer(const MethodDescriptor *method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: case METHODTYPE_SERVER_STREAMING: - return GetMessageType(method->input_type()) + " request"; + return GetClassName(method->input_type()) + " request"; case METHODTYPE_CLIENT_STREAMING: case METHODTYPE_BIDI_STREAMING: - return "IAsyncStreamReader<" + GetMessageType(method->input_type()) + return "IAsyncStreamReader<" + GetClassName(method->input_type()) + "> requestStream"; } GOOGLE_LOG(FATAL)<< "Can't get here."; @@ -153,7 +182,7 @@ std::string GetMethodReturnTypeServer(const MethodDescriptor *method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: case METHODTYPE_CLIENT_STREAMING: - return "Task<" + GetMessageType(method->output_type()) + ">"; + return "Task<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_SERVER_STREAMING: case METHODTYPE_BIDI_STREAMING: return "Task"; @@ -169,7 +198,7 @@ std::string GetMethodResponseStreamMaybe(const MethodDescriptor *method) { return ""; case METHODTYPE_SERVER_STREAMING: case METHODTYPE_BIDI_STREAMING: - return ", IServerStreamWriter<" + GetMessageType(method->output_type()) + return ", IServerStreamWriter<" + GetClassName(method->output_type()) + "> responseStream"; } GOOGLE_LOG(FATAL)<< "Can't get here."; @@ -202,7 +231,7 @@ void GenerateMarshallerFields(Printer* out, const ServiceDescriptor *service) { out->Print( "static readonly Marshaller<$type$> $fieldname$ = Marshallers.Create((arg) => arg.ToByteArray(), $type$.ParseFrom);\n", "fieldname", GetMarshallerFieldName(message), "type", - GetMessageType(message)); + GetClassName(message)); } out->Print("\n"); } @@ -211,8 +240,8 @@ void GenerateStaticMethodField(Printer* out, const MethodDescriptor *method) { out->Print( "static readonly Method<$request$, $response$> $fieldname$ = new Method<$request$, $response$>(\n", "fieldname", GetMethodFieldName(method), "request", - GetMessageType(method->input_type()), "response", - GetMessageType(method->output_type())); + GetClassName(method->input_type()), "response", + GetClassName(method->output_type())); out->Indent(); out->Indent(); out->Print("$methodtype$,\n", "methodtype", @@ -242,8 +271,8 @@ void GenerateClientInterface(Printer* out, const ServiceDescriptor *service) { out->Print( "$response$ $methodname$($request$ request, CancellationToken token = default(CancellationToken));\n", "methodname", method->name(), "request", - GetMessageType(method->input_type()), "response", - GetMessageType(method->output_type())); + GetClassName(method->input_type()), "response", + GetClassName(method->output_type())); } std::string method_name = method->name(); @@ -310,8 +339,8 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor *service) { out->Print( "public $response$ $methodname$($request$ request, CancellationToken token = default(CancellationToken))\n", "methodname", method->name(), "request", - GetMessageType(method->input_type()), "response", - GetMessageType(method->output_type())); + GetClassName(method->input_type()), "response", + GetClassName(method->output_type())); out->Print("{\n"); out->Indent(); out->Print("var call = CreateCall($servicenamefield$, $methodfield$);\n", @@ -466,7 +495,7 @@ grpc::string GetServices(const FileDescriptor *file) { // TODO(jtattermusch): add using for protobuf message classes out.Print("\n"); - out.Print("namespace $namespace$ {\n", "namespace", GetCSharpNamespace(file)); + out.Print("namespace $namespace$ {\n", "namespace", GetFileNamespace(file)); out.Indent(); for (int i = 0; i < file->service_count(); i++) { GenerateService(&out, file->service(i)); diff --git a/src/compiler/generator_helpers.h b/src/compiler/generator_helpers.h index 7ce4ec526c9..373dd7f013a 100644 --- a/src/compiler/generator_helpers.h +++ b/src/compiler/generator_helpers.h @@ -60,21 +60,26 @@ inline grpc::string StripProto(grpc::string filename) { } inline grpc::string StringReplace(grpc::string str, const grpc::string &from, - const grpc::string &to) { + const grpc::string &to, bool replace_all) { size_t pos = 0; - for (;;) { + do { pos = str.find(from, pos); if (pos == grpc::string::npos) { break; } str.replace(pos, from.length(), to); pos += to.length(); - } + } while(replace_all); return str; } +inline grpc::string StringReplace(grpc::string str, const grpc::string &from, + const grpc::string &to) { + return StringReplace(str, from, to, true); +} + inline std::vector tokenize(const grpc::string &input, const grpc::string &delimiters) { std::vector tokens; From 3fffe60ef87966c050a56369097d883a57f25e2f Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 20 May 2015 08:56:24 -0700 Subject: [PATCH 070/217] regenerate service stubs --- src/csharp/Grpc.Examples/MathGrpc.cs | 44 ++++++------ .../Grpc.IntegrationTesting/TestGrpc.cs | 70 +++++++++---------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs index 2546fd220de..b9efc44e8c1 100644 --- a/src/csharp/Grpc.Examples/MathGrpc.cs +++ b/src/csharp/Grpc.Examples/MathGrpc.cs @@ -12,30 +12,30 @@ namespace math { { static readonly string __ServiceName = "math.Math"; - static readonly Marshaller __Marshaller_DivArgs = Marshallers.Create((arg) => arg.ToByteArray(), DivArgs.ParseFrom); - static readonly Marshaller __Marshaller_DivReply = Marshallers.Create((arg) => arg.ToByteArray(), DivReply.ParseFrom); - static readonly Marshaller __Marshaller_FibArgs = Marshallers.Create((arg) => arg.ToByteArray(), FibArgs.ParseFrom); - static readonly Marshaller __Marshaller_Num = Marshallers.Create((arg) => arg.ToByteArray(), Num.ParseFrom); + static readonly Marshaller __Marshaller_DivArgs = Marshallers.Create((arg) => arg.ToByteArray(), global::math.DivArgs.ParseFrom); + static readonly Marshaller __Marshaller_DivReply = Marshallers.Create((arg) => arg.ToByteArray(), global::math.DivReply.ParseFrom); + static readonly Marshaller __Marshaller_FibArgs = Marshallers.Create((arg) => arg.ToByteArray(), global::math.FibArgs.ParseFrom); + static readonly Marshaller __Marshaller_Num = Marshallers.Create((arg) => arg.ToByteArray(), global::math.Num.ParseFrom); - static readonly Method __Method_Div = new Method( + static readonly Method __Method_Div = new Method( MethodType.Unary, "Div", __Marshaller_DivArgs, __Marshaller_DivReply); - static readonly Method __Method_DivMany = new Method( + static readonly Method __Method_DivMany = new Method( MethodType.DuplexStreaming, "DivMany", __Marshaller_DivArgs, __Marshaller_DivReply); - static readonly Method __Method_Fib = new Method( + static readonly Method __Method_Fib = new Method( MethodType.ServerStreaming, "Fib", __Marshaller_FibArgs, __Marshaller_Num); - static readonly Method __Method_Sum = new Method( + static readonly Method __Method_Sum = new Method( MethodType.ClientStreaming, "Sum", __Marshaller_Num, @@ -44,20 +44,20 @@ namespace math { // client-side stub interface public interface IMathClient { - DivReply Div(DivArgs request, CancellationToken token = default(CancellationToken)); - Task DivAsync(DivArgs request, CancellationToken token = default(CancellationToken)); - AsyncDuplexStreamingCall DivMany(CancellationToken token = default(CancellationToken)); - AsyncServerStreamingCall Fib(FibArgs request, CancellationToken token = default(CancellationToken)); - AsyncClientStreamingCall Sum(CancellationToken token = default(CancellationToken)); + global::math.DivReply Div(global::math.DivArgs request, CancellationToken token = default(CancellationToken)); + Task DivAsync(global::math.DivArgs request, CancellationToken token = default(CancellationToken)); + AsyncDuplexStreamingCall DivMany(CancellationToken token = default(CancellationToken)); + AsyncServerStreamingCall Fib(global::math.FibArgs request, CancellationToken token = default(CancellationToken)); + AsyncClientStreamingCall Sum(CancellationToken token = default(CancellationToken)); } // server-side interface public interface IMath { - Task Div(ServerCallContext context, DivArgs request); - Task DivMany(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); - Task Fib(ServerCallContext context, FibArgs request, IServerStreamWriter responseStream); - Task Sum(ServerCallContext context, IAsyncStreamReader requestStream); + Task Div(ServerCallContext context, global::math.DivArgs request); + Task DivMany(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); + Task Fib(ServerCallContext context, global::math.FibArgs request, IServerStreamWriter responseStream); + Task Sum(ServerCallContext context, IAsyncStreamReader requestStream); } // client stub @@ -69,27 +69,27 @@ namespace math { public MathClient(Channel channel, StubConfiguration config) : base(channel, config) { } - public DivReply Div(DivArgs request, CancellationToken token = default(CancellationToken)) + public global::math.DivReply Div(global::math.DivArgs request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_Div); return Calls.BlockingUnaryCall(call, request, token); } - public Task DivAsync(DivArgs request, CancellationToken token = default(CancellationToken)) + public Task DivAsync(global::math.DivArgs request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_Div); return Calls.AsyncUnaryCall(call, request, token); } - public AsyncDuplexStreamingCall DivMany(CancellationToken token = default(CancellationToken)) + public AsyncDuplexStreamingCall DivMany(CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_DivMany); return Calls.AsyncDuplexStreamingCall(call, token); } - public AsyncServerStreamingCall Fib(FibArgs request, CancellationToken token = default(CancellationToken)) + public AsyncServerStreamingCall Fib(global::math.FibArgs request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_Fib); return Calls.AsyncServerStreamingCall(call, request, token); } - public AsyncClientStreamingCall Sum(CancellationToken token = default(CancellationToken)) + public AsyncClientStreamingCall Sum(CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_Sum); return Calls.AsyncClientStreamingCall(call, token); diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs index 679aafb57a9..ee077f9f56f 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs @@ -12,45 +12,45 @@ namespace grpc.testing { { static readonly string __ServiceName = "grpc.testing.TestService"; - static readonly Marshaller __Marshaller_Empty = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom); - static readonly Marshaller __Marshaller_SimpleRequest = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom); - static readonly Marshaller __Marshaller_SimpleResponse = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom); - static readonly Marshaller __Marshaller_StreamingOutputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallRequest.ParseFrom); - static readonly Marshaller __Marshaller_StreamingOutputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallResponse.ParseFrom); - static readonly Marshaller __Marshaller_StreamingInputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallRequest.ParseFrom); - static readonly Marshaller __Marshaller_StreamingInputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallResponse.ParseFrom); + static readonly Marshaller __Marshaller_Empty = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.Empty.ParseFrom); + static readonly Marshaller __Marshaller_SimpleRequest = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.SimpleRequest.ParseFrom); + static readonly Marshaller __Marshaller_SimpleResponse = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.SimpleResponse.ParseFrom); + static readonly Marshaller __Marshaller_StreamingOutputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.StreamingOutputCallRequest.ParseFrom); + static readonly Marshaller __Marshaller_StreamingOutputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.StreamingOutputCallResponse.ParseFrom); + static readonly Marshaller __Marshaller_StreamingInputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.StreamingInputCallRequest.ParseFrom); + static readonly Marshaller __Marshaller_StreamingInputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), global::grpc.testing.StreamingInputCallResponse.ParseFrom); - static readonly Method __Method_EmptyCall = new Method( + static readonly Method __Method_EmptyCall = new Method( MethodType.Unary, "EmptyCall", __Marshaller_Empty, __Marshaller_Empty); - static readonly Method __Method_UnaryCall = new Method( + static readonly Method __Method_UnaryCall = new Method( MethodType.Unary, "UnaryCall", __Marshaller_SimpleRequest, __Marshaller_SimpleResponse); - static readonly Method __Method_StreamingOutputCall = new Method( + static readonly Method __Method_StreamingOutputCall = new Method( MethodType.ServerStreaming, "StreamingOutputCall", __Marshaller_StreamingOutputCallRequest, __Marshaller_StreamingOutputCallResponse); - static readonly Method __Method_StreamingInputCall = new Method( + static readonly Method __Method_StreamingInputCall = new Method( MethodType.ClientStreaming, "StreamingInputCall", __Marshaller_StreamingInputCallRequest, __Marshaller_StreamingInputCallResponse); - static readonly Method __Method_FullDuplexCall = new Method( + static readonly Method __Method_FullDuplexCall = new Method( MethodType.DuplexStreaming, "FullDuplexCall", __Marshaller_StreamingOutputCallRequest, __Marshaller_StreamingOutputCallResponse); - static readonly Method __Method_HalfDuplexCall = new Method( + static readonly Method __Method_HalfDuplexCall = new Method( MethodType.DuplexStreaming, "HalfDuplexCall", __Marshaller_StreamingOutputCallRequest, @@ -59,25 +59,25 @@ namespace grpc.testing { // client-side stub interface public interface ITestServiceClient { - Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken)); - Task EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken)); - SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken)); - Task UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)); - AsyncServerStreamingCall StreamingOutputCall(StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken)); - AsyncClientStreamingCall StreamingInputCall(CancellationToken token = default(CancellationToken)); - AsyncDuplexStreamingCall FullDuplexCall(CancellationToken token = default(CancellationToken)); - AsyncDuplexStreamingCall HalfDuplexCall(CancellationToken token = default(CancellationToken)); + global::grpc.testing.Empty EmptyCall(global::grpc.testing.Empty request, CancellationToken token = default(CancellationToken)); + Task EmptyCallAsync(global::grpc.testing.Empty request, CancellationToken token = default(CancellationToken)); + global::grpc.testing.SimpleResponse UnaryCall(global::grpc.testing.SimpleRequest request, CancellationToken token = default(CancellationToken)); + Task UnaryCallAsync(global::grpc.testing.SimpleRequest request, CancellationToken token = default(CancellationToken)); + AsyncServerStreamingCall StreamingOutputCall(global::grpc.testing.StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken)); + AsyncClientStreamingCall StreamingInputCall(CancellationToken token = default(CancellationToken)); + AsyncDuplexStreamingCall FullDuplexCall(CancellationToken token = default(CancellationToken)); + AsyncDuplexStreamingCall HalfDuplexCall(CancellationToken token = default(CancellationToken)); } // server-side interface public interface ITestService { - Task EmptyCall(ServerCallContext context, Empty request); - Task UnaryCall(ServerCallContext context, SimpleRequest request); - Task StreamingOutputCall(ServerCallContext context, StreamingOutputCallRequest request, IServerStreamWriter responseStream); - Task StreamingInputCall(ServerCallContext context, IAsyncStreamReader requestStream); - Task FullDuplexCall(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); - Task HalfDuplexCall(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); + Task EmptyCall(ServerCallContext context, global::grpc.testing.Empty request); + Task UnaryCall(ServerCallContext context, global::grpc.testing.SimpleRequest request); + Task StreamingOutputCall(ServerCallContext context, global::grpc.testing.StreamingOutputCallRequest request, IServerStreamWriter responseStream); + Task StreamingInputCall(ServerCallContext context, IAsyncStreamReader requestStream); + Task FullDuplexCall(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); + Task HalfDuplexCall(ServerCallContext context, IAsyncStreamReader requestStream, IServerStreamWriter responseStream); } // client stub @@ -89,42 +89,42 @@ namespace grpc.testing { public TestServiceClient(Channel channel, StubConfiguration config) : base(channel, config) { } - public Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken)) + public global::grpc.testing.Empty EmptyCall(global::grpc.testing.Empty request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_EmptyCall); return Calls.BlockingUnaryCall(call, request, token); } - public Task EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken)) + public Task EmptyCallAsync(global::grpc.testing.Empty request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_EmptyCall); return Calls.AsyncUnaryCall(call, request, token); } - public SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken)) + public global::grpc.testing.SimpleResponse UnaryCall(global::grpc.testing.SimpleRequest request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_UnaryCall); return Calls.BlockingUnaryCall(call, request, token); } - public Task UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)) + public Task UnaryCallAsync(global::grpc.testing.SimpleRequest request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_UnaryCall); return Calls.AsyncUnaryCall(call, request, token); } - public AsyncServerStreamingCall StreamingOutputCall(StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken)) + public AsyncServerStreamingCall StreamingOutputCall(global::grpc.testing.StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_StreamingOutputCall); return Calls.AsyncServerStreamingCall(call, request, token); } - public AsyncClientStreamingCall StreamingInputCall(CancellationToken token = default(CancellationToken)) + public AsyncClientStreamingCall StreamingInputCall(CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_StreamingInputCall); return Calls.AsyncClientStreamingCall(call, token); } - public AsyncDuplexStreamingCall FullDuplexCall(CancellationToken token = default(CancellationToken)) + public AsyncDuplexStreamingCall FullDuplexCall(CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_FullDuplexCall); return Calls.AsyncDuplexStreamingCall(call, token); } - public AsyncDuplexStreamingCall HalfDuplexCall(CancellationToken token = default(CancellationToken)) + public AsyncDuplexStreamingCall HalfDuplexCall(CancellationToken token = default(CancellationToken)) { var call = CreateCall(__ServiceName, __Method_HalfDuplexCall); return Calls.AsyncDuplexStreamingCall(call, token); From 7ca6179c666273c850e09f5ecbfc757d653c29ef Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 18 May 2015 14:28:22 -0700 Subject: [PATCH 071/217] Make IAsyncReadStream use IAsyncEnumerator from Ix-Async --- .../Grpc.Core.Tests/Grpc.Core.Tests.csproj | 7 +-- src/csharp/Grpc.Core.Tests/packages.config | 1 + .../Grpc.Core/AsyncClientStreamingCall.cs | 18 -------- .../Grpc.Core/AsyncDuplexStreamingCall.cs | 27 ------------ .../Grpc.Core/AsyncServerStreamingCall.cs | 10 ----- src/csharp/Grpc.Core/Call.cs | 2 - src/csharp/Grpc.Core/Grpc.Core.csproj | 3 ++ src/csharp/Grpc.Core/Grpc.Core.nuspec | 1 + src/csharp/Grpc.Core/IAsyncStreamReader.cs | 8 +--- src/csharp/Grpc.Core/IAsyncStreamWriter.cs | 3 +- src/csharp/Grpc.Core/IClientStreamWriter.cs | 5 +-- .../Grpc.Core/Internal/ClientRequestStream.cs | 4 +- .../Internal/ClientResponseStream.cs | 29 ++++++++++++- .../Grpc.Core/Internal/ServerCallHandler.cs | 11 +++-- .../Grpc.Core/Internal/ServerRequestStream.cs | 29 ++++++++++++- .../Grpc.Core/Internal/ServerSafeHandle.cs | 3 -- src/csharp/Grpc.Core/ServerCallContext.cs | 1 - .../Grpc.Core/Utils/AsyncStreamExtensions.cs | 26 ++++------- src/csharp/Grpc.Core/packages.config | 1 + .../Grpc.Examples.Tests.csproj | 4 ++ .../Grpc.Examples.Tests/packages.config | 1 + src/csharp/Grpc.Examples/Grpc.Examples.csproj | 3 ++ src/csharp/Grpc.Examples/packages.config | 1 + .../Grpc.IntegrationTesting.csproj | 3 ++ .../Grpc.IntegrationTesting/InteropClient.cs | 43 ++++++++----------- .../Grpc.IntegrationTesting/packages.config | 1 + 26 files changed, 116 insertions(+), 129 deletions(-) diff --git a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj index eac8d16fb15..62cb4432725 100644 --- a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj +++ b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj @@ -34,6 +34,9 @@ ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\packages\Ix-Async.1.2.3\lib\net45\System.Interactive.Async.dll + @@ -57,7 +60,5 @@ - - - + \ No newline at end of file diff --git a/src/csharp/Grpc.Core.Tests/packages.config b/src/csharp/Grpc.Core.Tests/packages.config index c714ef3a23e..28af8d78c6c 100644 --- a/src/csharp/Grpc.Core.Tests/packages.config +++ b/src/csharp/Grpc.Core.Tests/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs index b95776f66d4..8cdc1c895bf 100644 --- a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs @@ -41,8 +41,6 @@ namespace Grpc.Core /// Return type for client streaming calls. /// public sealed class AsyncClientStreamingCall - where TRequest : class - where TResponse : class { readonly IClientStreamWriter requestStream; readonly Task result; @@ -53,22 +51,6 @@ namespace Grpc.Core this.result = result; } - /// - /// Writes a request to RequestStream. - /// - public Task Write(TRequest message) - { - return requestStream.Write(message); - } - - /// - /// Closes the RequestStream. - /// - public Task Close() - { - return requestStream.Close(); - } - /// /// Asynchronous call result. /// diff --git a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs index ee054374167..0d13a3d0523 100644 --- a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs @@ -41,8 +41,6 @@ namespace Grpc.Core /// Return type for bidirectional streaming calls. /// public sealed class AsyncDuplexStreamingCall - where TRequest : class - where TResponse : class { readonly IClientStreamWriter requestStream; readonly IAsyncStreamReader responseStream; @@ -53,31 +51,6 @@ namespace Grpc.Core this.responseStream = responseStream; } - /// - /// Writes a request to RequestStream. - /// - public Task Write(TRequest message) - { - return requestStream.Write(message); - } - - /// - /// Closes the RequestStream. - /// - public Task Close() - { - return requestStream.Close(); - } - - /// - /// Reads a response from ResponseStream. - /// - /// - public Task ReadNext() - { - return responseStream.ReadNext(); - } - /// /// Async stream to read streaming responses. /// diff --git a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs index 73b96149850..6a258d132cf 100644 --- a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs @@ -41,7 +41,6 @@ namespace Grpc.Core /// Return type for server streaming calls. /// public sealed class AsyncServerStreamingCall - where TResponse : class { readonly IAsyncStreamReader responseStream; @@ -50,15 +49,6 @@ namespace Grpc.Core this.responseStream = responseStream; } - /// - /// Reads the next response from ResponseStream - /// - /// - public Task ReadNext() - { - return responseStream.ReadNext(); - } - /// /// Async stream to read streaming responses. /// diff --git a/src/csharp/Grpc.Core/Call.cs b/src/csharp/Grpc.Core/Call.cs index d1ee59ff0a0..37b452f020d 100644 --- a/src/csharp/Grpc.Core/Call.cs +++ b/src/csharp/Grpc.Core/Call.cs @@ -41,8 +41,6 @@ namespace Grpc.Core /// Abstraction of a call to be invoked on a client. /// public class Call - where TRequest : class - where TResponse : class { readonly string name; readonly Marshaller requestMarshaller; diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj index f5f2cf5f220..6b4345cbe13 100644 --- a/src/csharp/Grpc.Core/Grpc.Core.csproj +++ b/src/csharp/Grpc.Core/Grpc.Core.csproj @@ -37,6 +37,9 @@ ..\packages\Microsoft.Bcl.Immutable.1.0.34\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + ..\packages\Ix-Async.1.2.3\lib\net45\System.Interactive.Async.dll + diff --git a/src/csharp/Grpc.Core/Grpc.Core.nuspec b/src/csharp/Grpc.Core/Grpc.Core.nuspec index e54908cb8ba..5269881afa7 100644 --- a/src/csharp/Grpc.Core/Grpc.Core.nuspec +++ b/src/csharp/Grpc.Core/Grpc.Core.nuspec @@ -16,6 +16,7 @@ gRPC RPC Protocol HTTP/2 + diff --git a/src/csharp/Grpc.Core/IAsyncStreamReader.cs b/src/csharp/Grpc.Core/IAsyncStreamReader.cs index 699741cd054..95b674c0188 100644 --- a/src/csharp/Grpc.Core/IAsyncStreamReader.cs +++ b/src/csharp/Grpc.Core/IAsyncStreamReader.cs @@ -43,13 +43,7 @@ namespace Grpc.Core /// A stream of messages to be read. /// /// - public interface IAsyncStreamReader - where T : class + public interface IAsyncStreamReader : IAsyncEnumerator { - /// - /// Reads a single message. Returns null if the last message was already read. - /// A following read can only be started when the previous one finishes. - /// - Task ReadNext(); } } diff --git a/src/csharp/Grpc.Core/IAsyncStreamWriter.cs b/src/csharp/Grpc.Core/IAsyncStreamWriter.cs index 4bd8bfb8df2..644f445401f 100644 --- a/src/csharp/Grpc.Core/IAsyncStreamWriter.cs +++ b/src/csharp/Grpc.Core/IAsyncStreamWriter.cs @@ -44,10 +44,9 @@ namespace Grpc.Core /// /// public interface IAsyncStreamWriter - where T : class { /// - /// Writes a single message. Only one write can be pending at a time. + /// Writes a single asynchronously. Only one write can be pending at a time. /// /// the message to be written. Cannot be null. Task Write(T message); diff --git a/src/csharp/Grpc.Core/IClientStreamWriter.cs b/src/csharp/Grpc.Core/IClientStreamWriter.cs index 0847a928e6c..cc76d1369da 100644 --- a/src/csharp/Grpc.Core/IClientStreamWriter.cs +++ b/src/csharp/Grpc.Core/IClientStreamWriter.cs @@ -44,11 +44,10 @@ namespace Grpc.Core /// /// public interface IClientStreamWriter : IAsyncStreamWriter - where T : class { /// - /// Closes the stream. Can only be called once there is no pending write. No writes should follow calling this. + /// Completes/closes the stream. Can only be called once there is no pending write. No writes should follow calling this. /// - Task Close(); + Task Complete(); } } diff --git a/src/csharp/Grpc.Core/Internal/ClientRequestStream.cs b/src/csharp/Grpc.Core/Internal/ClientRequestStream.cs index 16970587328..b9fc10cd169 100644 --- a/src/csharp/Grpc.Core/Internal/ClientRequestStream.cs +++ b/src/csharp/Grpc.Core/Internal/ClientRequestStream.cs @@ -38,8 +38,6 @@ namespace Grpc.Core.Internal /// Writes requests asynchronously to an underlying AsyncCall object. /// internal class ClientRequestStream : IClientStreamWriter - where TRequest : class - where TResponse : class { readonly AsyncCall call; @@ -55,7 +53,7 @@ namespace Grpc.Core.Internal return taskSource.Task; } - public Task Close() + public Task Complete() { var taskSource = new AsyncCompletionTaskSource(); call.StartSendCloseFromClient(taskSource.CompletionDelegate); diff --git a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs index b2378cade66..6c445210381 100644 --- a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs +++ b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs @@ -33,6 +33,7 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace Grpc.Core.Internal @@ -42,17 +43,41 @@ namespace Grpc.Core.Internal where TResponse : class { readonly AsyncCall call; + TResponse current; public ClientResponseStream(AsyncCall call) { this.call = call; } - public Task ReadNext() + public TResponse Current { + get + { + if (current == null) + { + throw new InvalidOperationException("No current element is available."); + } + return current; + } + } + + public async Task MoveNext(CancellationToken token) + { + if (token != CancellationToken.None) + { + throw new InvalidOperationException("Cancellation of individual reads is not supported."); + } var taskSource = new AsyncCompletionTaskSource(); call.StartReadMessage(taskSource.CompletionDelegate); - return taskSource.Task; + var result = await taskSource.Task; + this.current = result; + return result != null; + } + + public void Dispose() + { + // TODO(jtattermusch): implement the semantics of stream disposal. } } } diff --git a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs index 95d8e978692..20ac46c234e 100644 --- a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs +++ b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs @@ -32,6 +32,7 @@ #endregion using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Grpc.Core.Internal; @@ -71,9 +72,10 @@ namespace Grpc.Core.Internal Status status = Status.DefaultSuccess; try { - var request = await requestStream.ReadNext(); + Preconditions.CheckArgument(await requestStream.MoveNext()); + var request = requestStream.Current; // TODO(jtattermusch): we need to read the full stream so that native callhandle gets deallocated. - Preconditions.CheckArgument(await requestStream.ReadNext() == null); + Preconditions.CheckArgument(!await requestStream.MoveNext()); var context = new ServerCallContext(); // TODO(jtattermusch): initialize the context var result = await handler(context, request); await responseStream.Write(result); @@ -122,9 +124,10 @@ namespace Grpc.Core.Internal Status status = Status.DefaultSuccess; try { - var request = await requestStream.ReadNext(); + Preconditions.CheckArgument(await requestStream.MoveNext()); + var request = requestStream.Current; // TODO(jtattermusch): we need to read the full stream so that native callhandle gets deallocated. - Preconditions.CheckArgument(await requestStream.ReadNext() == null); + Preconditions.CheckArgument(!await requestStream.MoveNext()); var context = new ServerCallContext(); // TODO(jtattermusch): initialize the context await handler(context, request, responseStream); diff --git a/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs b/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs index d9ee0c815b2..3fccb88abba 100644 --- a/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs +++ b/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs @@ -33,6 +33,7 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace Grpc.Core.Internal @@ -42,17 +43,41 @@ namespace Grpc.Core.Internal where TResponse : class { readonly AsyncCallServer call; + TRequest current; public ServerRequestStream(AsyncCallServer call) { this.call = call; } - public Task ReadNext() + public TRequest Current { + get + { + if (current == null) + { + throw new InvalidOperationException("No current element is available."); + } + return current; + } + } + + public async Task MoveNext(CancellationToken token) + { + if (token != CancellationToken.None) + { + throw new InvalidOperationException("Cancellation of individual reads is not supported."); + } var taskSource = new AsyncCompletionTaskSource(); call.StartReadMessage(taskSource.CompletionDelegate); - return taskSource.Task; + var result = await taskSource.Task; + this.current = result; + return result != null; + } + + public void Dispose() + { + // TODO(jtattermusch): implement the semantics of stream disposal. } } } diff --git a/src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs b/src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs index 731ea2be81b..7a1c016ae20 100644 --- a/src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs @@ -39,9 +39,6 @@ using Grpc.Core.Utils; namespace Grpc.Core.Internal { - // TODO: we need to make sure that the delegates are not collected before invoked. - //internal delegate void ServerShutdownCallbackDelegate(bool success); - /// /// grpc_server from grpc/grpc.h /// diff --git a/src/csharp/Grpc.Core/ServerCallContext.cs b/src/csharp/Grpc.Core/ServerCallContext.cs index e873b3e88a7..bc9a499c518 100644 --- a/src/csharp/Grpc.Core/ServerCallContext.cs +++ b/src/csharp/Grpc.Core/ServerCallContext.cs @@ -42,7 +42,6 @@ namespace Grpc.Core /// public sealed class ServerCallContext { - // TODO(jtattermusch): add cancellationToken // TODO(jtattermusch): add deadline info diff --git a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs index f915155f8a4..a4f8989b305 100644 --- a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs +++ b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs @@ -49,14 +49,9 @@ namespace Grpc.Core.Utils public static async Task ForEach(this IAsyncStreamReader streamReader, Func asyncAction) where T : class { - while (true) + while (await streamReader.MoveNext()) { - var elem = await streamReader.ReadNext(); - if (elem == null) - { - break; - } - await asyncAction(elem); + await asyncAction(streamReader.Current); } } @@ -67,32 +62,27 @@ namespace Grpc.Core.Utils where T : class { var result = new List(); - while (true) + while (await streamReader.MoveNext()) { - var elem = await streamReader.ReadNext(); - if (elem == null) - { - break; - } - result.Add(elem); + result.Add(streamReader.Current); } return result; } /// /// Writes all elements from given enumerable to the stream. - /// Closes the stream afterwards unless close = false. + /// Completes the stream afterwards unless close = false. /// - public static async Task WriteAll(this IClientStreamWriter streamWriter, IEnumerable elements, bool close = true) + public static async Task WriteAll(this IClientStreamWriter streamWriter, IEnumerable elements, bool complete = true) where T : class { foreach (var element in elements) { await streamWriter.Write(element); } - if (close) + if (complete) { - await streamWriter.Close(); + await streamWriter.Complete(); } } diff --git a/src/csharp/Grpc.Core/packages.config b/src/csharp/Grpc.Core/packages.config index 71967de56e5..fb7eaaeeda1 100644 --- a/src/csharp/Grpc.Core/packages.config +++ b/src/csharp/Grpc.Core/packages.config @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj index 87ccf07dd8b..6e84add42ba 100644 --- a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj +++ b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj @@ -37,6 +37,10 @@ ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + + False + ..\packages\Ix-Async.1.2.3\lib\net45\System.Interactive.Async.dll + diff --git a/src/csharp/Grpc.Examples.Tests/packages.config b/src/csharp/Grpc.Examples.Tests/packages.config index 4d6ec63b3cd..cc6e9af40f6 100644 --- a/src/csharp/Grpc.Examples.Tests/packages.config +++ b/src/csharp/Grpc.Examples.Tests/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/src/csharp/Grpc.Examples/Grpc.Examples.csproj b/src/csharp/Grpc.Examples/Grpc.Examples.csproj index 2c5019c214b..5ce490f4034 100644 --- a/src/csharp/Grpc.Examples/Grpc.Examples.csproj +++ b/src/csharp/Grpc.Examples/Grpc.Examples.csproj @@ -35,6 +35,9 @@ ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + + ..\packages\Ix-Async.1.2.3\lib\net45\System.Interactive.Async.dll + diff --git a/src/csharp/Grpc.Examples/packages.config b/src/csharp/Grpc.Examples/packages.config index 51c17bcd5e7..4c8d60fa62a 100644 --- a/src/csharp/Grpc.Examples/packages.config +++ b/src/csharp/Grpc.Examples/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj index 1ca3dd24e1c..b3a0a2917be 100644 --- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj +++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj @@ -54,6 +54,9 @@ ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + + ..\packages\Ix-Async.1.2.3\lib\net45\System.Interactive.Async.dll + diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs index 02f8a369def..d9076996981 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs @@ -256,48 +256,45 @@ namespace Grpc.IntegrationTesting var call = client.FullDuplexCall(); - StreamingOutputCallResponse response; - await call.RequestStream.Write(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) .SetPayload(CreateZerosPayload(27182)).Build()); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); - Assert.AreEqual(31415, response.Payload.Body.Length); + Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); + Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); await call.RequestStream.Write(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(9)) .SetPayload(CreateZerosPayload(8)).Build()); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); - Assert.AreEqual(9, response.Payload.Body.Length); + Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); + Assert.AreEqual(9, call.ResponseStream.Current.Payload.Body.Length); await call.RequestStream.Write(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(2653)) .SetPayload(CreateZerosPayload(1828)).Build()); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); - Assert.AreEqual(2653, response.Payload.Body.Length); + Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); + Assert.AreEqual(2653, call.ResponseStream.Current.Payload.Body.Length); await call.RequestStream.Write(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(58979)) .SetPayload(CreateZerosPayload(45904)).Build()); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); - Assert.AreEqual(58979, response.Payload.Body.Length); + Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); + Assert.AreEqual(58979, call.ResponseStream.Current.Payload.Body.Length); - await call.RequestStream.Close(); + await call.RequestStream.Complete(); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(null, response); + Assert.IsFalse(await call.ResponseStream.MoveNext()); Console.WriteLine("Passed!"); }).Wait(); @@ -309,7 +306,7 @@ namespace Grpc.IntegrationTesting { Console.WriteLine("running empty_stream"); var call = client.FullDuplexCall(); - await call.Close(); + await call.RequestStream.Complete(); var responseList = await call.ResponseStream.ToList(); Assert.AreEqual(0, responseList.Count); @@ -392,22 +389,20 @@ namespace Grpc.IntegrationTesting var cts = new CancellationTokenSource(); var call = client.FullDuplexCall(cts.Token); - StreamingOutputCallResponse response; - await call.RequestStream.Write(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) .SetPayload(CreateZerosPayload(27182)).Build()); - response = await call.ResponseStream.ReadNext(); - Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); - Assert.AreEqual(31415, response.Payload.Body.Length); + Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); + Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); cts.Cancel(); try { - response = await call.ResponseStream.ReadNext(); + await call.ResponseStream.MoveNext(); Assert.Fail(); } catch (RpcException e) diff --git a/src/csharp/Grpc.IntegrationTesting/packages.config b/src/csharp/Grpc.IntegrationTesting/packages.config index e33b6e3e464..291b7b8599a 100644 --- a/src/csharp/Grpc.IntegrationTesting/packages.config +++ b/src/csharp/Grpc.IntegrationTesting/packages.config @@ -3,6 +3,7 @@ + From f233d968d263b63f16f8f5a62c22ecad57ae8478 Mon Sep 17 00:00:00 2001 From: Nick Gauthier Date: Wed, 20 May 2015 14:02:50 -0400 Subject: [PATCH 072/217] Encapsulate logger within GRPC module --- src/ruby/bin/apis/pubsub_demo.rb | 4 +-- src/ruby/bin/interop/interop_client.rb | 6 ++-- src/ruby/bin/interop/interop_server.rb | 8 ++--- src/ruby/bin/math_client.rb | 44 ++++++++++++------------ src/ruby/bin/math_server.rb | 8 ++--- src/ruby/bin/noproto_client.rb | 8 ++--- src/ruby/bin/noproto_server.rb | 6 ++-- src/ruby/lib/grpc/generic/active_call.rb | 10 +++--- src/ruby/lib/grpc/generic/bidi_call.rb | 22 ++++++------ src/ruby/lib/grpc/generic/rpc_desc.rb | 14 ++++---- src/ruby/lib/grpc/generic/rpc_server.rb | 28 +++++++-------- src/ruby/lib/grpc/generic/service.rb | 8 ++--- src/ruby/lib/grpc/logconfig.rb | 5 ++- src/ruby/spec/generic/rpc_server_spec.rb | 4 +-- 14 files changed, 89 insertions(+), 86 deletions(-) diff --git a/src/ruby/bin/apis/pubsub_demo.rb b/src/ruby/bin/apis/pubsub_demo.rb index 6d69b0f21e5..a039d036ace 100755 --- a/src/ruby/bin/apis/pubsub_demo.rb +++ b/src/ruby/bin/apis/pubsub_demo.rb @@ -79,7 +79,7 @@ end def publisher_stub(opts) address = "#{opts.host}:#{opts.port}" stub_clz = Tech::Pubsub::PublisherService::Stub # shorter - logger.info("... access PublisherService at #{address}") + GRPC.logger.info("... access PublisherService at #{address}") stub_clz.new(address, creds: ssl_creds, update_metadata: auth_proc(opts), GRPC::Core::Channel::SSL_TARGET => opts.host) @@ -89,7 +89,7 @@ end def subscriber_stub(opts) address = "#{opts.host}:#{opts.port}" stub_clz = Tech::Pubsub::SubscriberService::Stub # shorter - logger.info("... access SubscriberService at #{address}") + GRPC.logger.info("... access SubscriberService at #{address}") stub_clz.new(address, creds: ssl_creds, update_metadata: auth_proc(opts), GRPC::Core::Channel::SSL_TARGET => opts.host) diff --git a/src/ruby/bin/interop/interop_client.rb b/src/ruby/bin/interop/interop_client.rb index a3889247225..8df03ffb3cd 100755 --- a/src/ruby/bin/interop/interop_client.rb +++ b/src/ruby/bin/interop/interop_client.rb @@ -70,7 +70,7 @@ end # loads the certificates used to access the test server securely. def load_prod_cert fail 'could not find a production cert' if ENV['SSL_CERT_FILE'].nil? - logger.info("loading prod certs from #{ENV['SSL_CERT_FILE']}") + GRPC.logger.info("loading prod certs from #{ENV['SSL_CERT_FILE']}") File.open(ENV['SSL_CERT_FILE']).read end @@ -115,10 +115,10 @@ def create_stub(opts) stub_opts[:update_metadata] = auth_creds.updater_proc end - logger.info("... connecting securely to #{address}") + GRPC.logger.info("... connecting securely to #{address}") Grpc::Testing::TestService::Stub.new(address, **stub_opts) else - logger.info("... connecting insecurely to #{address}") + GRPC.logger.info("... connecting insecurely to #{address}") Grpc::Testing::TestService::Stub.new(address) end end diff --git a/src/ruby/bin/interop/interop_server.rb b/src/ruby/bin/interop/interop_server.rb index 72570d92f3c..78cb8dd8364 100755 --- a/src/ruby/bin/interop/interop_server.rb +++ b/src/ruby/bin/interop/interop_server.rb @@ -129,13 +129,13 @@ class TestTarget < Grpc::Testing::TestService::Service Thread.new do begin reqs.each do |req| - logger.info("read #{req.inspect}") + GRPC.logger.info("read #{req.inspect}") resp_size = req.response_parameters[0].size resp = cls.new(payload: Payload.new(type: req.response_type, body: nulls(resp_size))) q.push(resp) end - logger.info('finished reads') + GRPC.logger.info('finished reads') q.push(self) rescue StandardError => e q.push(e) # share the exception with the enumerator @@ -179,10 +179,10 @@ def main s = GRPC::RpcServer.new if opts['secure'] s.add_http2_port(host, test_server_creds) - logger.info("... running securely on #{host}") + GRPC.logger.info("... running securely on #{host}") else s.add_http2_port(host) - logger.info("... running insecurely on #{host}") + GRPC.logger.info("... running insecurely on #{host}") end s.handle(TestTarget) s.run_till_terminated diff --git a/src/ruby/bin/math_client.rb b/src/ruby/bin/math_client.rb index db254efb002..6319cda3091 100755 --- a/src/ruby/bin/math_client.rb +++ b/src/ruby/bin/math_client.rb @@ -46,51 +46,51 @@ require 'optparse' include GRPC::Core::TimeConsts def do_div(stub) - logger.info('request_response') - logger.info('----------------') + GRPC.logger.info('request_response') + GRPC.logger.info('----------------') req = Math::DivArgs.new(dividend: 7, divisor: 3) - logger.info("div(7/3): req=#{req.inspect}") + GRPC.logger.info("div(7/3): req=#{req.inspect}") resp = stub.div(req, INFINITE_FUTURE) - logger.info("Answer: #{resp.inspect}") - logger.info('----------------') + GRPC.logger.info("Answer: #{resp.inspect}") + GRPC.logger.info('----------------') end def do_sum(stub) # to make client streaming requests, pass an enumerable of the inputs - logger.info('client_streamer') - logger.info('---------------') + GRPC.logger.info('client_streamer') + GRPC.logger.info('---------------') reqs = [1, 2, 3, 4, 5].map { |x| Math::Num.new(num: x) } - logger.info("sum(1, 2, 3, 4, 5): reqs=#{reqs.inspect}") + GRPC.logger.info("sum(1, 2, 3, 4, 5): reqs=#{reqs.inspect}") resp = stub.sum(reqs) # reqs.is_a?(Enumerable) - logger.info("Answer: #{resp.inspect}") - logger.info('---------------') + GRPC.logger.info("Answer: #{resp.inspect}") + GRPC.logger.info('---------------') end def do_fib(stub) - logger.info('server_streamer') - logger.info('----------------') + GRPC.logger.info('server_streamer') + GRPC.logger.info('----------------') req = Math::FibArgs.new(limit: 11) - logger.info("fib(11): req=#{req.inspect}") + GRPC.logger.info("fib(11): req=#{req.inspect}") resp = stub.fib(req, INFINITE_FUTURE) resp.each do |r| - logger.info("Answer: #{r.inspect}") + GRPC.logger.info("Answer: #{r.inspect}") end - logger.info('----------------') + GRPC.logger.info('----------------') end def do_div_many(stub) - logger.info('bidi_streamer') - logger.info('-------------') + GRPC.logger.info('bidi_streamer') + GRPC.logger.info('-------------') reqs = [] reqs << Math::DivArgs.new(dividend: 7, divisor: 3) reqs << Math::DivArgs.new(dividend: 5, divisor: 2) reqs << Math::DivArgs.new(dividend: 7, divisor: 2) - logger.info("div(7/3), div(5/2), div(7/2): reqs=#{reqs.inspect}") + GRPC.logger.info("div(7/3), div(5/2), div(7/2): reqs=#{reqs.inspect}") resp = stub.div_many(reqs, 10) resp.each do |r| - logger.info("Answer: #{r.inspect}") + GRPC.logger.info("Answer: #{r.inspect}") end - logger.info('----------------') + GRPC.logger.info('----------------') end def load_test_certs @@ -132,10 +132,10 @@ def main p stub_opts p options['host'] stub = Math::Math::Stub.new(options['host'], **stub_opts) - logger.info("... connecting securely on #{options['host']}") + GRPC.logger.info("... connecting securely on #{options['host']}") else stub = Math::Math::Stub.new(options['host']) - logger.info("... connecting insecurely on #{options['host']}") + GRPC.logger.info("... connecting insecurely on #{options['host']}") end do_div(stub) diff --git a/src/ruby/bin/math_server.rb b/src/ruby/bin/math_server.rb index e46d9c671f9..b41ccf6ce16 100755 --- a/src/ruby/bin/math_server.rb +++ b/src/ruby/bin/math_server.rb @@ -128,13 +128,13 @@ class Calculator < Math::Math::Service t = Thread.new do begin requests.each do |req| - logger.info("read #{req.inspect}") + GRPC.logger.info("read #{req.inspect}") resp = Math::DivReply.new(quotient: req.dividend / req.divisor, remainder: req.dividend % req.divisor) q.push(resp) Thread.pass # let the internal Bidi threads run end - logger.info('finished reads') + GRPC.logger.info('finished reads') q.push(self) rescue StandardError => e q.push(e) # share the exception with the enumerator @@ -176,10 +176,10 @@ def main s = GRPC::RpcServer.new if options['secure'] s.add_http2_port(options['host'], test_server_creds) - logger.info("... running securely on #{options['host']}") + GRPC.logger.info("... running securely on #{options['host']}") else s.add_http2_port(options['host']) - logger.info("... running insecurely on #{options['host']}") + GRPC.logger.info("... running insecurely on #{options['host']}") end s.handle(Calculator) diff --git a/src/ruby/bin/noproto_client.rb b/src/ruby/bin/noproto_client.rb index f3fd1103478..390a9c59c3b 100755 --- a/src/ruby/bin/noproto_client.rb +++ b/src/ruby/bin/noproto_client.rb @@ -94,15 +94,15 @@ def main p stub_opts p options['host'] stub = NoProtoStub.new(options['host'], **stub_opts) - logger.info("... connecting securely on #{options['host']}") + GRPC.logger.info("... connecting securely on #{options['host']}") else stub = NoProtoStub.new(options['host']) - logger.info("... connecting insecurely on #{options['host']}") + GRPC.logger.info("... connecting insecurely on #{options['host']}") end - logger.info('sending a NoProto rpc') + GRPC.logger.info('sending a NoProto rpc') resp = stub.an_rpc(NoProtoMsg.new) - logger.info("got a response: #{resp}") + GRPC.logger.info("got a response: #{resp}") end main diff --git a/src/ruby/bin/noproto_server.rb b/src/ruby/bin/noproto_server.rb index f71daeadb37..90baaf9a2e8 100755 --- a/src/ruby/bin/noproto_server.rb +++ b/src/ruby/bin/noproto_server.rb @@ -63,7 +63,7 @@ class NoProto < NoProtoService end def an_rpc(req, _call) - logger.info('echo service received a request') + GRPC.logger.info('echo service received a request') req end end @@ -98,10 +98,10 @@ def main s = GRPC::RpcServer.new if options['secure'] s.add_http2_port(options['host'], test_server_creds) - logger.info("... running securely on #{options['host']}") + GRPC.logger.info("... running securely on #{options['host']}") else s.add_http2_port(options['host']) - logger.info("... running insecurely on #{options['host']}") + GRPC.logger.info("... running insecurely on #{options['host']}") end s.handle(NoProto) diff --git a/src/ruby/lib/grpc/generic/active_call.rb b/src/ruby/lib/grpc/generic/active_call.rb index 947c39cd226..5f7beb5ab1e 100644 --- a/src/ruby/lib/grpc/generic/active_call.rb +++ b/src/ruby/lib/grpc/generic/active_call.rb @@ -188,7 +188,7 @@ module GRPC # @param marshalled [false, true] indicates if the object is already # marshalled. def remote_send(req, marshalled = false) - logger.debug("sending #{req}, marshalled? #{marshalled}") + GRPC.logger.debug("sending #{req}, marshalled? #{marshalled}") if marshalled payload = req else @@ -230,14 +230,14 @@ module GRPC @call.metadata = batch_result.metadata @metadata_tag = nil end - logger.debug("received req: #{batch_result}") + GRPC.logger.debug("received req: #{batch_result}") unless batch_result.nil? || batch_result.message.nil? - logger.debug("received req.to_s: #{batch_result.message}") + GRPC.logger.debug("received req.to_s: #{batch_result.message}") res = @unmarshal.call(batch_result.message) - logger.debug("received_req (unmarshalled): #{res.inspect}") + GRPC.logger.debug("received_req (unmarshalled): #{res.inspect}") return res end - logger.debug('found nil; the final response has been sent') + GRPC.logger.debug('found nil; the final response has been sent') nil end diff --git a/src/ruby/lib/grpc/generic/bidi_call.rb b/src/ruby/lib/grpc/generic/bidi_call.rb index 4ca3004d6f0..67143d40cf5 100644 --- a/src/ruby/lib/grpc/generic/bidi_call.rb +++ b/src/ruby/lib/grpc/generic/bidi_call.rb @@ -115,10 +115,10 @@ module GRPC return enum_for(:each_queued_msg) unless block_given? count = 0 loop do - logger.debug("each_queued_msg: msg##{count}") + GRPC.logger.debug("each_queued_msg: msg##{count}") count += 1 req = @readq.pop - logger.debug("each_queued_msg: req = #{req}") + GRPC.logger.debug("each_queued_msg: req = #{req}") throw req if req.is_a? StandardError break if req.equal?(END_OF_READS) yield req @@ -134,22 +134,22 @@ module GRPC begin count = 0 requests.each do |req| - logger.debug("bidi-write_loop: #{count}") + GRPC.logger.debug("bidi-write_loop: #{count}") count += 1 payload = @marshal.call(req) @call.run_batch(@cq, write_tag, INFINITE_FUTURE, SEND_MESSAGE => payload) end if is_client - logger.debug("bidi-write-loop: sent #{count}, waiting to finish") + GRPC.logger.debug("bidi-write-loop: sent #{count}, waiting") batch_result = @call.run_batch(@cq, write_tag, INFINITE_FUTURE, SEND_CLOSE_FROM_CLIENT => nil, RECV_STATUS_ON_CLIENT => nil) batch_result.check_status end rescue StandardError => e - logger.warn('bidi-write_loop: failed') - logger.warn(e) + GRPC.logger.warn('bidi-write_loop: failed') + GRPC.logger.warn(e) raise e end end @@ -164,7 +164,7 @@ module GRPC # queue the initial read before beginning the loop loop do - logger.debug("bidi-read_loop: #{count}") + GRPC.logger.debug("bidi-read_loop: #{count}") count += 1 # TODO: ensure metadata is read if available, currently it's not batch_result = @call.run_batch(@cq, read_tag, INFINITE_FUTURE, @@ -172,19 +172,19 @@ module GRPC # handle the next message if batch_result.message.nil? @readq.push(END_OF_READS) - logger.debug('bidi-read-loop: done reading!') + GRPC.logger.debug('bidi-read-loop: done reading!') break end # push the latest read onto the queue and continue reading - logger.debug("received req: #{batch_result.message}") + GRPC.logger.debug("received req: #{batch_result.message}") res = @unmarshal.call(batch_result.message) @readq.push(res) end rescue StandardError => e - logger.warn('bidi: read_loop failed') - logger.warn(e) + GRPC.logger.warn('bidi: read_loop failed') + GRPC.logger.warn(e) @readq.push(e) # let each_queued_msg terminate with this error end end diff --git a/src/ruby/lib/grpc/generic/rpc_desc.rb b/src/ruby/lib/grpc/generic/rpc_desc.rb index 10211ae2397..2fd61c5f7e7 100644 --- a/src/ruby/lib/grpc/generic/rpc_desc.rb +++ b/src/ruby/lib/grpc/generic/rpc_desc.rb @@ -84,22 +84,22 @@ module GRPC rescue BadStatus => e # this is raised by handlers that want GRPC to send an application error # code and detail message and some additional app-specific metadata. - logger.debug("app err: #{active_call}, status:#{e.code}:#{e.details}") + GRPC.logger.debug("app err:#{active_call}, status:#{e.code}:#{e.details}") send_status(active_call, e.code, e.details, **e.metadata) rescue Core::CallError => e # This is raised by GRPC internals but should rarely, if ever happen. # Log it, but don't notify the other endpoint.. - logger.warn("failed call: #{active_call}\n#{e}") + GRPC.logger.warn("failed call: #{active_call}\n#{e}") rescue Core::OutOfTime # This is raised when active_call#method.call exceeeds the deadline # event. Send a status of deadline exceeded - logger.warn("late call: #{active_call}") + GRPC.logger.warn("late call: #{active_call}") send_status(active_call, DEADLINE_EXCEEDED, 'late') rescue StandardError => e # This will usuaally be an unhandled error in the handling code. # Send back a UNKNOWN status to the client - logger.warn("failed handler: #{active_call}; sending status:UNKNOWN") - logger.warn(e) + GRPC.logger.warn("failed handler: #{active_call}; sending status:UNKNOWN") + GRPC.logger.warn(e) send_status(active_call, UNKNOWN, 'no reason given') end @@ -139,8 +139,8 @@ module GRPC details = 'Not sure why' if details.nil? active_client.send_status(code, details, code == OK, **kw) rescue StandardError => e - logger.warn("Could not send status #{code}:#{details}") - logger.warn(e) + GRPC.logger.warn("Could not send status #{code}:#{details}") + GRPC.logger.warn(e) end end end diff --git a/src/ruby/lib/grpc/generic/rpc_server.rb b/src/ruby/lib/grpc/generic/rpc_server.rb index de224660894..665c1444324 100644 --- a/src/ruby/lib/grpc/generic/rpc_server.rb +++ b/src/ruby/lib/grpc/generic/rpc_server.rb @@ -94,7 +94,7 @@ module GRPC def schedule(*args, &blk) fail 'already stopped' if @stopped return if blk.nil? - logger.info('schedule another job') + GRPC.logger.info('schedule another job') @jobs << [blk, args] end @@ -114,14 +114,14 @@ module GRPC # Stops the jobs in the pool def stop - logger.info('stopping, will wait for all the workers to exit') + GRPC.logger.info('stopping, will wait for all the workers to exit') @workers.size.times { schedule { throw :exit } } @stopped = true @stop_mutex.synchronize do # wait @keep_alive for works to stop @stop_cond.wait(@stop_mutex, @keep_alive) if @workers.size > 0 end forcibly_stop_workers - logger.info('stopped, all workers are shutdown') + GRPC.logger.info('stopped, all workers are shutdown') end protected @@ -129,14 +129,14 @@ module GRPC # Forcibly shutdown any threads that are still alive. def forcibly_stop_workers return unless @workers.size > 0 - logger.info("forcibly terminating #{@workers.size} worker(s)") + GRPC.logger.info("forcibly terminating #{@workers.size} worker(s)") @workers.each do |t| next unless t.alive? begin t.exit rescue StandardError => e - logger.warn('error while terminating a worker') - logger.warn(e) + GRPC.logger.warn('error while terminating a worker') + GRPC.logger.warn(e) end end end @@ -156,8 +156,8 @@ module GRPC blk, args = @jobs.pop blk.call(*args) rescue StandardError => e - logger.warn('Error in worker thread') - logger.warn(e) + GRPC.logger.warn('Error in worker thread') + GRPC.logger.warn(e) end end end @@ -365,7 +365,7 @@ module GRPC # the server to stop. def run if rpc_descs.size.zero? - logger.warn('did not run as no services were present') + GRPC.logger.warn('did not run as no services were present') return end @run_mutex.synchronize do @@ -381,9 +381,9 @@ module GRPC # Sends UNAVAILABLE if there are too many unprocessed jobs def available?(an_rpc) jobs_count, max = @pool.jobs_waiting, @max_waiting_requests - logger.info("waiting: #{jobs_count}, max: #{max}") + GRPC.logger.info("waiting: #{jobs_count}, max: #{max}") return an_rpc if @pool.jobs_waiting <= @max_waiting_requests - logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}") + GRPC.logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}") noop = proc { |x| x } c = ActiveCall.new(an_rpc.call, @cq, noop, noop, an_rpc.deadline) c.send_status(StatusCodes::UNAVAILABLE, '') @@ -394,7 +394,7 @@ module GRPC def found?(an_rpc) mth = an_rpc.method.to_sym return an_rpc if rpc_descs.key?(mth) - logger.warn("NOT_FOUND: #{an_rpc}") + GRPC.logger.warn("NOT_FOUND: #{an_rpc}") noop = proc { |x| x } c = ActiveCall.new(an_rpc.call, @cq, noop, noop, an_rpc.deadline) c.send_status(StatusCodes::NOT_FOUND, '') @@ -434,7 +434,7 @@ module GRPC return nil unless found?(an_rpc) # Create the ActiveCall - logger.info("deadline is #{an_rpc.deadline}; (now=#{Time.now})") + GRPC.logger.info("deadline is #{an_rpc.deadline}; (now=#{Time.now})") rpc_desc = rpc_descs[an_rpc.method.to_sym] ActiveCall.new(an_rpc.call, @cq, rpc_desc.marshal_proc, rpc_desc.unmarshal_proc(:input), @@ -474,7 +474,7 @@ module GRPC else handlers[route] = service.method(rpc_name) end - logger.info("handling #{route} with #{handlers[route]}") + GRPC.logger.info("handling #{route} with #{handlers[route]}") end end end diff --git a/src/ruby/lib/grpc/generic/service.rb b/src/ruby/lib/grpc/generic/service.rb index 8ea2c82f171..3b9743ea668 100644 --- a/src/ruby/lib/grpc/generic/service.rb +++ b/src/ruby/lib/grpc/generic/service.rb @@ -175,23 +175,23 @@ module GRPC route = "/#{route_prefix}/#{name}" if desc.request_response? define_method(mth_name) do |req, deadline = nil, **kw| - logger.debug("calling #{@host}:#{route}") + GRPC.logger.debug("calling #{@host}:#{route}") request_response(route, req, marshal, unmarshal, deadline, **kw) end elsif desc.client_streamer? define_method(mth_name) do |reqs, deadline = nil, **kw| - logger.debug("calling #{@host}:#{route}") + GRPC.logger.debug("calling #{@host}:#{route}") client_streamer(route, reqs, marshal, unmarshal, deadline, **kw) end elsif desc.server_streamer? define_method(mth_name) do |req, deadline = nil, **kw, &blk| - logger.debug("calling #{@host}:#{route}") + GRPC.logger.debug("calling #{@host}:#{route}") server_streamer(route, req, marshal, unmarshal, deadline, **kw, &blk) end else # is a bidi_stream define_method(mth_name) do |reqs, deadline = nil, **kw, &blk| - logger.debug("calling #{@host}:#{route}") + GRPC.logger.debug("calling #{@host}:#{route}") bidi_streamer(route, reqs, marshal, unmarshal, deadline, **kw, &blk) end diff --git a/src/ruby/lib/grpc/logconfig.rb b/src/ruby/lib/grpc/logconfig.rb index f36906fc45f..96812170ba8 100644 --- a/src/ruby/lib/grpc/logconfig.rb +++ b/src/ruby/lib/grpc/logconfig.rb @@ -29,7 +29,10 @@ require 'logging' -include Logging.globally # logger is accessible everywhere +# GRPC contains the General RPC module. +module GRPC + extend Logging.globally +end Logging.logger.root.appenders = Logging.appenders.stdout Logging.logger.root.level = :info diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb index 2cd21a15e34..640b0f656c6 100644 --- a/src/ruby/spec/generic/rpc_server_spec.rb +++ b/src/ruby/spec/generic/rpc_server_spec.rb @@ -69,7 +69,7 @@ class EchoService end def an_rpc(req, call) - logger.info('echo service received a request') + GRPC.logger.info('echo service received a request') call.output_metadata.update(@trailing_metadata) @received_md << call.metadata unless call.metadata.nil? req @@ -109,7 +109,7 @@ class SlowService end def an_rpc(req, call) - logger.info("starting a slow #{@delay} rpc") + GRPC.logger.info("starting a slow #{@delay} rpc") sleep @delay @received_md << call.metadata unless call.metadata.nil? req # send back the req as the response From dbfe2f437c532548ac3d4ecc21737fd6419a217f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 20 May 2015 11:59:20 -0700 Subject: [PATCH 073/217] Added cancel_after_first_response test --- .../Sample/SampleTests/RemoteProtoTests.m | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index 7e063fddb4e..4fbaf631685 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -269,4 +269,37 @@ [self waitForExpectationsWithTimeout:1 handler:nil]; } +- (void)testCancelAfterFirstResponseRPC { + __weak XCTestExpectation *expectation = [self expectationWithDescription:@"CancelAfterFirstResponse"]; + + // A buffered pipe to which we never write any value acts as a writer that just hangs. + GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init]; + + __block bool receivedResponse = false; + + id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:@21782 + requestedResponseSize:@31415]; + + [requestsBuffer writeValue:request]; + + __block ProtoRPC *call = [_service RPCToFullDuplexCallWithRequestsWriter:requestsBuffer + handler:^(BOOL done, + RMTStreamingOutputCallResponse *response, + NSError *error) { + if (receivedResponse) { + XCTAssert(done, @"Unexpected extra response %@", response); + XCTAssertEqual(error.code, GRPC_STATUS_CANCELLED); + [expectation fulfill]; + } else { + XCTAssertNil(error, @"Finished with unexpected error: %@", error); + XCTAssertFalse(done, @"Finished without response"); + XCTAssertNotNil(response); + receivedResponse = true; + [call cancel]; + } + }]; + [call start]; + [self waitForExpectationsWithTimeout:4 handler:nil]; +} + @end From 606129b655b3d7333d6ac5e19251a94fe3fa155d Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 20 May 2015 12:03:16 -0700 Subject: [PATCH 074/217] Fixed boolean variable --- .../examples/Sample/SampleTests/RemoteProtoTests.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index 4fbaf631685..bf1fb68339c 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -275,7 +275,7 @@ // A buffered pipe to which we never write any value acts as a writer that just hangs. GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init]; - __block bool receivedResponse = false; + __block BOOL receivedResponse = NO; id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:@21782 requestedResponseSize:@31415]; @@ -294,7 +294,7 @@ XCTAssertNil(error, @"Finished with unexpected error: %@", error); XCTAssertFalse(done, @"Finished without response"); XCTAssertNotNil(response); - receivedResponse = true; + receivedResponse = YES; [call cancel]; } }]; From 8166675a214c73a077c68ae3e860bf9f6a440008 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 20 May 2015 12:07:41 -0700 Subject: [PATCH 075/217] Fixed writer comment --- src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m index bf1fb68339c..8e0e11d23da 100644 --- a/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m +++ b/src/objective-c/examples/Sample/SampleTests/RemoteProtoTests.m @@ -272,7 +272,7 @@ - (void)testCancelAfterFirstResponseRPC { __weak XCTestExpectation *expectation = [self expectationWithDescription:@"CancelAfterFirstResponse"]; - // A buffered pipe to which we never write any value acts as a writer that just hangs. + // A buffered pipe to which we write a single value but never close GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init]; __block BOOL receivedResponse = NO; From a4cdf8aaad266984481c04f22db3b7baccbe31a0 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 12:33:01 -0700 Subject: [PATCH 076/217] Fix ASAN reported leak --- test/core/end2end/tests/max_message_length.c | 1 + 1 file changed, 1 insertion(+) diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c index cee8306213c..78502e4bb95 100644 --- a/test/core/end2end/tests/max_message_length.c +++ b/test/core/end2end/tests/max_message_length.c @@ -188,6 +188,7 @@ static void test_max_message_length(grpc_end2end_test_config config) { grpc_metadata_array_destroy(&trailing_metadata_recv); grpc_metadata_array_destroy(&request_metadata_recv); grpc_call_details_destroy(&call_details); + grpc_byte_buffer_destroy(request_payload); grpc_call_destroy(c); grpc_call_destroy(s); From a1001522c1cec27225cc5263caa6bdf1fe257c3e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 12:44:10 -0700 Subject: [PATCH 077/217] Fix memory leak --- .../tests/request_response_with_payload_and_call_creds.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c index 0ebea438c69..437345960ac 100644 --- a/test/core/end2end/tests/request_response_with_payload_and_call_creds.c +++ b/test/core/end2end/tests/request_response_with_payload_and_call_creds.c @@ -125,6 +125,8 @@ static void test_call_creds_failure(grpc_end2end_test_config config) { GPR_ASSERT(grpc_call_set_credentials(c, creds) != GRPC_CALL_OK); grpc_credentials_release(creds); + grpc_call_destroy(c); + end_test(&f); config.tear_down_data(&f); } From d4919d018f04425bab56693ce1541b0f96c5b0d3 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 16:08:18 -0700 Subject: [PATCH 078/217] Enforce invariant of not performing reads after stream closure --- src/core/surface/call.c | 4 ++-- src/core/transport/chttp2_transport.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 50df36cae9f..659f7d26c30 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -401,6 +401,7 @@ static int is_op_live(grpc_call *call, grpc_ioreq_op op) { static void lock(grpc_call *call) { gpr_mu_lock(&call->mu); } static int need_more_data(grpc_call *call) { + if (call->read_state == READ_STATE_STREAM_CLOSED) return 0; return is_op_live(call, GRPC_IOREQ_RECV_INITIAL_METADATA) || (is_op_live(call, GRPC_IOREQ_RECV_MESSAGE) && grpc_bbq_empty(&call->incoming_queue)) || is_op_live(call, GRPC_IOREQ_RECV_TRAILING_METADATA) || @@ -408,8 +409,7 @@ static int need_more_data(grpc_call *call) { is_op_live(call, GRPC_IOREQ_RECV_STATUS_DETAILS) || (is_op_live(call, GRPC_IOREQ_RECV_CLOSE) && grpc_bbq_empty(&call->incoming_queue)) || - (call->write_state == WRITE_STATE_INITIAL && !call->is_client && - call->read_state < READ_STATE_GOT_INITIAL_METADATA); + (call->write_state == WRITE_STATE_INITIAL && !call->is_client); } static void unlock(grpc_call *call) { diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c index 678b3610363..9dc5f233899 100644 --- a/src/core/transport/chttp2_transport.c +++ b/src/core/transport/chttp2_transport.c @@ -1142,6 +1142,7 @@ static void perform_op_locked(transport *t, stream *s, grpc_transport_op *op) { if (op->recv_ops) { GPR_ASSERT(s->incoming_sopb == NULL); + GPR_ASSERT(s->published_state != GRPC_STREAM_CLOSED); s->recv_done_closure.cb = op->on_done_recv; s->recv_done_closure.user_data = op->recv_user_data; s->incoming_sopb = op->recv_ops; From c9d0382e3d53c2d21bcf8ec24242f9ab80ef92f6 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 16:08:45 -0700 Subject: [PATCH 079/217] Zombie, then delete abandoned but queued incoming calls --- src/core/surface/server.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 351ed5b7586..d75af7291bb 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -427,6 +427,8 @@ static void server_on_recv(void *ptr, int success) { grpc_iomgr_add_callback(kill_zombie, elem); } else if (calld->state == PENDING) { call_list_remove(calld, PENDING_START); + calld->state = ZOMBIED; + grpc_iomgr_add_callback(kill_zombie, elem); } gpr_mu_unlock(&chand->server->mu); break; From 99d5c106f4e36792fdc85369fa2d426edff726f9 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 16:19:09 -0700 Subject: [PATCH 080/217] Fix leaks in dualstack_socket_test --- test/core/end2end/dualstack_socket_test.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c index be3c7ca17f7..06614a93e77 100644 --- a/test/core/end2end/dualstack_socket_test.c +++ b/test/core/end2end/dualstack_socket_test.c @@ -211,6 +211,9 @@ void test_connect(const char *server_host, const char *client_host, int port, grpc_completion_queue_shutdown(server_cq); drain_cq(server_cq); grpc_completion_queue_destroy(server_cq); + + grpc_call_details_destroy(&call_details); + gpr_free(details); } int main(int argc, char **argv) { From dc6e86bb7ac28822fe72394a5cf4ebb5d5a9be32 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 17:11:44 -0700 Subject: [PATCH 081/217] Kick the tire down the road instead of blocking to free up threads --- src/core/iomgr/pollset_posix.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 4d1bcad9e27..ab1af0d4eec 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -258,7 +258,6 @@ static void unary_poll_do_promote(void *args, int success) { grpc_pollset *pollset = up_args->pollset; grpc_fd *fd = up_args->fd; int do_shutdown_cb = 0; - gpr_free(up_args); /* * This is quite tricky. There are a number of cases to keep in mind here: @@ -273,8 +272,12 @@ static void unary_poll_do_promote(void *args, int success) { /* First we need to ensure that nobody is polling concurrently */ while (pollset->counter != 0) { grpc_pollset_kick(pollset); - gpr_cv_wait(&pollset->cv, &pollset->mu, gpr_inf_future); + grpc_iomgr_add_callback(unary_poll_do_promote, up_args); + gpr_mu_unlock(&pollset->mu); + return; } + + gpr_free(up_args); /* At this point the pollset may no longer be a unary poller. In that case * we should just call the right add function and be done. */ /* TODO(klempner): If we're not careful this could cause infinite recursion. From a605d334fbb294994940a540942544775e2b3b88 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 15 May 2015 14:42:54 -0700 Subject: [PATCH 082/217] Make cq tracing work again --- src/core/surface/completion_queue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 48910afda33..8c9ca48a059 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -275,14 +275,14 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); memset(&ret, 0, sizeof(ret)); ret.type = GRPC_QUEUE_TIMEOUT; - GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ev->base); + GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); return ret; } } gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); ret = ev->base; gpr_free(ev); - GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ev->base); + GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); return ret; } From 1c8f36c40b1696ee2fe62cd2d088e4de97e65b14 Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Thu, 21 May 2015 00:09:04 +0000 Subject: [PATCH 083/217] Fix mistaken method name: "append", not "add" This defect was originally introduced in Google-internal source control on 18 August 2014. Wow. Clearly unit test coverage is needed for this feature. --- src/python/src/grpc/framework/face/_calls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/src/grpc/framework/face/_calls.py b/src/python/src/grpc/framework/face/_calls.py index 75a550e3c7d..87edeb0f0e5 100644 --- a/src/python/src/grpc/framework/face/_calls.py +++ b/src/python/src/grpc/framework/face/_calls.py @@ -248,7 +248,7 @@ class _OperationFuture(future.Future): """See future.Future.add_done_callback for specification.""" with self._condition: if self._callbacks is not None: - self._callbacks.add(fn) + self._callbacks.append(fn) return callable_util.call_logging_exceptions(fn, _DONE_CALLBACK_LOG_MESSAGE, self) From 08116501cbe91dbf7b6a09ded111a4395c81a738 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Wed, 20 May 2015 17:27:23 -0700 Subject: [PATCH 084/217] Fix to work around the fact that Histogram isn't copyable. --- .../cpp/qps/async_streaming_ping_pong_test.cc | 4 ++-- test/cpp/qps/async_unary_ping_pong_test.cc | 4 ++-- test/cpp/qps/driver.cc | 23 ++++++++----------- test/cpp/qps/driver.h | 13 +++++------ test/cpp/qps/qps_driver.cc | 15 ++++++------ test/cpp/qps/qps_test.cc | 4 ++-- test/cpp/qps/sync_streaming_ping_pong_test.cc | 4 ++-- test/cpp/qps/sync_unary_ping_pong_test.cc | 4 ++-- 8 files changed, 33 insertions(+), 38 deletions(-) diff --git a/test/cpp/qps/async_streaming_ping_pong_test.cc b/test/cpp/qps/async_streaming_ping_pong_test.cc index a1822b7e156..d4871c0ba11 100644 --- a/test/cpp/qps/async_streaming_ping_pong_test.cc +++ b/test/cpp/qps/async_streaming_ping_pong_test.cc @@ -64,8 +64,8 @@ static void RunAsyncStreamingPingPong() { const auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); - ReportQPS(result); - ReportLatency(result); + ReportQPS(*result); + ReportLatency(*result); } } // namespace testing diff --git a/test/cpp/qps/async_unary_ping_pong_test.cc b/test/cpp/qps/async_unary_ping_pong_test.cc index 8b037a86562..35f188c9862 100644 --- a/test/cpp/qps/async_unary_ping_pong_test.cc +++ b/test/cpp/qps/async_unary_ping_pong_test.cc @@ -64,8 +64,8 @@ static void RunAsyncUnaryPingPong() { const auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); - ReportQPS(result); - ReportLatency(result); + ReportQPS(*result); + ReportLatency(*result); } } // namespace testing diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 83f70e612d7..7c84cfbe10c 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -75,13 +75,10 @@ static deque get_hosts(const string& name) { } } -ScenarioResult RunScenario(const ClientConfig& initial_client_config, - size_t num_clients, - const ServerConfig& server_config, - size_t num_servers, - int warmup_seconds, - int benchmark_seconds, - int spawn_local_worker_count) { +std::unique_ptr RunScenario( + const ClientConfig& initial_client_config, size_t num_clients, + const ServerConfig& server_config, size_t num_servers, int warmup_seconds, + int benchmark_seconds, int spawn_local_worker_count) { // ClientContext allocator (all are destroyed at scope exit) list contexts; auto alloc_context = [&contexts]() { @@ -205,9 +202,9 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, gpr_sleep_until(gpr_time_add(start, gpr_time_from_seconds(benchmark_seconds))); // Finish a run - ScenarioResult result; - result.client_config = result_client_config; - result.server_config = result_server_config; + std::unique_ptr result(new ScenarioResult); + result->client_config = result_client_config; + result->server_config = result_server_config; gpr_log(GPR_INFO, "Finishing"); for (auto server = servers.begin(); server != servers.end(); server++) { GPR_ASSERT(server->stream->Write(server_mark)); @@ -218,14 +215,14 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, for (auto server = servers.begin(); server != servers.end(); server++) { GPR_ASSERT(server->stream->Read(&server_status)); const auto& stats = server_status.stats(); - result.server_resources.push_back(ResourceUsage{ + result->server_resources.push_back(ResourceUsage{ stats.time_elapsed(), stats.time_user(), stats.time_system()}); } for (auto client = clients.begin(); client != clients.end(); client++) { GPR_ASSERT(client->stream->Read(&client_status)); const auto& stats = client_status.stats(); - result.latencies.MergeProto(stats.latencies()); - result.client_resources.push_back(ResourceUsage{ + result->latencies.MergeProto(stats.latencies()); + result->client_resources.push_back(ResourceUsage{ stats.time_elapsed(), stats.time_user(), stats.time_system()}); } diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h index 4c7d52f1ea7..5e9d4b3cb92 100644 --- a/test/cpp/qps/driver.h +++ b/test/cpp/qps/driver.h @@ -34,6 +34,8 @@ #ifndef TEST_QPS_DRIVER_H #define TEST_QPS_DRIVER_H +#include + #include "test/cpp/qps/histogram.h" #include "test/cpp/qps/qpstest.grpc.pb.h" @@ -53,13 +55,10 @@ struct ScenarioResult { ServerConfig server_config; }; -ScenarioResult RunScenario(const grpc::testing::ClientConfig& client_config, - size_t num_clients, - const grpc::testing::ServerConfig& server_config, - size_t num_servers, - int warmup_seconds, - int benchmark_seconds, - int spawn_local_worker_count); +std::unique_ptr RunScenario( + const grpc::testing::ClientConfig& client_config, size_t num_clients, + const grpc::testing::ServerConfig& server_config, size_t num_servers, + int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count); } // namespace testing } // namespace grpc diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc index fc8e04201cd..f49cd38b339 100644 --- a/test/cpp/qps/qps_driver.cc +++ b/test/cpp/qps/qps_driver.cc @@ -103,14 +103,13 @@ int main(int argc, char** argv) { FLAGS_server_threads < FLAGS_client_channels * FLAGS_outstanding_rpcs_per_channel)); - auto result = RunScenario(client_config, FLAGS_num_clients, - server_config, FLAGS_num_servers, - FLAGS_warmup_seconds, FLAGS_benchmark_seconds, - FLAGS_local_workers); - - ReportQPSPerCore(result, server_config); - ReportLatency(result); - ReportTimes(result); + const auto result = RunScenario( + client_config, FLAGS_num_clients, server_config, FLAGS_num_servers, + FLAGS_warmup_seconds, FLAGS_benchmark_seconds, FLAGS_local_workers); + + ReportQPSPerCore(*result, server_config); + ReportLatency(*result); + ReportTimes(*result); return 0; } diff --git a/test/cpp/qps/qps_test.cc b/test/cpp/qps/qps_test.cc index f567e4cf061..9a81d0fc90c 100644 --- a/test/cpp/qps/qps_test.cc +++ b/test/cpp/qps/qps_test.cc @@ -64,8 +64,8 @@ static void RunQPS() { const auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); - ReportQPSPerCore(result, server_config); - ReportLatency(result); + ReportQPSPerCore(*result, server_config); + ReportLatency(*result); } } // namespace testing diff --git a/test/cpp/qps/sync_streaming_ping_pong_test.cc b/test/cpp/qps/sync_streaming_ping_pong_test.cc index 48c7ff63e03..218306846b5 100644 --- a/test/cpp/qps/sync_streaming_ping_pong_test.cc +++ b/test/cpp/qps/sync_streaming_ping_pong_test.cc @@ -63,8 +63,8 @@ static void RunSynchronousStreamingPingPong() { const auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); - ReportQPS(result); - ReportLatency(result); + ReportQPS(*result); + ReportLatency(*result); } } // namespace testing diff --git a/test/cpp/qps/sync_unary_ping_pong_test.cc b/test/cpp/qps/sync_unary_ping_pong_test.cc index 4c4de6377b8..137ef79f2f8 100644 --- a/test/cpp/qps/sync_unary_ping_pong_test.cc +++ b/test/cpp/qps/sync_unary_ping_pong_test.cc @@ -63,8 +63,8 @@ static void RunSynchronousUnaryPingPong() { const auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); - ReportQPS(result); - ReportLatency(result); + ReportQPS(*result); + ReportLatency(*result); } } // namespace testing From 644cad6178badd4bc5411680c944eb244a3438c4 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 20 May 2015 17:57:54 -0700 Subject: [PATCH 085/217] Fix segfault exposed by Ruby --- src/core/surface/call.c | 1 + src/ruby/core | Bin 0 -> 79941632 bytes 2 files changed, 1 insertion(+) create mode 100644 src/ruby/core diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 50df36cae9f..e43634384a5 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -597,6 +597,7 @@ static void call_on_done_send(void *pc, int success) { finish_ioreq_op(call, GRPC_IOREQ_SEND_STATUS, success); finish_ioreq_op(call, GRPC_IOREQ_SEND_CLOSE, 1); } + call->send_ops.nops = 0; call->last_send_contains = 0; call->sending = 0; unlock(call); diff --git a/src/ruby/core b/src/ruby/core new file mode 100644 index 0000000000000000000000000000000000000000..6fac943e327cd913dfc95ffb34084faecf896dd7 GIT binary patch literal 79941632 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

MYx@78SLs$Fu;M|3x4;D7M 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�uaUY-FTnDS-@ja!ic&T&zkuQ3~FW)qt-ZtL4 z{A7Xo&2?~~c!?{OKGX^8HeUEyce3|!(GCY3eEQq(efc8Q2Z*0&EBAbOFImUG<^Rmo zMeCMo%rH~KiGA=c*%F$ zt?t|G)7QM_pf$U@?^hsxlGyp@y=2|Tzt_BvsrbB?mXAGX{b%CyUc$F}*QFEp@zn>{ z!GY?J{Z*#>P$&2!U+M#XMSs3+lHX73@1eZPf%@P&*f#Z0{Wte~s1skj@F%U09XIVh zahub=@{FG91H@0`sm?!rgmv_?{6Cxe=!j1rv3%@7>wh3VeFXmhtdEEEZb>KZ8_Lu79@wScE^<`lu+cb%A-#b+AXg3atJ#_k5@mU%c?!ubQlX9P`4b ze&X`4R}Y#|eSrAs%m1j4=mL6K{)47I%1?Lk(?_^3eC$E%zb-y~1pfc5kB8RUij({J z>VxZGMLd2_XYxm#;E#Bz5BQxoPNw(kOWQC1$S*n{Xh?4mKglzkUc8sAs*TFXWK0Ia#YpUud57U zlJa5D-E$hcR^-!T|xBM|i?_7NH-14ypt^c<8-U?3j( z+}1UDjz9W~-tfb@PVdotU-EjJq52i-4{dz$QV$j;AL?s&=ZP;~_|2nSyjAZ%(BEI4 zIcfX#uipOcHRT70pO*YHFDdu(O@7qYaq%-REx#uF4k`}p>f$pmDYyC2P@J^m)0=uQ z6p#DGru>m7_@lq%2mHnzqtkoGU(Npd;CHur+kze4c@@M@xvtZTc}Y3`Eq|=hJ6g~2 znU|K2J!t)>;xjMdTfGCtNjpBhsRtXk2pWWWu`e)-U&uTl@j zCcd`xAy0hq!f$QgTfFpl{_Plv*ASn1Nx9WKT;Ih>JHGs&9xS9U&zl-*hdjX_dXXRSTbhrfxu1Ex&6fPk zugDMT!9={y_Zb_yev>D@c;QFqyZoryU+8ah$qO#{Tlv`JS;`L(KiNjkKkEqPKK?kf zel*2r9kG1uLF+&Gu=CG40^jCGES+e_mmk!FE%I0Qk@d*=BTw*0f5{K{^=o^Zk2cdRS_@sU?3jvKjoS)=OhAjO(l1 zJxS{Yh@Ws%mnZDgl>7MO&3ciD&pvJW*n`%8Euu?MaHOnla9 z_*U<_bfO)f-qeF_jVJmx)ed=%Kl+Q_@Y5&zTkis$W7d@eU%b?V4aLXvm(F=e<-T~~ zw^r>fKdiom;$5dAUh2VEJoMz8hR(it;fFW&7jL5T;QAHuQV*7jm-Aao?Vz(SUij@v z{l#1Rn49NoR>Vs^m@7Ww%G3@zQ*QGYetp~i;%&;$DHZWj57x!w{=d}xMrU8V@bjg5 zi?_p5#~!r)OYuAViW;!< zFOnVY_|^;R!6y3ZoRn;-{Zr#$;~h`|{Myw{@2ckk^!Ix&@B59FFCY8fmh=Yk)0Ths z70P}5J&oSsRxW<_70bsSwEh$E*;n9Oy>rD$J3hUs2P5>=Ij<#uo>Ol1uE~ye ze0q246=yDedEYUf;QC9RC|aQzrTe&@lp?F z;__~bc!t9K%uXvde|)PtqQlXFx{?U3jAqrd14KR?ywch&P~8*fehnqTq02lZgC z_&7hs+i3kzxi4P$g`U?`#Y=y`e$=fep7-1itue|E5I;@%XI@h7ZAR_{!4(vB}bs0VA}@%|6btH~4m(O>eT!{4j7{D6O7v|#PaFAo3Q{**hv zg7}FhY5ikfslvz4jNYmEoq1{a*n{|QU+>Nrh4{=%;<9>|8W-B}=}mnH#Y5jv&+*A~ z{Lx?Zh97Ew?=`<4-suZ}xc>7?96d*RgY5&{?*rDi*ZQYCu>LK7rt}UEbo_?+22e!p-aX08G-7- zT>a$th~iIa{ZqLwUievibblXp-B-$!p1GoZe?$2J;-@M9%uCAA>kWJ}AA=oS{LD+s zZ^*ubilcsu%a2%m<|TZqccwUL$Cn?}gEjFuUl;O6p5TxEG9Tfm8;@@NyW@f<_g?py zhc=(4euDUkc653%FDb{r<bJ&6D42U`EcXI|pp>Rn1F+VSa4J(!8d z^RjTV>o0kZKjKAi`0++g?@+%_L_ItZ{>w|J$NqWSd-sf`H;7#>|KvI4K7MZWZi`Qz zTR!$6{%b#SdWZTxm^_DX^-ko6c6@qM50)BF&esk3BhT?if6)_uvf=3T9@=u=?z`^t z!>z_jZxBDVx*KouoO1kI{%oUnU3~J~^05c;pWf#5Zirt<7x-51mUN;WpWf7iiFlp& zQ}n$%d5%B&i{9|F^+%_7e)Q`5oqy(?-!Juh>>z&P-JIU!Ipz4b{KDv+iQma{H2@!b z(E4wRPoCr7>K#ib+VSa4J=oHCav#Zi4&*uhh!?%#=R5Yce%p9U#oMlUKZtrT6OZQ$ zyzddH+!rtW_Lq9g4;yd3i_3!r74cFJM&j{41@D)jvoBuw=~rC5RnJ>(y!BmOyk$ka z)Prrs%l$3y*>rSPz&0P?Cw=N0D9;yG#7jNcP(S&7U*69_XP>_CqlhO(ZSffg$_MpiVd_8r`^fu+#b(Z~vBbIV--kJL-UyDl&DH1n_hD+Q|I(Ec zurNN;#Y=whyZT_ZzpIBEC?)J`w24XHPS4S@9q(D-R;`?>o`|6MlHz#$VcZLAd;-?!`mmuggABesN8+@O}D~ z`?zr)fM9S~*U@tB14take34(WALAHZeDeuCBx3+J_H{aB`@7#$%YWdmbMx=U4B<#< z|9zPH@{>kVbN(fczfc&2jxc{a_q^E`-=NyXE;RohldX?UJ$lf7OY@ld9VpM_<_*6G zgI)b}_wQ(p_IYEh^?~)G${%*I{8c?qp?}M&1BLvtZZrPA{$ZExKf3 zi2uez?)gPqe9k@a86Wbmp13$^r%EsE>c=^~s?N98UsL{S`o6EqA9l5k`|}qKx&HC* zhE(~(E<3G1f4The@0?Wm!>%~CKYxt_UH`^w|MdAI&%x516Y4rYan2)O$alsa3^k6} zHN>~)F!-Hu)VMbcza>6#&@Oz&1q`G!b~Wih9F)UHXD~JVy7-@jRSF5 z{(uVLhugmScw-0O&L76R)PC<9Z|cF8`bWE|;-%k|TYrV@&XIx7AN62t+7AzQ`k)j3 z7$5o#zntjwsalV1yovmcK+sv3}MMbNZsQFJAcR9xmQU z-1OMA06q&mvge^V-MmVyHtG6 z$&_2Y3&lx0KE0_2WASLWEq~+*<>*Czz;Ex@+jQRo>T7Q|JmqWo9^N#&n+K&(E6{7PoBfKdN&j&?fCSj z9t_2!-KP9?@>~`47ri_DeMgty$3ObilofBh^O*&c^!q15{0GN6y~uOQ@o)L1(K{BO zJhy!8LE^wJ6Tg$^s<3(osf&|#e0oz4Hl#1-k5uiD=fpvO(YwR{bZ>gwcnkSSYtDl& zUh2VEJn|v@wCgu{;)@r4v(I=F`I%L5KTJJXDqim2T51QKeeuF?ex$ec!|Gc*#_7WE z{QLB!9?TUV=etbpptCPt`2EJ)lplU~-xn|SU|l@!|4PjlboRvyzulw0V;X-8^ljr{#mCf$G_zV@591j_!$>J>om3S zJNDvP|B3jl)9|g{IdQ5TpWfDA1WygOj(S~9y{xlWmj0`fK+;e z_z7k>y~uOQef%*-?^t~D-14ypt^Z7X@*KX^yLN($lXiT1QxE3Sm*ZAR_{o5wBySU>cOV;<#||glIt&dfk|U%b?VZN08JTzZ2@ymwGT3kLMlXXI;P1*%vST`tB~? zQ9u8epRpDBKs{IzuL5hS9d!1^3%`CqfBM!=b-Dx<@lp@wijTN5wS&%-+xZ4Rp4MNy zP5D_^@%=6JU|l@&H9F1p8=Zae!p~3cFWyvs_}yt={!$MH;xYbhU8A!vUikGx`-?Zs zln;78*cWf0dazJ@#MMwc=uG(=@$Y1KgL_E&NvGzxF_QeZ7IIzEX zGx_0n{e1dT57xxvd|7BeMQ2~U@XH?O8{_kpp^N_cLDrp5KOFaQ!7u@JD|KQ~>_O{47N20{E;X4qrc<_{9f||{@4#6`I|?!Jb%eddV}~$ZgKB{GA}9j@y8pzbMZU# zQVqbz9<=`3;xjMtZ}l#v6Yco)rXI}1Po#+%E}_=^3U zdN2}?^G5A#7cY6@jaPmehxHe4U4G(%X7cczgi7wvJ-mez&!|&Ys@|Sur7LWBfJjeALoqh4bPxQXQX!nyuey*%I zKT{8uikI)F>T~q(cB|YMFZ^EPWxk&H&i6lf{8tzLrOYRfylMkRo4DWUPS1CGCGVd) zQXk&E{|Nf{^E8oD@eA>D@$28-w~LQGi2ug3&VMO>TYUQ8wO*X|+P@!ku8Wg);-9$w zMDKQS6YuNm)0MB;W0!yM2WP*2?fZTqdjEbS@mhb`mz=-4ekc=v;XU2@%-GOH3>IJf z4u6s|QW2l$+6iuQyy&Oh{D2?g6gFmwFZ&F>u=PMUe~tnN%hjD8=-3pGIEs&V^PA#> zVc5+Nqyur3k2$^28=b*K3HgZOW}?D8WMpLM^rqT^e=o6?DP(7Tw` zosZOmb@9lLQvS%3){EWwMSj4K8~zT)zNcF;Sy^WXbxN?-chlD|%# z-|qN3%K*LclSpshdY#uP7hzqI%I$31o5HQMvho!7K~^4K8{zP-JTe*aCV z=7Z>~PM7$H?wm$B{w;s1x&KSW&pdqWLE^wqA%4^FyTKF@##%Hn25*s!^y_( z_X5as{Lx?ZhTrb-?*WHsNZ7d8^~)3oGcV~b-$TDo5Nmw+djZQEQ~`Fr`r_-Z{i@$z z(4YAPd#IsOyt?9UdVYT)yvns-yU`(b;mz(kxxryXUfkragDV|ow>WHyALi~F{rNj5 zu=Wk{6=(ah?rU^_@B91qmijdS!Qim2=bPULm}d3^LtA8*L&lT+d-GJ|H|2Jx&kW%! z?{~zpJ?0m7$$s5B56VCFnW?w)HP*N>jy7*6sJ#IpcIo#0J?|>yZ>HXNsPczheaHTu zSA~~4eJ)V^RsOImE_D8)iobuddN$;*t><}F{;=!UU!Zx$dtp`nu**Kx+x}$xm&)H5 z?JrgSusgQejo;@fqN`N24XiShtHx%k9E zIef+iY#DxAeB!WtbOvLy{<3}(hvlO$SQvgw<3Jpi&-wtrwReB{RU3BWw6J3SP!Hyc zFO*K1+M(aRc;Uyp^%rjwKl=B?eDi_#n83Pt#1(zh^&6cjCqK{^e)e@2ukU^g{u}16 z{EV&8mwGS|4_({l8h8}h?@ zYrc4?2Sf3Qi~9(4rrfR%@Ehm#7jLZlmDv^NN$SCt;$?mnY6qQt@pky<_7`s{KVijr zhI%j)kM%2=t#wi5zIfr6ea^RBet1vDmk-o~k$8#r@fiQ;8rN@h_Qoqe$;bO! zA5!_@?}~l;QV#~=F~8cnMrU8V@RKe3i#NR1=`yQgeV`sJ6d&h>hT1`AU%c?cKIdCY zei{|=QV%BLp=bPk*Kc(8#S6dRcr*Fo?}~l-Ks{I!4?Rm=qq8qw_(`AoMupRbzf1GQ zOFh_Be4NK}wS&⪼QD|^tYb15+C;&*SUV9voBuwVV~=7Lw?3otY_4N zp^fi)7cV;d;)S2=<@62oyz$l7{)6+cXwMI^{P3QfFCVA}TZ)(ctWZ03mE+Uy$MBn< z>~B3Q<%jp=eDP8bX5s}xzQ5qw7ccyN7gU-Hq;rAPFUEkO2 zR1q)rU|aE$uYB**(OCi8e1M;8eHiU|J<#_~ycgih2kOCw`pJ1ARXgbH(-(ff`WEuT z_v*fQsRv{6Sa10r4xN4R!tYn#MBn$-cpu7qPsVss50;9Td~K;6boRvyKkD=OLyhkp z-OpwRK7IM!PcT<}Jb&W*OLX?d3%}oZn~HaQ#eP9OSQign`5u;QU%VZDpTCEh>igcf zBHm8D>;myP-|&4hI{V_Kokox6U-I$6oey|$?mHR>loQ?iJ|KRYKh*yEHHVb@_{VEK z#4h-e<8|IcQ3ZVLLF+#jpZ8E`m;IS*zL)mBFW~c+>U|5^DVi?c=Du&!Ic zA%nwQ^Lu{6NWZT`_5T&3&pP|vuUHiShZ^G;DiFi$6xaph!dmq`)T>JIA9i|`E`#Z8vG(PcNuD&I` z@?W^?=;sb=YKQn4KYj-u4DN9D*tLGreNDO5Ke?^jE?o1wBl^#Kvb+2^{d*rXjQ+F> zqHi|W@q7LEKKSEh4 zEGvGbb(3|J@$mV>u6S>M{&M-_-x;X#*RdPx{Eha0vUaB%k8{+aDu38z@9NKACV%`c zd6hrxnk)C`uav)r=5>`n?CL8yf1`c>BGJA&UJFu{KkOopKk}G-v-1IeWkvtU6EHRB zf!a@99&m2KAM=TE2it~U7vG*M;4_Y3UE_k^hWK1t|BMUR6d${m_;n%W_(x|j(l`+> z=P2T^eDno#bAIAHM;!3&cr|ri>wNEJ&Y{FhJy)04B+V;+}1TZ;g9|jFZ|kC{ms8{p37sNYy0A*9xN0eKA-Z8r0_UTJKn2N{x$9*L_`{IRPuF+pUG<5&Ud+xq? zsRu*xI{A8!o44rfix+;dj*EA+=bc!7E|3FXywrm&`l);^)DAlP;)P#)(8W92_v1_X z;XO59ywro4c#J>K69Sd{;)UN_)y3QEd71NhuICnfPv?u5dNAU7l;Y!g2Ri%Wg-QPVctz zfVh18nMUur_&k@ieC)wa95QT(&vQx3pSR0W>o0S`x3-)AN%wpm#4gtTHF-lh@mu~y zCjLzPPTr^i_}GKie^Y$&2LD5R5SDtbVv2)#SG)Uq$}e2TeJa#n@{M|MP#>_%4spLT zVC&Og>0CyIkp9`{IRmsSo}qOvhdZAZ&ksW;tm1yBgDDQi72W!8a-Or8*`xlg|LjlS znkOFOTio@Xpg?W@@VvNG{|4xgLHaje=R=TuHs*``a!?-0gY2;G`9=Rvc=pC$@37wo zms(y6gpI$g=k@$M%5((2PrvBDTwV=8FgUF1NY5WY;xOim{F40=$LQi)&(MQ)7Hmm} zICambqXkYEzGtL;`1c>Z@qw@0aQ0@2<}Zj{@@vOu-=o~ezr^epx%ljRmXAGX{kO$u z--AD>525PeQ%`&Y6bKvlUOn=BwVdTJOKx<}Ta6w3-7dXz>caBN_3_dNtnci;Ukn~{ z`mnFkjF0~<>C+HD7N339^05c;AHQSgk*^Li@!41559&ia-^B-?dg2?PK$!ea`bd{5 zeeTrX$ARHi-M?GWl>c%!=_Nn-Uv6br0Jc`>UN?f@xcD=*L%8r)5+5wz(an#=Cl1R$ z;$5x;%nopT>@)F+!}7^HFi<{X*A$;PC?|f#1q@9;!-v&>;!p$d>))KT#hf$mds|KU z3F0RaKQVFn_*dEaD}L_bV-MoLUUT``7Qb!yg9@;%{Dn{4#5X{Juyx7k@{@MKCi7K# zW{)_187JJ~|LF&hIkWlndY3NP+MTCC?3&^SYL{{!{|2LP@LT6U_VBR>@t?iZ=^Klm z8UCOGi4`Aw8=uuT|HkO_rCl&Y59!-heB`n9|H{xSYwokstR^v%U5kKv_Pk|?{fMEZRNk=qi>-0 z;oJ7DzRe3={uaW@{Y(9!{kF!N{U%p@CO-UcapFr$AF|2QXNS@kgrDmEq1_|@w?^MWeDauf@sB-d{g>jC$MA>vAPk>! zd6d5Dkm{LBc0aGUR?mwTe!}hN++Q`d@4*|?2kh#%cehJ@{(Dzm^?sOcJA)6Y-L`n~ ze>;BkN_YG8FMr9ExBu#}`45NLLWkvx4)f<75`X+RcU_Y`?blv#tL z0SE?%bzEGtX{zj|Ui!cB8+{Ps*EE7pDkhmi4H{==R^w;v)zpzWi zC(kH{k3DGp7vhs=@U32@bfujty*hRaU4EtK-#jueU-_56p}^PcNWAyY+x^vNZg}@~ zW26^|ZTNTXLyCuTA3tD!mti74d1m{auh{_#F@@QfP=&ZX>c=)rglr~tdxOQY)_{!;nlz0)dx*cC7Kw!YCn z_Mf)=HFRT8xo=UTc*<>{{~I>-f>Xru^|9Zk0dm`t=v-KIKcw zhbn*Al@Ikde&KUYPu%H;)UP7tG9UR z?-hqVlOFShO~_O{4<9Q+HTs2_zZfaa;$EP>-U|l@o;`tmciUVZUW52oS~7tg236UuG8@Y{3qk^8)= zc;PSk?gu~c%jOmzn5O&y@e}{k<9 z^rjwcEB`oe@cjXKfV_cE*_l;hv>$C>;n#b+I{eC$E%KhpPEtRwKP-l_c1j!$pu z!9YBF{vc2AM}Nr=_~|J1{={Y_mE#b;Lfp|WUPgL_>GUs#3LG+xrMuyUiN=RKrkr>!pK--57oR+)96t7- z_1_ksJce)ktFOU>s{Ss2QS$SdL(l#qSARj;tt;;sXUd7!^2t~18sam~l*7j!wEkP- zGtTgBe+N}j)!#iII`igpFBqCML;VG5H_?1zoGB+>%V!>9my6FhQw|?{(E4wS-x+5$ zVEapZzW$;|V~rr<^zY{|F<)^w&KL>jd{lldlzt{Ie*w+&A258XWu&()C z7O=thGvGlI$-+XO+Ao;wg`(ynLs(?Ib>U|gN=>G{Xt$pA=JFa}v z@>(E>pT8q2KJW5_Ys>fPmubDI(l62h5F`%#{9mEn57346%*KVDtg~Qf@;yA==^5$0 z5!%5Y=ZdCy%p1lLd;IZ!7IxHEA^!OOF4DThIz@kJ2Y-wwcBS6?tNMNm{u)oNcg=$N z-~Ikftxq6+$`zbGoD(Sb@e{KjM(=QZ&Iy)}J!t)>;&V=bk6w&_vb^Gy|0=!kSO0o{ z&jVWW$9;O0KkT9&pTFAv#TtiMTHmVtVHfq;ze4^RJ^I70SAXQsYS;bc_Ji-7eR`t& z0~zOVMK`XT%P9BprbT0eF9*Xw+}>Wnkr zw*7fm>^5F{fyC8%r_+mhOF4R3eroip{fFZ-Z!I5t(E6{7&%A|i^=c?i+VSbdJOv}o zJKC-5e8;(xa{AkucY1D@8-7E4d+vkJJOXQ)7x-<7&$ac>yZ|%SQ=Nlr(xIVtET239 z3*{Mhb@7RVa^go{u&sQ?uBq`N4$9#Vr~rO`-RSal->p9M%6V74yje~83gRbU+2tGa zoO1kI{tT0^ZSk4smXAGX{fF;z{+Z|SZN3I8IXl|%Y}-AwT>MnJ-@I!B{-v3Z*Z3Lb;6>exSc+tolB~#+%3wzcb{EmwK>Nyu{bgc%ri} zUij&wPT!#7-?N~<6Zg9Kq1!jyX@vz_y8Ag0KTX}Awlps(_wh56&w=h|S%)njd(iri z#b+IcZ}o0TC))ApO+A>1N4wmQlP8qZ-vJfCFE4g_k2XIt>B{d8`QoJ>tck~b<9Pvj z;)@r4s`FE?`H|eX>qT2`{+?@_$`24f(O9iF%6H1q%kpQM{7A)T-Lrh`LF>N|pLGwu z&5u%fL_0pcsRuKj$EacZ+y;O2m;8Vq^|*e(zv^e7`0-a)JLOZeq&JA4K+ltymz4YX z4WoA~KJ(J@u?MaHOnl}ge5-e&=T)@h)0=v*)OgY^&%MZV%IPn9clbT(ZR4%!`5W&Y z`QoJ>%;_iVkJ=$meDT6>Jl@~>(UhO@756jLgLUyZU-5hroqh4bZ#>dlyo}EU$(FSr z9JBRysqz_Y{kQwQiA>KqSx2mY%b%ruu07%SP4QVrEFXIi|JViZck37H2<0|EB0ayQ z9bbM>4>mPl*uQxW%=2FSp%?iKzt-pdZd>s-^!&>gFZEz59{XSYeNG?p#1}98yyz`I ztiBET;XPPiywroCc%AdU@&TQF@xpJGVu>%Afq?|`oH6W#0no~$ZA@LzlBA6Go~gz`JtWqSKs{mN9w^s z;~6}rzxSKy{I$2}{@o$^i{9|#Z}+A*@$P=~K?fgl*wF_cwDt6(KXdRg#~wEQ=!wT1 zGyNF)1>*0>Nsmtc_UE>HZsEsW{(#sOYq@wk^FkFq{!M0lO7WQ&v1{9EcT&zGqO2lWBFbYb^+QC}*5di_3cIkg*o(8a6c3T`_% ztWQ%y_W^7i>v)OE!SXm)p6lO_0F&cg`D~SgEtOAGJ792vvv*$o{~t0{(Hd{g8^2z6 z`5pTG#o0aTU;mKf_p0xJ;%bOz!t7iQcRnqiA0{X)-}il~^rpYI7xZtw5)34tt^K0D z9+X4!p!IV1{G$I8k3MkvL5CfE=;oXEy0W>3;rsL}v|bE&IzFs&{=FJ7Q{H-Li>#RS z9*2ypZ#~0)yQ4odbmU~V+3{a3SslJt{vi}f3}=@i`gmN{EYTM5n^34e(XD7YW4@)E`EuR z>-xIg{wW{#;qLO=wLgsMQU7!u#~4qy7Kd%YVs_2=_|~_E^d9iUP5;;zK=Ro` zTV%z9@&oUDhVRp_rS)RK)8k>4voC<{ExPZ+JoLA`nDrhd zK#!mQeC}$+-RJHxNBsb^54-!FbYnN)xG$i6AOELX@8ihv3-P%xuzc)6{9{*&&wT;q zLwpcsW?i9r;a|JY8TV+tZ>YaMeFoJ4b}e&XL4B}cf9p{!9&uV6wgrpXwbeh~sC!)} z+!@bx>)+IRKdndolc+y^bMc77;^MCF1O@C{uQKU9U^}L3`o}sClFuI6A}b!0C-NXN z=QaBOKkL1Fz;WEc$4s7n+&0sXKl-3IJ;%}k_&)ubS}z757#!9$>pU1Qrt3Z9>RZpy zqxHcjM&74iN&UN-e*edTBk$KoT5s!<-8I$l@B7DDckKVgal1}=VuulX5WB`cj#plK zz({?pia}v^!{J@;@rNp>{hwa?-p{>W^mOCakvQX1&AM`nYge=m!2ib?yH0p+=@sXV z)i{9|Mw__yxR0US$De2JUsCb8kFk90LF>N|pZgfgfAZ|;#96h^FI9fbohv}>O7Yp3 zDJOo*Z<+X`kGlS|FIztLp!J`M&%SK=mn?bX$~#@WW-(9kgV+_~GY*s!zva(2@t5K= z4wjESX#Gc^73OsrZaT6~C?c!#f?n5T9|deC$E| zV^@mLI8cs$2OYoUH=0i#)tI69LF}UO>c4cP+{a&F^iRcS94sGu(E2aLXB;elg`aM8 zT;s^%-n!xku`9)A94IG#%P&p*(PrwubhLczLF+#ipK-AKGgr-bKl5$hZH!a=Aa;fL zj05GwZ}|&N{H6GegXLonTL01J>c4cf{8Nq^_{Oap-11nU_&X@WRD8yvlCS5`*cIY4 z4wTdX0DF))WLS#NI9UEq24C6h%j?hHXa44H{RFX#KBoRlN6PVU`D2JfhN<|BgXLon zTK|RkjDzJLzSOBd`O5aMu2?935W7-*#({F;xBQxkKiWe5myVW?J!t)>;xi7G|CzDV ze{lXuPyc?V;s>!S#Ah5RCw|KxYvM1(XB;dad(iriKCb>tN6Vjh$JZu2zHs%c6U7f= zmx|9gP)_`oADZ|J@fiop#~!r)OYs>8%ik=Sw8Mj!Pda71;s>#dwp9P6BjvcZs4kL=xgb-`wC{QyO~nslmx|9gP)_`oADj3K@fiop#~!r)OYs>8%im|s-QwS*r>;3m@q@uOyN{gT zq6zB1bgbe}Qv9*_srZb8_O{46`ygi{7r^lst+9U_}3>Xeh|Ate8z!t;Ksow-XXZ-r!7n`c zLQC<3*yVbkhH;?W$4`l0hHdc~2g}DEwEn|woPLZ0e4fAa{3Rhy`S-m)gdeb!KFxQ# z=cWz$YlqG+{^;+33gG8A+%WRoq}TV`!yRuvsSNje-)!j(;-|K)^Gn`Pj(^KP&FEbh zpS-br>_O|lAwGEn-|F3xPPF6Gn|d%2FIms&o!mTiWSE zp1kF)ne+zn)7-)7O`cPZf6G6^=pF3n_~g0eV-H&YvH0XU{2@LFi%&T}-paA^nJ?|^_Te(Y#`l4928;~-q-!T0rlx5=dbGfU%p@G_PG$Rww>b_L)~%Hzi1ED z@9VJCb-BB{j`vZ$${SO4t@cuthx@zoK;;wEKYj-q40n>9>I?bNWe13lf@1q_9_3^H z`B<0!OY4ViBdb3IA^NtYPnEv>dnUZkR#QA(&i}>7us+XJzJi(Zt)X(TnEdAb`feCJEB)hp7La`Q&=y(opgfTW*?)G=ugd;wzE}01?@7Qh%DY9@QI8|` z3#u8H&U!?J5IxpCI^OM|W$)dky{S7-ftZ)dU-n7LeSGpByGVJ?K1n%z>_O{46`y?) zKK-SCh2o?g@&J4M4X6OS*0FA#?)CleZO%Poh4(Ib`YCgy7l@yr?&dZ79Od}8eAWZ( zV)5DMD2Ir$0o_$x2%?L2@#ejlW+eSm#|{3Jg5$M|5^7#^KJ z@}VhzOX7GocZMoCO4E1ApMGVcKN_OqTI)yWzIXP_{<~A z#~!r)3-Osp@EITUDwQ|1Q>7Pn(fHBn_0F4CKJxtS#!a0jy+GnhcG14bJWvICS$=Nx z%Ej-@Bg4lYwEo-TGmnVN>J`e4cB=HkuDQ|Z^!m(}*@7=jc;K>FdV$2%*wyJpo>7io zmOtC*)e@gPvwZA9>%X>}^G}|^w|dp(hjyy;!Y&)7UZ?+X+};0mQ?}7q=>-y3Q}K54 zOcm&5`GwId(D{`-qh0vegVuj6K6wV;>Xo6Z{8#CPzv!Ia)=T2OaQGAZZuOpT+*5wk z?f)QgrF**ZCC@1L@#h%53h~J^%f}wH{!8)6Gx%1oNOrX2(~ET;Y?%8K?t{3G!XN#e zrT&3UvrcvHugrZ8eAWT5)cTAc?yrc0a`?;(Fx0#v-a_|h#9{g530No36mKa$aacb3 zf|==OGDYiw+Ohlr6~GTJaQWKn`RnvGZ#r*@EjFGvPx%VAc5;6&+?Idlx%F@PO^s)* z?)c$eE`H{@U)`!;c%I+kd8?SKM*Y zP4}#vOK%WA^}U^5tP_;u-}2{~^`Rj?>xAWF4_f~%@mVL}TfJ+tqaEM+Ks}g~4{Dg_ zBjh>$=r4N1Z+vugdSCIeF&|jt%CCKChV%yU)70}B@|<$~TYk&v9q74FC(qRYeC$E% zKNg=n$G_D(Q=GKp)0=v*CLZk;@<*OiPQ2(1KfQT$>&cF*pL)fISDW?o+|CT@B=$(pBo?AZlp!HvfPoBfKdY96Pc6@qM4`$-gF3#dc$vRHoEoX+!CSl+$1IhM!I!o!%>*a@+eKyX4yI=5ON8 z(_s9H`+NCF-zSjg*1zTdS$b#Ur{Z_=Tn!LE_8|W8Q;1KVQ*QN+^<1BJe0oz4wltpX zk9-e7p5u>r(Hnm7wcgfm8*iz2`5g^kywro4cy@mwPkiyh4?f&my!7{hyLZ`hwY87? zd!hUQ@e>^6<|Ffxav%SBGaqB|nU|K2J!t)B;xjKTpYIQrQw6`P9v$f7Zh*(QYxqO@ z(3hJj9X9AJ-uH#5J<=e2j7s zf4gPBetzNu58pde;|XF{N>AoJlmjA90rf{0(t#qRnKK7vXAB)d8!?*n%QbkpN|FX=` zGP7TpJb%H)ZodW_ce?lK3i)H4@khLt|Gv;!wEwWj$XCUs_>8mVV-MmVyGZL5<4n2j z??B+bnXc;Z!*k=)cKG9R>onD0uzkGyy`=gPZhRPL{Lx>_Un6uD;b$DbA%38KTR!$6 z{;_L`&p1>5#{MobQdQMo)P3`U_=yqCns*b(=HQs+i4d}N04~`cF6RX|2%7*b7m<&L5wr)`^-zqef;%9EF3n) zXI@eZAA8XH4|E=3Uc#rpTo33)k*fT}4_H%tw8Qy_aiW}fS6Y4l=fCsKUF)gz0_lWcHCj=gxz-AW$M;DP2O$d7L*hgdkQ9qaO+ zJf;>t_Mr7&7oR+aPk*@{2*Qz%Rr=xwOw>PnJ|T~3pLnmm;kIY*S$e_v+0qLP@78*L zoa--nS;gmfmJ;z(@ySce#~#E#c7^!lCFSUaK27OLJ1z4&XY_YK4PY1a`2G+64m$YQ z;|@D|=(yK@mvZWBKR!0{+ip{j9y;n^0u$ozyKmp~fEC+IelnB3Am;IBoWA5GTi_bbpEqv@j>%T2N>mYoa zf1&I;?NsC+cFnbWTmOjn#Ygk=-!);%xG~ZTB(BEES|2n|DfjVbgjhIiiO)JgEqv@j z>%Vr2^Upc~-|AJDAKIzPFYK~W>b3e|*K9iP#>ua=KkUxaAaNC^X&!6*D5t-ce^!Wv z!%}?mj9U2EgVukPIsfDte5+S*sPqnvnIH^92q0qla$ zI-dPqO!%w=U{id4=ab*xBo5kz&%6LjlgGZ_^@LBJfT8jXKTX9?9F)UHU$8E{Y`mQ~ z)ByYeUBiz@nXmj_72l`vd#Rbmzb%aK?fzY;A^ElC^ba1_m3WWZmmm6f-tHIea>MQC zJ#ybf_j^^L^1ss_yiS4pKtA(3SMcvy{_?Y~JS_-9{Z1D&Yk!OUVV`}#{jQhK{wK!1 zJ=kqee@=g7uZymoaNxiktq&mWCa1f6XI-V-$3HK`!eK5x>ngSIu?O*Ad(pig&=#L{ z75)$(gssoHIP*sLyf$XR^UJuBhWg8S#@Y?4pw#-*>)*#MEncK}`1g-(`@pvHtaj^UkJa_qHx6D0pR<8I#?Aqcp4wU2H^5=wD zI1Fd1|I(3K_}GKien;{ks+u}10)WXLe zwEjcwpNxa$KlG2`%jW*_(HrZEAH*&{*XhSNP>z4gpBG}`uq{60KrMXiLF+%%KF>J7 z-$)<$`_YE_$+?032YdVtr~td>r0?|fdm%$KB&?s~bTP%jw7GkC{RF_CUvL)Vq_1y3 z98^QtwNG>F5$#i-e$n|I?fI(^kMj!cg2VdI(M9L5NaNQEok0gZ=dbkt=={~tcnr`X zgY<8{UStDpo*3F9yCk2s^N3pb*n`%8^kwItd1U$aewO!q+Zxxd%?$EuIIPe31vAC_m(Ur2 zsp1grEeG-eN6Y8~`9V2|p6}b~4}bYvcJIQO8cz_r>_Vp}^Nw;KpZ;Ul6rXuVIehFv z>p%F4^Uu74Z~OaBRaEuYjz2oJHC{{Lz#!vae)+1A^AlLR#KqT$=8Tkg@UQ!iq*DDC z&K_*ecE2~)o_zU;Js3ad%8lEeFVXYwcl>Vm&rg^#XS~J}q@h@PGEXV@@yiekhne`y zQ)=O34_g0C@tLQVzsHN~e{Z|*UXU)>(5?R<{~k?prPG_dtm6MObQb)3G`aZXrR8G} z;vc)V_~a$!Lwpd1Uw3hu;$Wtp?@)f}sqRx#{Uv|NFYE^O0Xxb;>hp`7U;Yk-`p)?1 zIWy1KH;_SFy!fk*-`aFx*U_2&wZ84@Yv1g)E57Tl!>b&&zvB@9_1W&aahb!&)Ds`S za|6bjU$j#bpKFl#xNd)~+dt*wf74z5>2qDpETcd6;2I zP+WHXBuPR&C#Ao(8}yI+5YU&;mj6~?56S^~&>qvBC-nb>)sB5~{VP@-TwV)AC;sc) z`7|yZuh4T{;)ZYaA zvpz=GJ3T{v4@5gdd=NH<-1kNC3+{Jo6Rl^H9(Md`!WZ=ZQrhEu$1Yp4J0Hjw>eJi1 z|9x%rK!@}e_k1?f`5~L-&INP>d+r}nt$VD4w1YkQG@t_P%CD;3nKzG|FJ67^KREx2 z)?Zux7APUB{9)IUzpCFW!5{fh|Ay1^90gV754)gGe@*$*avxOr>)4&+^c-#fqDx)> zzS?8|u*)y%&tEQo4Q=dI{ll(xf%8}O`)+pp8kf8N6&3kHo`8k&j9jd1Kj+**Ir+`F zgQ3O|JI)jKTmYYO1RLVxuO^(!<0&x`3pboGv44^ZX74A`0w+9da%KLj`BBEJLv4w7k>Vg{_?kw zpT>LseZ16zv3TTbsQWc^_QeZ7=`-F$e$onksRv8qRbbp-qO&hv`0We(n{Tx%Tt3XG zh?jaWS3ij>Q#cP5r#KnC#I#X`rh2K86zj#yK-Z-w<16%~9xN0u`O0$+boRvyzt&^CjL+PUK3RTx)`hE2 z()|mFpXhrouX)Z#xsSi}AQlc&@p;ZiEqv@j>%S16=X~(({@l>>AlmWmchrNSc%Ai3 z&z;B<{1NYf3gE|m?jN!ITv@SRP!F~gFY5!($;cC5yztxKa`SJr_aCL=eQJ5p#5O&8N-?&H5}5DSNe_^cz;!p9!8{!8&$N8k_XL%xgqo+Q(AHtM4r+&Ino z^nP8B(B7#BDlPSw=MV5ex`AEvtM2DH)Cbo%KcjyBD<1wV4%>po>>B+EEB?OIf$PT2 z(&hMW{Xe3A|9y6k`X|@+r*AGE@mO5k^_`%A?ek%tuV>PGz;;a6^l!e-FCh8sp)IoF zL3tt%8V_{OFZzGNF?Vlv_3R7wSzZeS@n>Ij@8=ZCvo`N#t6lg${hC@Y20T3;R(YiJ zDo7k2+9E4vzri88_|`M@`0Ym=15B1rM%KsZtqic7x`qn)05ccA(?*s+vTQ5uXZ-5RNq<`!)pf8^d z{Vl&7ln3&_I;8(6Z2tBid~M5Hk6&IBnE2BJ-1=D8`vQEgOFQs=`bD?6yc&RDa9G#u zGazvo^F@AX_ZxJn+HY6~!IpHO1NlQv7rxh}96b-Yt33ITpFMoa80N2CAAjKZ+^1CW z!$B+@#^Q6ILM{HW2Z;l_OnmNBD2E^4@~1{}>ECW{ukY@!!19|epPJ&cFIDl!DgNkN zjvxHc^`Cvo^05c;k6kQ2`x52E|DNTCTT7j`!Dr?ueh|A%{6PJn+{cd;KXy&=83)SY zV-H&Y!H?8`kN@SSt#x+(^qTdC;s@~)i_bVvj(^J^Z{p9yXB;dad(irCiqAM$etgxh z=DzgyvG+|={2+G8T=k!EPzCW@er)2;#b+F7x5Jk`JnO$LKH~tN^`i6s!mTb&+L?2c zd;bA@pT9u7`iAa(n)+?7oz{Ww+VTfffS=k8-yV7IVYJ^DhUypX_O{4XuAHB z=d^C~qoHx79bbM>4~F8U8##Sb`HM6T_#@r{6~K>MSM-%1v2>vwUw%*zwutxLF5d8V zr%(HT887{^{at%{{_c~$`m6d_1X*m*ubZ&%@_`;=tP;F4uGC6A-(m{IiZw&iGpXltCEmYTo8Y zO*+wzFF&XUbLB(6x!Yf&d9J^#BlL!N(Gh-asK522Y2x+e2Y$f1c%|~At$0~S`i+-< z!MFOR@{{ZP2%o;xgMrbr{tKrs^ALYlU-+=5cBbFc9@y$Q#!It8U=4$_Dd`#YqHeUKg zf33cy;$5g8Q1j_aJ(!6XU*zI#X*`*S__OiCPpF?Wu;caLAeYxZ7ntvdEg8Q6*_Cd;h{27B-IE=;b?1QR?k3DGpXX3LD(z?x$ znslNaUw%*z=E?`=T`7NDzw~o1KcWX*e_2QHXZ403_qo3W^h@#j@&i9$L;VcacKH!baqma4 zj`SPv07N1Ey=}_oTipN4);s5~>z>bmm>1HEb%b&sf2R72T`4~62<7mx2d)3;zub7S zj=(2B_%{E_!= zCT;HY!<>Hya;Eyrctuy~+$KZ1fgOC1`r3oeU)B2)D~b3$VYIJ%PpA;Tw(prE@zTES zU-Oji-x(E>Kiu2B4^ZCd^yIxr0*7z)Q@RH&truOB z4)SY=e!Q0g5=W?n1K+T2{YzVK#YgrV+C~@VJLMpHu+D<%Lr(YjME8DaaH8^aPWN~W z(U8#o-az^>H_ykM>iFY?&uKjx-{XA8u61#@|3UeszBKjpZ`W1lKT^MWt@~>72NHhc zG1o5V2+Do@OK~j2miU|_EFXK&`meQ}f6fu`hxj1Of9vd83uHfLbzX(;vRp$i94uI; zd%f>6dhLR4G_{{r{XP!AcRfHuiib;!!?s{CyPlwUeCt75{Tuaqpn+x`0Gk?*MJ0pn zAN!&HJUM7`E>iy1>I=HMI)pw8UB0E;Yh9h_FcdG|&RwT3Iy?GDdyy$`Z{zHVk9h$m zYL|9O`R5w6>s?j8lTIOkIC<6kj|h4A-|&pDS`_}GKi ze=I)dT=+wL5EhS1?^6EW@#gEnnpzLi9@m4G)}zs`2Q}g`adJ7#hs6{bAK!XVs()RR z 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%0D3Z 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