From 9f72864caf46f292d0f0ce34baa5ec0e1beb7739 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Tue, 24 Mar 2015 18:50:30 +0100 Subject: [PATCH 01/65] Adding basic sanity test. --- .travis.yml | 3 ++- tools/run_tests/run_sanity.sh | 39 +++++++++++++++++++++++++++++++++++ tools/run_tests/run_tests.py | 20 +++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100755 tools/run_tests/run_sanity.sh diff --git a/.travis.yml b/.travis.yml index e43a89e453a..1cd0aeedb7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,13 @@ before_install: - sudo add-apt-repository ppa:h-rayflood/llvm -y - sudo apt-get update -qq - sudo apt-get install -qq libgtest-dev libgflags-dev python-virtualenv clang-3.5 - - sudo pip install cpp-coveralls + - sudo pip install cpp-coveralls mako simplejson env: global: - RUBY_VERSION=2.1 - COVERALLS_PARALLEL=true matrix: + - CONFIG=opt TEST=sanity - CONFIG=dbg TEST=c - CONFIG=dbg TEST=c++ - CONFIG=opt TEST=c diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh new file mode 100755 index 00000000000..e915af93d4b --- /dev/null +++ b/tools/run_tests/run_sanity.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +# 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. + + +set -e + +export TEST=true + +cd `dirname $0`/../.. + +./tools/buildgen/generate_projects.sh diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index a132ef45413..2d6582a521a 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -224,6 +224,23 @@ class CSharpLanguage(object): def __str__(self): return 'csharp' +class Sanity(object): + + def test_specs(self, config, travis): + return [config.job_spec('tools/run_tests/run_sanity.sh', None)] + + def make_targets(self): + return ['run_dep_checks'] + + def build_steps(self): + return [] + + def supports_multi_config(self): + return False + + def __str__(self): + return 'sanity' + # different configurations we can run under _CONFIGS = { 'dbg': SimpleConfig('dbg'), @@ -248,7 +265,8 @@ _LANGUAGES = { 'php': PhpLanguage(), 'python': PythonLanguage(), 'ruby': RubyLanguage(), - 'csharp': CSharpLanguage() + 'csharp': CSharpLanguage(), + 'sanity': Sanity(), } # parse command line From a99157f4dd74583f1fb879792270553443bea34b Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 7 Apr 2015 14:32:15 -0700 Subject: [PATCH 02/65] Fix server shutdown A previous fix to make close() occur later can cause socket reuse by servers to fail as previous sockets are left asynchronously open. This change: - adds a callback to TCP server shutdown to signal that the server is completely shutdown - wait for that callback before destroying listeners in the server (and before destroying the server) - handles fallout --- src/core/iomgr/tcp_server.h | 4 +- src/core/iomgr/tcp_server_posix.c | 58 ++++++++++++++++--- src/core/security/server_secure_chttp2.c | 4 +- src/core/surface/completion_queue.c | 7 +++ src/core/surface/completion_queue.h | 2 + src/core/surface/server.c | 44 ++++++++++++-- src/core/surface/server.h | 2 + src/core/surface/server_chttp2.c | 4 +- test/core/end2end/tests/cancel_after_invoke.c | 5 +- test/core/end2end/tests/cancel_test_helpers.h | 5 +- test/core/iomgr/tcp_server_posix_test.c | 10 ++-- 11 files changed, 117 insertions(+), 28 deletions(-) diff --git a/src/core/iomgr/tcp_server.h b/src/core/iomgr/tcp_server.h index 68ee85c5a7f..1e58901a7a6 100644 --- a/src/core/iomgr/tcp_server.h +++ b/src/core/iomgr/tcp_server.h @@ -71,6 +71,8 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, up when grpc_tcp_server_destroy is called. */ int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned index); -void grpc_tcp_server_destroy(grpc_tcp_server *server); +void grpc_tcp_server_destroy(grpc_tcp_server *server, + void (*shutdown_done)(void *shutdown_done_arg), + void *shutdown_done_arg); #endif /* GRPC_INTERNAL_CORE_IOMGR_TCP_SERVER_H */ diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 90b7eb451d4..482166e2eb6 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -102,12 +102,18 @@ struct grpc_tcp_server { gpr_cv cv; /* active port count: how many ports are actually still listening */ - int active_ports; + size_t active_ports; + /* destroyed port count: how many ports are completely destroyed */ + size_t destroyed_ports; /* all listening ports */ server_port *ports; size_t nports; size_t port_capacity; + + /* shutdown callback */ + void (*shutdown_complete)(void *); + void *shutdown_complete_arg; }; grpc_tcp_server *grpc_tcp_server_create(void) { @@ -115,6 +121,7 @@ grpc_tcp_server *grpc_tcp_server_create(void) { gpr_mu_init(&s->mu); gpr_cv_init(&s->cv); s->active_ports = 0; + s->destroyed_ports = 0; s->cb = NULL; s->cb_arg = NULL; s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP); @@ -123,29 +130,62 @@ grpc_tcp_server *grpc_tcp_server_create(void) { return s; } -void grpc_tcp_server_destroy(grpc_tcp_server *s) { +static void finish_shutdown(grpc_tcp_server *s) { + s->shutdown_complete(s->shutdown_complete_arg); + + gpr_mu_destroy(&s->mu); + gpr_cv_destroy(&s->cv); + + gpr_free(s->ports); + gpr_free(s); +} + +static void destroyed_port(void *server, int success) { + grpc_tcp_server *s = server; + gpr_mu_lock(&s->mu); + s->destroyed_ports++; + if (s->destroyed_ports == s->nports) { + gpr_mu_unlock(&s->mu); + finish_shutdown(s); + } else { + gpr_mu_unlock(&s->mu); + } +} + +static void dont_care_about_shutdown_completion(void *ignored) {} + +void grpc_tcp_server_destroy(grpc_tcp_server *s, + void (*shutdown_complete)(void *shutdown_complete_arg), + void *shutdown_complete_arg) { size_t i; gpr_mu_lock(&s->mu); + + s->shutdown_complete = shutdown_complete ? shutdown_complete : dont_care_about_shutdown_completion; + s->shutdown_complete_arg = shutdown_complete_arg; + /* shutdown all fd's */ for (i = 0; i < s->nports; i++) { grpc_fd_shutdown(s->ports[i].emfd); } /* wait while that happens */ + /* TODO(ctiller): make this asynchronous also */ while (s->active_ports) { gpr_cv_wait(&s->cv, &s->mu, gpr_inf_future); } gpr_mu_unlock(&s->mu); /* delete ALL the things */ - for (i = 0; i < s->nports; i++) { - server_port *sp = &s->ports[i]; - if (sp->addr.sockaddr.sa_family == AF_UNIX) { - unlink_if_unix_domain_socket(&sp->addr.un); + if (s->nports) { + for (i = 0; i < s->nports; i++) { + server_port *sp = &s->ports[i]; + if (sp->addr.sockaddr.sa_family == AF_UNIX) { + unlink_if_unix_domain_socket(&sp->addr.un); + } + grpc_fd_orphan(sp->emfd, destroyed_port, s); } - grpc_fd_orphan(sp->emfd, NULL, NULL); + } else { + finish_shutdown(s); } - gpr_free(s->ports); - gpr_free(s); } /* get max listen queue size on linux */ diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c index c155b80b7e6..d5b3a82b878 100644 --- a/src/core/security/server_secure_chttp2.c +++ b/src/core/security/server_secure_chttp2.c @@ -120,7 +120,7 @@ static void destroy(grpc_server *server, void *statep) { grpc_server_secure_state *state = statep; gpr_mu_lock(&state->mu); state->is_shutdown = 1; - grpc_tcp_server_destroy(state->tcp); + grpc_tcp_server_destroy(state->tcp, grpc_server_listener_destroy_done, server); gpr_mu_unlock(&state->mu); state_unref(state); } @@ -213,7 +213,7 @@ error: grpc_resolved_addresses_destroy(resolved); } if (tcp) { - grpc_tcp_server_destroy(tcp); + grpc_tcp_server_destroy(tcp, NULL, NULL); } if (state) { gpr_free(state); diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 6a1d83ce5d4..b08bd93693e 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -432,3 +432,10 @@ void grpc_cq_dump_pending_ops(grpc_completion_queue *cc) { grpc_pollset *grpc_cq_pollset(grpc_completion_queue *cc) { return &cc->pollset; } + +void grpc_cq_hack_spin_pollset(grpc_completion_queue *cc) { + gpr_mu_lock(GRPC_POLLSET_MU(&cc->pollset)); + grpc_pollset_kick(&cc->pollset); + grpc_pollset_work(&cc->pollset, gpr_time_add(gpr_now(), gpr_time_from_millis(100))); + gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); +} diff --git a/src/core/surface/completion_queue.h b/src/core/surface/completion_queue.h index 3054264cadf..3e9e2d186ef 100644 --- a/src/core/surface/completion_queue.h +++ b/src/core/surface/completion_queue.h @@ -114,4 +114,6 @@ void grpc_cq_dump_pending_ops(grpc_completion_queue *cc); grpc_pollset *grpc_cq_pollset(grpc_completion_queue *cc); +void grpc_cq_hack_spin_pollset(grpc_completion_queue *cc); + #endif /* GRPC_INTERNAL_CORE_SURFACE_COMPLETION_QUEUE_H */ diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 424734c54ce..2e013ea7421 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -137,6 +137,7 @@ struct grpc_server { size_t cq_count; gpr_mu mu; + gpr_cv cv; registered_method *registered_methods; requested_call_array requested_calls; @@ -149,6 +150,7 @@ struct grpc_server { channel_data root_channel_data; listener *listeners; + int listeners_destroyed; gpr_refcount internal_refcount; }; @@ -263,6 +265,7 @@ static void server_unref(grpc_server *server) { if (gpr_unref(&server->internal_refcount)) { grpc_channel_args_destroy(server->channel_args); gpr_mu_destroy(&server->mu); + gpr_cv_destroy(&server->cv); gpr_free(server->channel_filters); requested_call_array_destroy(&server->requested_calls); while ((rm = server->registered_methods) != NULL) { @@ -620,6 +623,7 @@ grpc_server *grpc_server_create_from_filters(grpc_completion_queue *cq, if (cq) addcq(server, cq); gpr_mu_init(&server->mu); + gpr_cv_init(&server->cv); server->unregistered_cq = cq; /* decremented by grpc_server_destroy */ @@ -781,6 +785,15 @@ grpc_transport_setup_result grpc_server_setup_transport( return result; } +static int num_listeners(grpc_server *server) { + listener *l; + int n = 0; + for (l = server->listeners; l; l = l->next) { + n++; + } + return n; +} + static void shutdown_internal(grpc_server *server, gpr_uint8 have_shutdown_tag, void *shutdown_tag) { listener *l; @@ -878,11 +891,6 @@ static void shutdown_internal(grpc_server *server, gpr_uint8 have_shutdown_tag, for (l = server->listeners; l; l = l->next) { l->destroy(server, l->arg); } - while (server->listeners) { - l = server->listeners; - server->listeners = l->next; - gpr_free(l); - } } void grpc_server_shutdown(grpc_server *server) { @@ -893,8 +901,18 @@ void grpc_server_shutdown_and_notify(grpc_server *server, void *tag) { shutdown_internal(server, 1, tag); } +void grpc_server_listener_destroy_done(void *s) { + grpc_server *server = s; + gpr_mu_lock(&server->mu); + server->listeners_destroyed++; + gpr_cv_signal(&server->cv); + gpr_mu_unlock(&server->mu); +} + void grpc_server_destroy(grpc_server *server) { channel_data *c; + listener *l; + size_t i; gpr_mu_lock(&server->mu); if (!server->shutdown) { gpr_mu_unlock(&server->mu); @@ -902,6 +920,22 @@ void grpc_server_destroy(grpc_server *server) { gpr_mu_lock(&server->mu); } + while (server->listeners_destroyed != num_listeners(server)) { + for (i = 0; i < server->cq_count; i++) { + gpr_mu_unlock(&server->mu); + grpc_cq_hack_spin_pollset(server->cqs[i]); + gpr_mu_lock(&server->mu); + } + + gpr_cv_wait(&server->cv, &server->mu, gpr_time_add(gpr_now(), gpr_time_from_millis(100))); + } + + while (server->listeners) { + l = server->listeners; + server->listeners = l->next; + gpr_free(l); + } + for (c = server->root_channel_data.next; c != &server->root_channel_data; c = c->next) { shutdown_channel(c); diff --git a/src/core/surface/server.h b/src/core/surface/server.h index e33f69b8c75..548a16c6c96 100644 --- a/src/core/surface/server.h +++ b/src/core/surface/server.h @@ -51,6 +51,8 @@ void grpc_server_add_listener(grpc_server *server, void *listener, grpc_pollset **pollsets, size_t npollsets), void (*destroy)(grpc_server *server, void *arg)); +void grpc_server_listener_destroy_done(void *server); + /* Setup a transport - creates a channel stack, binds the transport to the server */ grpc_transport_setup_result grpc_server_setup_transport( diff --git a/src/core/surface/server_chttp2.c b/src/core/surface/server_chttp2.c index 27434b39e2d..9a23125752a 100644 --- a/src/core/surface/server_chttp2.c +++ b/src/core/surface/server_chttp2.c @@ -75,7 +75,7 @@ static void start(grpc_server *server, void *tcpp, grpc_pollset **pollsets, size callbacks) */ static void destroy(grpc_server *server, void *tcpp) { grpc_tcp_server *tcp = tcpp; - grpc_tcp_server_destroy(tcp); + grpc_tcp_server_destroy(tcp, grpc_server_listener_destroy_done, server); } int grpc_server_add_http2_port(grpc_server *server, const char *addr) { @@ -131,7 +131,7 @@ error: grpc_resolved_addresses_destroy(resolved); } if (tcp) { - grpc_tcp_server_destroy(tcp); + grpc_tcp_server_destroy(tcp, NULL, NULL); } return 0; } diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c index e15fa7fcd91..326321f4e21 100644 --- a/test/core/end2end/tests/cancel_after_invoke.c +++ b/test/core/end2end/tests/cancel_after_invoke.c @@ -51,10 +51,11 @@ 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, + cancellation_mode mode, 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); + gpr_log(GPR_INFO, "%s/%s/%s", test_name, config.name, mode.name); f = config.create_fixture(client_args, server_args); config.init_client(&f, client_args); config.init_server(&f, server_args); @@ -109,7 +110,7 @@ static void test_cancel_after_invoke(grpc_end2end_test_config config, grpc_op ops[6]; grpc_op *op; grpc_call *c; - grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL); + grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, mode, NULL, NULL); gpr_timespec deadline = five_seconds_time(); cq_verifier *v_client = cq_verifier_create(f.client_cq); grpc_metadata_array initial_metadata_recv; diff --git a/test/core/end2end/tests/cancel_test_helpers.h b/test/core/end2end/tests/cancel_test_helpers.h index f2581dc32ff..3d92b64ae49 100644 --- a/test/core/end2end/tests/cancel_test_helpers.h +++ b/test/core/end2end/tests/cancel_test_helpers.h @@ -35,6 +35,7 @@ #define GRPC_TEST_CORE_END2END_TESTS_CANCEL_TEST_HELPERS_H typedef struct { + const char *name; grpc_call_error (*initiate_cancel)(grpc_call *call); grpc_status_code expect_status; const char *expect_details; @@ -45,7 +46,7 @@ static grpc_call_error wait_for_deadline(grpc_call *call) { } static const cancellation_mode cancellation_modes[] = { - {grpc_call_cancel, GRPC_STATUS_CANCELLED, ""}, - {wait_for_deadline, GRPC_STATUS_DEADLINE_EXCEEDED, "Deadline Exceeded"}, }; + {"cancel", grpc_call_cancel, GRPC_STATUS_CANCELLED, ""}, + {"deadline", wait_for_deadline, GRPC_STATUS_DEADLINE_EXCEEDED, "Deadline Exceeded"}, }; #endif /* GRPC_TEST_CORE_END2END_TESTS_CANCEL_TEST_HELPERS_H */ diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c index 2689c3f38e5..6b80ee1ee8c 100644 --- a/test/core/iomgr/tcp_server_posix_test.c +++ b/test/core/iomgr/tcp_server_posix_test.c @@ -60,14 +60,14 @@ static void on_connect(void *arg, grpc_endpoint *tcp) { static void test_no_op(void) { grpc_tcp_server *s = grpc_tcp_server_create(); - grpc_tcp_server_destroy(s); + grpc_tcp_server_destroy(s, NULL, NULL); } static void test_no_op_with_start(void) { grpc_tcp_server *s = grpc_tcp_server_create(); LOG_TEST(); grpc_tcp_server_start(s, NULL, 0, on_connect, NULL); - grpc_tcp_server_destroy(s); + grpc_tcp_server_destroy(s, NULL, NULL); } static void test_no_op_with_port(void) { @@ -80,7 +80,7 @@ static void test_no_op_with_port(void) { GPR_ASSERT( grpc_tcp_server_add_port(s, (struct sockaddr *)&addr, sizeof(addr))); - grpc_tcp_server_destroy(s); + grpc_tcp_server_destroy(s, NULL, NULL); } static void test_no_op_with_port_and_start(void) { @@ -95,7 +95,7 @@ static void test_no_op_with_port_and_start(void) { grpc_tcp_server_start(s, NULL, 0, on_connect, NULL); - grpc_tcp_server_destroy(s); + grpc_tcp_server_destroy(s, NULL, NULL); } static void test_connect(int n) { @@ -144,7 +144,7 @@ static void test_connect(int n) { gpr_mu_unlock(&mu); - grpc_tcp_server_destroy(s); + grpc_tcp_server_destroy(s, NULL, NULL); } int main(int argc, char **argv) { From 55b7306c6c445aa839435e17229551c5a62eebce Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 7 Apr 2015 16:13:13 -0700 Subject: [PATCH 03/65] Update Windows build for interface changes --- src/core/iomgr/tcp_server_windows.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c index 0c3ab1dc911..896c9e5d08a 100644 --- a/src/core/iomgr/tcp_server_windows.c +++ b/src/core/iomgr/tcp_server_windows.c @@ -92,7 +92,9 @@ grpc_tcp_server *grpc_tcp_server_create(void) { return s; } -void grpc_tcp_server_destroy(grpc_tcp_server *s) { +void grpc_tcp_server_destroy(grpc_tcp_server *s, + void(*shutdown_done)(void *shutdown_done_arg), + void *shutdown_done_arg) { size_t i; gpr_mu_lock(&s->mu); /* shutdown all fd's */ @@ -112,6 +114,10 @@ void grpc_tcp_server_destroy(grpc_tcp_server *s) { } gpr_free(s->ports); gpr_free(s); + + if (shutdown_done) { + shutdown_done(shutdown_done_arg); + } } /* Prepare a recently-created socket for listening. */ From 5058c692093cbeb84e8711bbfc21051873464eca Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 09:42:04 -0700 Subject: [PATCH 04/65] Initial porting of run_tests to Windows --- tools/run_tests/jobset.py | 55 ++++++++++++++++++++++++------------ tools/run_tests/run_tests.py | 27 ++++++++++++------ 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index 81cdd0e6e40..b4c3d194915 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -32,6 +32,7 @@ import hashlib import multiprocessing import os +import platform import random import signal import subprocess @@ -43,17 +44,19 @@ import time _DEFAULT_MAX_JOBS = 16 * multiprocessing.cpu_count() -have_alarm = False -def alarm_handler(unused_signum, unused_frame): - global have_alarm - have_alarm = False - - # setup a signal handler so that signal.pause registers 'something' # when a child finishes # not using futures and threading to avoid a dependency on subprocess32 -signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) -signal.signal(signal.SIGALRM, alarm_handler) +if platform.system() == "Windows": + pass +else: + have_alarm = False + def alarm_handler(unused_signum, unused_frame): + global have_alarm + have_alarm = False + + signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) + signal.signal(signal.SIGALRM, alarm_handler) def shuffle_iteratable(it): @@ -109,6 +112,11 @@ _TAG_COLOR = { def message(tag, message, explanatory_text=None, do_newline=False): + if platform.system() == 'Windows': + if explanatory_text: + print explanatory_text + print '%s: %s' % (tag, message) + return try: sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % ( _BEGINNING_OF_LINE, @@ -136,7 +144,7 @@ def which(filename): class JobSpec(object): """Specifies what to run for a job.""" - def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None): + def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None, cwd=None): """ Arguments: cmdline: a list of arguments to pass as the command line @@ -152,6 +160,7 @@ class JobSpec(object): self.environ = environ self.shortname = cmdline[0] if shortname is None else shortname self.hash_targets = hash_targets or [] + self.cwd = cwd def identity(self): return '%r %r %r' % (self.cmdline, self.environ, self.hash_targets) @@ -174,9 +183,11 @@ class Job(object): for k, v in spec.environ.iteritems(): env[k] = v self._start = time.time() + print spec.cwd self._process = subprocess.Popen(args=spec.cmdline, stderr=subprocess.STDOUT, stdout=self._tempfile, + cwd=spec.cwd, env=env) self._state = _RUNNING self._newline_on_success = newline_on_success @@ -241,10 +252,15 @@ class Jobset(object): bin_hash = None should_run = True if should_run: - self._running.add(Job(spec, - bin_hash, - self._newline_on_success, - self._travis)) + try: + self._running.add(Job(spec, + bin_hash, + self._newline_on_success, + self._travis)) + except: + message('FAILED', spec.shortname) + self._cancelled = True + return False return True def reap(self): @@ -264,11 +280,14 @@ class Jobset(object): if (not self._travis): message('WAITING', '%d jobs running, %d complete, %d failed' % ( len(self._running), self._completed, self._failures)) - global have_alarm - if not have_alarm: - have_alarm = True - signal.alarm(10) - signal.pause() + if platform.system() == 'Windows': + time.sleep(0.1) + else: + global have_alarm + if not have_alarm: + have_alarm = True + signal.alarm(10) + signal.pause() def cancelled(self): """Poll for cancellation.""" diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 3cf6ddf2623..6013f1163b9 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -39,6 +39,7 @@ import os import re import sys import time +import platform import jobset import watch_dirs @@ -314,17 +315,27 @@ if len(build_configs) > 1: print language, 'does not support multiple build configurations' sys.exit(1) -build_steps = [jobset.JobSpec(['make', - '-j', '%d' % (multiprocessing.cpu_count() + 1), - 'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % args.slowdown, - 'CONFIG=%s' % cfg] + list(set( - itertools.chain.from_iterable( - l.make_targets() for l in languages)))) - for cfg in build_configs] + list(set( +if platform.system() == 'Windows': + def make_jobspec(cfg, targets): + return jobset.JobSpec(['nmake', '/f', 'Grpc.mak', 'CONFIG=%s' % cfg] + targets, + cwd='vsprojects\\vs2013') +else: + def make_jobspec(cfg, targets): + return jobset.JobSpec(['make', + '-j', '%d' % (multiprocessing.cpu_count() + 1), + 'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % + args.slowdown, + 'CONFIG=%s' % cfg] + targets) + +build_steps = [make_jobspec(cfg, + list(set(itertools.chain.from_iterable( + l.make_targets() for l in languages)))) + for cfg in build_configs] +build_steps.extend(set( jobset.JobSpec(cmdline, environ={'CONFIG': cfg}) for cfg in build_configs for l in languages - for cmdline in l.build_steps())) + for cmdline in l.build_steps())) one_run = set( spec for config in run_configs From f5a7c8b364b0d68068dc4ffd1f93f9fbc9aa1887 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 09:48:54 -0700 Subject: [PATCH 05/65] Make Grpc.mak more useful for run_tests.py --- templates/vsprojects/vs2013/Grpc.mak.template | 24 ++++++++----------- third_party/openssl | 2 +- vsprojects/vs2013/Grpc.mak | 11 ++++----- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/templates/vsprojects/vs2013/Grpc.mak.template b/templates/vsprojects/vs2013/Grpc.mak.template index 8e1b33bba76..fd2b048247a 100644 --- a/templates/vsprojects/vs2013/Grpc.mak.template +++ b/templates/vsprojects/vs2013/Grpc.mak.template @@ -33,7 +33,8 @@ <% allowed_dependencies = set(['gpr', 'grpc', 'gpr_test_util', 'grpc_test_util']) buildable_targets = [ target for target in targets if set(target.deps).issubset(allowed_dependencies) and all([src.endswith('.c') for src in target.src])] - test_targets = [ target for target in buildable_targets if target.name.endswith('_test') ] + c_test_targets = [ target for target in buildable_targets if target.build == 'test' and not target.language == 'c++' ] + cxx_test_targets = [ target for target in buildable_targets if target.build == 'test' and target.language == 'c++' ] %>\ # NMake file to build secondary gRPC targets on Windows. # Use grpc.sln to solution to build the gRPC libraries. @@ -62,26 +63,21 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: \ -% for target in test_targets: +buildtests: buildtests_c buildtests_cxx + +buildtests_c: \ +% for target in c_test_targets: ${target.name}.exe \ % endfor echo All tests built. -test: \ -% for target in test_targets: -${target.name} \ -% endfor - - echo All tests ran. - -test_gpr: \ -% for target in [ tgt for tgt in test_targets if tgt.name.startswith('gpr_')]: -${target.name} \ +buildtests_cxx: \ +% for target in cxx_test_targets: +${target.name}.exe \ % endfor - echo All tests ran. + echo All tests built. % for target in buildable_targets: ${target.name}.exe: grpc_test_util diff --git a/third_party/openssl b/third_party/openssl index 3df69d3aefd..4ac03295828 160000 --- a/third_party/openssl +++ b/third_party/openssl @@ -1 +1 @@ -Subproject commit 3df69d3aefde7671053d4e3c242b228e5d79c83f +Subproject commit 4ac0329582829f5378d8078c8d314ad37db87736 diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 203c7872878..15b2a7feaa9 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -53,14 +53,13 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: 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_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.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_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_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe - echo All tests built. +buildtests: buildtests_c buildtests_cxx -test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test - echo All tests ran. +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 chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.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_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 metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe + echo All tests built. -test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_useful_test - echo All tests ran. +buildtests_cxx: + echo All tests built. alarm_heap_test.exe: grpc_test_util echo Building alarm_heap_test From c3d5f16d7577c3b3273c24342462e61387442e31 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 09:51:15 -0700 Subject: [PATCH 06/65] Ensure OUT_DIR created --- templates/vsprojects/vs2013/Grpc.mak.template | 2 +- vsprojects/vs2013/Grpc.mak | 162 +++++++++--------- 2 files changed, 82 insertions(+), 82 deletions(-) diff --git a/templates/vsprojects/vs2013/Grpc.mak.template b/templates/vsprojects/vs2013/Grpc.mak.template index fd2b048247a..e43d6bb5051 100644 --- a/templates/vsprojects/vs2013/Grpc.mak.template +++ b/templates/vsprojects/vs2013/Grpc.mak.template @@ -80,7 +80,7 @@ ${target.name}.exe \ echo All tests built. % for target in buildable_targets: -${target.name}.exe: grpc_test_util +${target.name}.exe: grpc_test_util $(OUT_DIR) echo Building ${target.name} $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ \ %for source in target.src: diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 15b2a7feaa9..c9063c099c1 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -61,7 +61,7 @@ buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.e buildtests_cxx: echo All tests built. -alarm_heap_test.exe: grpc_test_util +alarm_heap_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_heap_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_heap_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_heap_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_heap_test.obj @@ -69,7 +69,7 @@ alarm_heap_test: alarm_heap_test.exe echo Running alarm_heap_test $(OUT_DIR)\alarm_heap_test.exe -alarm_list_test.exe: grpc_test_util +alarm_list_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_list_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_list_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_list_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_list_test.obj @@ -77,7 +77,7 @@ alarm_list_test: alarm_list_test.exe echo Running alarm_list_test $(OUT_DIR)\alarm_list_test.exe -alarm_test.exe: grpc_test_util +alarm_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_test.obj @@ -85,7 +85,7 @@ alarm_test: alarm_test.exe echo Running alarm_test $(OUT_DIR)\alarm_test.exe -alpn_test.exe: grpc_test_util +alpn_test.exe: grpc_test_util $(OUT_DIR) echo Building alpn_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\alpn_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alpn_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alpn_test.obj @@ -93,7 +93,7 @@ alpn_test: alpn_test.exe echo Running alpn_test $(OUT_DIR)\alpn_test.exe -bin_encoder_test.exe: grpc_test_util +bin_encoder_test.exe: grpc_test_util $(OUT_DIR) echo Building bin_encoder_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\bin_encoder_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\bin_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\bin_encoder_test.obj @@ -101,7 +101,7 @@ bin_encoder_test: bin_encoder_test.exe echo Running bin_encoder_test $(OUT_DIR)\bin_encoder_test.exe -census_hash_table_test.exe: grpc_test_util +census_hash_table_test.exe: grpc_test_util $(OUT_DIR) echo Building census_hash_table_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\hash_table_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_hash_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hash_table_test.obj @@ -109,7 +109,7 @@ census_hash_table_test: census_hash_table_test.exe echo Running census_hash_table_test $(OUT_DIR)\census_hash_table_test.exe -census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util +census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_multiple_writers_circular_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_circular_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_circular_buffer_test.obj @@ -117,7 +117,7 @@ census_statistics_multiple_writers_circular_buffer_test: census_statistics_multi echo Running census_statistics_multiple_writers_circular_buffer_test $(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe -census_statistics_multiple_writers_test.exe: grpc_test_util +census_statistics_multiple_writers_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_multiple_writers_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_test.obj @@ -125,7 +125,7 @@ census_statistics_multiple_writers_test: census_statistics_multiple_writers_test echo Running census_statistics_multiple_writers_test $(OUT_DIR)\census_statistics_multiple_writers_test.exe -census_statistics_performance_test.exe: grpc_test_util +census_statistics_performance_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_performance_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\performance_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_performance_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\performance_test.obj @@ -133,7 +133,7 @@ census_statistics_performance_test: census_statistics_performance_test.exe echo Running census_statistics_performance_test $(OUT_DIR)\census_statistics_performance_test.exe -census_statistics_quick_test.exe: grpc_test_util +census_statistics_quick_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_quick_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\quick_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_quick_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\quick_test.obj @@ -141,7 +141,7 @@ census_statistics_quick_test: census_statistics_quick_test.exe echo Running census_statistics_quick_test $(OUT_DIR)\census_statistics_quick_test.exe -census_statistics_small_log_test.exe: grpc_test_util +census_statistics_small_log_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_small_log_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\small_log_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_small_log_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\small_log_test.obj @@ -149,7 +149,7 @@ census_statistics_small_log_test: census_statistics_small_log_test.exe echo Running census_statistics_small_log_test $(OUT_DIR)\census_statistics_small_log_test.exe -census_stats_store_test.exe: grpc_test_util +census_stats_store_test.exe: grpc_test_util $(OUT_DIR) echo Building census_stats_store_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\rpc_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stats_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\rpc_stats_test.obj @@ -157,7 +157,7 @@ census_stats_store_test: census_stats_store_test.exe echo Running census_stats_store_test $(OUT_DIR)\census_stats_store_test.exe -census_stub_test.exe: grpc_test_util +census_stub_test.exe: grpc_test_util $(OUT_DIR) echo Building census_stub_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\census_stub_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stub_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\census_stub_test.obj @@ -165,7 +165,7 @@ census_stub_test: census_stub_test.exe echo Running census_stub_test $(OUT_DIR)\census_stub_test.exe -census_trace_store_test.exe: grpc_test_util +census_trace_store_test.exe: grpc_test_util $(OUT_DIR) echo Building census_trace_store_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\trace_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_trace_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\trace_test.obj @@ -173,7 +173,7 @@ census_trace_store_test: census_trace_store_test.exe echo Running census_trace_store_test $(OUT_DIR)\census_trace_store_test.exe -census_window_stats_test.exe: grpc_test_util +census_window_stats_test.exe: grpc_test_util $(OUT_DIR) echo Building census_window_stats_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\window_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_window_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\window_stats_test.obj @@ -181,7 +181,7 @@ census_window_stats_test: census_window_stats_test.exe echo Running census_window_stats_test $(OUT_DIR)\census_window_stats_test.exe -chttp2_status_conversion_test.exe: grpc_test_util +chttp2_status_conversion_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_status_conversion_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\status_conversion_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_status_conversion_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\status_conversion_test.obj @@ -189,7 +189,7 @@ chttp2_status_conversion_test: chttp2_status_conversion_test.exe echo Running chttp2_status_conversion_test $(OUT_DIR)\chttp2_status_conversion_test.exe -chttp2_stream_encoder_test.exe: grpc_test_util +chttp2_stream_encoder_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_stream_encoder_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_encoder_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_encoder_test.obj @@ -197,7 +197,7 @@ chttp2_stream_encoder_test: chttp2_stream_encoder_test.exe echo Running chttp2_stream_encoder_test $(OUT_DIR)\chttp2_stream_encoder_test.exe -chttp2_stream_map_test.exe: grpc_test_util +chttp2_stream_map_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_stream_map_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_map_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_map_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_map_test.obj @@ -205,7 +205,7 @@ chttp2_stream_map_test: chttp2_stream_map_test.exe echo Running chttp2_stream_map_test $(OUT_DIR)\chttp2_stream_map_test.exe -chttp2_transport_end2end_test.exe: grpc_test_util +chttp2_transport_end2end_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_transport_end2end_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2_transport_end2end_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_transport_end2end_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\chttp2_transport_end2end_test.obj @@ -213,7 +213,7 @@ chttp2_transport_end2end_test: chttp2_transport_end2end_test.exe echo Running chttp2_transport_end2end_test $(OUT_DIR)\chttp2_transport_end2end_test.exe -dualstack_socket_test.exe: grpc_test_util +dualstack_socket_test.exe: grpc_test_util $(OUT_DIR) echo Building dualstack_socket_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\dualstack_socket_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\dualstack_socket_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dualstack_socket_test.obj @@ -221,7 +221,7 @@ dualstack_socket_test: dualstack_socket_test.exe echo Running dualstack_socket_test $(OUT_DIR)\dualstack_socket_test.exe -echo_client.exe: grpc_test_util +echo_client.exe: grpc_test_util $(OUT_DIR) echo Building echo_client $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\client.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj @@ -229,7 +229,7 @@ echo_client: echo_client.exe echo Running echo_client $(OUT_DIR)\echo_client.exe -echo_server.exe: grpc_test_util +echo_server.exe: grpc_test_util $(OUT_DIR) echo Building echo_server $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\server.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj @@ -237,7 +237,7 @@ echo_server: echo_server.exe echo Running echo_server $(OUT_DIR)\echo_server.exe -echo_test.exe: grpc_test_util +echo_test.exe: grpc_test_util $(OUT_DIR) echo Building echo_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\echo_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\echo_test.obj @@ -245,7 +245,7 @@ echo_test: echo_test.exe echo Running echo_test $(OUT_DIR)\echo_test.exe -fd_posix_test.exe: grpc_test_util +fd_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building fd_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\fd_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fd_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fd_posix_test.obj @@ -253,7 +253,7 @@ fd_posix_test: fd_posix_test.exe echo Running fd_posix_test $(OUT_DIR)\fd_posix_test.exe -fling_client.exe: grpc_test_util +fling_client.exe: grpc_test_util $(OUT_DIR) echo Building fling_client $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\client.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj @@ -261,7 +261,7 @@ fling_client: fling_client.exe echo Running fling_client $(OUT_DIR)\fling_client.exe -fling_server.exe: grpc_test_util +fling_server.exe: grpc_test_util $(OUT_DIR) echo Building fling_server $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\server.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj @@ -269,7 +269,7 @@ fling_server: fling_server.exe echo Running fling_server $(OUT_DIR)\fling_server.exe -fling_stream_test.exe: grpc_test_util +fling_stream_test.exe: grpc_test_util $(OUT_DIR) echo Building fling_stream_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_stream_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_stream_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_stream_test.obj @@ -277,7 +277,7 @@ fling_stream_test: fling_stream_test.exe echo Running fling_stream_test $(OUT_DIR)\fling_stream_test.exe -fling_test.exe: grpc_test_util +fling_test.exe: grpc_test_util $(OUT_DIR) echo Building fling_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_test.obj @@ -285,7 +285,7 @@ fling_test: fling_test.exe echo Running fling_test $(OUT_DIR)\fling_test.exe -gen_hpack_tables.exe: grpc_test_util +gen_hpack_tables.exe: grpc_test_util $(OUT_DIR) echo Building gen_hpack_tables $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\src\core\transport\chttp2\gen_hpack_tables.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_hpack_tables.exe" Debug\grpc_test_util.lib Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_hpack_tables.obj @@ -293,7 +293,7 @@ gen_hpack_tables: gen_hpack_tables.exe echo Running gen_hpack_tables $(OUT_DIR)\gen_hpack_tables.exe -gpr_cancellable_test.exe: grpc_test_util +gpr_cancellable_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_cancellable_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cancellable_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cancellable_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cancellable_test.obj @@ -301,7 +301,7 @@ gpr_cancellable_test: gpr_cancellable_test.exe echo Running gpr_cancellable_test $(OUT_DIR)\gpr_cancellable_test.exe -gpr_cmdline_test.exe: grpc_test_util +gpr_cmdline_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_cmdline_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cmdline_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cmdline_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cmdline_test.obj @@ -309,7 +309,7 @@ gpr_cmdline_test: gpr_cmdline_test.exe echo Running gpr_cmdline_test $(OUT_DIR)\gpr_cmdline_test.exe -gpr_env_test.exe: grpc_test_util +gpr_env_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_env_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\env_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_env_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\env_test.obj @@ -317,7 +317,7 @@ gpr_env_test: gpr_env_test.exe echo Running gpr_env_test $(OUT_DIR)\gpr_env_test.exe -gpr_file_test.exe: grpc_test_util +gpr_file_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_file_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\file_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_file_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\file_test.obj @@ -325,7 +325,7 @@ gpr_file_test: gpr_file_test.exe echo Running gpr_file_test $(OUT_DIR)\gpr_file_test.exe -gpr_histogram_test.exe: grpc_test_util +gpr_histogram_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_histogram_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\histogram_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_histogram_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\histogram_test.obj @@ -333,7 +333,7 @@ gpr_histogram_test: gpr_histogram_test.exe echo Running gpr_histogram_test $(OUT_DIR)\gpr_histogram_test.exe -gpr_host_port_test.exe: grpc_test_util +gpr_host_port_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_host_port_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\host_port_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_host_port_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\host_port_test.obj @@ -341,7 +341,7 @@ gpr_host_port_test: gpr_host_port_test.exe echo Running gpr_host_port_test $(OUT_DIR)\gpr_host_port_test.exe -gpr_log_test.exe: grpc_test_util +gpr_log_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_log_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\log_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_log_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\log_test.obj @@ -349,7 +349,7 @@ gpr_log_test: gpr_log_test.exe echo Running gpr_log_test $(OUT_DIR)\gpr_log_test.exe -gpr_slice_buffer_test.exe: grpc_test_util +gpr_slice_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_slice_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_buffer_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_buffer_test.obj @@ -357,7 +357,7 @@ gpr_slice_buffer_test: gpr_slice_buffer_test.exe echo Running gpr_slice_buffer_test $(OUT_DIR)\gpr_slice_buffer_test.exe -gpr_slice_test.exe: grpc_test_util +gpr_slice_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_slice_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_test.obj @@ -365,7 +365,7 @@ gpr_slice_test: gpr_slice_test.exe echo Running gpr_slice_test $(OUT_DIR)\gpr_slice_test.exe -gpr_string_test.exe: grpc_test_util +gpr_string_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_string_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\string_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_string_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\string_test.obj @@ -373,7 +373,7 @@ gpr_string_test: gpr_string_test.exe echo Running gpr_string_test $(OUT_DIR)\gpr_string_test.exe -gpr_sync_test.exe: grpc_test_util +gpr_sync_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_sync_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\sync_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_sync_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sync_test.obj @@ -381,7 +381,7 @@ gpr_sync_test: gpr_sync_test.exe echo Running gpr_sync_test $(OUT_DIR)\gpr_sync_test.exe -gpr_thd_test.exe: grpc_test_util +gpr_thd_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_thd_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\thd_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_thd_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\thd_test.obj @@ -389,7 +389,7 @@ gpr_thd_test: gpr_thd_test.exe echo Running gpr_thd_test $(OUT_DIR)\gpr_thd_test.exe -gpr_time_test.exe: grpc_test_util +gpr_time_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_time_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_time_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj @@ -397,7 +397,7 @@ gpr_time_test: gpr_time_test.exe echo Running gpr_time_test $(OUT_DIR)\gpr_time_test.exe -gpr_useful_test.exe: grpc_test_util +gpr_useful_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_useful_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\useful_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_useful_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\useful_test.obj @@ -405,7 +405,7 @@ gpr_useful_test: gpr_useful_test.exe echo Running gpr_useful_test $(OUT_DIR)\gpr_useful_test.exe -grpc_base64_test.exe: grpc_test_util +grpc_base64_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_base64_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\base64_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_base64_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\base64_test.obj @@ -413,7 +413,7 @@ grpc_base64_test: grpc_base64_test.exe echo Running grpc_base64_test $(OUT_DIR)\grpc_base64_test.exe -grpc_byte_buffer_reader_test.exe: grpc_test_util +grpc_byte_buffer_reader_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_byte_buffer_reader_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\byte_buffer_reader_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_byte_buffer_reader_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\byte_buffer_reader_test.obj @@ -421,7 +421,7 @@ grpc_byte_buffer_reader_test: grpc_byte_buffer_reader_test.exe echo Running grpc_byte_buffer_reader_test $(OUT_DIR)\grpc_byte_buffer_reader_test.exe -grpc_channel_stack_test.exe: grpc_test_util +grpc_channel_stack_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_channel_stack_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\channel_stack_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_channel_stack_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\channel_stack_test.obj @@ -429,7 +429,7 @@ grpc_channel_stack_test: grpc_channel_stack_test.exe echo Running grpc_channel_stack_test $(OUT_DIR)\grpc_channel_stack_test.exe -grpc_completion_queue_benchmark.exe: grpc_test_util +grpc_completion_queue_benchmark.exe: grpc_test_util $(OUT_DIR) echo Building grpc_completion_queue_benchmark $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_benchmark.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_benchmark.obj @@ -437,7 +437,7 @@ grpc_completion_queue_benchmark: grpc_completion_queue_benchmark.exe echo Running grpc_completion_queue_benchmark $(OUT_DIR)\grpc_completion_queue_benchmark.exe -grpc_completion_queue_test.exe: grpc_test_util +grpc_completion_queue_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_completion_queue_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_test.obj @@ -445,7 +445,7 @@ grpc_completion_queue_test: grpc_completion_queue_test.exe echo Running grpc_completion_queue_test $(OUT_DIR)\grpc_completion_queue_test.exe -grpc_create_jwt.exe: grpc_test_util +grpc_create_jwt.exe: grpc_test_util $(OUT_DIR) echo Building grpc_create_jwt $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\create_jwt.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_create_jwt.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\create_jwt.obj @@ -453,7 +453,7 @@ grpc_create_jwt: grpc_create_jwt.exe echo Running grpc_create_jwt $(OUT_DIR)\grpc_create_jwt.exe -grpc_credentials_test.exe: grpc_test_util +grpc_credentials_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_credentials_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\credentials_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_credentials_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\credentials_test.obj @@ -461,7 +461,7 @@ grpc_credentials_test: grpc_credentials_test.exe echo Running grpc_credentials_test $(OUT_DIR)\grpc_credentials_test.exe -grpc_fetch_oauth2.exe: grpc_test_util +grpc_fetch_oauth2.exe: grpc_test_util $(OUT_DIR) echo Building grpc_fetch_oauth2 $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\fetch_oauth2.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_fetch_oauth2.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fetch_oauth2.obj @@ -469,7 +469,7 @@ grpc_fetch_oauth2: grpc_fetch_oauth2.exe echo Running grpc_fetch_oauth2 $(OUT_DIR)\grpc_fetch_oauth2.exe -grpc_json_token_test.exe: grpc_test_util +grpc_json_token_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_json_token_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\json_token_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_json_token_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_token_test.obj @@ -477,7 +477,7 @@ grpc_json_token_test: grpc_json_token_test.exe echo Running grpc_json_token_test $(OUT_DIR)\grpc_json_token_test.exe -grpc_print_google_default_creds_token.exe: grpc_test_util +grpc_print_google_default_creds_token.exe: grpc_test_util $(OUT_DIR) echo Building grpc_print_google_default_creds_token $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\print_google_default_creds_token.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_print_google_default_creds_token.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\print_google_default_creds_token.obj @@ -485,7 +485,7 @@ grpc_print_google_default_creds_token: grpc_print_google_default_creds_token.exe echo Running grpc_print_google_default_creds_token $(OUT_DIR)\grpc_print_google_default_creds_token.exe -grpc_stream_op_test.exe: grpc_test_util +grpc_stream_op_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_stream_op_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\stream_op_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_stream_op_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_op_test.obj @@ -493,7 +493,7 @@ grpc_stream_op_test: grpc_stream_op_test.exe echo Running grpc_stream_op_test $(OUT_DIR)\grpc_stream_op_test.exe -hpack_parser_test.exe: grpc_test_util +hpack_parser_test.exe: grpc_test_util $(OUT_DIR) echo Building hpack_parser_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_parser_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_parser_test.obj @@ -501,7 +501,7 @@ hpack_parser_test: hpack_parser_test.exe echo Running hpack_parser_test $(OUT_DIR)\hpack_parser_test.exe -hpack_table_test.exe: grpc_test_util +hpack_table_test.exe: grpc_test_util $(OUT_DIR) echo Building hpack_table_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_table_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_table_test.obj @@ -509,7 +509,7 @@ hpack_table_test: hpack_table_test.exe echo Running hpack_table_test $(OUT_DIR)\hpack_table_test.exe -httpcli_format_request_test.exe: grpc_test_util +httpcli_format_request_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_format_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\format_request_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_format_request_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\format_request_test.obj @@ -517,7 +517,7 @@ httpcli_format_request_test: httpcli_format_request_test.exe echo Running httpcli_format_request_test $(OUT_DIR)\httpcli_format_request_test.exe -httpcli_parser_test.exe: grpc_test_util +httpcli_parser_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_parser_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\parser_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\parser_test.obj @@ -525,7 +525,7 @@ httpcli_parser_test: httpcli_parser_test.exe echo Running httpcli_parser_test $(OUT_DIR)\httpcli_parser_test.exe -httpcli_test.exe: grpc_test_util +httpcli_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\httpcli_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\httpcli_test.obj @@ -533,7 +533,7 @@ httpcli_test: httpcli_test.exe echo Running httpcli_test $(OUT_DIR)\httpcli_test.exe -json_rewrite.exe: grpc_test_util +json_rewrite.exe: grpc_test_util $(OUT_DIR) echo Building json_rewrite $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite.exe" Debug\grpc.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite.obj @@ -541,7 +541,7 @@ json_rewrite: json_rewrite.exe echo Running json_rewrite $(OUT_DIR)\json_rewrite.exe -json_rewrite_test.exe: grpc_test_util +json_rewrite_test.exe: grpc_test_util $(OUT_DIR) echo Building json_rewrite_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite_test.obj @@ -549,7 +549,7 @@ json_rewrite_test: json_rewrite_test.exe echo Running json_rewrite_test $(OUT_DIR)\json_rewrite_test.exe -json_test.exe: grpc_test_util +json_test.exe: grpc_test_util $(OUT_DIR) echo Building json_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_test.obj @@ -557,7 +557,7 @@ json_test: json_test.exe echo Running json_test $(OUT_DIR)\json_test.exe -lame_client_test.exe: grpc_test_util +lame_client_test.exe: grpc_test_util $(OUT_DIR) echo Building lame_client_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\lame_client_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\lame_client_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\lame_client_test.obj @@ -565,7 +565,7 @@ lame_client_test: lame_client_test.exe echo Running lame_client_test $(OUT_DIR)\lame_client_test.exe -low_level_ping_pong_benchmark.exe: grpc_test_util +low_level_ping_pong_benchmark.exe: grpc_test_util $(OUT_DIR) echo Building low_level_ping_pong_benchmark $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\network_benchmarks\low_level_ping_pong.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\low_level_ping_pong_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\low_level_ping_pong.obj @@ -573,7 +573,7 @@ low_level_ping_pong_benchmark: low_level_ping_pong_benchmark.exe echo Running low_level_ping_pong_benchmark $(OUT_DIR)\low_level_ping_pong_benchmark.exe -message_compress_test.exe: grpc_test_util +message_compress_test.exe: grpc_test_util $(OUT_DIR) echo Building message_compress_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\compression\message_compress_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\message_compress_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\message_compress_test.obj @@ -581,7 +581,7 @@ message_compress_test: message_compress_test.exe echo Running message_compress_test $(OUT_DIR)\message_compress_test.exe -metadata_buffer_test.exe: grpc_test_util +metadata_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building metadata_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\metadata_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\metadata_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_buffer_test.obj @@ -589,7 +589,7 @@ metadata_buffer_test: metadata_buffer_test.exe echo Running metadata_buffer_test $(OUT_DIR)\metadata_buffer_test.exe -multi_init_test.exe: grpc_test_util +multi_init_test.exe: grpc_test_util $(OUT_DIR) echo Building multi_init_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\multi_init_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\multi_init_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multi_init_test.obj @@ -597,7 +597,7 @@ multi_init_test: multi_init_test.exe echo Running multi_init_test $(OUT_DIR)\multi_init_test.exe -murmur_hash_test.exe: grpc_test_util +murmur_hash_test.exe: grpc_test_util $(OUT_DIR) echo Building murmur_hash_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\murmur_hash_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\murmur_hash_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\murmur_hash_test.obj @@ -605,7 +605,7 @@ murmur_hash_test: murmur_hash_test.exe echo Running murmur_hash_test $(OUT_DIR)\murmur_hash_test.exe -no_server_test.exe: grpc_test_util +no_server_test.exe: grpc_test_util $(OUT_DIR) echo Building no_server_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\no_server_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\no_server_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\no_server_test.obj @@ -613,7 +613,7 @@ no_server_test: no_server_test.exe echo Running no_server_test $(OUT_DIR)\no_server_test.exe -poll_kick_posix_test.exe: grpc_test_util +poll_kick_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building poll_kick_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\poll_kick_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\poll_kick_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\poll_kick_posix_test.obj @@ -621,7 +621,7 @@ poll_kick_posix_test: poll_kick_posix_test.exe echo Running poll_kick_posix_test $(OUT_DIR)\poll_kick_posix_test.exe -resolve_address_test.exe: grpc_test_util +resolve_address_test.exe: grpc_test_util $(OUT_DIR) echo Building resolve_address_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\resolve_address_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\resolve_address_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\resolve_address_test.obj @@ -629,7 +629,7 @@ resolve_address_test: resolve_address_test.exe echo Running resolve_address_test $(OUT_DIR)\resolve_address_test.exe -secure_endpoint_test.exe: grpc_test_util +secure_endpoint_test.exe: grpc_test_util $(OUT_DIR) echo Building secure_endpoint_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\secure_endpoint_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\secure_endpoint_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\secure_endpoint_test.obj @@ -637,7 +637,7 @@ secure_endpoint_test: secure_endpoint_test.exe echo Running secure_endpoint_test $(OUT_DIR)\secure_endpoint_test.exe -sockaddr_utils_test.exe: grpc_test_util +sockaddr_utils_test.exe: grpc_test_util $(OUT_DIR) echo Building sockaddr_utils_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\sockaddr_utils_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\sockaddr_utils_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sockaddr_utils_test.obj @@ -645,7 +645,7 @@ sockaddr_utils_test: sockaddr_utils_test.exe echo Running sockaddr_utils_test $(OUT_DIR)\sockaddr_utils_test.exe -tcp_client_posix_test.exe: grpc_test_util +tcp_client_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_client_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_client_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_client_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_client_posix_test.obj @@ -653,7 +653,7 @@ tcp_client_posix_test: tcp_client_posix_test.exe echo Running tcp_client_posix_test $(OUT_DIR)\tcp_client_posix_test.exe -tcp_posix_test.exe: grpc_test_util +tcp_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_posix_test.obj @@ -661,7 +661,7 @@ tcp_posix_test: tcp_posix_test.exe echo Running tcp_posix_test $(OUT_DIR)\tcp_posix_test.exe -tcp_server_posix_test.exe: grpc_test_util +tcp_server_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_server_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_server_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_server_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_server_posix_test.obj @@ -669,7 +669,7 @@ tcp_server_posix_test: tcp_server_posix_test.exe echo Running tcp_server_posix_test $(OUT_DIR)\tcp_server_posix_test.exe -time_averaged_stats_test.exe: grpc_test_util +time_averaged_stats_test.exe: grpc_test_util $(OUT_DIR) echo Building time_averaged_stats_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\time_averaged_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_averaged_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_averaged_stats_test.obj @@ -677,7 +677,7 @@ time_averaged_stats_test: time_averaged_stats_test.exe echo Running time_averaged_stats_test $(OUT_DIR)\time_averaged_stats_test.exe -time_test.exe: grpc_test_util +time_test.exe: grpc_test_util $(OUT_DIR) echo Building time_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj @@ -685,7 +685,7 @@ time_test: time_test.exe echo Running time_test $(OUT_DIR)\time_test.exe -timeout_encoding_test.exe: grpc_test_util +timeout_encoding_test.exe: grpc_test_util $(OUT_DIR) echo Building timeout_encoding_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\timeout_encoding_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timeout_encoding_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timeout_encoding_test.obj @@ -693,7 +693,7 @@ timeout_encoding_test: timeout_encoding_test.exe echo Running timeout_encoding_test $(OUT_DIR)\timeout_encoding_test.exe -transport_metadata_test.exe: grpc_test_util +transport_metadata_test.exe: grpc_test_util $(OUT_DIR) echo Building transport_metadata_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_metadata_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_test.obj @@ -701,7 +701,7 @@ transport_metadata_test: transport_metadata_test.exe echo Running transport_metadata_test $(OUT_DIR)\transport_metadata_test.exe -transport_security_test.exe: grpc_test_util +transport_security_test.exe: grpc_test_util $(OUT_DIR) echo Building transport_security_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\tsi\transport_security_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_security_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\transport_security_test.obj From 818efa6741d33fed9a9ecbb03d5df8ec1112683c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 09:58:14 -0700 Subject: [PATCH 07/65] Implement gpr_sleep_until for Windows. --- src/core/support/time_win32.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c index f221cb57903..539470bccfe 100644 --- a/src/core/support/time_win32.c +++ b/src/core/support/time_win32.c @@ -39,6 +39,7 @@ #include #include +#include gpr_timespec gpr_now(void) { gpr_timespec now_tv; @@ -49,4 +50,23 @@ gpr_timespec gpr_now(void) { return now_tv; } +void gpr_sleep_until(gpr_timespec until) { + gpr_timespec now; + gpr_timespec delta; + DWORD sleep_millis; + + for (;;) { + /* We could simplify by using clock_nanosleep instead, but it might be + * slightly less portable. */ + now = gpr_now(); + if (gpr_time_cmp(until, now) <= 0) { + return; + } + + delta = gpr_time_sub(until, now); + sleep_millis = delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS; + Sleep(sleep_millis); + } +} + #endif /* GPR_WIN32 */ From 87f84051958879f088449810d68a4e4f1eba09d6 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 09:58:27 -0700 Subject: [PATCH 08/65] Clean up alarm_test.c includes --- test/core/iomgr/alarm_test.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/core/iomgr/alarm_test.c b/test/core/iomgr/alarm_test.c index 8d49332fa65..e677ba30dde 100644 --- a/test/core/iomgr/alarm_test.c +++ b/test/core/iomgr/alarm_test.c @@ -37,13 +37,9 @@ #include #include #include -#include #include #include #include -#include -#include -#include #include #include From 532fa365a00ac53912771bb9b4dca98633b90fc3 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 10:53:42 -0700 Subject: [PATCH 09/65] Add endpoint_pair_windows.c (never compiled) --- src/core/iomgr/endpoint_pair_windows.c | 88 ++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/core/iomgr/endpoint_pair_windows.c diff --git a/src/core/iomgr/endpoint_pair_windows.c b/src/core/iomgr/endpoint_pair_windows.c new file mode 100644 index 00000000000..365f2d15a7a --- /dev/null +++ b/src/core/iomgr/endpoint_pair_windows.c @@ -0,0 +1,88 @@ +/* + * + * 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 + +#ifdef GPR_POSIX_SOCKET + +#include "src/core/iomgr/endpoint_pair.h" + +#include +#include +#include +#include +#include + +#include "src/core/iomgr/tcp_posix.h" +#include + +static void create_sockets(SOCKET sv[2]) { + SOCKET svr_sock = INVALID_SOCKET; + SOCKET lst_sock = INVALID_SOCKET; + SOCKET cli_sock = INVALID_SOCKET; + BOOL success; + int status; + sockaddr_in addr; + socklen_t addr_len; + + lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); + GPR_ASSERT(lst_sock != INVALID_SOCKET); + + memset(addr, 0, sizeof(addr)); + GPR_ASSERT(bind(lst_sock, &addr, sizeof(addr)) != SOCKET_ERROR); + GPR_ASSERT(listen(lst_sock, SOMAXCONN) != SOCKET_ERROR); + GPR_ASSERT(getsockname(lst_sock, &addr, &addr_len) != SOCKET_ERROR); + + cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); + GPR_ASSERT(cli_sock != INVALID_SOCKET); + + GPR_ASSERT(WSAConnect(cli_sock, &addr, addr_len, NULL, NULL, NULL, NULL) == 0); + svr_sock = accept(lst_sock, &addr, &addr_len); + GPR_ASSERT(svr_sock != INVALID_SOCKET); + + Close(lst_sock); + + sv[1] = cli_sock; + sv[0] = svr_sock; +} + +grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(size_t read_slice_size) { + SOCKET sv[2]; + grpc_endpoint_pair p; + create_sockets(sv); + p.client = grpc_tcp_create(grpc_fd_create(sv[1]), read_slice_size); + p.server = grpc_tcp_create(grpc_fd_create(sv[0]), read_slice_size); + return p; +} + +#endif From 1861dca16c8c75e8e8deaee7d11c9e98dd83b4d8 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 11:25:26 -0700 Subject: [PATCH 10/65] Fix #ifdef --- src/core/iomgr/endpoint_pair_windows.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/iomgr/endpoint_pair_windows.c b/src/core/iomgr/endpoint_pair_windows.c index 365f2d15a7a..a30d3f70abe 100644 --- a/src/core/iomgr/endpoint_pair_windows.c +++ b/src/core/iomgr/endpoint_pair_windows.c @@ -33,7 +33,7 @@ #include -#ifdef GPR_POSIX_SOCKET +#ifdef GPR_WINSOCK_SOCKET #include "src/core/iomgr/endpoint_pair.h" From b25c90dbf45df3c411160db63f2e046cf9ea3112 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 11:26:30 -0700 Subject: [PATCH 11/65] Add endpoint_pair_windows.c --- BUILD | 2 ++ Makefile | 5 +++++ build.json | 1 + vsprojects/vs2010/grpc.vcxproj | 2 ++ vsprojects/vs2010/grpc.vcxproj.filters | 3 +++ vsprojects/vs2010/grpc_unsecure.vcxproj | 2 ++ vsprojects/vs2010/grpc_unsecure.vcxproj.filters | 3 +++ vsprojects/vs2013/grpc.vcxproj | 2 ++ vsprojects/vs2013/grpc.vcxproj.filters | 3 +++ vsprojects/vs2013/grpc_unsecure.vcxproj | 2 ++ vsprojects/vs2013/grpc_unsecure.vcxproj.filters | 3 +++ 11 files changed, 28 insertions(+) diff --git a/BUILD b/BUILD index e5822c74428..43017102a10 100644 --- a/BUILD +++ b/BUILD @@ -259,6 +259,7 @@ cc_library( "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", @@ -467,6 +468,7 @@ cc_library( "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", diff --git a/Makefile b/Makefile index fad9eb26fbd..94c0236e68d 100644 --- a/Makefile +++ b/Makefile @@ -2523,6 +2523,7 @@ LIBGRPC_SRC = \ src/core/iomgr/alarm_heap.c \ src/core/iomgr/endpoint.c \ src/core/iomgr/endpoint_pair_posix.c \ + src/core/iomgr/endpoint_pair_windows.c \ src/core/iomgr/fd_posix.c \ src/core/iomgr/iocp_windows.c \ src/core/iomgr/iomgr.c \ @@ -2670,6 +2671,7 @@ src/core/iomgr/alarm.c: $(OPENSSL_DEP) src/core/iomgr/alarm_heap.c: $(OPENSSL_DEP) src/core/iomgr/endpoint.c: $(OPENSSL_DEP) src/core/iomgr/endpoint_pair_posix.c: $(OPENSSL_DEP) +src/core/iomgr/endpoint_pair_windows.c: $(OPENSSL_DEP) src/core/iomgr/fd_posix.c: $(OPENSSL_DEP) src/core/iomgr/iocp_windows.c: $(OPENSSL_DEP) src/core/iomgr/iomgr.c: $(OPENSSL_DEP) @@ -2833,6 +2835,7 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: @@ -3009,6 +3012,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/iomgr/alarm_heap.c \ src/core/iomgr/endpoint.c \ src/core/iomgr/endpoint_pair_posix.c \ + src/core/iomgr/endpoint_pair_windows.c \ src/core/iomgr/fd_posix.c \ src/core/iomgr/iocp_windows.c \ src/core/iomgr/iomgr.c \ @@ -3149,6 +3153,7 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: diff --git a/build.json b/build.json index 1e7ab9661b0..06bcd0e3a5a 100644 --- a/build.json +++ b/build.json @@ -191,6 +191,7 @@ "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", diff --git a/vsprojects/vs2010/grpc.vcxproj b/vsprojects/vs2010/grpc.vcxproj index 203ca347d3f..02d1f2643e1 100644 --- a/vsprojects/vs2010/grpc.vcxproj +++ b/vsprojects/vs2010/grpc.vcxproj @@ -270,6 +270,8 @@ + + diff --git a/vsprojects/vs2010/grpc.vcxproj.filters b/vsprojects/vs2010/grpc.vcxproj.filters index 20dbe8c444f..a010639ad13 100644 --- a/vsprojects/vs2010/grpc.vcxproj.filters +++ b/vsprojects/vs2010/grpc.vcxproj.filters @@ -124,6 +124,9 @@ src\core\iomgr + + src\core\iomgr + src\core\iomgr diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj b/vsprojects/vs2010/grpc_unsecure.vcxproj index 1558d72514d..651f38ae342 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj @@ -214,6 +214,8 @@ + + diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters index 4b758d61132..7757a44aecb 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters @@ -64,6 +64,9 @@ src\core\iomgr + + src\core\iomgr + src\core\iomgr diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj index a88eb34ab88..cb87334eab6 100644 --- a/vsprojects/vs2013/grpc.vcxproj +++ b/vsprojects/vs2013/grpc.vcxproj @@ -272,6 +272,8 @@ + + diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters index 20dbe8c444f..a010639ad13 100644 --- a/vsprojects/vs2013/grpc.vcxproj.filters +++ b/vsprojects/vs2013/grpc.vcxproj.filters @@ -124,6 +124,9 @@ src\core\iomgr + + src\core\iomgr + src\core\iomgr diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj index 98c14c2fdb4..098ce340c11 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj @@ -216,6 +216,8 @@ + + diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters index 4b758d61132..7757a44aecb 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters @@ -64,6 +64,9 @@ src\core\iomgr + + src\core\iomgr + src\core\iomgr From a181436d1d8167f4a8a52efff3511eb2403e0d08 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 11:54:08 -0700 Subject: [PATCH 12/65] Make endpoint_pair_windows compile. --- src/core/iomgr/endpoint_pair_windows.c | 29 ++++++++++++-------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/core/iomgr/endpoint_pair_windows.c b/src/core/iomgr/endpoint_pair_windows.c index a30d3f70abe..d78b6ea957e 100644 --- a/src/core/iomgr/endpoint_pair_windows.c +++ b/src/core/iomgr/endpoint_pair_windows.c @@ -34,43 +34,40 @@ #include #ifdef GPR_WINSOCK_SOCKET - +#include "src/core/iomgr/sockaddr_utils.h" #include "src/core/iomgr/endpoint_pair.h" #include #include #include -#include -#include -#include "src/core/iomgr/tcp_posix.h" +#include "src/core/iomgr/tcp_windows.h" +#include "src/core/iomgr/socket_windows.h" #include static void create_sockets(SOCKET sv[2]) { SOCKET svr_sock = INVALID_SOCKET; SOCKET lst_sock = INVALID_SOCKET; SOCKET cli_sock = INVALID_SOCKET; - BOOL success; - int status; - sockaddr_in addr; - socklen_t addr_len; + SOCKADDR_IN addr; + int addr_len; lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); GPR_ASSERT(lst_sock != INVALID_SOCKET); - memset(addr, 0, sizeof(addr)); - GPR_ASSERT(bind(lst_sock, &addr, sizeof(addr)) != SOCKET_ERROR); + memset(&addr, 0, sizeof(addr)); + GPR_ASSERT(bind(lst_sock, (struct sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR); GPR_ASSERT(listen(lst_sock, SOMAXCONN) != SOCKET_ERROR); - GPR_ASSERT(getsockname(lst_sock, &addr, &addr_len) != SOCKET_ERROR); + GPR_ASSERT(getsockname(lst_sock, (struct sockaddr*)&addr, &addr_len) != SOCKET_ERROR); cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); GPR_ASSERT(cli_sock != INVALID_SOCKET); - GPR_ASSERT(WSAConnect(cli_sock, &addr, addr_len, NULL, NULL, NULL, NULL) == 0); - svr_sock = accept(lst_sock, &addr, &addr_len); + GPR_ASSERT(WSAConnect(cli_sock, (struct sockaddr*)&addr, addr_len, NULL, NULL, NULL, NULL) == 0); + svr_sock = accept(lst_sock, (struct sockaddr*)&addr, &addr_len); GPR_ASSERT(svr_sock != INVALID_SOCKET); - Close(lst_sock); + closesocket(lst_sock); sv[1] = cli_sock; sv[0] = svr_sock; @@ -80,8 +77,8 @@ grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(size_t read_slice_size) { SOCKET sv[2]; grpc_endpoint_pair p; create_sockets(sv); - p.client = grpc_tcp_create(grpc_fd_create(sv[1]), read_slice_size); - p.server = grpc_tcp_create(grpc_fd_create(sv[0]), read_slice_size); + p.client = grpc_tcp_create(grpc_winsocket_create(sv[1])); + p.server = grpc_tcp_create(grpc_winsocket_create(sv[0])); return p; } From d5cc8aca76b7d5f74439ff71a7937f38bc31047d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 11:55:26 -0700 Subject: [PATCH 13/65] Spam cleanup --- tools/run_tests/jobset.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index b4c3d194915..efe040aeb65 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -183,7 +183,6 @@ class Job(object): for k, v in spec.environ.iteritems(): env[k] = v self._start = time.time() - print spec.cwd self._process = subprocess.Popen(args=spec.cmdline, stderr=subprocess.STDOUT, stdout=self._tempfile, From 95cd750989777d6d3851be7734f00091b624400d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 13:38:22 -0700 Subject: [PATCH 14/65] Revert mistaken OpenSSL change --- third_party/openssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/openssl b/third_party/openssl index 4ac03295828..3df69d3aefd 160000 --- a/third_party/openssl +++ b/third_party/openssl @@ -1 +1 @@ -Subproject commit 4ac0329582829f5378d8078c8d314ad37db87736 +Subproject commit 3df69d3aefde7671053d4e3c242b228e5d79c83f From d625d81e9b8179d0da2dacf66981662fb24565c7 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 15:52:35 -0700 Subject: [PATCH 15/65] Allow restricting platforms for certain tests --- build.json | 3 + templates/tools/run_tests/tests.json.template | 1 + tools/run_tests/run_tests.py | 12 +- tools/run_tests/tests.json | 2531 ++++++++++++++--- 4 files changed, 2124 insertions(+), 423 deletions(-) diff --git a/build.json b/build.json index 06bcd0e3a5a..f7a05fae3bb 100644 --- a/build.json +++ b/build.json @@ -854,6 +854,9 @@ "grpc", "gpr_test_util", "gpr" + ], + "platforms": [ + "posix" ] }, { diff --git a/templates/tools/run_tests/tests.json.template b/templates/tools/run_tests/tests.json.template index 6d7520bc0f8..113eebe4a59 100644 --- a/templates/tools/run_tests/tests.json.template +++ b/templates/tools/run_tests/tests.json.template @@ -4,6 +4,7 @@ import json ${json.dumps([{"name": tgt.name, "language": tgt.language, + "platforms": tgt.get("platforms", ["windows", "posix"]), "flaky": tgt.get("flaky", False)} for tgt in targets if tgt.get('run', True) and tgt.build == 'test'], diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 6013f1163b9..b2e93626893 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -102,9 +102,16 @@ class CLanguage(object): def __init__(self, make_target, test_lang): self.make_target = make_target + if platform.system() == 'Windows': + plat = 'windows' + else: + plat = 'posix' with open('tools/run_tests/tests.json') as f: js = json.load(f) - self.binaries = [tgt for tgt in js if tgt['language'] == test_lang] + self.binaries = [tgt + for tgt in js + if tgt['language'] == test_lang and + plat in tgt['platforms']] def test_specs(self, config, travis): out = [] @@ -191,6 +198,7 @@ class PythonLanguage(object): def __str__(self): return 'python' + class RubyLanguage(object): def test_specs(self, config, travis): @@ -208,6 +216,7 @@ class RubyLanguage(object): def __str__(self): return 'ruby' + class CSharpLanguage(object): def test_specs(self, config, travis): @@ -225,6 +234,7 @@ class CSharpLanguage(object): def __str__(self): return 'csharp' + class Build(object): def test_specs(self, config, travis): diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index eab07040e7c..3e304ee88a6 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -4,2112 +4,3799 @@ { "flaky": false, "language": "c", - "name": "alarm_heap_test" + "name": "alarm_heap_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alarm_list_test" + "name": "alarm_list_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alarm_test" + "name": "alarm_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alpn_test" + "name": "alpn_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "bin_encoder_test" + "name": "bin_encoder_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_hash_table_test" + "name": "census_hash_table_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": true, "language": "c", - "name": "census_statistics_multiple_writers_circular_buffer_test" + "name": "census_statistics_multiple_writers_circular_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_multiple_writers_test" + "name": "census_statistics_multiple_writers_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_performance_test" + "name": "census_statistics_performance_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_quick_test" + "name": "census_statistics_quick_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": true, "language": "c", - "name": "census_statistics_small_log_test" + "name": "census_statistics_small_log_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_stub_test" + "name": "census_stub_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_window_stats_test" + "name": "census_window_stats_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_status_conversion_test" + "name": "chttp2_status_conversion_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_stream_encoder_test" + "name": "chttp2_stream_encoder_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_stream_map_test" + "name": "chttp2_stream_map_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_transport_end2end_test" + "name": "chttp2_transport_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "dualstack_socket_test" + "name": "dualstack_socket_test", + "platforms": [ + "posix" + ] }, { "flaky": false, "language": "c", - "name": "echo_test" + "name": "echo_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fd_posix_test" + "name": "fd_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fling_stream_test" + "name": "fling_stream_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fling_test" + "name": "fling_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_cancellable_test" + "name": "gpr_cancellable_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_cmdline_test" + "name": "gpr_cmdline_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_env_test" + "name": "gpr_env_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_file_test" + "name": "gpr_file_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_histogram_test" + "name": "gpr_histogram_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_host_port_test" + "name": "gpr_host_port_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_log_test" + "name": "gpr_log_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_slice_buffer_test" + "name": "gpr_slice_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_slice_test" + "name": "gpr_slice_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_string_test" + "name": "gpr_string_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_sync_test" + "name": "gpr_sync_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_thd_test" + "name": "gpr_thd_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_time_test" + "name": "gpr_time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_useful_test" + "name": "gpr_useful_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_base64_test" + "name": "grpc_base64_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_byte_buffer_reader_test" + "name": "grpc_byte_buffer_reader_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_channel_stack_test" + "name": "grpc_channel_stack_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_completion_queue_test" + "name": "grpc_completion_queue_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_credentials_test" + "name": "grpc_credentials_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_json_token_test" + "name": "grpc_json_token_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_stream_op_test" + "name": "grpc_stream_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "hpack_parser_test" + "name": "hpack_parser_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "hpack_table_test" + "name": "hpack_table_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "httpcli_format_request_test" + "name": "httpcli_format_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "httpcli_parser_test" + "name": "httpcli_parser_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "json_rewrite_test" + "name": "json_rewrite_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "json_test" + "name": "json_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "lame_client_test" + "name": "lame_client_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "message_compress_test" + "name": "message_compress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "metadata_buffer_test" + "name": "metadata_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "multi_init_test" + "name": "multi_init_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "murmur_hash_test" + "name": "murmur_hash_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "no_server_test" + "name": "no_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "poll_kick_posix_test" + "name": "poll_kick_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "resolve_address_test" + "name": "resolve_address_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "secure_endpoint_test" + "name": "secure_endpoint_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "sockaddr_utils_test" + "name": "sockaddr_utils_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_client_posix_test" + "name": "tcp_client_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_posix_test" + "name": "tcp_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_server_posix_test" + "name": "tcp_server_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "time_averaged_stats_test" + "name": "time_averaged_stats_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "time_test" + "name": "time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "timeout_encoding_test" + "name": "timeout_encoding_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "transport_metadata_test" + "name": "transport_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "transport_security_test" + "name": "transport_security_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "async_end2end_test" + "name": "async_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "channel_arguments_test" + "name": "channel_arguments_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "cli_call_test" + "name": "cli_call_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "credentials_test" + "name": "credentials_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "cxx_time_test" + "name": "cxx_time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "end2end_test" + "name": "end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "generic_end2end_test" + "name": "generic_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "interop_test" + "name": "interop_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "pubsub_publisher_test" + "name": "pubsub_publisher_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "pubsub_subscriber_test" + "name": "pubsub_subscriber_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "status_test" + "name": "status_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "thread_pool_test" + "name": "thread_pool_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_bad_hostname_test" + "name": "chttp2_fake_security_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_test" + "name": "chttp2_fake_security_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_invoke_test" + "name": "chttp2_fake_security_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_before_invoke_test" + "name": "chttp2_fake_security_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_in_a_vacuum_test" + "name": "chttp2_fake_security_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_census_simple_request_test" + "name": "chttp2_fake_security_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_disappearing_server_test" + "name": "chttp2_fake_security_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_empty_batch_test" + "name": "chttp2_fake_security_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_graceful_server_shutdown_test" + "name": "chttp2_fake_security_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_invoke_large_request_test" + "name": "chttp2_fake_security_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_max_concurrent_streams_test" + "name": "chttp2_fake_security_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_no_op_test" + "name": "chttp2_fake_security_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_ping_pong_streaming_test" + "name": "chttp2_fake_security_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test" + "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_payload_test" + "name": "chttp2_fake_security_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_large_metadata_test" + "name": "chttp2_fake_security_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_payload_test" + "name": "chttp2_fake_security_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_delayed_request_test" + "name": "chttp2_fake_security_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_request_test" + "name": "chttp2_fake_security_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_thread_stress_test" + "name": "chttp2_fake_security_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_legacy_test" + "name": "chttp2_fake_security_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_invoke_legacy_test" + "name": "chttp2_fake_security_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_before_invoke_legacy_test" + "name": "chttp2_fake_security_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_census_simple_request_legacy_test" + "name": "chttp2_fake_security_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_disappearing_server_legacy_test" + "name": "chttp2_fake_security_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test" + "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_invoke_large_request_legacy_test" + "name": "chttp2_fake_security_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_max_concurrent_streams_legacy_test" + "name": "chttp2_fake_security_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_no_op_legacy_test" + "name": "chttp2_fake_security_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_ping_pong_streaming_legacy_test" + "name": "chttp2_fake_security_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_large_metadata_legacy_test" + "name": "chttp2_fake_security_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_payload_legacy_test" + "name": "chttp2_fake_security_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_delayed_request_legacy_test" + "name": "chttp2_fake_security_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_request_legacy_test" + "name": "chttp2_fake_security_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_thread_stress_legacy_test" + "name": "chttp2_fake_security_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_bad_hostname_test" + "name": "chttp2_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_test" + "name": "chttp2_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_invoke_test" + "name": "chttp2_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_before_invoke_test" + "name": "chttp2_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_census_simple_request_test" + "name": "chttp2_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_disappearing_server_test" + "name": "chttp2_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_empty_batch_test" + "name": "chttp2_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_graceful_server_shutdown_test" + "name": "chttp2_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_invoke_large_request_test" + "name": "chttp2_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_max_concurrent_streams_test" + "name": "chttp2_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_no_op_test" + "name": "chttp2_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_ping_pong_streaming_test" + "name": "chttp2_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_payload_test" + "name": "chttp2_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_large_metadata_test" + "name": "chttp2_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_payload_test" + "name": "chttp2_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_delayed_request_test" + "name": "chttp2_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_request_test" + "name": "chttp2_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_thread_stress_test" + "name": "chttp2_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_census_simple_request_legacy_test" + "name": "chttp2_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_disappearing_server_legacy_test" + "name": "chttp2_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_no_op_legacy_test" + "name": "chttp2_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_payload_legacy_test" + "name": "chttp2_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_request_legacy_test" + "name": "chttp2_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_thread_stress_legacy_test" + "name": "chttp2_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_bad_hostname_test" + "name": "chttp2_fullstack_uds_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_invoke_test" + "name": "chttp2_fullstack_uds_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_before_invoke_test" + "name": "chttp2_fullstack_uds_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test" + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_census_simple_request_test" + "name": "chttp2_fullstack_uds_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_disappearing_server_test" + "name": "chttp2_fullstack_uds_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_empty_batch_test" + "name": "chttp2_fullstack_uds_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_graceful_server_shutdown_test" + "name": "chttp2_fullstack_uds_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_invoke_large_request_test" + "name": "chttp2_fullstack_uds_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_max_concurrent_streams_test" + "name": "chttp2_fullstack_uds_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_no_op_test" + "name": "chttp2_fullstack_uds_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_ping_pong_streaming_test" + "name": "chttp2_fullstack_uds_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_large_metadata_test" + "name": "chttp2_fullstack_uds_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_payload_test" + "name": "chttp2_fullstack_uds_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_delayed_request_test" + "name": "chttp2_fullstack_uds_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_request_test" + "name": "chttp2_fullstack_uds_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_thread_stress_test" + "name": "chttp2_fullstack_uds_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test" + "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_census_simple_request_legacy_test" + "name": "chttp2_fullstack_uds_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_disappearing_server_legacy_test" + "name": "chttp2_fullstack_uds_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test" + "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test" + "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test" + "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_no_op_legacy_test" + "name": "chttp2_fullstack_uds_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test" + "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test" + "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test" + "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_request_legacy_test" + "name": "chttp2_fullstack_uds_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_thread_stress_legacy_test" + "name": "chttp2_fullstack_uds_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_bad_hostname_test" + "name": "chttp2_simple_ssl_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test" + "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_census_simple_request_test" + "name": "chttp2_simple_ssl_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_disappearing_server_test" + "name": "chttp2_simple_ssl_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_empty_batch_test" + "name": "chttp2_simple_ssl_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test" + "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test" + "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test" + "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_no_op_test" + "name": "chttp2_simple_ssl_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test" + "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test" + "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test" + "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_request_test" + "name": "chttp2_simple_ssl_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_thread_stress_test" + "name": "chttp2_simple_ssl_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test" + "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test" + "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test" + "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_bad_hostname_test" + "name": "chttp2_socket_pair_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_test" + "name": "chttp2_socket_pair_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_invoke_test" + "name": "chttp2_socket_pair_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_before_invoke_test" + "name": "chttp2_socket_pair_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_in_a_vacuum_test" + "name": "chttp2_socket_pair_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_census_simple_request_test" + "name": "chttp2_socket_pair_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_disappearing_server_test" + "name": "chttp2_socket_pair_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_empty_batch_test" + "name": "chttp2_socket_pair_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_graceful_server_shutdown_test" + "name": "chttp2_socket_pair_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_invoke_large_request_test" + "name": "chttp2_socket_pair_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_max_concurrent_streams_test" + "name": "chttp2_socket_pair_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_no_op_test" + "name": "chttp2_socket_pair_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_ping_pong_streaming_test" + "name": "chttp2_socket_pair_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test" + "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_payload_test" + "name": "chttp2_socket_pair_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_large_metadata_test" + "name": "chttp2_socket_pair_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_payload_test" + "name": "chttp2_socket_pair_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_delayed_request_test" + "name": "chttp2_socket_pair_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_request_test" + "name": "chttp2_socket_pair_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_thread_stress_test" + "name": "chttp2_socket_pair_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test" + "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_legacy_test" + "name": "chttp2_socket_pair_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test" + "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test" + "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_census_simple_request_legacy_test" + "name": "chttp2_socket_pair_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_disappearing_server_legacy_test" + "name": "chttp2_socket_pair_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test" + "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_invoke_large_request_legacy_test" + "name": "chttp2_socket_pair_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test" + "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_no_op_legacy_test" + "name": "chttp2_socket_pair_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test" + "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test" + "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_payload_legacy_test" + "name": "chttp2_socket_pair_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_delayed_request_legacy_test" + "name": "chttp2_socket_pair_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_request_legacy_test" + "name": "chttp2_socket_pair_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_thread_stress_legacy_test" + "name": "chttp2_socket_pair_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] } ] From 0ff7e692b0070bf8da1a6e983ce58bbf9cc003e8 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 15:57:17 -0700 Subject: [PATCH 16/65] Better defaulting of attributes --- templates/tools/run_tests/tests.json.template | 4 +- tools/buildgen/plugins/expand_bin_attrs.py | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100755 tools/buildgen/plugins/expand_bin_attrs.py diff --git a/templates/tools/run_tests/tests.json.template b/templates/tools/run_tests/tests.json.template index 113eebe4a59..337858d9f1f 100644 --- a/templates/tools/run_tests/tests.json.template +++ b/templates/tools/run_tests/tests.json.template @@ -4,8 +4,8 @@ import json ${json.dumps([{"name": tgt.name, "language": tgt.language, - "platforms": tgt.get("platforms", ["windows", "posix"]), - "flaky": tgt.get("flaky", False)} + "platforms": tgt.platforms, + "flaky": tgt.flaky} for tgt in targets if tgt.get('run', True) and tgt.build == 'test'], sort_keys=True, indent=2)} diff --git a/tools/buildgen/plugins/expand_bin_attrs.py b/tools/buildgen/plugins/expand_bin_attrs.py new file mode 100755 index 00000000000..0896a5a1652 --- /dev/null +++ b/tools/buildgen/plugins/expand_bin_attrs.py @@ -0,0 +1,51 @@ +# 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. + +"""Buildgen expand binary attributes plugin. + +This fills in any optional attributes. + +""" + + +def mako_plugin(dictionary): + """The exported plugin code for expand_filegroups. + + The list of libs in the build.json file can contain "filegroups" tags. + These refer to the filegroups in the root object. We will expand and + merge filegroups on the src, headers and public_headers properties. + + """ + + targets = dictionary.get('targets') + + for tgt in targets: + tgt['flaky'] = tgt.get('flaky', False) + tgt['platforms'] = tgt.get('platforms', ['windows', 'posix']) + From fef0c2dcf52a3430575fd222d176da6dfc0846ad Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 15:58:59 -0700 Subject: [PATCH 17/65] Dont build uninteresting tests on Windows --- templates/vsprojects/vs2013/Grpc.mak.template | 5 ++++- vsprojects/vs2013/Grpc.mak | 10 +--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/templates/vsprojects/vs2013/Grpc.mak.template b/templates/vsprojects/vs2013/Grpc.mak.template index e43d6bb5051..c1c15df5c68 100644 --- a/templates/vsprojects/vs2013/Grpc.mak.template +++ b/templates/vsprojects/vs2013/Grpc.mak.template @@ -32,7 +32,10 @@ <%def name="to_windows_path(path)">${path.replace('/','\\')}\ <% allowed_dependencies = set(['gpr', 'grpc', 'gpr_test_util', 'grpc_test_util']) - buildable_targets = [ target for target in targets if set(target.deps).issubset(allowed_dependencies) and all([src.endswith('.c') for src in target.src])] + buildable_targets = [ target for target in targets + if set(target.deps).issubset(allowed_dependencies) and + all([src.endswith('.c') for src in target.src]) and + 'windows' in target.platforms ] c_test_targets = [ target for target in buildable_targets if target.build == 'test' and not target.language == 'c++' ] cxx_test_targets = [ target for target in buildable_targets if target.build == 'test' and target.language == 'c++' ] %>\ diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index c9063c099c1..f211d3f6c0e 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -55,7 +55,7 @@ $(OUT_DIR): 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 chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.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_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 metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_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 chttp2_transport_end2end_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.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_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 metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe echo All tests built. buildtests_cxx: @@ -213,14 +213,6 @@ chttp2_transport_end2end_test: chttp2_transport_end2end_test.exe echo Running chttp2_transport_end2end_test $(OUT_DIR)\chttp2_transport_end2end_test.exe -dualstack_socket_test.exe: grpc_test_util $(OUT_DIR) - echo Building dualstack_socket_test - $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\dualstack_socket_test.c - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\dualstack_socket_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dualstack_socket_test.obj -dualstack_socket_test: dualstack_socket_test.exe - echo Running dualstack_socket_test - $(OUT_DIR)\dualstack_socket_test.exe - echo_client.exe: grpc_test_util $(OUT_DIR) echo Building echo_client $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\client.c From 34cf2f37f7e08e4f5c908691514c213fb4369c0e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 16:10:00 -0700 Subject: [PATCH 18/65] Begin port selection code for windows --- Makefile | 3 + build.json | 1 + test/core/util/port_windows.c | 159 +++++++++++++++++++++++ vsprojects/vs2010/grpc_test_util.vcxproj | 2 + vsprojects/vs2013/grpc_test_util.vcxproj | 2 + 5 files changed, 167 insertions(+) create mode 100644 test/core/util/port_windows.c diff --git a/Makefile b/Makefile index 94c0236e68d..cbf7c4dd40e 100644 --- a/Makefile +++ b/Makefile @@ -2925,6 +2925,7 @@ LIBGRPC_TEST_UTIL_SRC = \ test/core/util/grpc_profiler.c \ test/core/util/parse_hexstring.c \ test/core/util/port_posix.c \ + test/core/util/port_windows.c \ test/core/util/slice_splitter.c \ @@ -2954,6 +2955,7 @@ test/core/transport/transport_end2end_tests.c: $(OPENSSL_DEP) test/core/util/grpc_profiler.c: $(OPENSSL_DEP) test/core/util/parse_hexstring.c: $(OPENSSL_DEP) test/core/util/port_posix.c: $(OPENSSL_DEP) +test/core/util/port_windows.c: $(OPENSSL_DEP) test/core/util/slice_splitter.c: $(OPENSSL_DEP) endif @@ -2987,6 +2989,7 @@ $(OBJDIR)/$(CONFIG)/test/core/transport/transport_end2end_tests.o: $(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: $(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: $(OBJDIR)/$(CONFIG)/test/core/util/port_posix.o: +$(OBJDIR)/$(CONFIG)/test/core/util/port_windows.o: $(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: diff --git a/build.json b/build.json index f7a05fae3bb..fb81e34beb3 100644 --- a/build.json +++ b/build.json @@ -434,6 +434,7 @@ "test/core/util/grpc_profiler.c", "test/core/util/parse_hexstring.c", "test/core/util/port_posix.c", + "test/core/util/port_windows.c", "test/core/util/slice_splitter.c" ], "deps": [ diff --git a/test/core/util/port_windows.c b/test/core/util/port_windows.c new file mode 100644 index 00000000000..279aa2d21b3 --- /dev/null +++ b/test/core/util/port_windows.c @@ -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/test_config.h" +#if defined(GPR_WINSOCK_SOCKET) && defined(GRPC_TEST_PICK_PORT) + +#include "test/core/util/port.h" + +#include +#include +#include +#include +#include +#include + +#include + +#define NUM_RANDOM_PORTS_TO_PICK 100 + +static int is_port_available(int *port, int is_tcp) { + const int proto = is_tcp ? IPPROTO_TCP : 0; + const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); + int one = 1; + struct sockaddr_in addr; + socklen_t alen = sizeof(addr); + int actual_port; + + GPR_ASSERT(*port >= 0); + GPR_ASSERT(*port <= 65535); + if (fd < 0) { + gpr_log(GPR_ERROR, "socket() failed: %s", strerror(errno)); + return 0; + } + + /* Reuseaddr lets us start up a server immediately after it exits */ + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) { + gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno)); + close(fd); + return 0; + } + + /* Try binding to port */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(*port); + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno)); + close(fd); + return 0; + } + + /* Get the bound port number */ + if (getsockname(fd, (struct sockaddr *)&addr, &alen) < 0) { + gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno)); + close(fd); + return 0; + } + GPR_ASSERT(alen <= sizeof(addr)); + actual_port = ntohs(addr.sin_port); + GPR_ASSERT(actual_port > 0); + if (*port == 0) { + *port = actual_port; + } else { + GPR_ASSERT(*port == actual_port); + } + + close(fd); + return 1; +} + +int grpc_pick_unused_port(void) { + /* We repeatedly pick a port and then see whether or not it is + available for use both as a TCP socket and a UDP socket. First, we + pick a random large port number. For subsequent + iterations, we bind to an anonymous port and let the OS pick the + port number. The random port picking reduces the probability of + races with other processes on kernels that want to reuse the same + port numbers over and over. */ + + /* In alternating iterations we try UDP ports before TCP ports UDP + ports -- it could be the case that this machine has been using up + UDP ports and they are scarcer. */ + + /* Type of port to first pick in next iteration */ + int is_tcp = 1; + int try = 0; + + for (;;) { + int port; + try++; + if (try == 1) { + port = getpid() % (65536 - 30000) + 30000; + } else if (try <= NUM_RANDOM_PORTS_TO_PICK) { + port = rand() % (65536 - 30000) + 30000; + } else { + port = 0; + } + + if (!is_port_available(&port, is_tcp)) { + continue; + } + + GPR_ASSERT(port > 0); + /* Check that the port # is free for the other type of socket also */ + if (!is_port_available(&port, !is_tcp)) { + /* In the next iteration try to bind to the other type first + because perhaps it is more rare. */ + is_tcp = !is_tcp; + continue; + } + + /* TODO(ctiller): consider caching this port in some structure, to avoid + handing it out again */ + + return port; + } + + /* The port iterator reached the end without finding a suitable port. */ + return 0; +} + +int grpc_pick_unused_port_or_die(void) { + int port = grpc_pick_unused_port(); + GPR_ASSERT(port > 0); + return port; +} + +#endif /* GPR_WINSOCK_SOCKET && GRPC_TEST_PICK_PORT */ diff --git a/vsprojects/vs2010/grpc_test_util.vcxproj b/vsprojects/vs2010/grpc_test_util.vcxproj index 967543f78a8..d3559d4dde0 100644 --- a/vsprojects/vs2010/grpc_test_util.vcxproj +++ b/vsprojects/vs2010/grpc_test_util.vcxproj @@ -96,6 +96,8 @@ + + diff --git a/vsprojects/vs2013/grpc_test_util.vcxproj b/vsprojects/vs2013/grpc_test_util.vcxproj index 4756f539289..d25fd7cbf15 100644 --- a/vsprojects/vs2013/grpc_test_util.vcxproj +++ b/vsprojects/vs2013/grpc_test_util.vcxproj @@ -98,6 +98,8 @@ + + From ee76f4f93232d5d772003b4afb3e24d23d89cf4f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 16:10:29 -0700 Subject: [PATCH 19/65] Fix indentation --- test/core/end2end/dualstack_socket_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c index 66b76dc0523..29097661bce 100644 --- a/test/core/end2end/dualstack_socket_test.c +++ b/test/core/end2end/dualstack_socket_test.c @@ -192,7 +192,7 @@ int main(int argc, char **argv) { do_ipv6 = 0; } - /* For coverage, test with and without dualstack sockets. */ + /* For coverage, test with and without dualstack sockets. */ for (grpc_forbid_dualstack_sockets_for_testing = 0; grpc_forbid_dualstack_sockets_for_testing <= 1; grpc_forbid_dualstack_sockets_for_testing++) { From b8fce7f628948d0a3f26b0b779f270600392aa27 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 16:10:41 -0700 Subject: [PATCH 20/65] Remove unix headers --- test/core/transport/chttp2_transport_end2end_test.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/core/transport/chttp2_transport_end2end_test.c b/test/core/transport/chttp2_transport_end2end_test.c index b90fe229999..766fd19960e 100644 --- a/test/core/transport/chttp2_transport_end2end_test.c +++ b/test/core/transport/chttp2_transport_end2end_test.c @@ -38,8 +38,6 @@ #include #include #include -#include -#include #include "test/core/util/test_config.h" #include "src/core/iomgr/iomgr.h" From f7262057e6fff03544311cd95ea584218062e2ab Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Apr 2015 16:13:58 -0700 Subject: [PATCH 21/65] Port port_posix to port_windows. --- test/core/util/port_windows.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test/core/util/port_windows.c b/test/core/util/port_windows.c index 279aa2d21b3..17058c33533 100644 --- a/test/core/util/port_windows.c +++ b/test/core/util/port_windows.c @@ -35,14 +35,13 @@ #include "test/core/util/test_config.h" #if defined(GPR_WINSOCK_SOCKET) && defined(GRPC_TEST_PICK_PORT) +#include "src/core/iomgr/sockaddr_utils.h" #include "test/core/util/port.h" -#include -#include +#include #include #include #include -#include #include @@ -50,7 +49,7 @@ static int is_port_available(int *port, int is_tcp) { const int proto = is_tcp ? IPPROTO_TCP : 0; - const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); + const SOCKET fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); int one = 1; struct sockaddr_in addr; socklen_t alen = sizeof(addr); @@ -64,9 +63,9 @@ static int is_port_available(int *port, int is_tcp) { } /* Reuseaddr lets us start up a server immediately after it exits */ - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) { + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&one, sizeof(one)) < 0) { gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno)); - close(fd); + closesocket(fd); return 0; } @@ -76,14 +75,14 @@ static int is_port_available(int *port, int is_tcp) { addr.sin_port = htons(*port); if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno)); - close(fd); + closesocket(fd); return 0; } /* Get the bound port number */ if (getsockname(fd, (struct sockaddr *)&addr, &alen) < 0) { gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno)); - close(fd); + closesocket(fd); return 0; } GPR_ASSERT(alen <= sizeof(addr)); @@ -95,7 +94,7 @@ static int is_port_available(int *port, int is_tcp) { GPR_ASSERT(*port == actual_port); } - close(fd); + closesocket(fd); return 1; } @@ -120,7 +119,7 @@ int grpc_pick_unused_port(void) { int port; try++; if (try == 1) { - port = getpid() % (65536 - 30000) + 30000; + port = _getpid() % (65536 - 30000) + 30000; } else if (try <= NUM_RANDOM_PORTS_TO_PICK) { port = rand() % (65536 - 30000) + 30000; } else { From e9a6eb7332eef19805e1177e813dfd301096743d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 9 Apr 2015 15:51:41 -0700 Subject: [PATCH 22/65] Allow RunScenarios to spawn in-process workers This allows us to get back to single binary tests where appropriate, which will help in-depth profiling efforts. I've built this atop my smoke_test changes as they inspired me to get this done. --- Makefile | 23 ++-- build.json | 10 +- test/core/util/port_posix.c | 33 ++++- test/cpp/qps/driver.cc | 28 ++++- test/cpp/qps/driver.h | 3 +- test/cpp/qps/qps_driver.cc | 4 +- test/cpp/qps/qps_worker.cc | 233 ++++++++++++++++++++++++++++++++++++ test/cpp/qps/qps_worker.h | 60 ++++++++++ test/cpp/qps/smoke_test.cc | 8 +- test/cpp/qps/smoke_test.sh | 28 ----- test/cpp/qps/worker.cc | 189 +---------------------------- 11 files changed, 385 insertions(+), 234 deletions(-) create mode 100644 test/cpp/qps/qps_worker.cc create mode 100644 test/cpp/qps/qps_worker.h delete mode 100755 test/cpp/qps/smoke_test.sh diff --git a/Makefile b/Makefile index 6665eb418cb..47ce0cff057 100644 --- a/Makefile +++ b/Makefile @@ -3728,7 +3728,12 @@ $(OBJDIR)/$(CONFIG)/examples/pubsub/subscriber.o: $(GENDIR)/examples/pubsub/ LIBQPS_SRC = \ $(GENDIR)/test/cpp/qps/qpstest.pb.cc \ + test/cpp/qps/client_async.cc \ + test/cpp/qps/client_sync.cc \ test/cpp/qps/driver.cc \ + test/cpp/qps/qps_worker.cc \ + test/cpp/qps/server_async.cc \ + test/cpp/qps/server_sync.cc \ test/cpp/qps/timer.cc \ @@ -3757,7 +3762,12 @@ ifneq ($(OPENSSL_DEP),) # installing headers to their final destination on the drive. We need this # otherwise parallel compilation will fail if a source is compiled first. test/cpp/qps/qpstest.proto: $(OPENSSL_DEP) +test/cpp/qps/client_async.cc: $(OPENSSL_DEP) +test/cpp/qps/client_sync.cc: $(OPENSSL_DEP) test/cpp/qps/driver.cc: $(OPENSSL_DEP) +test/cpp/qps/qps_worker.cc: $(OPENSSL_DEP) +test/cpp/qps/server_async.cc: $(OPENSSL_DEP) +test/cpp/qps/server_sync.cc: $(OPENSSL_DEP) test/cpp/qps/timer.cc: $(OPENSSL_DEP) endif @@ -3784,7 +3794,12 @@ endif endif +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/qps/timer.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc @@ -8775,10 +8790,6 @@ endif QPS_WORKER_SRC = \ - test/cpp/qps/client_async.cc \ - test/cpp/qps/client_sync.cc \ - test/cpp/qps/server_async.cc \ - test/cpp/qps/server_sync.cc \ test/cpp/qps/worker.cc \ QPS_WORKER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(QPS_WORKER_SRC)))) @@ -8809,10 +8820,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(LIBDIR)/$(CONFIG)/libqps.a $(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 -$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(LIBDIR)/$(CONFIG)/libqps.a $(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 -$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(LIBDIR)/$(CONFIG)/libqps.a $(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 -$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(LIBDIR)/$(CONFIG)/libqps.a $(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 $(OBJDIR)/$(CONFIG)/test/cpp/qps/worker.o: $(LIBDIR)/$(CONFIG)/libqps.a $(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_qps_worker: $(QPS_WORKER_OBJS:.o=.dep) diff --git a/build.json b/build.json index f2a39c6f2c5..adf6128339c 100644 --- a/build.json +++ b/build.json @@ -554,11 +554,17 @@ "language": "c++", "headers": [ "test/cpp/qps/driver.h", + "test/cpp/qps/qps_worker.h", "test/cpp/qps/timer.h" ], "src": [ "test/cpp/qps/qpstest.proto", + "test/cpp/qps/client_async.cc", + "test/cpp/qps/client_sync.cc", "test/cpp/qps/driver.cc", + "test/cpp/qps/qps_worker.cc", + "test/cpp/qps/server_async.cc", + "test/cpp/qps/server_sync.cc", "test/cpp/qps/timer.cc" ] }, @@ -2007,10 +2013,6 @@ "test/cpp/qps/server.h" ], "src": [ - "test/cpp/qps/client_async.cc", - "test/cpp/qps/client_sync.cc", - "test/cpp/qps/server_async.cc", - "test/cpp/qps/server_sync.cc", "test/cpp/qps/worker.cc" ], "deps": [ diff --git a/test/core/util/port_posix.c b/test/core/util/port_posix.c index 7467c2f9ea4..726ee3bd6c7 100644 --- a/test/core/util/port_posix.c +++ b/test/core/util/port_posix.c @@ -44,10 +44,37 @@ #include #include +#include #include #define NUM_RANDOM_PORTS_TO_PICK 100 +static int *chosen_ports = NULL; +static size_t num_chosen_ports = 0; + +static int has_port_been_chosen(int port) { + size_t i; + for (i = 0; i < num_chosen_ports; i++) { + if (chosen_ports[i] == port) { + return 1; + } + } + return 0; +} + +static void free_chosen_ports() { + gpr_free(chosen_ports); +} + +static void chose_port(int port) { + if (chosen_ports == NULL) { + atexit(free_chosen_ports); + } + num_chosen_ports++; + chosen_ports = gpr_realloc(chosen_ports, sizeof(int) * num_chosen_ports); + chosen_ports[num_chosen_ports - 1] = port; +} + static int is_port_available(int *port, int is_tcp) { const int proto = is_tcp ? IPPROTO_TCP : 0; const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); @@ -127,6 +154,10 @@ int grpc_pick_unused_port(void) { port = 0; } + if (has_port_been_chosen(port)) { + continue; + } + if (!is_port_available(&port, is_tcp)) { continue; } @@ -142,7 +173,7 @@ int grpc_pick_unused_port(void) { /* TODO(ctiller): consider caching this port in some structure, to avoid handing it out again */ - + chose_port(port); return port; } diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index f44883783dd..9f7d3b56a44 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -42,21 +42,25 @@ #include #include #include +#include #include #include "test/cpp/qps/histogram.h" +#include "test/cpp/qps/qps_worker.h" +#include "test/core/util/port.h" using std::list; using std::thread; using std::unique_ptr; +using std::deque; using std::vector; namespace grpc { namespace testing { -static vector get_hosts(const string& name) { +static deque get_hosts(const string& name) { char* env = gpr_getenv(name.c_str()); - if (!env) return vector(); + if (!env) return deque(); - vector out; + deque out; char* p = env; for (;;) { char* comma = strchr(p, ','); @@ -76,7 +80,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, const ServerConfig& server_config, size_t num_servers, int warmup_seconds, - int benchmark_seconds) { + int benchmark_seconds, + int spawn_local_worker_count) { // ClientContext allocator (all are destroyed at scope exit) list contexts; auto alloc_context = [&contexts]() { @@ -88,6 +93,21 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, auto workers = get_hosts("QPS_WORKERS"); ClientConfig client_config = initial_client_config; + // Spawn some local workers if desired + vector> local_workers; + for (int i = 0; i < abs(spawn_local_worker_count); i++) { + 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)); + char addr[256]; + sprintf(addr, "localhost:%d", driver_port); + if (spawn_local_worker_count < 0) { + workers.push_front(addr); + } else { + workers.push_back(addr); + } + } + // TODO(ctiller): support running multiple configurations, and binpack // client/server pairs // to available workers diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h index 7a81b701c48..bfa0e68ff86 100644 --- a/test/cpp/qps/driver.h +++ b/test/cpp/qps/driver.h @@ -56,7 +56,8 @@ ScenarioResult RunScenario(const grpc::testing::ClientConfig& client_config, const grpc::testing::ServerConfig& server_config, size_t num_servers, int warmup_seconds, - int benchmark_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 f42d538b165..e1f1649af42 100644 --- a/test/cpp/qps/qps_driver.cc +++ b/test/cpp/qps/qps_driver.cc @@ -42,6 +42,7 @@ DEFINE_int32(num_servers, 1, "Number of server binaries"); DEFINE_int32(warmup_seconds, 5, "Warmup time (in seconds)"); DEFINE_int32(benchmark_seconds, 30, "Benchmark time (in seconds)"); +DEFINE_int32(local_workers, 0, "Number of local workers to start"); // Common config DEFINE_bool(enable_ssl, false, "Use SSL"); @@ -103,7 +104,8 @@ int main(int argc, char** argv) { auto result = RunScenario(client_config, FLAGS_num_clients, server_config, FLAGS_num_servers, - FLAGS_warmup_seconds, FLAGS_benchmark_seconds); + FLAGS_warmup_seconds, FLAGS_benchmark_seconds, + FLAGS_local_workers); gpr_log(GPR_INFO, "QPS: %.1f", result.latencies.Count() / diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc new file mode 100644 index 00000000000..46d70dce529 --- /dev/null +++ b/test/cpp/qps/qps_worker.cc @@ -0,0 +1,233 @@ +/* + * + * 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 "qps_worker.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "test/core/util/grpc_profiler.h" +#include "test/cpp/util/create_test_channel.h" +#include "test/cpp/qps/qpstest.pb.h" +#include "test/cpp/qps/client.h" +#include "test/cpp/qps/server.h" + +namespace grpc { +namespace testing { + +std::unique_ptr CreateClient(const ClientConfig& config) { + switch (config.client_type()) { + case ClientType::SYNCHRONOUS_CLIENT: + return (config.rpc_type() == RpcType::UNARY) ? + CreateSynchronousUnaryClient(config) : + CreateSynchronousStreamingClient(config); + case ClientType::ASYNC_CLIENT: + return (config.rpc_type() == RpcType::UNARY) ? + CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config); + } + abort(); +} + +std::unique_ptr CreateServer(const ServerConfig& config, int server_port) { + switch (config.server_type()) { + case ServerType::SYNCHRONOUS_SERVER: + return CreateSynchronousServer(config, server_port); + case ServerType::ASYNC_SERVER: + return CreateAsyncServer(config, server_port); + } + abort(); +} + +class WorkerImpl GRPC_FINAL : public Worker::Service { + public: + explicit WorkerImpl(int server_port) : server_port_(server_port), acquired_(false) {} + + Status RunTest(ServerContext* ctx, + ServerReaderWriter* stream) + GRPC_OVERRIDE { + InstanceGuard g(this); + if (!g.Acquired()) { + return Status(RESOURCE_EXHAUSTED); + } + + grpc_profiler_start("qps_client.prof"); + Status ret = RunTestBody(ctx,stream); + grpc_profiler_stop(); + return ret; + } + + Status RunServer(ServerContext* ctx, + ServerReaderWriter* stream) + GRPC_OVERRIDE { + InstanceGuard g(this); + if (!g.Acquired()) { + return Status(RESOURCE_EXHAUSTED); + } + + grpc_profiler_start("qps_server.prof"); + Status ret = RunServerBody(ctx,stream); + grpc_profiler_stop(); + return ret; + } + + private: + // Protect against multiple clients using this worker at once. + class InstanceGuard { + public: + InstanceGuard(WorkerImpl* impl) + : impl_(impl), acquired_(impl->TryAcquireInstance()) {} + ~InstanceGuard() { + if (acquired_) { + impl_->ReleaseInstance(); + } + } + + bool Acquired() const { return acquired_; } + + private: + WorkerImpl* const impl_; + const bool acquired_; + }; + + bool TryAcquireInstance() { + std::lock_guard g(mu_); + if (acquired_) return false; + acquired_ = true; + return true; + } + + void ReleaseInstance() { + std::lock_guard g(mu_); + GPR_ASSERT(acquired_); + acquired_ = false; + } + + Status RunTestBody(ServerContext* ctx, + ServerReaderWriter* stream) { + ClientArgs args; + if (!stream->Read(&args)) { + return Status(INVALID_ARGUMENT); + } + if (!args.has_setup()) { + return Status(INVALID_ARGUMENT); + } + auto client = CreateClient(args.setup()); + if (!client) { + return Status(INVALID_ARGUMENT); + } + ClientStatus status; + if (!stream->Write(status)) { + return Status(UNKNOWN); + } + while (stream->Read(&args)) { + if (!args.has_mark()) { + return Status(INVALID_ARGUMENT); + } + *status.mutable_stats() = client->Mark(); + stream->Write(status); + } + + return Status::OK; + } + + Status RunServerBody(ServerContext* ctx, + ServerReaderWriter* stream) { + ServerArgs args; + if (!stream->Read(&args)) { + return Status(INVALID_ARGUMENT); + } + if (!args.has_setup()) { + return Status(INVALID_ARGUMENT); + } + auto server = CreateServer(args.setup(), server_port_); + if (!server) { + return Status(INVALID_ARGUMENT); + } + ServerStatus status; + status.set_port(server_port_); + if (!stream->Write(status)) { + return Status(UNKNOWN); + } + while (stream->Read(&args)) { + if (!args.has_mark()) { + return Status(INVALID_ARGUMENT); + } + *status.mutable_stats() = server->Mark(); + stream->Write(status); + } + + return Status::OK; + } + + const int server_port_; + + std::mutex mu_; + bool acquired_; +}; + +QpsWorker::QpsWorker(int driver_port, int server_port) { + impl_.reset(new WorkerImpl(server_port)); + + char* server_address = NULL; + gpr_join_host_port(&server_address, "::", driver_port); + + ServerBuilder builder; + builder.AddListeningPort(server_address, InsecureServerCredentials()); + builder.RegisterService(impl_.get()); + + gpr_free(server_address); + + server_ = std::move(builder.BuildAndStart()); +} + +QpsWorker::~QpsWorker() { +} + +} // namespace testing +} // namespace grpc diff --git a/test/cpp/qps/qps_worker.h b/test/cpp/qps/qps_worker.h new file mode 100644 index 00000000000..861588907ec --- /dev/null +++ b/test/cpp/qps/qps_worker.h @@ -0,0 +1,60 @@ +/* + * + * 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 QPS_WORKER_H +#define QPS_WORKER_H + +#include + +namespace grpc { + +class Server; + +namespace testing { + +class WorkerImpl; + +class QpsWorker { + public: + QpsWorker(int driver_port, int server_port); + ~QpsWorker(); + + private: + std::unique_ptr impl_; + std::unique_ptr server_; +}; + +} // namespace testing +} // namespace grpc + +#endif diff --git a/test/cpp/qps/smoke_test.cc b/test/cpp/qps/smoke_test.cc index 5cdabb88a0d..b0cc0c30394 100644 --- a/test/cpp/qps/smoke_test.cc +++ b/test/cpp/qps/smoke_test.cc @@ -58,7 +58,7 @@ static void RunSynchronousUnaryPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); gpr_log(GPR_INFO, "QPS: %.1f", result.latencies.Count() / @@ -87,7 +87,7 @@ static void RunSynchronousStreamingPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); gpr_log(GPR_INFO, "QPS: %.1f", result.latencies.Count() / @@ -117,7 +117,7 @@ static void RunAsyncUnaryPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); gpr_log(GPR_INFO, "QPS: %.1f", result.latencies.Count() / @@ -147,7 +147,7 @@ static void RunQPS() { server_config.set_enable_ssl(false); server_config.set_threads(4); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); auto qps = result.latencies.Count() / diff --git a/test/cpp/qps/smoke_test.sh b/test/cpp/qps/smoke_test.sh deleted file mode 100755 index ba7f0a4f27d..00000000000 --- a/test/cpp/qps/smoke_test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# performs a single qps run with one client and one server - -set -ex - -cd $(dirname $0)/../../.. - -killall qps_worker || true - -config=opt - -NUMCPUS=`python2.7 -c 'import multiprocessing; print multiprocessing.cpu_count()'` - -make CONFIG=$config qps_worker qps_smoke_test -j$NUMCPUS - -bins/$config/qps_worker -driver_port 10000 -server_port 10001 & -PID1=$! -bins/$config/qps_worker -driver_port 10010 -server_port 10011 & -PID2=$! - -export QPS_WORKERS="localhost:10000,localhost:10010" - -bins/$config/qps_smoke_test $* - -kill -2 $PID1 $PID2 -wait - diff --git a/test/cpp/qps/worker.cc b/test/cpp/qps/worker.cc index b6830cc0557..1ef5313b661 100644 --- a/test/cpp/qps/worker.cc +++ b/test/cpp/qps/worker.cc @@ -31,33 +31,15 @@ * */ -#include -#include -#include -#include -#include -#include -#include - #include +#include +#include + #include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include "test/core/util/grpc_profiler.h" -#include "test/cpp/util/create_test_channel.h" -#include "test/cpp/qps/qpstest.pb.h" -#include "test/cpp/qps/client.h" -#include "test/cpp/qps/server.h" + +#include "qps_worker.h" DEFINE_int32(driver_port, 0, "Driver server port."); DEFINE_int32(server_port, 0, "Spawned server port."); @@ -76,167 +58,8 @@ static void sigint_handler(int x) {got_sigint = true;} namespace grpc { namespace testing { -std::unique_ptr CreateClient(const ClientConfig& config) { - switch (config.client_type()) { - case ClientType::SYNCHRONOUS_CLIENT: - return (config.rpc_type() == RpcType::UNARY) ? - CreateSynchronousUnaryClient(config) : - CreateSynchronousStreamingClient(config); - case ClientType::ASYNC_CLIENT: - return (config.rpc_type() == RpcType::UNARY) ? - CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config); - } - abort(); -} - -std::unique_ptr CreateServer(const ServerConfig& config) { - switch (config.server_type()) { - case ServerType::SYNCHRONOUS_SERVER: - return CreateSynchronousServer(config, FLAGS_server_port); - case ServerType::ASYNC_SERVER: - return CreateAsyncServer(config, FLAGS_server_port); - } - abort(); -} - -class WorkerImpl GRPC_FINAL : public Worker::Service { - public: - WorkerImpl() : acquired_(false) {} - - Status RunTest(ServerContext* ctx, - ServerReaderWriter* stream) - GRPC_OVERRIDE { - InstanceGuard g(this); - if (!g.Acquired()) { - return Status(RESOURCE_EXHAUSTED); - } - - grpc_profiler_start("qps_client.prof"); - Status ret = RunTestBody(ctx,stream); - grpc_profiler_stop(); - return ret; - } - - Status RunServer(ServerContext* ctx, - ServerReaderWriter* stream) - GRPC_OVERRIDE { - InstanceGuard g(this); - if (!g.Acquired()) { - return Status(RESOURCE_EXHAUSTED); - } - - grpc_profiler_start("qps_server.prof"); - Status ret = RunServerBody(ctx,stream); - grpc_profiler_stop(); - return ret; - } - - private: - // Protect against multiple clients using this worker at once. - class InstanceGuard { - public: - InstanceGuard(WorkerImpl* impl) - : impl_(impl), acquired_(impl->TryAcquireInstance()) {} - ~InstanceGuard() { - if (acquired_) { - impl_->ReleaseInstance(); - } - } - - bool Acquired() const { return acquired_; } - - private: - WorkerImpl* const impl_; - const bool acquired_; - }; - - bool TryAcquireInstance() { - std::lock_guard g(mu_); - if (acquired_) return false; - acquired_ = true; - return true; - } - - void ReleaseInstance() { - std::lock_guard g(mu_); - GPR_ASSERT(acquired_); - acquired_ = false; - } - - Status RunTestBody(ServerContext* ctx, - ServerReaderWriter* stream) { - ClientArgs args; - if (!stream->Read(&args)) { - return Status(INVALID_ARGUMENT); - } - if (!args.has_setup()) { - return Status(INVALID_ARGUMENT); - } - auto client = CreateClient(args.setup()); - if (!client) { - return Status(INVALID_ARGUMENT); - } - ClientStatus status; - if (!stream->Write(status)) { - return Status(UNKNOWN); - } - while (stream->Read(&args)) { - if (!args.has_mark()) { - return Status(INVALID_ARGUMENT); - } - *status.mutable_stats() = client->Mark(); - stream->Write(status); - } - - return Status::OK; - } - - Status RunServerBody(ServerContext* ctx, - ServerReaderWriter* stream) { - ServerArgs args; - if (!stream->Read(&args)) { - return Status(INVALID_ARGUMENT); - } - if (!args.has_setup()) { - return Status(INVALID_ARGUMENT); - } - auto server = CreateServer(args.setup()); - if (!server) { - return Status(INVALID_ARGUMENT); - } - ServerStatus status; - status.set_port(FLAGS_server_port); - if (!stream->Write(status)) { - return Status(UNKNOWN); - } - while (stream->Read(&args)) { - if (!args.has_mark()) { - return Status(INVALID_ARGUMENT); - } - *status.mutable_stats() = server->Mark(); - stream->Write(status); - } - - return Status::OK; - } - - std::mutex mu_; - bool acquired_; -}; - static void RunServer() { - char* server_address = NULL; - gpr_join_host_port(&server_address, "::", FLAGS_driver_port); - - WorkerImpl service; - - ServerBuilder builder; - builder.AddListeningPort(server_address, InsecureServerCredentials()); - builder.RegisterService(&service); - - gpr_free(server_address); - - auto server = builder.BuildAndStart(); + QpsWorker worker(FLAGS_driver_port, FLAGS_server_port); while (!got_sigint) { std::this_thread::sleep_for(std::chrono::seconds(5)); From d4df088c750341cb3f7a928a42d421135ea7e38e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Apr 2015 14:40:28 -0700 Subject: [PATCH 23/65] Remove TODO --- test/core/util/port_posix.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/core/util/port_posix.c b/test/core/util/port_posix.c index 726ee3bd6c7..b07df391f9a 100644 --- a/test/core/util/port_posix.c +++ b/test/core/util/port_posix.c @@ -171,8 +171,6 @@ int grpc_pick_unused_port(void) { continue; } - /* TODO(ctiller): consider caching this port in some structure, to avoid - handing it out again */ chose_port(port); return port; } From 9fa41b92e061eb434a9a9f9ac7932fd0770c6511 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Apr 2015 15:08:03 -0700 Subject: [PATCH 24/65] Eliminate channel-wide lock for grpc_mdelem_ref. We only need to lock on the initial ref from garbage to atomically change mdtab_free. --- src/core/transport/metadata.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index 066cc263a1f..e3de6ce4552 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -34,10 +34,12 @@ #include "src/core/iomgr/sockaddr.h" #include "src/core/transport/metadata.h" +#include #include #include #include +#include #include #include "src/core/support/murmur_hash.h" #include "src/core/transport/chttp2/bin_encoder.h" @@ -68,11 +70,12 @@ typedef struct internal_metadata { internal_string *key; internal_string *value; + gpr_atm refcnt; + /* private only data */ void *user_data; void (*destroy_user_data)(void *user_data); - gpr_uint32 refs; grpc_mdctx *context; struct internal_metadata *bucket_next; } internal_metadata; @@ -129,8 +132,8 @@ static void unlock(grpc_mdctx *ctx) { gpr_mu_unlock(&ctx->mu); } -static void ref_md(internal_metadata *md) { - if (0 == md->refs++) { +static void ref_md_locked(internal_metadata *md) { + if (0 == gpr_atm_no_barrier_fetch_add(&md->refcnt, 1)) { md->context->mdtab_free--; } } @@ -168,7 +171,7 @@ static void discard_metadata(grpc_mdctx *ctx) { for (i = 0; i < ctx->mdtab_capacity; i++) { cur = ctx->mdtab[i]; while (cur) { - GPR_ASSERT(cur->refs == 0); + GPR_ASSERT(gpr_atm_acq_load(&cur->refcnt) == 0); next = cur->bucket_next; internal_string_unref(cur->key); internal_string_unref(cur->value); @@ -349,7 +352,7 @@ static void gc_mdtab(grpc_mdctx *ctx) { prev_next = &ctx->mdtab[i]; for (md = ctx->mdtab[i]; md; md = next) { next = md->bucket_next; - if (md->refs == 0) { + if (gpr_atm_acq_load(&md->refcnt) == 0) { internal_string_unref(md->key); internal_string_unref(md->value); if (md->user_data) { @@ -415,7 +418,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdctx *ctx, /* search for an existing pair */ for (md = ctx->mdtab[hash % ctx->mdtab_capacity]; md; md = md->bucket_next) { if (md->key == key && md->value == value) { - ref_md(md); + ref_md_locked(md); internal_string_unref(key); internal_string_unref(value); unlock(ctx); @@ -425,7 +428,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdctx *ctx, /* not found: create a new pair */ md = gpr_malloc(sizeof(internal_metadata)); - md->refs = 1; + gpr_atm_rel_store(&md->refcnt, 1); md->context = ctx; md->key = key; md->value = value; @@ -468,10 +471,12 @@ grpc_mdelem *grpc_mdelem_from_string_and_buffer(grpc_mdctx *ctx, grpc_mdelem *grpc_mdelem_ref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; - grpc_mdctx *ctx = md->context; - lock(ctx); - ref_md(md); - unlock(ctx); + /* we can assume the ref count is >= 1 as the application is calling + this function - meaning that no adjustment to mdtab_free is necessary, + simplifying the logic here to be just an atomic increment */ + /* use C assert to have this removed in opt builds */ + assert(gpr_atm_acq_load(&md->refcnt) >= 1); + gpr_atm_no_barrier_fetch_add(&md->refcnt, 1); return gmd; } @@ -479,8 +484,8 @@ void grpc_mdelem_unref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; grpc_mdctx *ctx = md->context; lock(ctx); - GPR_ASSERT(md->refs); - if (0 == --md->refs) { + assert(gpr_atm_acq_load(&md->refcnt) >= 1); + if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { ctx->mdtab_free++; } unlock(ctx); From c914c4a71ac55f9fb7eb0bd86b39b27ad7ed6fbf Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 07:00:07 -0700 Subject: [PATCH 25/65] Infrastructure for timer insertion, logging, and testing. --- BUILD | 4 + Makefile | 41 +++++++- build.json | 16 +++ src/core/statistics/timers.c | 162 +++++++++++++++++++++++++++++ src/core/statistics/timers.h | 63 +++++++++++ src/core/surface/init.c | 7 +- test/core/statistics/timers_test.c | 83 +++++++++++++++ 7 files changed, 373 insertions(+), 3 deletions(-) create mode 100644 src/core/statistics/timers.c create mode 100644 src/core/statistics/timers.h create mode 100644 test/core/statistics/timers_test.c diff --git a/BUILD b/BUILD index ccff9c05c65..9a280db7c50 100644 --- a/BUILD +++ b/BUILD @@ -186,6 +186,7 @@ cc_library( "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", + "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -297,6 +298,7 @@ cc_library( "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", + "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", @@ -414,6 +416,7 @@ cc_library( "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", + "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -505,6 +508,7 @@ cc_library( "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", + "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", diff --git a/Makefile b/Makefile index 8e01bb88dc6..b0edd762c41 100644 --- a/Makefile +++ b/Makefile @@ -620,6 +620,7 @@ tcp_server_posix_test: $(BINDIR)/$(CONFIG)/tcp_server_posix_test time_averaged_stats_test: $(BINDIR)/$(CONFIG)/time_averaged_stats_test time_test: $(BINDIR)/$(CONFIG)/time_test timeout_encoding_test: $(BINDIR)/$(CONFIG)/timeout_encoding_test +timers_test: $(BINDIR)/$(CONFIG)/timers_test transport_metadata_test: $(BINDIR)/$(CONFIG)/transport_metadata_test transport_security_test: $(BINDIR)/$(CONFIG)/transport_security_test async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test @@ -1079,7 +1080,7 @@ privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.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)/chttp2_transport_end2end_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/echo_client $(BINDIR)/$(CONFIG)/echo_server $(BINDIR)/$(CONFIG)/echo_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_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)/metadata_buffer_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)/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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_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_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_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_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)/chttp2_transport_end2end_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/echo_client $(BINDIR)/$(CONFIG)/echo_server $(BINDIR)/$(CONFIG)/echo_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_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)/metadata_buffer_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_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_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_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_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_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_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_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_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)/pubsub_client $(BINDIR)/$(CONFIG)/pubsub_publisher_test $(BINDIR)/$(CONFIG)/pubsub_subscriber_test $(BINDIR)/$(CONFIG)/qps_driver $(BINDIR)/$(CONFIG)/qps_worker $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/thread_pool_test @@ -1216,6 +1217,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/time_test || ( echo test time_test failed ; exit 1 ) $(E) "[RUN] Testing timeout_encoding_test" $(Q) $(BINDIR)/$(CONFIG)/timeout_encoding_test || ( echo test timeout_encoding_test failed ; exit 1 ) + $(E) "[RUN] Testing timers_test" + $(Q) $(BINDIR)/$(CONFIG)/timers_test || ( echo test timers_test failed ; exit 1 ) $(E) "[RUN] Testing transport_metadata_test" $(Q) $(BINDIR)/$(CONFIG)/transport_metadata_test || ( echo test transport_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing transport_security_test" @@ -2564,6 +2567,7 @@ LIBGRPC_SRC = \ src/core/statistics/census_rpc_stats.c \ src/core/statistics/census_tracing.c \ src/core/statistics/hash_table.c \ + src/core/statistics/timers.c \ src/core/statistics/window_stats.c \ src/core/surface/byte_buffer.c \ src/core/surface/byte_buffer_queue.c \ @@ -2711,6 +2715,7 @@ src/core/statistics/census_log.c: $(OPENSSL_DEP) src/core/statistics/census_rpc_stats.c: $(OPENSSL_DEP) src/core/statistics/census_tracing.c: $(OPENSSL_DEP) src/core/statistics/hash_table.c: $(OPENSSL_DEP) +src/core/statistics/timers.c: $(OPENSSL_DEP) src/core/statistics/window_stats.c: $(OPENSSL_DEP) src/core/surface/byte_buffer.c: $(OPENSSL_DEP) src/core/surface/byte_buffer_queue.c: $(OPENSSL_DEP) @@ -2874,6 +2879,7 @@ $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: +$(OBJDIR)/$(CONFIG)/src/core/statistics/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: @@ -3050,6 +3056,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/statistics/census_rpc_stats.c \ src/core/statistics/census_tracing.c \ src/core/statistics/hash_table.c \ + src/core/statistics/timers.c \ src/core/statistics/window_stats.c \ src/core/surface/byte_buffer.c \ src/core/surface/byte_buffer_queue.c \ @@ -3190,6 +3197,7 @@ $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: +$(OBJDIR)/$(CONFIG)/src/core/statistics/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: @@ -7907,6 +7915,37 @@ endif endif +TIMERS_TEST_SRC = \ + test/core/statistics/timers_test.c \ + +TIMERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMERS_TEST_SRC)))) + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/timers_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/timers_test: $(TIMERS_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) $(TIMERS_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)/timers_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/statistics/timers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_timers_test: $(TIMERS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMERS_TEST_OBJS:.o=.dep) +endif +endif + + TRANSPORT_METADATA_TEST_SRC = \ test/core/transport/metadata_test.c \ diff --git a/build.json b/build.json index f8f23e0d335..4e1e9a7f8d1 100644 --- a/build.json +++ b/build.json @@ -136,6 +136,7 @@ "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", + "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -228,6 +229,7 @@ "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", + "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", @@ -1658,6 +1660,20 @@ "gpr" ] }, + { + "name": "timers_test", + "build": "test", + "language": "c", + "src": [ + "test/core/statistics/timers_test.c" + ], + "deps": [ + "grpc_test_util", + "grpc", + "gpr_test_util", + "gpr" + ] + }, { "name": "transport_metadata_test", "build": "test", diff --git a/src/core/statistics/timers.c b/src/core/statistics/timers.c new file mode 100644 index 00000000000..185e462c83d --- /dev/null +++ b/src/core/statistics/timers.c @@ -0,0 +1,162 @@ +/* + * + * 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 "timers.h" + +#include +#include +#include +#include +#include + +typedef struct grpc_timer_entry { +#ifdef GRPC_TIMERS_RDTSC +#error Rdtsc timers not supported yet + /* TODO(vpai): Fill in rdtsc support if desired */ +#else + gpr_timespec timer_; +#endif + const char* tag_; + int seq_; + const char* file_; + int line_; +} grpc_timer_entry; + +struct grpc_timers_log { + gpr_mu mu_; + grpc_timer_entry* log_; + int num_entries_; + int capacity_; + int capacity_limit_; + FILE *fp_; + const char *fmt_; +}; + +grpc_timers_log* grpc_timers_log_global = NULL; + +static int timer_now(grpc_timer_entry *tm) { +#ifdef GRPC_TIMERS_RDTSC +#error Rdtsc not supported yet +#else + tm->timer_ = gpr_now(); + return(1); +#endif +} + +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, + const char *fmt) { + grpc_timers_log* log = gpr_malloc(sizeof(*log)); + GPR_ASSERT(log); + + /* TODO (vpai): Allow allocation below limit */ + log->log_ = gpr_malloc(capacity_limit*sizeof(*log->log_)); + GPR_ASSERT(log->log_); + + /* TODO (vpai): Improve concurrency, do per-thread logging? */ + gpr_mu_init(&log->mu_); + + log->num_entries_ = 0; + log->capacity_ = log->capacity_limit_ = capacity_limit; + + log->fp_ = dump; + log->fmt_ = fmt; + + return log; +} + +static void log_report_locked(grpc_timers_log *log) { + FILE *fp = log->fp_; + const char *fmt = log->fmt_; + int i; + for (i=0;inum_entries_;i++) { + grpc_timer_entry* entry = &(log->log_[i]); + fprintf(fp, fmt, +#ifdef GRPC_TIMERS_RDTSC +#error Rdtsc not supported +#else + entry->timer_.tv_sec, entry->timer_.tv_nsec, +#endif + entry->tag_, entry->seq_, entry->file_, entry->line_); + } + + /* Now clear out the log */ + log->num_entries_=0; +} + +void grpc_timers_log_destroy(grpc_timers_log *log) { + gpr_mu_lock(&log->mu_); + log_report_locked(log); + gpr_mu_unlock(&log->mu_); + + gpr_free(log->log_); + gpr_mu_destroy(&log->mu_); + + gpr_free(log); +} + +void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, + const char *file, int line) { + grpc_timer_entry* entry; + + /* TODO (vpai) : Improve concurrency */ + gpr_mu_lock(&log->mu_); + if (log->num_entries_ == log->capacity_limit_) { + log_report_locked(log); + } + + entry = &log->log_[log->num_entries_++]; + + timer_now(entry); + entry->tag_ = tag; + entry->seq_ = seq; + entry->file_ = file; + entry->line_ = line; + + gpr_mu_unlock(&log->mu_); +} + +void grpc_timers_log_global_init(void) { + grpc_timers_log_global = + grpc_timers_log_create(100000, stdout, +#ifdef GRPC_TIMERS_RDTSC +#error Rdtsc not supported +#else + "TIMER %1$ld.%2$09d %3$s seq %4$d @ %5$s:%6$d\n" +#endif + ); + /* Use positional arguments as an example for others to change fmt */ +} + +void grpc_timers_log_global_destroy(void) { + grpc_timers_log_destroy(grpc_timers_log_global); +} diff --git a/src/core/statistics/timers.h b/src/core/statistics/timers.h new file mode 100644 index 00000000000..3303138b402 --- /dev/null +++ b/src/core/statistics/timers.h @@ -0,0 +1,63 @@ +/* + * + * 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_TIMERS_H +#define GRPC_TIMERS_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct grpc_timers_log grpc_timers_log; + +void grpc_timers_log_global_init(void); +void grpc_timers_log_global_destroy(void); +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, + const char *fmt); +void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, + const char *file, int line); +void grpc_timers_log_destroy(grpc_timers_log *); + +extern grpc_timers_log *grpc_timers_log_global; + +#define GRPC_TIMER_MARK(x, s) grpc_timers_log_add(grpc_timers_log_global, #x, \ + s, __FILE__, __LINE__); + + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_TIMERS_H */ diff --git a/src/core/surface/init.c b/src/core/surface/init.c index d4f0eb40e8e..5d0eaadf1cd 100644 --- a/src/core/surface/init.c +++ b/src/core/surface/init.c @@ -32,10 +32,11 @@ */ #include -#include "src/core/iomgr/iomgr.h" +#include "src/core/channel/channel_stack.h" #include "src/core/debug/trace.h" +#include "src/core/iomgr/iomgr.h" #include "src/core/statistics/census_interface.h" -#include "src/core/channel/channel_stack.h" +#include "src/core/statistics/timers.h" #include "src/core/surface/call.h" #include "src/core/surface/init.h" #include "src/core/surface/surface_trace.h" @@ -63,6 +64,7 @@ void grpc_init(void) { grpc_tracer_init("GRPC_TRACE"); grpc_iomgr_init(); census_init(); + grpc_timers_log_global_init(); } gpr_mu_unlock(&g_init_mu); } @@ -72,6 +74,7 @@ void grpc_shutdown(void) { if (--g_initializations == 0) { grpc_iomgr_shutdown(); census_shutdown(); + grpc_timers_log_global_destroy(); } gpr_mu_unlock(&g_init_mu); } diff --git a/test/core/statistics/timers_test.c b/test/core/statistics/timers_test.c new file mode 100644 index 00000000000..efd90ed728b --- /dev/null +++ b/test/core/statistics/timers_test.c @@ -0,0 +1,83 @@ +/* + * + * 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/statistics/timers.h" +#include +#include "test/core/util/test_config.h" + +void test_log_events(int num_seqs) { + int start = 0; + int *state; + state = calloc(num_seqs,sizeof(state[0])); + while (start < num_seqs) { + int i; + int row; + if (state[start] == 3) { /* Already done with this posn */ + start++; + continue; + } + + row = rand() % 10; /* how many in a row */ + for (i = start; (i < start+row) && (i < num_seqs); i++) { + int j; + int advance = 1 + rand() % 3; /* how many to advance by */ + for (j=0; j Date: Mon, 13 Apr 2015 10:10:07 -0700 Subject: [PATCH 26/65] Update build files --- BUILD | 831 +++++++++++++++++++++++++++++++++++++ tools/run_tests/tests.json | 18 + vsprojects/vs2013/Grpc.mak | 15 +- 3 files changed, 858 insertions(+), 6 deletions(-) diff --git a/BUILD b/BUILD index e69de29bb2d..12fd6488b6b 100644 --- a/BUILD +++ b/BUILD @@ -0,0 +1,831 @@ +# GRPC Bazel BUILD file. +# This currently builds C and C++ code. + +# 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. + +licenses(["notice"]) # 3-clause BSD + +package(default_visibility = ["//visibility:public"]) + + + + +cc_library( + name = "gpr", + srcs = [ + "src/core/support/env.h", + "src/core/support/file.h", + "src/core/support/murmur_hash.h", + "src/core/support/string.h", + "src/core/support/string_win32.h", + "src/core/support/thd_internal.h", + "src/core/support/alloc.c", + "src/core/support/cancellable.c", + "src/core/support/cmdline.c", + "src/core/support/cpu_iphone.c", + "src/core/support/cpu_linux.c", + "src/core/support/cpu_posix.c", + "src/core/support/cpu_windows.c", + "src/core/support/env_linux.c", + "src/core/support/env_posix.c", + "src/core/support/env_win32.c", + "src/core/support/file.c", + "src/core/support/file_posix.c", + "src/core/support/file_win32.c", + "src/core/support/histogram.c", + "src/core/support/host_port.c", + "src/core/support/log.c", + "src/core/support/log_android.c", + "src/core/support/log_linux.c", + "src/core/support/log_posix.c", + "src/core/support/log_win32.c", + "src/core/support/murmur_hash.c", + "src/core/support/slice.c", + "src/core/support/slice_buffer.c", + "src/core/support/string.c", + "src/core/support/string_posix.c", + "src/core/support/string_win32.c", + "src/core/support/sync.c", + "src/core/support/sync_posix.c", + "src/core/support/sync_win32.c", + "src/core/support/thd.c", + "src/core/support/thd_posix.c", + "src/core/support/thd_win32.c", + "src/core/support/time.c", + "src/core/support/time_posix.c", + "src/core/support/time_win32.c", + ], + hdrs = [ + "include/grpc/support/alloc.h", + "include/grpc/support/atm.h", + "include/grpc/support/atm_gcc_atomic.h", + "include/grpc/support/atm_gcc_sync.h", + "include/grpc/support/atm_win32.h", + "include/grpc/support/cancellable_platform.h", + "include/grpc/support/cmdline.h", + "include/grpc/support/cpu.h", + "include/grpc/support/histogram.h", + "include/grpc/support/host_port.h", + "include/grpc/support/log.h", + "include/grpc/support/log_win32.h", + "include/grpc/support/port_platform.h", + "include/grpc/support/slice.h", + "include/grpc/support/slice_buffer.h", + "include/grpc/support/sync.h", + "include/grpc/support/sync_generic.h", + "include/grpc/support/sync_posix.h", + "include/grpc/support/sync_win32.h", + "include/grpc/support/thd.h", + "include/grpc/support/time.h", + "include/grpc/support/tls.h", + "include/grpc/support/tls_gcc.h", + "include/grpc/support/tls_msvc.h", + "include/grpc/support/tls_pthread.h", + "include/grpc/support/useful.h", + ], + includes = [ + "include", + ".", + ], + deps = [ + ], +) + + +cc_library( + name = "grpc", + srcs = [ + "src/core/httpcli/format_request.h", + "src/core/httpcli/httpcli.h", + "src/core/httpcli/httpcli_security_context.h", + "src/core/httpcli/parser.h", + "src/core/security/auth.h", + "src/core/security/base64.h", + "src/core/security/credentials.h", + "src/core/security/json_token.h", + "src/core/security/secure_endpoint.h", + "src/core/security/secure_transport_setup.h", + "src/core/security/security_context.h", + "src/core/tsi/fake_transport_security.h", + "src/core/tsi/ssl_transport_security.h", + "src/core/tsi/transport_security.h", + "src/core/tsi/transport_security_interface.h", + "src/core/channel/census_filter.h", + "src/core/channel/channel_args.h", + "src/core/channel/channel_stack.h", + "src/core/channel/child_channel.h", + "src/core/channel/client_channel.h", + "src/core/channel/client_setup.h", + "src/core/channel/connected_channel.h", + "src/core/channel/http_client_filter.h", + "src/core/channel/http_filter.h", + "src/core/channel/http_server_filter.h", + "src/core/channel/metadata_buffer.h", + "src/core/channel/noop_filter.h", + "src/core/compression/algorithm.h", + "src/core/compression/message_compress.h", + "src/core/debug/trace.h", + "src/core/iomgr/alarm.h", + "src/core/iomgr/alarm_heap.h", + "src/core/iomgr/alarm_internal.h", + "src/core/iomgr/endpoint.h", + "src/core/iomgr/endpoint_pair.h", + "src/core/iomgr/fd_posix.h", + "src/core/iomgr/iocp_windows.h", + "src/core/iomgr/iomgr.h", + "src/core/iomgr/iomgr_internal.h", + "src/core/iomgr/iomgr_posix.h", + "src/core/iomgr/pollset.h", + "src/core/iomgr/pollset_kick.h", + "src/core/iomgr/pollset_kick_posix.h", + "src/core/iomgr/pollset_kick_windows.h", + "src/core/iomgr/pollset_posix.h", + "src/core/iomgr/pollset_windows.h", + "src/core/iomgr/resolve_address.h", + "src/core/iomgr/sockaddr.h", + "src/core/iomgr/sockaddr_posix.h", + "src/core/iomgr/sockaddr_utils.h", + "src/core/iomgr/sockaddr_win32.h", + "src/core/iomgr/socket_utils_posix.h", + "src/core/iomgr/socket_windows.h", + "src/core/iomgr/tcp_client.h", + "src/core/iomgr/tcp_posix.h", + "src/core/iomgr/tcp_server.h", + "src/core/iomgr/tcp_windows.h", + "src/core/iomgr/time_averaged_stats.h", + "src/core/iomgr/wakeup_fd_pipe.h", + "src/core/iomgr/wakeup_fd_posix.h", + "src/core/json/json.h", + "src/core/json/json_common.h", + "src/core/json/json_reader.h", + "src/core/json/json_writer.h", + "src/core/statistics/census_interface.h", + "src/core/statistics/census_log.h", + "src/core/statistics/census_rpc_stats.h", + "src/core/statistics/census_tracing.h", + "src/core/statistics/hash_table.h", + "src/core/statistics/window_stats.h", + "src/core/surface/byte_buffer_queue.h", + "src/core/surface/call.h", + "src/core/surface/channel.h", + "src/core/surface/client.h", + "src/core/surface/completion_queue.h", + "src/core/surface/event_string.h", + "src/core/surface/init.h", + "src/core/surface/server.h", + "src/core/surface/surface_trace.h", + "src/core/transport/chttp2/alpn.h", + "src/core/transport/chttp2/bin_encoder.h", + "src/core/transport/chttp2/frame.h", + "src/core/transport/chttp2/frame_data.h", + "src/core/transport/chttp2/frame_goaway.h", + "src/core/transport/chttp2/frame_ping.h", + "src/core/transport/chttp2/frame_rst_stream.h", + "src/core/transport/chttp2/frame_settings.h", + "src/core/transport/chttp2/frame_window_update.h", + "src/core/transport/chttp2/hpack_parser.h", + "src/core/transport/chttp2/hpack_table.h", + "src/core/transport/chttp2/http2_errors.h", + "src/core/transport/chttp2/huffsyms.h", + "src/core/transport/chttp2/status_conversion.h", + "src/core/transport/chttp2/stream_encoder.h", + "src/core/transport/chttp2/stream_map.h", + "src/core/transport/chttp2/timeout_encoding.h", + "src/core/transport/chttp2/varint.h", + "src/core/transport/chttp2_transport.h", + "src/core/transport/metadata.h", + "src/core/transport/stream_op.h", + "src/core/transport/transport.h", + "src/core/transport/transport_impl.h", + "src/core/httpcli/format_request.c", + "src/core/httpcli/httpcli.c", + "src/core/httpcli/httpcli_security_context.c", + "src/core/httpcli/parser.c", + "src/core/security/auth.c", + "src/core/security/base64.c", + "src/core/security/credentials.c", + "src/core/security/credentials_posix.c", + "src/core/security/credentials_win32.c", + "src/core/security/factories.c", + "src/core/security/google_default_credentials.c", + "src/core/security/json_token.c", + "src/core/security/secure_endpoint.c", + "src/core/security/secure_transport_setup.c", + "src/core/security/security_context.c", + "src/core/security/server_secure_chttp2.c", + "src/core/surface/init_secure.c", + "src/core/surface/secure_channel_create.c", + "src/core/tsi/fake_transport_security.c", + "src/core/tsi/ssl_transport_security.c", + "src/core/tsi/transport_security.c", + "src/core/channel/call_op_string.c", + "src/core/channel/census_filter.c", + "src/core/channel/channel_args.c", + "src/core/channel/channel_stack.c", + "src/core/channel/child_channel.c", + "src/core/channel/client_channel.c", + "src/core/channel/client_setup.c", + "src/core/channel/connected_channel.c", + "src/core/channel/http_client_filter.c", + "src/core/channel/http_filter.c", + "src/core/channel/http_server_filter.c", + "src/core/channel/metadata_buffer.c", + "src/core/channel/noop_filter.c", + "src/core/compression/algorithm.c", + "src/core/compression/message_compress.c", + "src/core/debug/trace.c", + "src/core/iomgr/alarm.c", + "src/core/iomgr/alarm_heap.c", + "src/core/iomgr/endpoint.c", + "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", + "src/core/iomgr/fd_posix.c", + "src/core/iomgr/iocp_windows.c", + "src/core/iomgr/iomgr.c", + "src/core/iomgr/iomgr_posix.c", + "src/core/iomgr/iomgr_windows.c", + "src/core/iomgr/pollset_kick.c", + "src/core/iomgr/pollset_multipoller_with_epoll.c", + "src/core/iomgr/pollset_multipoller_with_poll_posix.c", + "src/core/iomgr/pollset_posix.c", + "src/core/iomgr/pollset_windows.c", + "src/core/iomgr/resolve_address_posix.c", + "src/core/iomgr/resolve_address_windows.c", + "src/core/iomgr/sockaddr_utils.c", + "src/core/iomgr/socket_utils_common_posix.c", + "src/core/iomgr/socket_utils_linux.c", + "src/core/iomgr/socket_utils_posix.c", + "src/core/iomgr/socket_windows.c", + "src/core/iomgr/tcp_client_posix.c", + "src/core/iomgr/tcp_client_windows.c", + "src/core/iomgr/tcp_posix.c", + "src/core/iomgr/tcp_server_posix.c", + "src/core/iomgr/tcp_server_windows.c", + "src/core/iomgr/tcp_windows.c", + "src/core/iomgr/time_averaged_stats.c", + "src/core/iomgr/wakeup_fd_eventfd.c", + "src/core/iomgr/wakeup_fd_nospecial.c", + "src/core/iomgr/wakeup_fd_pipe.c", + "src/core/iomgr/wakeup_fd_posix.c", + "src/core/json/json.c", + "src/core/json/json_reader.c", + "src/core/json/json_string.c", + "src/core/json/json_writer.c", + "src/core/statistics/census_init.c", + "src/core/statistics/census_log.c", + "src/core/statistics/census_rpc_stats.c", + "src/core/statistics/census_tracing.c", + "src/core/statistics/hash_table.c", + "src/core/statistics/window_stats.c", + "src/core/surface/byte_buffer.c", + "src/core/surface/byte_buffer_queue.c", + "src/core/surface/byte_buffer_reader.c", + "src/core/surface/call.c", + "src/core/surface/call_details.c", + "src/core/surface/call_log_batch.c", + "src/core/surface/channel.c", + "src/core/surface/channel_create.c", + "src/core/surface/client.c", + "src/core/surface/completion_queue.c", + "src/core/surface/event_string.c", + "src/core/surface/init.c", + "src/core/surface/lame_client.c", + "src/core/surface/metadata_array.c", + "src/core/surface/server.c", + "src/core/surface/server_chttp2.c", + "src/core/surface/server_create.c", + "src/core/surface/surface_trace.c", + "src/core/transport/chttp2/alpn.c", + "src/core/transport/chttp2/bin_encoder.c", + "src/core/transport/chttp2/frame_data.c", + "src/core/transport/chttp2/frame_goaway.c", + "src/core/transport/chttp2/frame_ping.c", + "src/core/transport/chttp2/frame_rst_stream.c", + "src/core/transport/chttp2/frame_settings.c", + "src/core/transport/chttp2/frame_window_update.c", + "src/core/transport/chttp2/hpack_parser.c", + "src/core/transport/chttp2/hpack_table.c", + "src/core/transport/chttp2/huffsyms.c", + "src/core/transport/chttp2/status_conversion.c", + "src/core/transport/chttp2/stream_encoder.c", + "src/core/transport/chttp2/stream_map.c", + "src/core/transport/chttp2/timeout_encoding.c", + "src/core/transport/chttp2/varint.c", + "src/core/transport/chttp2_transport.c", + "src/core/transport/metadata.c", + "src/core/transport/stream_op.c", + "src/core/transport/transport.c", + ], + hdrs = [ + "include/grpc/grpc_security.h", + "include/grpc/byte_buffer.h", + "include/grpc/byte_buffer_reader.h", + "include/grpc/grpc.h", + "include/grpc/grpc_http.h", + "include/grpc/status.h", + ], + includes = [ + "include", + ".", + ], + deps = [ + "//external:libssl", + ":gpr", + ], +) + + +cc_library( + name = "grpc_unsecure", + srcs = [ + "src/core/channel/census_filter.h", + "src/core/channel/channel_args.h", + "src/core/channel/channel_stack.h", + "src/core/channel/child_channel.h", + "src/core/channel/client_channel.h", + "src/core/channel/client_setup.h", + "src/core/channel/connected_channel.h", + "src/core/channel/http_client_filter.h", + "src/core/channel/http_filter.h", + "src/core/channel/http_server_filter.h", + "src/core/channel/metadata_buffer.h", + "src/core/channel/noop_filter.h", + "src/core/compression/algorithm.h", + "src/core/compression/message_compress.h", + "src/core/debug/trace.h", + "src/core/iomgr/alarm.h", + "src/core/iomgr/alarm_heap.h", + "src/core/iomgr/alarm_internal.h", + "src/core/iomgr/endpoint.h", + "src/core/iomgr/endpoint_pair.h", + "src/core/iomgr/fd_posix.h", + "src/core/iomgr/iocp_windows.h", + "src/core/iomgr/iomgr.h", + "src/core/iomgr/iomgr_internal.h", + "src/core/iomgr/iomgr_posix.h", + "src/core/iomgr/pollset.h", + "src/core/iomgr/pollset_kick.h", + "src/core/iomgr/pollset_kick_posix.h", + "src/core/iomgr/pollset_kick_windows.h", + "src/core/iomgr/pollset_posix.h", + "src/core/iomgr/pollset_windows.h", + "src/core/iomgr/resolve_address.h", + "src/core/iomgr/sockaddr.h", + "src/core/iomgr/sockaddr_posix.h", + "src/core/iomgr/sockaddr_utils.h", + "src/core/iomgr/sockaddr_win32.h", + "src/core/iomgr/socket_utils_posix.h", + "src/core/iomgr/socket_windows.h", + "src/core/iomgr/tcp_client.h", + "src/core/iomgr/tcp_posix.h", + "src/core/iomgr/tcp_server.h", + "src/core/iomgr/tcp_windows.h", + "src/core/iomgr/time_averaged_stats.h", + "src/core/iomgr/wakeup_fd_pipe.h", + "src/core/iomgr/wakeup_fd_posix.h", + "src/core/json/json.h", + "src/core/json/json_common.h", + "src/core/json/json_reader.h", + "src/core/json/json_writer.h", + "src/core/statistics/census_interface.h", + "src/core/statistics/census_log.h", + "src/core/statistics/census_rpc_stats.h", + "src/core/statistics/census_tracing.h", + "src/core/statistics/hash_table.h", + "src/core/statistics/window_stats.h", + "src/core/surface/byte_buffer_queue.h", + "src/core/surface/call.h", + "src/core/surface/channel.h", + "src/core/surface/client.h", + "src/core/surface/completion_queue.h", + "src/core/surface/event_string.h", + "src/core/surface/init.h", + "src/core/surface/server.h", + "src/core/surface/surface_trace.h", + "src/core/transport/chttp2/alpn.h", + "src/core/transport/chttp2/bin_encoder.h", + "src/core/transport/chttp2/frame.h", + "src/core/transport/chttp2/frame_data.h", + "src/core/transport/chttp2/frame_goaway.h", + "src/core/transport/chttp2/frame_ping.h", + "src/core/transport/chttp2/frame_rst_stream.h", + "src/core/transport/chttp2/frame_settings.h", + "src/core/transport/chttp2/frame_window_update.h", + "src/core/transport/chttp2/hpack_parser.h", + "src/core/transport/chttp2/hpack_table.h", + "src/core/transport/chttp2/http2_errors.h", + "src/core/transport/chttp2/huffsyms.h", + "src/core/transport/chttp2/status_conversion.h", + "src/core/transport/chttp2/stream_encoder.h", + "src/core/transport/chttp2/stream_map.h", + "src/core/transport/chttp2/timeout_encoding.h", + "src/core/transport/chttp2/varint.h", + "src/core/transport/chttp2_transport.h", + "src/core/transport/metadata.h", + "src/core/transport/stream_op.h", + "src/core/transport/transport.h", + "src/core/transport/transport_impl.h", + "src/core/surface/init_unsecure.c", + "src/core/channel/call_op_string.c", + "src/core/channel/census_filter.c", + "src/core/channel/channel_args.c", + "src/core/channel/channel_stack.c", + "src/core/channel/child_channel.c", + "src/core/channel/client_channel.c", + "src/core/channel/client_setup.c", + "src/core/channel/connected_channel.c", + "src/core/channel/http_client_filter.c", + "src/core/channel/http_filter.c", + "src/core/channel/http_server_filter.c", + "src/core/channel/metadata_buffer.c", + "src/core/channel/noop_filter.c", + "src/core/compression/algorithm.c", + "src/core/compression/message_compress.c", + "src/core/debug/trace.c", + "src/core/iomgr/alarm.c", + "src/core/iomgr/alarm_heap.c", + "src/core/iomgr/endpoint.c", + "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", + "src/core/iomgr/fd_posix.c", + "src/core/iomgr/iocp_windows.c", + "src/core/iomgr/iomgr.c", + "src/core/iomgr/iomgr_posix.c", + "src/core/iomgr/iomgr_windows.c", + "src/core/iomgr/pollset_kick.c", + "src/core/iomgr/pollset_multipoller_with_epoll.c", + "src/core/iomgr/pollset_multipoller_with_poll_posix.c", + "src/core/iomgr/pollset_posix.c", + "src/core/iomgr/pollset_windows.c", + "src/core/iomgr/resolve_address_posix.c", + "src/core/iomgr/resolve_address_windows.c", + "src/core/iomgr/sockaddr_utils.c", + "src/core/iomgr/socket_utils_common_posix.c", + "src/core/iomgr/socket_utils_linux.c", + "src/core/iomgr/socket_utils_posix.c", + "src/core/iomgr/socket_windows.c", + "src/core/iomgr/tcp_client_posix.c", + "src/core/iomgr/tcp_client_windows.c", + "src/core/iomgr/tcp_posix.c", + "src/core/iomgr/tcp_server_posix.c", + "src/core/iomgr/tcp_server_windows.c", + "src/core/iomgr/tcp_windows.c", + "src/core/iomgr/time_averaged_stats.c", + "src/core/iomgr/wakeup_fd_eventfd.c", + "src/core/iomgr/wakeup_fd_nospecial.c", + "src/core/iomgr/wakeup_fd_pipe.c", + "src/core/iomgr/wakeup_fd_posix.c", + "src/core/json/json.c", + "src/core/json/json_reader.c", + "src/core/json/json_string.c", + "src/core/json/json_writer.c", + "src/core/statistics/census_init.c", + "src/core/statistics/census_log.c", + "src/core/statistics/census_rpc_stats.c", + "src/core/statistics/census_tracing.c", + "src/core/statistics/hash_table.c", + "src/core/statistics/window_stats.c", + "src/core/surface/byte_buffer.c", + "src/core/surface/byte_buffer_queue.c", + "src/core/surface/byte_buffer_reader.c", + "src/core/surface/call.c", + "src/core/surface/call_details.c", + "src/core/surface/call_log_batch.c", + "src/core/surface/channel.c", + "src/core/surface/channel_create.c", + "src/core/surface/client.c", + "src/core/surface/completion_queue.c", + "src/core/surface/event_string.c", + "src/core/surface/init.c", + "src/core/surface/lame_client.c", + "src/core/surface/metadata_array.c", + "src/core/surface/server.c", + "src/core/surface/server_chttp2.c", + "src/core/surface/server_create.c", + "src/core/surface/surface_trace.c", + "src/core/transport/chttp2/alpn.c", + "src/core/transport/chttp2/bin_encoder.c", + "src/core/transport/chttp2/frame_data.c", + "src/core/transport/chttp2/frame_goaway.c", + "src/core/transport/chttp2/frame_ping.c", + "src/core/transport/chttp2/frame_rst_stream.c", + "src/core/transport/chttp2/frame_settings.c", + "src/core/transport/chttp2/frame_window_update.c", + "src/core/transport/chttp2/hpack_parser.c", + "src/core/transport/chttp2/hpack_table.c", + "src/core/transport/chttp2/huffsyms.c", + "src/core/transport/chttp2/status_conversion.c", + "src/core/transport/chttp2/stream_encoder.c", + "src/core/transport/chttp2/stream_map.c", + "src/core/transport/chttp2/timeout_encoding.c", + "src/core/transport/chttp2/varint.c", + "src/core/transport/chttp2_transport.c", + "src/core/transport/metadata.c", + "src/core/transport/stream_op.c", + "src/core/transport/transport.c", + ], + hdrs = [ + "include/grpc/byte_buffer.h", + "include/grpc/byte_buffer_reader.h", + "include/grpc/grpc.h", + "include/grpc/grpc_http.h", + "include/grpc/status.h", + ], + includes = [ + "include", + ".", + ], + deps = [ + ":gpr", + ], +) + + +cc_library( + name = "grpc++", + srcs = [ + "src/cpp/client/secure_credentials.h", + "src/cpp/server/secure_server_credentials.h", + "src/cpp/client/channel.h", + "src/cpp/proto/proto_utils.h", + "src/cpp/server/thread_pool.h", + "src/cpp/util/time.h", + "src/cpp/client/secure_credentials.cc", + "src/cpp/server/secure_server_credentials.cc", + "src/cpp/client/channel.cc", + "src/cpp/client/channel_arguments.cc", + "src/cpp/client/client_context.cc", + "src/cpp/client/client_unary_call.cc", + "src/cpp/client/create_channel.cc", + "src/cpp/client/credentials.cc", + "src/cpp/client/generic_stub.cc", + "src/cpp/client/insecure_credentials.cc", + "src/cpp/client/internal_stub.cc", + "src/cpp/common/call.cc", + "src/cpp/common/completion_queue.cc", + "src/cpp/common/rpc_method.cc", + "src/cpp/proto/proto_utils.cc", + "src/cpp/server/async_generic_service.cc", + "src/cpp/server/insecure_server_credentials.cc", + "src/cpp/server/server.cc", + "src/cpp/server/server_builder.cc", + "src/cpp/server/server_context.cc", + "src/cpp/server/server_credentials.cc", + "src/cpp/server/thread_pool.cc", + "src/cpp/util/byte_buffer.cc", + "src/cpp/util/slice.cc", + "src/cpp/util/status.cc", + "src/cpp/util/time.cc", + ], + hdrs = [ + "include/grpc++/async_generic_service.h", + "include/grpc++/async_unary_call.h", + "include/grpc++/byte_buffer.h", + "include/grpc++/channel_arguments.h", + "include/grpc++/channel_interface.h", + "include/grpc++/client_context.h", + "include/grpc++/completion_queue.h", + "include/grpc++/config.h", + "include/grpc++/create_channel.h", + "include/grpc++/credentials.h", + "include/grpc++/generic_stub.h", + "include/grpc++/impl/call.h", + "include/grpc++/impl/client_unary_call.h", + "include/grpc++/impl/internal_stub.h", + "include/grpc++/impl/rpc_method.h", + "include/grpc++/impl/rpc_service_method.h", + "include/grpc++/impl/service_type.h", + "include/grpc++/impl/sync.h", + "include/grpc++/impl/sync_cxx11.h", + "include/grpc++/impl/sync_no_cxx11.h", + "include/grpc++/impl/thd.h", + "include/grpc++/impl/thd_cxx11.h", + "include/grpc++/impl/thd_no_cxx11.h", + "include/grpc++/server.h", + "include/grpc++/server_builder.h", + "include/grpc++/server_context.h", + "include/grpc++/server_credentials.h", + "include/grpc++/slice.h", + "include/grpc++/status.h", + "include/grpc++/status_code_enum.h", + "include/grpc++/stream.h", + "include/grpc++/thread_pool_interface.h", + ], + includes = [ + "include", + ".", + ], + deps = [ + "//external:protobuf_clib", + ":gpr", + ":grpc", + ], +) + + +cc_library( + name = "grpc++_unsecure", + srcs = [ + "src/cpp/client/channel.h", + "src/cpp/proto/proto_utils.h", + "src/cpp/server/thread_pool.h", + "src/cpp/util/time.h", + "src/cpp/client/channel.cc", + "src/cpp/client/channel_arguments.cc", + "src/cpp/client/client_context.cc", + "src/cpp/client/client_unary_call.cc", + "src/cpp/client/create_channel.cc", + "src/cpp/client/credentials.cc", + "src/cpp/client/generic_stub.cc", + "src/cpp/client/insecure_credentials.cc", + "src/cpp/client/internal_stub.cc", + "src/cpp/common/call.cc", + "src/cpp/common/completion_queue.cc", + "src/cpp/common/rpc_method.cc", + "src/cpp/proto/proto_utils.cc", + "src/cpp/server/async_generic_service.cc", + "src/cpp/server/insecure_server_credentials.cc", + "src/cpp/server/server.cc", + "src/cpp/server/server_builder.cc", + "src/cpp/server/server_context.cc", + "src/cpp/server/server_credentials.cc", + "src/cpp/server/thread_pool.cc", + "src/cpp/util/byte_buffer.cc", + "src/cpp/util/slice.cc", + "src/cpp/util/status.cc", + "src/cpp/util/time.cc", + ], + hdrs = [ + "include/grpc++/async_generic_service.h", + "include/grpc++/async_unary_call.h", + "include/grpc++/byte_buffer.h", + "include/grpc++/channel_arguments.h", + "include/grpc++/channel_interface.h", + "include/grpc++/client_context.h", + "include/grpc++/completion_queue.h", + "include/grpc++/config.h", + "include/grpc++/create_channel.h", + "include/grpc++/credentials.h", + "include/grpc++/generic_stub.h", + "include/grpc++/impl/call.h", + "include/grpc++/impl/client_unary_call.h", + "include/grpc++/impl/internal_stub.h", + "include/grpc++/impl/rpc_method.h", + "include/grpc++/impl/rpc_service_method.h", + "include/grpc++/impl/service_type.h", + "include/grpc++/impl/sync.h", + "include/grpc++/impl/sync_cxx11.h", + "include/grpc++/impl/sync_no_cxx11.h", + "include/grpc++/impl/thd.h", + "include/grpc++/impl/thd_cxx11.h", + "include/grpc++/impl/thd_no_cxx11.h", + "include/grpc++/server.h", + "include/grpc++/server_builder.h", + "include/grpc++/server_context.h", + "include/grpc++/server_credentials.h", + "include/grpc++/slice.h", + "include/grpc++/status.h", + "include/grpc++/status_code_enum.h", + "include/grpc++/stream.h", + "include/grpc++/thread_pool_interface.h", + ], + includes = [ + "include", + ".", + ], + deps = [ + "//external:protobuf_clib", + ":gpr", + ":grpc_unsecure", + ], +) + + +cc_library( + name = "grpc_plugin_support", + srcs = [ + "src/compiler/config.h", + "src/compiler/cpp_generator.h", + "src/compiler/cpp_generator_helpers.h", + "src/compiler/generator_helpers.h", + "src/compiler/objective_c_generator.h", + "src/compiler/objective_c_generator_helpers.h", + "src/compiler/python_generator.h", + "src/compiler/ruby_generator.h", + "src/compiler/ruby_generator_helpers-inl.h", + "src/compiler/ruby_generator_map-inl.h", + "src/compiler/ruby_generator_string-inl.h", + "src/compiler/cpp_generator.cc", + "src/compiler/objective_c_generator.cc", + "src/compiler/python_generator.cc", + "src/compiler/ruby_generator.cc", + ], + hdrs = [ + ], + includes = [ + "include", + ".", + ], + deps = [ + "//external:protobuf_compiler", + ], +) + + +cc_library( + name = "grpc_csharp_ext", + srcs = [ + "src/csharp/ext/grpc_csharp_ext.c", + ], + hdrs = [ + ], + includes = [ + "include", + ".", + ], + deps = [ + ":gpr", + ":grpc", + ], +) + + + +cc_binary( + name = "grpc_cpp_plugin", + srcs = [ + "src/compiler/cpp_plugin.cc", + ], + deps = [ + "//external:protobuf_compiler", + ":grpc_plugin_support", + ], +) + + +cc_binary( + name = "grpc_objective_c_plugin", + srcs = [ + "src/compiler/objective_c_plugin.cc", + ], + deps = [ + "//external:protobuf_compiler", + ":grpc_plugin_support", + ], +) + + +cc_binary( + name = "grpc_python_plugin", + srcs = [ + "src/compiler/python_plugin.cc", + ], + deps = [ + "//external:protobuf_compiler", + ":grpc_plugin_support", + ], +) + + +cc_binary( + name = "grpc_ruby_plugin", + srcs = [ + "src/compiler/ruby_plugin.cc", + ], + deps = [ + "//external:protobuf_compiler", + ":grpc_plugin_support", + ], +) + + + + + diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 520405b96af..cb379863f1f 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -315,6 +315,24 @@ "posix" ] }, + { + "flaky": false, + "language": "c", + "name": "gpr_tls_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "gpr_useful_test", + "platforms": [ + "windows", + "posix" + ] + }, { "flaky": false, "language": "c", diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 69e09b3bcdb..c2c25ced69a 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -53,6 +53,13 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) +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 chttp2_transport_end2end_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.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 metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe + echo All tests built. + +buildtests_cxx: + echo All tests built. alarm_heap_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_heap_test @@ -382,10 +389,7 @@ gpr_time_test: gpr_time_test.exe echo Running gpr_time_test $(OUT_DIR)\gpr_time_test.exe -<<<<<<< HEAD -gpr_useful_test.exe: grpc_test_util $(OUT_DIR) -======= -gpr_tls_test.exe: grpc_test_util +gpr_tls_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_tls_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\tls_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_tls_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tls_test.obj @@ -393,8 +397,7 @@ gpr_tls_test: gpr_tls_test.exe echo Running gpr_tls_test $(OUT_DIR)\gpr_tls_test.exe -gpr_useful_test.exe: grpc_test_util ->>>>>>> fba547644c7e55ae222cb130cb289e19db43b449 +gpr_useful_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_useful_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\useful_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_useful_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\useful_test.obj From 479a961b08302b67495fa60c1b17ff006341e054 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Apr 2015 10:31:15 -0700 Subject: [PATCH 27/65] third_party/openssl --- third_party/openssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/openssl b/third_party/openssl index 4ac03295828..3df69d3aefd 160000 --- a/third_party/openssl +++ b/third_party/openssl @@ -1 +1 @@ -Subproject commit 4ac0329582829f5378d8078c8d314ad37db87736 +Subproject commit 3df69d3aefde7671053d4e3c242b228e5d79c83f From 6dfa7e6ea3dbe23923b2a32b0c976d5004a0d11d Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 10:41:40 -0700 Subject: [PATCH 28/65] Move files to a new "profiling" directory to better distinguish from census statistics --- BUILD | 8 ++++---- Makefile | 14 +++++++------- build.json | 6 +++--- src/core/{statistics => profiling}/timers.c | 0 src/core/{statistics => profiling}/timers.h | 0 src/core/surface/init.c | 2 +- test/core/{statistics => profiling}/timers_test.c | 2 +- tools/run_tests/tests.json | 5 +++++ 8 files changed, 21 insertions(+), 16 deletions(-) rename src/core/{statistics => profiling}/timers.c (100%) rename src/core/{statistics => profiling}/timers.h (100%) rename test/core/{statistics => profiling}/timers_test.c (98%) diff --git a/BUILD b/BUILD index 599a84674dd..5372cf23bad 100644 --- a/BUILD +++ b/BUILD @@ -186,12 +186,12 @@ cc_library( "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", - "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -298,12 +298,12 @@ cc_library( "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", - "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", @@ -415,12 +415,12 @@ cc_library( "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", - "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -507,12 +507,12 @@ cc_library( "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", - "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", diff --git a/Makefile b/Makefile index 486df3c32ef..f44833ae217 100644 --- a/Makefile +++ b/Makefile @@ -2636,12 +2636,12 @@ LIBGRPC_SRC = \ src/core/json/json_reader.c \ src/core/json/json_string.c \ src/core/json/json_writer.c \ + src/core/profiling/timers.c \ src/core/statistics/census_init.c \ src/core/statistics/census_log.c \ src/core/statistics/census_rpc_stats.c \ src/core/statistics/census_tracing.c \ src/core/statistics/hash_table.c \ - src/core/statistics/timers.c \ src/core/statistics/window_stats.c \ src/core/surface/byte_buffer.c \ src/core/surface/byte_buffer_queue.c \ @@ -2784,12 +2784,12 @@ src/core/json/json.c: $(OPENSSL_DEP) src/core/json/json_reader.c: $(OPENSSL_DEP) src/core/json/json_string.c: $(OPENSSL_DEP) src/core/json/json_writer.c: $(OPENSSL_DEP) +src/core/profiling/timers.c: $(OPENSSL_DEP) src/core/statistics/census_init.c: $(OPENSSL_DEP) src/core/statistics/census_log.c: $(OPENSSL_DEP) src/core/statistics/census_rpc_stats.c: $(OPENSSL_DEP) src/core/statistics/census_tracing.c: $(OPENSSL_DEP) src/core/statistics/hash_table.c: $(OPENSSL_DEP) -src/core/statistics/timers.c: $(OPENSSL_DEP) src/core/statistics/window_stats.c: $(OPENSSL_DEP) src/core/surface/byte_buffer.c: $(OPENSSL_DEP) src/core/surface/byte_buffer_queue.c: $(OPENSSL_DEP) @@ -2948,12 +2948,12 @@ $(OBJDIR)/$(CONFIG)/src/core/json/json.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: +$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: -$(OBJDIR)/$(CONFIG)/src/core/statistics/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: @@ -3125,12 +3125,12 @@ LIBGRPC_UNSECURE_SRC = \ src/core/json/json_reader.c \ src/core/json/json_string.c \ src/core/json/json_writer.c \ + src/core/profiling/timers.c \ src/core/statistics/census_init.c \ src/core/statistics/census_log.c \ src/core/statistics/census_rpc_stats.c \ src/core/statistics/census_tracing.c \ src/core/statistics/hash_table.c \ - src/core/statistics/timers.c \ src/core/statistics/window_stats.c \ src/core/surface/byte_buffer.c \ src/core/surface/byte_buffer_queue.c \ @@ -3266,12 +3266,12 @@ $(OBJDIR)/$(CONFIG)/src/core/json/json.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: +$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: -$(OBJDIR)/$(CONFIG)/src/core/statistics/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: $(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: @@ -8160,7 +8160,7 @@ endif TIMERS_TEST_SRC = \ - test/core/statistics/timers_test.c \ + test/core/profiling/timers_test.c \ TIMERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMERS_TEST_SRC)))) @@ -8179,7 +8179,7 @@ $(BINDIR)/$(CONFIG)/timers_test: $(TIMERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc endif -$(OBJDIR)/$(CONFIG)/test/core/statistics/timers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/profiling/timers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_timers_test: $(TIMERS_TEST_OBJS:.o=.dep) diff --git a/build.json b/build.json index 577324620cb..c8654891a0c 100644 --- a/build.json +++ b/build.json @@ -137,12 +137,12 @@ "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", "src/core/statistics/census_tracing.h", "src/core/statistics/hash_table.h", - "src/core/statistics/timers.h", "src/core/statistics/window_stats.h", "src/core/surface/byte_buffer_queue.h", "src/core/surface/call.h", @@ -230,12 +230,12 @@ "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", "src/core/statistics/census_tracing.c", "src/core/statistics/hash_table.c", - "src/core/statistics/timers.c", "src/core/statistics/window_stats.c", "src/core/surface/byte_buffer.c", "src/core/surface/byte_buffer_queue.c", @@ -1726,7 +1726,7 @@ "build": "test", "language": "c", "src": [ - "test/core/statistics/timers_test.c" + "test/core/profiling/timers_test.c" ], "deps": [ "grpc_test_util", diff --git a/src/core/statistics/timers.c b/src/core/profiling/timers.c similarity index 100% rename from src/core/statistics/timers.c rename to src/core/profiling/timers.c diff --git a/src/core/statistics/timers.h b/src/core/profiling/timers.h similarity index 100% rename from src/core/statistics/timers.h rename to src/core/profiling/timers.h diff --git a/src/core/surface/init.c b/src/core/surface/init.c index 5d0eaadf1cd..4de51a666f1 100644 --- a/src/core/surface/init.c +++ b/src/core/surface/init.c @@ -36,7 +36,7 @@ #include "src/core/debug/trace.h" #include "src/core/iomgr/iomgr.h" #include "src/core/statistics/census_interface.h" -#include "src/core/statistics/timers.h" +#include "src/core/profiling/timers.h" #include "src/core/surface/call.h" #include "src/core/surface/init.h" #include "src/core/surface/surface_trace.h" diff --git a/test/core/statistics/timers_test.c b/test/core/profiling/timers_test.c similarity index 98% rename from test/core/statistics/timers_test.c rename to test/core/profiling/timers_test.c index efd90ed728b..b7219d7859f 100644 --- a/test/core/statistics/timers_test.c +++ b/test/core/profiling/timers_test.c @@ -31,7 +31,7 @@ * */ -#include "src/core/statistics/timers.h" +#include "src/core/profiling/timers.h" #include #include "test/core/util/test_config.h" diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index b25616474db..605f7180fc9 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -331,6 +331,11 @@ "language": "c", "name": "timeout_encoding_test" }, + { + "flaky": false, + "language": "c", + "name": "timers_test" + }, { "flaky": false, "language": "c", From 1ae46a2129411b9cbaa5f57afe321b4946b76e3f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Apr 2015 10:48:55 -0700 Subject: [PATCH 29/65] Change barriers to protect the innocent --- src/core/transport/metadata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index e3de6ce4552..c9e0fc8f6f1 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -475,7 +475,7 @@ grpc_mdelem *grpc_mdelem_ref(grpc_mdelem *gmd) { this function - meaning that no adjustment to mdtab_free is necessary, simplifying the logic here to be just an atomic increment */ /* use C assert to have this removed in opt builds */ - assert(gpr_atm_acq_load(&md->refcnt) >= 1); + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); gpr_atm_no_barrier_fetch_add(&md->refcnt, 1); return gmd; } @@ -484,7 +484,7 @@ void grpc_mdelem_unref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; grpc_mdctx *ctx = md->context; lock(ctx); - assert(gpr_atm_acq_load(&md->refcnt) >= 1); + assert(gpr_atm_nobarrier_load(&md->refcnt) >= 1); if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { ctx->mdtab_free++; } From bc1711319238ec442e2957ead576be5ecd03b032 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 10:58:06 -0700 Subject: [PATCH 30/65] Allow a build config called CONFIG=latprof that defines the appropriate variables to set up the GRPC_LATENCY_PROFILER preprocessor macro so that timing actually takes place. --- Makefile | 9 ++++ src/core/profiling/timers.c | 87 ++++++++++++++++++++----------------- src/core/profiling/timers.h | 12 +++-- templates/Makefile.template | 9 ++++ 4 files changed, 75 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index f44833ae217..2b780b501fa 100644 --- a/Makefile +++ b/Makefile @@ -85,6 +85,15 @@ CPPFLAGS_opt = -O2 LDFLAGS_opt = DEFINES_opt = NDEBUG +VALID_CONFIG_latprof = 1 +CC_latprof = $(DEFAULT_CC) +CXX_latprof = $(DEFAULT_CXX) +LD_latprof = $(DEFAULT_CC) +LDXX_latprof = $(DEFAULT_CXX) +CPPFLAGS_latprof = -O2 -DGRPC_LATENCY_PROFILER +LDFLAGS_latprof = +DEFINES_latprof = NDEBUG + VALID_CONFIG_dbg = 1 CC_dbg = $(DEFAULT_CC) CXX_dbg = $(DEFAULT_CXX) diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 185e462c83d..8a04beb46b4 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -31,6 +31,8 @@ * */ +#ifdef GRPC_LATENCY_PROFILER + #include "timers.h" #include @@ -44,22 +46,22 @@ typedef struct grpc_timer_entry { #error Rdtsc timers not supported yet /* TODO(vpai): Fill in rdtsc support if desired */ #else - gpr_timespec timer_; + gpr_timespec timer; #endif - const char* tag_; - int seq_; - const char* file_; - int line_; + const char* tag; + int seq; + const char* file; + int line; } grpc_timer_entry; struct grpc_timers_log { - gpr_mu mu_; - grpc_timer_entry* log_; - int num_entries_; - int capacity_; - int capacity_limit_; - FILE *fp_; - const char *fmt_; + gpr_mu mu; + grpc_timer_entry* log; + int num_entries; + int capacity; + int capacity_limit; + FILE *fp; + const char *fmt; }; grpc_timers_log* grpc_timers_log_global = NULL; @@ -68,7 +70,7 @@ static int timer_now(grpc_timer_entry *tm) { #ifdef GRPC_TIMERS_RDTSC #error Rdtsc not supported yet #else - tm->timer_ = gpr_now(); + tm->timer = gpr_now(); return(1); #endif } @@ -79,47 +81,47 @@ grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, GPR_ASSERT(log); /* TODO (vpai): Allow allocation below limit */ - log->log_ = gpr_malloc(capacity_limit*sizeof(*log->log_)); - GPR_ASSERT(log->log_); + log->log = gpr_malloc(capacity_limit*sizeof(*log->log)); + GPR_ASSERT(log->log); /* TODO (vpai): Improve concurrency, do per-thread logging? */ - gpr_mu_init(&log->mu_); + gpr_mu_init(&log->mu); - log->num_entries_ = 0; - log->capacity_ = log->capacity_limit_ = capacity_limit; + log->num_entries = 0; + log->capacity = log->capacity_limit = capacity_limit; - log->fp_ = dump; - log->fmt_ = fmt; + log->fp = dump; + log->fmt = fmt; return log; } static void log_report_locked(grpc_timers_log *log) { - FILE *fp = log->fp_; - const char *fmt = log->fmt_; + FILE *fp = log->fp; + const char *fmt = log->fmt; int i; - for (i=0;inum_entries_;i++) { - grpc_timer_entry* entry = &(log->log_[i]); + for (i=0;inum_entries;i++) { + grpc_timer_entry* entry = &(log->log[i]); fprintf(fp, fmt, #ifdef GRPC_TIMERS_RDTSC #error Rdtsc not supported #else - entry->timer_.tv_sec, entry->timer_.tv_nsec, + entry->timer.tv_sec, entry->timer.tv_nsec, #endif - entry->tag_, entry->seq_, entry->file_, entry->line_); + entry->tag, entry->seq, entry->file, entry->line); } /* Now clear out the log */ - log->num_entries_=0; + log->num_entries=0; } void grpc_timers_log_destroy(grpc_timers_log *log) { - gpr_mu_lock(&log->mu_); + gpr_mu_lock(&log->mu); log_report_locked(log); - gpr_mu_unlock(&log->mu_); + gpr_mu_unlock(&log->mu); - gpr_free(log->log_); - gpr_mu_destroy(&log->mu_); + gpr_free(log->log); + gpr_mu_destroy(&log->mu); gpr_free(log); } @@ -129,20 +131,20 @@ void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, grpc_timer_entry* entry; /* TODO (vpai) : Improve concurrency */ - gpr_mu_lock(&log->mu_); - if (log->num_entries_ == log->capacity_limit_) { + gpr_mu_lock(&log->mu); + if (log->num_entries == log->capacity_limit) { log_report_locked(log); } - entry = &log->log_[log->num_entries_++]; + entry = &log->log[log->num_entries++]; timer_now(entry); - entry->tag_ = tag; - entry->seq_ = seq; - entry->file_ = file; - entry->line_ = line; + entry->tag = tag; + entry->seq = seq; + entry->file = file; + entry->line = line; - gpr_mu_unlock(&log->mu_); + gpr_mu_unlock(&log->mu); } void grpc_timers_log_global_init(void) { @@ -160,3 +162,10 @@ void grpc_timers_log_global_init(void) { void grpc_timers_log_global_destroy(void) { grpc_timers_log_destroy(grpc_timers_log_global); } + +#else /* !GRPC_LATENCY_PROFILER */ +void grpc_timers_log_global_init(void) { +} +void grpc_timers_log_global_destroy(void) { +} +#endif /* GRPC_LATENCY_PROFILER */ diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h index 3303138b402..ee89e1f46dc 100644 --- a/src/core/profiling/timers.h +++ b/src/core/profiling/timers.h @@ -40,10 +40,10 @@ extern "C" { #endif +#ifdef GRPC_LATENCY_PROFILER + typedef struct grpc_timers_log grpc_timers_log; -void grpc_timers_log_global_init(void); -void grpc_timers_log_global_destroy(void); grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, const char *fmt); void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, @@ -53,8 +53,14 @@ void grpc_timers_log_destroy(grpc_timers_log *); extern grpc_timers_log *grpc_timers_log_global; #define GRPC_TIMER_MARK(x, s) grpc_timers_log_add(grpc_timers_log_global, #x, \ - s, __FILE__, __LINE__); + s, __FILE__, __LINE__) +#else /* !GRPC_LATENCY_PROFILER */ +#define GRPC_TIMER_MARK(x, s) do {} while (0) +#endif /* GRPC_LATENCY_PROFILER */ + +void grpc_timers_log_global_init(void); +void grpc_timers_log_global_destroy(void); #ifdef __cplusplus } diff --git a/templates/Makefile.template b/templates/Makefile.template index 2cfbfa36ec9..1af59d8ab5f 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -96,6 +96,15 @@ CPPFLAGS_opt = -O2 LDFLAGS_opt = DEFINES_opt = NDEBUG +VALID_CONFIG_latprof = 1 +CC_latprof = $(DEFAULT_CC) +CXX_latprof = $(DEFAULT_CXX) +LD_latprof = $(DEFAULT_CC) +LDXX_latprof = $(DEFAULT_CXX) +CPPFLAGS_latprof = -O2 -DGRPC_LATENCY_PROFILER +LDFLAGS_latprof = +DEFINES_latprof = NDEBUG + VALID_CONFIG_dbg = 1 CC_dbg = $(DEFAULT_CC) CXX_dbg = $(DEFAULT_CXX) From 2288f5b4b28ab8ecbde09b05c52900ffc355292c Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 11:00:58 -0700 Subject: [PATCH 31/65] Eliminate unneeded asserts --- src/core/profiling/timers.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 8a04beb46b4..28cd00c79fa 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -78,11 +78,9 @@ static int timer_now(grpc_timer_entry *tm) { grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, const char *fmt) { grpc_timers_log* log = gpr_malloc(sizeof(*log)); - GPR_ASSERT(log); /* TODO (vpai): Allow allocation below limit */ log->log = gpr_malloc(capacity_limit*sizeof(*log->log)); - GPR_ASSERT(log->log); /* TODO (vpai): Improve concurrency, do per-thread logging? */ gpr_mu_init(&log->mu); From 0b9d0da39f7fa690c24b056317c6c67a57b5bfa6 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 11:02:43 -0700 Subject: [PATCH 32/65] Space --- src/core/profiling/timers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 28cd00c79fa..8fdad6e42b5 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -80,7 +80,7 @@ grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, grpc_timers_log* log = gpr_malloc(sizeof(*log)); /* TODO (vpai): Allow allocation below limit */ - log->log = gpr_malloc(capacity_limit*sizeof(*log->log)); + log->log = gpr_malloc(capacity_limit * sizeof(*log->log)); /* TODO (vpai): Improve concurrency, do per-thread logging? */ gpr_mu_init(&log->mu); From 353d422a7628002b8d821cf49c4ab1aeea712237 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 13 Apr 2015 12:59:17 -0700 Subject: [PATCH 33/65] Fixed bugs in trailing metadata handling and math server example --- src/node/examples/math_server.js | 40 +++++++++++++------------------ src/node/src/server.js | 8 +++++-- src/node/test/math_client_test.js | 20 ++++++++++++++++ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/node/examples/math_server.js b/src/node/examples/math_server.js index ae548c89e40..3fac193d641 100644 --- a/src/node/examples/math_server.js +++ b/src/node/examples/math_server.js @@ -33,10 +33,6 @@ 'use strict'; -var util = require('util'); - -var Transform = require('stream').Transform; - var grpc = require('..'); var math = grpc.load(__dirname + '/math.proto').math; @@ -54,11 +50,12 @@ function mathDiv(call, cb) { // Unary + is explicit coersion to integer if (+req.divisor === 0) { cb(new Error('cannot divide by zero')); + } else { + cb(null, { + quotient: req.dividend / req.divisor, + remainder: req.dividend % req.divisor + }); } - cb(null, { - quotient: req.dividend / req.divisor, - remainder: req.dividend % req.divisor - }); } /** @@ -97,24 +94,19 @@ function mathSum(call, cb) { } function mathDivMany(stream) { - // Here, call is a standard duplex Node object Stream - util.inherits(DivTransform, Transform); - function DivTransform() { - var options = {objectMode: true}; - Transform.call(this, options); - } - DivTransform.prototype._transform = function(div_args, encoding, callback) { + stream.on('data', function(div_args) { if (+div_args.divisor === 0) { - callback(new Error('cannot divide by zero')); + stream.emit('error', new Error('cannot divide by zero')); + } else { + stream.write({ + quotient: div_args.dividend / div_args.divisor, + remainder: div_args.dividend % div_args.divisor + }); } - callback(null, { - quotient: div_args.dividend / div_args.divisor, - remainder: div_args.dividend % div_args.divisor - }); - }; - var transform = new DivTransform(); - stream.pipe(transform); - transform.pipe(stream); + }); + stream.on('end', function() { + stream.end(); + }); } var server = new Server({ diff --git a/src/node/src/server.js b/src/node/src/server.js index 05de16294d4..eef705c44c6 100644 --- a/src/node/src/server.js +++ b/src/node/src/server.js @@ -360,7 +360,9 @@ function handleUnary(call, handler, metadata) { } handler.func(emitter, function sendUnaryData(err, value, trailer) { if (err) { - err.metadata = trailer; + if (trailer) { + err.metadata = trailer; + } handleError(call, err); } else { sendUnaryResponse(call, value, handler.serialize, trailer); @@ -406,7 +408,9 @@ function handleClientStreaming(call, handler, metadata) { handler.func(stream, function(err, value, trailer) { stream.terminate(); if (err) { - err.metadata = trailer; + if (trailer) { + err.metadata = trailer; + } handleError(call, err); } else { sendUnaryResponse(call, value, handler.serialize, trailer); diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js index d83f64116f7..79df97871bf 100644 --- a/src/node/test/math_client_test.js +++ b/src/node/test/math_client_test.js @@ -68,6 +68,13 @@ describe('Math client', function() { done(); }); }); + it('should handle an error from a unary request', function(done) { + var arg = {dividend: 7, divisor: 0}; + math_client.div(arg, function handleDivResult(err, value) { + assert(err); + done(); + }); + }); it('should handle a server streaming request', function(done) { var call = math_client.fib({limit: 7}); var expected_results = [1, 1, 2, 3, 5, 8, 13]; @@ -115,4 +122,17 @@ describe('Math client', function() { done(); }); }); + it('should handle an error from a bidi request', function(done) { + var call = math_client.divMany(); + call.on('data', function(value) { + assert.fail(value, undefined, 'Unexpected data response on failing call', + '!='); + }); + call.write({dividend: 7, divisor: 0}); + call.end(); + call.on('status', function checkStatus(status) { + assert.notEqual(status.code, grpc.status.OK); + done(); + }); + }); }); From 954d7a26867f57bd44ebcaba3677e93332abc804 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Apr 2015 13:01:50 -0700 Subject: [PATCH 34/65] Fix race on shutdown --- src/core/iomgr/tcp_server_posix.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 895f85fc682..7e31f2d7a54 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -174,7 +174,6 @@ void grpc_tcp_server_destroy( while (s->active_ports) { gpr_cv_wait(&s->cv, &s->mu, gpr_inf_future); } - gpr_mu_unlock(&s->mu); /* delete ALL the things */ if (s->nports) { @@ -185,7 +184,9 @@ void grpc_tcp_server_destroy( } grpc_fd_orphan(sp->emfd, destroyed_port, s); } + gpr_mu_unlock(&s->mu); } else { + gpr_mu_unlock(&s->mu); finish_shutdown(s); } } From 9cccb08311ea969ac018a781a2fe4a0f09a7cc8b Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 13:04:06 -0700 Subject: [PATCH 35/65] Stub out precise clock structure from the overall flow of timers.c so that there are no ifdefs in the middle of structures of the main code path --- BUILD | 2 + build.json | 1 + src/core/profiling/timers.c | 47 ++++--------------- src/core/profiling/timers.h | 9 ++-- src/core/profiling/timers_preciseclock.h | 57 ++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 43 deletions(-) create mode 100644 src/core/profiling/timers_preciseclock.h diff --git a/BUILD b/BUILD index 5372cf23bad..2215c5f8d91 100644 --- a/BUILD +++ b/BUILD @@ -187,6 +187,7 @@ cc_library( "src/core/json/json_reader.h", "src/core/json/json_writer.h", "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", @@ -416,6 +417,7 @@ cc_library( "src/core/json/json_reader.h", "src/core/json/json_writer.h", "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", diff --git a/build.json b/build.json index c8654891a0c..0274ed11512 100644 --- a/build.json +++ b/build.json @@ -138,6 +138,7 @@ "src/core/json/json_reader.h", "src/core/json/json_writer.h", "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 8fdad6e42b5..74da10bf91b 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -34,6 +34,7 @@ #ifdef GRPC_LATENCY_PROFILER #include "timers.h" +#include "timers_preciseclock.h" #include #include @@ -42,12 +43,7 @@ #include typedef struct grpc_timer_entry { -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc timers not supported yet - /* TODO(vpai): Fill in rdtsc support if desired */ -#else - gpr_timespec timer; -#endif + grpc_precise_clock tm; const char* tag; int seq; const char* file; @@ -61,22 +57,11 @@ struct grpc_timers_log { int capacity; int capacity_limit; FILE *fp; - const char *fmt; }; grpc_timers_log* grpc_timers_log_global = NULL; -static int timer_now(grpc_timer_entry *tm) { -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported yet -#else - tm->timer = gpr_now(); - return(1); -#endif -} - -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, - const char *fmt) { +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump) { grpc_timers_log* log = gpr_malloc(sizeof(*log)); /* TODO (vpai): Allow allocation below limit */ @@ -89,24 +74,19 @@ grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, log->capacity = log->capacity_limit = capacity_limit; log->fp = dump; - log->fmt = fmt; return log; } static void log_report_locked(grpc_timers_log *log) { FILE *fp = log->fp; - const char *fmt = log->fmt; int i; for (i=0;inum_entries;i++) { grpc_timer_entry* entry = &(log->log[i]); - fprintf(fp, fmt, -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported -#else - entry->timer.tv_sec, entry->timer.tv_nsec, -#endif - entry->tag, entry->seq, entry->file, entry->line); + fprintf(fp, "GRPC_LAT_PROF "); + grpc_precise_clock_print(&entry->tm, fp); + fprintf(fp, " %s#%d,%s:%d\n", entry->tag, entry->seq, + entry->file, entry->line); } /* Now clear out the log */ @@ -136,7 +116,7 @@ void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, entry = &log->log[log->num_entries++]; - timer_now(entry); + grpc_precise_clock_now(&entry->tm); entry->tag = tag; entry->seq = seq; entry->file = file; @@ -146,21 +126,12 @@ void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, } void grpc_timers_log_global_init(void) { - grpc_timers_log_global = - grpc_timers_log_create(100000, stdout, -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported -#else - "TIMER %1$ld.%2$09d %3$s seq %4$d @ %5$s:%6$d\n" -#endif - ); - /* Use positional arguments as an example for others to change fmt */ + grpc_timers_log_global = grpc_timers_log_create(100000, stdout); } void grpc_timers_log_global_destroy(void) { grpc_timers_log_destroy(grpc_timers_log_global); } - #else /* !GRPC_LATENCY_PROFILER */ void grpc_timers_log_global_init(void) { } diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h index ee89e1f46dc..f3a87752ce4 100644 --- a/src/core/profiling/timers.h +++ b/src/core/profiling/timers.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPC_TIMERS_H -#define GRPC_TIMERS_H +#ifndef GRPC_CORE_PROFILING_TIMERS_H +#define GRPC_CORE_PROFILING_TIMERS_H #include @@ -44,8 +44,7 @@ extern "C" { typedef struct grpc_timers_log grpc_timers_log; -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, - const char *fmt); +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump); void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, const char *file, int line); void grpc_timers_log_destroy(grpc_timers_log *); @@ -66,4 +65,4 @@ void grpc_timers_log_global_destroy(void); } #endif -#endif /* GRPC_TIMERS_H */ +#endif /* GRPC_CORE_PROFILING_TIMERS_H */ diff --git a/src/core/profiling/timers_preciseclock.h b/src/core/profiling/timers_preciseclock.h new file mode 100644 index 00000000000..c39596709aa --- /dev/null +++ b/src/core/profiling/timers_preciseclock.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H +#define GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H + +#include +#include + +typedef struct grpc_precise_clock grpc_precise_clock; + +#ifdef GRPC_TIMERS_RDTSC +#error RDTSC timers not currently supported +#else +struct grpc_precise_clock { + gpr_timespec clock; +}; +static void grpc_precise_clock_now(grpc_precise_clock* clk) { + clk->clock = gpr_now(); +} +static void grpc_precise_clock_print(const grpc_precise_clock* clk, FILE* fp) { + fprintf(fp, "%ld.%09d", clk->clock.tv_sec, clk->clock.tv_nsec); +} +#endif /* GRPC_TIMERS_RDTSC */ + + +#endif /* GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H */ From 0310f13fd95e44ba95b2424caea33be513681d57 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 13:07:36 -0700 Subject: [PATCH 36/65] clang-format results --- src/core/profiling/timers.c | 30 +++++++++++------------- src/core/profiling/timers.h | 12 ++++++---- src/core/profiling/timers_preciseclock.h | 1 - test/core/profiling/timers_test.c | 6 ++--- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 74da10bf91b..4814930a79a 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -56,12 +56,12 @@ struct grpc_timers_log { int num_entries; int capacity; int capacity_limit; - FILE *fp; + FILE* fp; }; grpc_timers_log* grpc_timers_log_global = NULL; -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump) { +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE* dump) { grpc_timers_log* log = gpr_malloc(sizeof(*log)); /* TODO (vpai): Allow allocation below limit */ @@ -78,22 +78,22 @@ grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump) { return log; } -static void log_report_locked(grpc_timers_log *log) { - FILE *fp = log->fp; +static void log_report_locked(grpc_timers_log* log) { + FILE* fp = log->fp; int i; - for (i=0;inum_entries;i++) { + for (i = 0; i < log->num_entries; i++) { grpc_timer_entry* entry = &(log->log[i]); fprintf(fp, "GRPC_LAT_PROF "); grpc_precise_clock_print(&entry->tm, fp); - fprintf(fp, " %s#%d,%s:%d\n", entry->tag, entry->seq, - entry->file, entry->line); + fprintf(fp, " %s#%d,%s:%d\n", entry->tag, entry->seq, entry->file, + entry->line); } /* Now clear out the log */ - log->num_entries=0; + log->num_entries = 0; } -void grpc_timers_log_destroy(grpc_timers_log *log) { +void grpc_timers_log_destroy(grpc_timers_log* log) { gpr_mu_lock(&log->mu); log_report_locked(log); gpr_mu_unlock(&log->mu); @@ -104,8 +104,8 @@ void grpc_timers_log_destroy(grpc_timers_log *log) { gpr_free(log); } -void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, - const char *file, int line) { +void grpc_timers_log_add(grpc_timers_log* log, const char* tag, int seq, + const char* file, int line) { grpc_timer_entry* entry; /* TODO (vpai) : Improve concurrency */ @@ -132,9 +132,7 @@ void grpc_timers_log_global_init(void) { void grpc_timers_log_global_destroy(void) { grpc_timers_log_destroy(grpc_timers_log_global); } -#else /* !GRPC_LATENCY_PROFILER */ -void grpc_timers_log_global_init(void) { -} -void grpc_timers_log_global_destroy(void) { -} +#else /* !GRPC_LATENCY_PROFILER */ +void grpc_timers_log_global_init(void) {} +void grpc_timers_log_global_destroy(void) {} #endif /* GRPC_LATENCY_PROFILER */ diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h index f3a87752ce4..ef4cad112ae 100644 --- a/src/core/profiling/timers.h +++ b/src/core/profiling/timers.h @@ -44,18 +44,20 @@ extern "C" { typedef struct grpc_timers_log grpc_timers_log; -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump); +grpc_timers_log *grpc_timers_log_create(int capacity_limit, FILE *dump); void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, - const char *file, int line); + const char *file, int line); void grpc_timers_log_destroy(grpc_timers_log *); extern grpc_timers_log *grpc_timers_log_global; -#define GRPC_TIMER_MARK(x, s) grpc_timers_log_add(grpc_timers_log_global, #x, \ - s, __FILE__, __LINE__) +#define GRPC_TIMER_MARK(x, s) \ + grpc_timers_log_add(grpc_timers_log_global, #x, s, __FILE__, __LINE__) #else /* !GRPC_LATENCY_PROFILER */ -#define GRPC_TIMER_MARK(x, s) do {} while (0) +#define GRPC_TIMER_MARK(x, s) \ + do { \ + } while (0) #endif /* GRPC_LATENCY_PROFILER */ void grpc_timers_log_global_init(void); diff --git a/src/core/profiling/timers_preciseclock.h b/src/core/profiling/timers_preciseclock.h index c39596709aa..bf4a0eab8a4 100644 --- a/src/core/profiling/timers_preciseclock.h +++ b/src/core/profiling/timers_preciseclock.h @@ -53,5 +53,4 @@ static void grpc_precise_clock_print(const grpc_precise_clock* clk, FILE* fp) { } #endif /* GRPC_TIMERS_RDTSC */ - #endif /* GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H */ diff --git a/test/core/profiling/timers_test.c b/test/core/profiling/timers_test.c index b7219d7859f..55e59c969e8 100644 --- a/test/core/profiling/timers_test.c +++ b/test/core/profiling/timers_test.c @@ -38,7 +38,7 @@ void test_log_events(int num_seqs) { int start = 0; int *state; - state = calloc(num_seqs,sizeof(state[0])); + state = calloc(num_seqs, sizeof(state[0])); while (start < num_seqs) { int i; int row; @@ -48,10 +48,10 @@ void test_log_events(int num_seqs) { } row = rand() % 10; /* how many in a row */ - for (i = start; (i < start+row) && (i < num_seqs); i++) { + for (i = start; (i < start + row) && (i < num_seqs); i++) { int j; int advance = 1 + rand() % 3; /* how many to advance by */ - for (j=0; j Date: Mon, 13 Apr 2015 13:21:21 -0700 Subject: [PATCH 37/65] Visual Studio build files --- vsprojects/vs2010/Grpc.mak | 12 ++++++++++-- vsprojects/vs2010/grpc.vcxproj | 4 ++++ vsprojects/vs2010/grpc.vcxproj.filters | 12 ++++++++++++ vsprojects/vs2010/grpc_unsecure.vcxproj | 4 ++++ vsprojects/vs2010/grpc_unsecure.vcxproj.filters | 12 ++++++++++++ vsprojects/vs2013/Grpc.mak | 12 ++++++++++-- vsprojects/vs2013/grpc.vcxproj | 4 ++++ vsprojects/vs2013/grpc.vcxproj.filters | 12 ++++++++++++ vsprojects/vs2013/grpc_unsecure.vcxproj | 4 ++++ vsprojects/vs2013/grpc_unsecure.vcxproj.filters | 12 ++++++++++++ 10 files changed, 84 insertions(+), 4 deletions(-) diff --git a/vsprojects/vs2010/Grpc.mak b/vsprojects/vs2010/Grpc.mak index 727aa377816..93689a42af3 100644 --- a/vsprojects/vs2010/Grpc.mak +++ b/vsprojects/vs2010/Grpc.mak @@ -53,10 +53,10 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: 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_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.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_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe +buildtests: 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_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.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_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_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 echo All tests built. -test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test +test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test timers_test transport_metadata_test transport_security_test echo All tests ran. test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test @@ -702,6 +702,14 @@ timeout_encoding_test: timeout_encoding_test.exe echo Running timeout_encoding_test $(OUT_DIR)\timeout_encoding_test.exe +timers_test.exe: grpc_test_util + echo Building timers_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\profiling\timers_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timers_test.obj +timers_test: timers_test.exe + echo Running timers_test + $(OUT_DIR)\timers_test.exe + transport_metadata_test.exe: grpc_test_util echo Building transport_metadata_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c diff --git a/vsprojects/vs2010/grpc.vcxproj b/vsprojects/vs2010/grpc.vcxproj index 203ca347d3f..ac2bbafd03d 100644 --- a/vsprojects/vs2010/grpc.vcxproj +++ b/vsprojects/vs2010/grpc.vcxproj @@ -148,6 +148,8 @@ + + @@ -334,6 +336,8 @@ + + diff --git a/vsprojects/vs2010/grpc.vcxproj.filters b/vsprojects/vs2010/grpc.vcxproj.filters index 20dbe8c444f..db1dd370e77 100644 --- a/vsprojects/vs2010/grpc.vcxproj.filters +++ b/vsprojects/vs2010/grpc.vcxproj.filters @@ -220,6 +220,9 @@ src\core\json + + src\core\profiling + src\core\statistics @@ -566,6 +569,12 @@ src\core\json + + src\core\profiling + + + src\core\profiling + src\core\statistics @@ -713,6 +722,9 @@ {e665cc0e-b994-d7c5-cc18-2007392019f0} + + {87674b72-0f05-0469-481a-bd8c7af9ad80} + {1d850ac6-e639-4eab-5338-4ba40272fcc9} diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj b/vsprojects/vs2010/grpc_unsecure.vcxproj index 1558d72514d..f40db977b93 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj @@ -132,6 +132,8 @@ + + @@ -278,6 +280,8 @@ + + diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters index 4b758d61132..28486a3cbc3 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters @@ -160,6 +160,9 @@ src\core\json + + src\core\profiling + src\core\statistics @@ -458,6 +461,12 @@ src\core\json + + src\core\profiling + + + src\core\profiling + src\core\statistics @@ -602,6 +611,9 @@ {443ffc61-1bea-2477-6e54-1ddf8c139264} + + {7f91d9bf-c9de-835a-d74d-b16f843b89a9} + {e084164c-a069-00e3-db35-4e0b1cd6f0b7} diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 727aa377816..93689a42af3 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -53,10 +53,10 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: 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_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.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_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe +buildtests: 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_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.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_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_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 echo All tests built. -test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test +test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test timers_test transport_metadata_test transport_security_test echo All tests ran. test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test @@ -702,6 +702,14 @@ timeout_encoding_test: timeout_encoding_test.exe echo Running timeout_encoding_test $(OUT_DIR)\timeout_encoding_test.exe +timers_test.exe: grpc_test_util + echo Building timers_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\profiling\timers_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timers_test.obj +timers_test: timers_test.exe + echo Running timers_test + $(OUT_DIR)\timers_test.exe + transport_metadata_test.exe: grpc_test_util echo Building transport_metadata_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj index a88eb34ab88..cf42e1acd67 100644 --- a/vsprojects/vs2013/grpc.vcxproj +++ b/vsprojects/vs2013/grpc.vcxproj @@ -150,6 +150,8 @@ + + @@ -336,6 +338,8 @@ + + diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters index 20dbe8c444f..db1dd370e77 100644 --- a/vsprojects/vs2013/grpc.vcxproj.filters +++ b/vsprojects/vs2013/grpc.vcxproj.filters @@ -220,6 +220,9 @@ src\core\json + + src\core\profiling + src\core\statistics @@ -566,6 +569,12 @@ src\core\json + + src\core\profiling + + + src\core\profiling + src\core\statistics @@ -713,6 +722,9 @@ {e665cc0e-b994-d7c5-cc18-2007392019f0} + + {87674b72-0f05-0469-481a-bd8c7af9ad80} + {1d850ac6-e639-4eab-5338-4ba40272fcc9} diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj index 98c14c2fdb4..5b0e2c86d6b 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj @@ -134,6 +134,8 @@ + + @@ -280,6 +282,8 @@ + + diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters index 4b758d61132..28486a3cbc3 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters @@ -160,6 +160,9 @@ src\core\json + + src\core\profiling + src\core\statistics @@ -458,6 +461,12 @@ src\core\json + + src\core\profiling + + + src\core\profiling + src\core\statistics @@ -602,6 +611,9 @@ {443ffc61-1bea-2477-6e54-1ddf8c139264} + + {7f91d9bf-c9de-835a-d74d-b16f843b89a9} + {e084164c-a069-00e3-db35-4e0b1cd6f0b7} From 6c71ce545666c98a876a60810fa7b5ce5b5dcbda Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Mon, 13 Apr 2015 13:32:43 -0700 Subject: [PATCH 38/65] Refactoring of server context creation (incremental improvement). --- src/core/security/factories.c | 16 ++++++++++++++++ src/core/security/security_context.h | 7 +++---- src/core/security/server_secure_chttp2.c | 11 +---------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/core/security/factories.c b/src/core/security/factories.c index 02267d55457..3d9216aac40 100644 --- a/src/core/security/factories.c +++ b/src/core/security/factories.c @@ -50,3 +50,19 @@ grpc_channel *grpc_secure_channel_create(grpc_credentials *creds, return grpc_secure_channel_create_with_factories( factories, GPR_ARRAY_SIZE(factories), creds, target, args); } + +grpc_security_status grpc_server_security_context_create( + grpc_server_credentials *creds, grpc_security_context **ctx) { + grpc_security_status status = GRPC_SECURITY_ERROR; + + *ctx = NULL; + if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) { + status = grpc_ssl_server_security_context_create( + grpc_ssl_server_credentials_get_config(creds), ctx); + } else if (strcmp(creds->type, + GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) { + *ctx = grpc_fake_server_security_context_create(); + status = GRPC_SECURITY_OK; + } + return status; +} diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h index 0b5821c3c08..2b4e38f3ea6 100644 --- a/src/core/security/security_context.h +++ b/src/core/security/security_context.h @@ -206,10 +206,9 @@ grpc_channel *grpc_secure_channel_create_with_factories( const grpc_secure_channel_factory *factories, size_t num_factories, grpc_credentials *creds, const char *target, const grpc_channel_args *args); -/* Secure server creation. */ +/* Secure server context creation. */ -grpc_server *grpc_secure_server_create_internal(grpc_completion_queue *cq, - const grpc_channel_args *args, - grpc_security_context *ctx); +grpc_security_status grpc_server_security_context_create( + grpc_server_credentials *creds, grpc_security_context **ctx); #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */ diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c index 081272724cf..165ed5474fe 100644 --- a/src/core/security/server_secure_chttp2.c +++ b/src/core/security/server_secure_chttp2.c @@ -141,16 +141,7 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, /* create security context */ if (creds == NULL) goto error; - - if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) { - status = grpc_ssl_server_security_context_create( - grpc_ssl_server_credentials_get_config(creds), &ctx); - } else if (strcmp(creds->type, - GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) { - ctx = grpc_fake_server_security_context_create(); - status = GRPC_SECURITY_OK; - } - + status = grpc_server_security_context_create(creds, &ctx); if (status != GRPC_SECURITY_OK) { gpr_log(GPR_ERROR, "Unable to create secure server with credentials of type %s.", From 693de4511cde34c5714c472f3e3d64344b106bf8 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 13 Apr 2015 14:19:41 -0700 Subject: [PATCH 39/65] Bump node library version to publish bugfix --- src/node/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/package.json b/src/node/package.json index 9f52f8c988e..fc3ca1f103c 100644 --- a/src/node/package.json +++ b/src/node/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "0.6.0", + "version": "0.6.1", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", From ba63e8a2a7b111a7e243184428ff3ab38d33567a Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Apr 2015 15:02:29 -0700 Subject: [PATCH 40/65] Fix Typo ... and this, kids, is why you should always compile in debug before pushing. --- src/core/transport/metadata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index c9e0fc8f6f1..f4075a31f8d 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -484,7 +484,7 @@ void grpc_mdelem_unref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; grpc_mdctx *ctx = md->context; lock(ctx); - assert(gpr_atm_nobarrier_load(&md->refcnt) >= 1); + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { ctx->mdtab_free++; } From 721f362614bad9e5195c497db27e813dd559890b Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Apr 2015 16:14:28 -0700 Subject: [PATCH 41/65] Inline initial slice buffer allocation --- include/grpc/support/slice_buffer.h | 8 +++- src/core/support/slice_buffer.c | 57 ++++++++++++++++----------- src/core/transport/chttp2_transport.c | 5 +-- 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/include/grpc/support/slice_buffer.h b/include/grpc/support/slice_buffer.h index c7e5dbc6470..1545dbfd76a 100644 --- a/include/grpc/support/slice_buffer.h +++ b/include/grpc/support/slice_buffer.h @@ -40,6 +40,8 @@ extern "C" { #endif +#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8 + /* Represents an expandable array of slices, to be interpreted as a single item TODO(ctiller): inline some small number of elements into the struct, to avoid per-call allocations */ @@ -52,6 +54,8 @@ typedef struct { size_t capacity; /* the combined length of all slices in the array */ size_t length; + /* inlined elements to avoid allocations */ + gpr_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS]; } gpr_slice_buffer; /* initialize a slice buffer */ @@ -78,9 +82,11 @@ gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned len); void gpr_slice_buffer_pop(gpr_slice_buffer *sb); /* clear a slice buffer, unref all elements */ void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb); +/* swap the contents of two slice buffers */ +void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b); #ifdef __cplusplus } #endif -#endif /* GRPC_SUPPORT_SLICE_BUFFER_H */ +#endif /* GRPC_SUPPORT_SLICE_BUFFER_H */ diff --git a/src/core/support/slice_buffer.c b/src/core/support/slice_buffer.c index b280e4bd020..3b1daa07c54 100644 --- a/src/core/support/slice_buffer.c +++ b/src/core/support/slice_buffer.c @@ -38,21 +38,34 @@ #include #include -/* initial allocation size (# of slices) */ -#define INITIAL_CAPACITY 4 -/* grow a buffer; requires INITIAL_CAPACITY > 1 */ +/* grow a buffer; requires GRPC_SLICE_BUFFER_INLINE_ELEMENTS > 1 */ #define GROW(x) (3 * (x) / 2) +static void maybe_embiggen(gpr_slice_buffer *sb) { + if (sb->count == sb->capacity) { + sb->capacity = GROW(sb->capacity); + GPR_ASSERT(sb->capacity > sb->count); + if (sb->slices == sb->inlined) { + sb->slices = gpr_malloc(sb->capacity * sizeof(gpr_slice)); + memcpy(sb->slices, sb->inlined, sb->count * sizeof(gpr_slice)); + } else { + sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); + } + } +} + void gpr_slice_buffer_init(gpr_slice_buffer *sb) { sb->count = 0; sb->length = 0; - sb->capacity = INITIAL_CAPACITY; - sb->slices = gpr_malloc(sizeof(gpr_slice) * INITIAL_CAPACITY); + sb->capacity = GRPC_SLICE_BUFFER_INLINE_ELEMENTS; + sb->slices = sb->inlined; } void gpr_slice_buffer_destroy(gpr_slice_buffer *sb) { gpr_slice_buffer_reset_and_unref(sb); - gpr_free(sb->slices); + if (sb->slices != sb->inlined) { + gpr_free(sb->slices); + } } gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) { @@ -71,11 +84,7 @@ gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) { return out; add_new: - if (sb->count == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); back = &sb->slices[sb->count]; sb->count++; back->refcount = NULL; @@ -85,11 +94,7 @@ add_new: size_t gpr_slice_buffer_add_indexed(gpr_slice_buffer *sb, gpr_slice s) { size_t out = sb->count; - if (out == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); sb->slices[out] = s; sb->length += GPR_SLICE_LENGTH(s); sb->count = out + 1; @@ -116,12 +121,7 @@ void gpr_slice_buffer_add(gpr_slice_buffer *sb, gpr_slice s) { memcpy(back->data.inlined.bytes + back->data.inlined.length, s.data.inlined.bytes, cp1); back->data.inlined.length = GPR_SLICE_INLINED_SIZE; - if (n == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = - gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); back = &sb->slices[n]; sb->count = n + 1; back->refcount = NULL; @@ -160,3 +160,16 @@ void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb) { sb->count = 0; sb->length = 0; } + +void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b) { + gpr_slice_buffer temp = *a; + *a = *b; + *b = temp; + + if (a->slices == b->inlined) { + a->slices = a->inlined; + } + if (b->slices == a->inlined) { + b->slices = b->inlined; + } +} diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c index 4c0394d46fa..110a4b544f3 100644 --- a/src/core/transport/chttp2_transport.c +++ b/src/core/transport/chttp2_transport.c @@ -834,13 +834,10 @@ static void push_setting(transport *t, grpc_chttp2_setting_id id, static int prepare_write(transport *t) { stream *s; - gpr_slice_buffer tempbuf; gpr_uint32 window_delta; /* simple writes are queued to qbuf, and flushed here */ - tempbuf = t->qbuf; - t->qbuf = t->outbuf; - t->outbuf = tempbuf; + gpr_slice_buffer_swap(&t->qbuf, &t->outbuf); GPR_ASSERT(t->qbuf.count == 0); if (t->dirtied_local_settings && !t->sent_local_settings) { From 41251e4d3aa000dd3762bb725d480a760c8bd175 Mon Sep 17 00:00:00 2001 From: Masood Malekghassemi Date: Mon, 13 Apr 2015 15:56:05 -0700 Subject: [PATCH 42/65] Fix Python auth and interop test --- src/python/interop/interop/client.py | 2 +- src/python/interop/interop/methods.py | 2 +- src/python/src/grpc/early_adopter/implementations.py | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/python/interop/interop/client.py b/src/python/interop/interop/client.py index bae5e174604..41f0d945393 100644 --- a/src/python/interop/interop/client.py +++ b/src/python/interop/interop/client.py @@ -64,7 +64,7 @@ def _args(): return parser.parse_args() def _oauth_access_token(args): - credentials = client.GoogleCredentials.get_application_default() + credentials = oauth2client_client.GoogleCredentials.get_application_default() scoped_credentials = credentials.create_scoped([args.oauth_scope]) return scoped_credentials.get_access_token().access_token diff --git a/src/python/interop/interop/methods.py b/src/python/interop/interop/methods.py index c69771dff1e..909b738bd10 100644 --- a/src/python/interop/interop/methods.py +++ b/src/python/interop/interop/methods.py @@ -292,7 +292,7 @@ def _service_account_creds(stub, args): if wanted_email != response.username: raise ValueError( 'expected username %s, got %s' % (wanted_email, response.username)) - if response.oauth_scope in args.oauth_scope: + if args.oauth_scope.find(response.oauth_scope) == -1: raise ValueError( 'expected to find oauth scope "%s" in received "%s"' % (response.oauth_scope, args.oauth_scope)) diff --git a/src/python/src/grpc/early_adopter/implementations.py b/src/python/src/grpc/early_adopter/implementations.py index 35456d38c6b..f3f2a043ebd 100644 --- a/src/python/src/grpc/early_adopter/implementations.py +++ b/src/python/src/grpc/early_adopter/implementations.py @@ -223,7 +223,8 @@ def stub( breakdown = _face_utilities.break_down_invocation(service_name, methods) return _Stub( breakdown, host, port, secure, root_certificates, private_key, - certificate_chain, server_host_override=server_host_override) + certificate_chain, server_host_override=server_host_override, + metadata_transformer=metadata_transformer) def server( From db9eb05eeaafa8e661f7a48948baaa0d195d3055 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 7 Apr 2015 12:59:38 -0700 Subject: [PATCH 43/65] Update installation instructions to mention debian binary install --- src/ruby/README.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/ruby/README.md b/src/ruby/README.md index 9c0eef49b06..286ae662cc5 100644 --- a/src/ruby/README.md +++ b/src/ruby/README.md @@ -11,16 +11,19 @@ Alpha : Ready for early adopters INSTALLATION PREREQUISITES -------------------------- -This requires Ruby 2.1, as the RPC API surface uses keyword args. +This requires Ruby 2.x, as the RPC API surface uses keyword args. QUICK - INSTALL --------------- -- Clone this repository. -- Follow the instructions in [INSTALL](../../INSTALL) to install the gRPC C core. -- If you don't have Ruby 2.1 installed, switch to the more detailed instructions below -- Use bundler to install +On debian linux systems, install from our released deb package. +Otherwise, install from source, as described below. + +$ wget https://github.com/grpc/grpc/releases/download/release-0_6_0/libgrpc_0.6.0_amd64.deb +$ wget https://github.com/grpc/grpc/releases/download/release-0_6_0/libgrpc-dev_0.6.0_amd64.deb +$ sudo dpkg -i libgrpc_0.6.0_amd64.deb libgrpc-dev_0.6.0_amd64.deb + ```sh $ # from this directory $ gem install bundler && bundle install @@ -29,14 +32,9 @@ $ gem install bundler && bundle install Installing from source ---------------------- -- Build the gRPC C core -E.g, from the root of the gRPC [git repo](https://github.com/google/grpc) -```sh -$ cd ../.. -$ make && sudo make install -``` - -- Install Ruby 2.1. Consider doing this with [RVM](http://rvm.io), it's a nice way of controlling +- Clone this repository +- Follow the instructions in [INSTALL](../../INSTALL) to install the gRPC C core. +- Install Ruby 2.x. Consider doing this with [RVM](http://rvm.io), it's a nice way of controlling the exact ruby version that's used. ```sh $ command curl -sSL https://rvm.io/mpapis.asc | gpg --import - From fe0104a1605a8ea8a8c11fb56f7735750401f173 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 09:19:12 -0700 Subject: [PATCH 44/65] Batch unref metadata in HTTP/2 stream encoder Moves us from one metadata lock per metadata element to one metadata lock per HTTP/2 frame output. --- src/core/transport/chttp2/stream_encoder.c | 80 +++++++++++++--------- src/core/transport/metadata.c | 14 ++++ src/core/transport/metadata.h | 12 ++++ 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index 79cce553fa7..665f82e65cf 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -171,13 +171,15 @@ static gpr_uint8 *add_tiny_header_data(framer_state *st, int len) { return gpr_slice_buffer_tiny_add(st->output, len); } -static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { +/* add an element to the decoder table: returns metadata element to unref */ +static grpc_mdelem *add_elem(grpc_chttp2_hpack_compressor *c, + grpc_mdelem *elem) { gpr_uint32 key_hash = elem->key->hash; gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash); gpr_uint32 new_index = c->tail_remote_index + c->table_elems + 1; gpr_uint32 elem_size = 32 + GPR_SLICE_LENGTH(elem->key->slice) + GPR_SLICE_LENGTH(elem->value->slice); - int drop_ref; + grpc_mdelem *elem_to_unref = (void *)1; /* Reserve space for this element in the remote table: if this overflows the current table, drop elements until it fits, matching the decompressor @@ -204,34 +206,32 @@ static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == elem) { /* already there: update with new index */ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 1; + elem_to_unref = elem; } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem) { /* already there (cuckoo): update with new index */ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 1; + elem_to_unref = elem; } else if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == NULL) { /* not there, but a free element: add */ c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 0; + elem_to_unref = NULL; } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == NULL) { /* not there (cuckoo), but a free element: add */ c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 0; + elem_to_unref = NULL; } else if (c->indices_elems[HASH_FRAGMENT_2(elem_hash)] < c->indices_elems[HASH_FRAGMENT_3(elem_hash)]) { /* not there: replace oldest */ - grpc_mdelem_unref(c->entries_elems[HASH_FRAGMENT_2(elem_hash)]); + elem_to_unref = c->entries_elems[HASH_FRAGMENT_2(elem_hash)]; c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 0; } else { /* not there: replace oldest */ - grpc_mdelem_unref(c->entries_elems[HASH_FRAGMENT_3(elem_hash)]); + elem_to_unref = c->entries_elems[HASH_FRAGMENT_3(elem_hash)]; c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 0; } /* do exactly the same for the key (so we can find by that again too) */ @@ -257,9 +257,7 @@ static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index; } - if (drop_ref) { - grpc_mdelem_unref(elem); - } + return elem_to_unref; } static void emit_indexed(grpc_chttp2_hpack_compressor *c, gpr_uint32 index, @@ -348,9 +346,9 @@ static gpr_uint32 dynidx(grpc_chttp2_hpack_compressor *c, gpr_uint32 index) { c->table_elems - index; } -/* encode an mdelem, taking ownership of it */ -static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, - framer_state *st) { +/* encode an mdelem; returns metadata element to unref */ +static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c, + grpc_mdelem *elem, framer_state *st) { gpr_uint32 key_hash = elem->key->hash; gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash); size_t decoder_space_usage; @@ -366,8 +364,7 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: complete element (first cuckoo hash) */ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_2(elem_hash)]), st); - grpc_mdelem_unref(elem); - return; + return elem; } if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem && @@ -375,8 +372,7 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: complete element (second cuckoo hash) */ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_3(elem_hash)]), st); - grpc_mdelem_unref(elem); - return; + return elem; } /* should this elem be in the table? */ @@ -394,12 +390,12 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: key (first cuckoo hash) */ if (should_add_elem) { emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st); - grpc_mdelem_unref(elem); + return elem; } - return; + abort(); } indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)]; @@ -408,23 +404,24 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: key (first cuckoo hash) */ if (should_add_elem) { emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st); - grpc_mdelem_unref(elem); + return elem; } - return; + abort(); } /* no elem, key in the table... fall back to literal emission */ if (should_add_elem) { emit_lithdr_incidx_v(c, elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx_v(c, elem, st); - grpc_mdelem_unref(elem); + return elem; } + abort(); } #define STRLEN_LIT(x) (sizeof(x) - 1) @@ -433,11 +430,13 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, static void deadline_enc(grpc_chttp2_hpack_compressor *c, gpr_timespec deadline, framer_state *st) { char timeout_str[GRPC_CHTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE]; + grpc_mdelem *mdelem; grpc_chttp2_encode_timeout(gpr_time_sub(deadline, gpr_now()), timeout_str); - hpack_enc(c, grpc_mdelem_from_metadata_strings( - c->mdctx, grpc_mdstr_ref(c->timeout_key_str), - grpc_mdstr_from_string(c->mdctx, timeout_str)), - st); + mdelem = grpc_mdelem_from_metadata_strings( + c->mdctx, grpc_mdstr_ref(c->timeout_key_str), + grpc_mdstr_from_string(c->mdctx, timeout_str)); + mdelem = hpack_enc(c, mdelem, st); + if (mdelem) grpc_mdelem_unref(mdelem); } gpr_slice grpc_chttp2_data_frame_create_empty_close(gpr_uint32 id) { @@ -542,6 +541,9 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, grpc_stream_op *op; gpr_uint32 max_take_size; gpr_uint32 curop = 0; + gpr_uint32 unref_op; + grpc_mdctx *mdctx = compressor->mdctx; + int need_unref = 0; GPR_ASSERT(stream_id != 0); @@ -564,7 +566,8 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, curop++; break; case GRPC_OP_METADATA: - hpack_enc(compressor, op->data.metadata, &st); + op->data.metadata = hpack_enc(compressor, op->data.metadata, &st); + need_unref |= op->data.metadata != NULL; curop++; break; case GRPC_OP_DEADLINE: @@ -601,4 +604,15 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, begin_frame(&st, DATA); } finish_frame(&st, 1, eof); + + if (need_unref) { + grpc_mdctx_lock(mdctx); + for (unref_op = 0; unref_op < curop; unref_op++) { + op = &ops[unref_op]; + if (op->type != GRPC_OP_METADATA) continue; + if (!op->data.metadata) continue; + grpc_mdctx_locked_mdelem_unref(mdctx, op->data.metadata); + } + grpc_mdctx_unlock(mdctx); + } } diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index 066cc263a1f..2ecab715e09 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -550,3 +550,17 @@ gpr_slice grpc_mdstr_as_base64_encoded_and_huffman_compressed(grpc_mdstr *gs) { unlock(ctx); return slice; } + +void grpc_mdctx_lock(grpc_mdctx *ctx) { lock(ctx); } + +void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, grpc_mdelem *gmd) { + internal_metadata *md = (internal_metadata *)gmd; + grpc_mdctx *elem_ctx = md->context; + GPR_ASSERT(md->refs); + GPR_ASSERT(ctx == elem_ctx); + if (0 == --md->refs) { + ctx->mdtab_free++; + } +} + +void grpc_mdctx_unlock(grpc_mdctx *ctx) { unlock(ctx); } diff --git a/src/core/transport/metadata.h b/src/core/transport/metadata.h index b8afbeb1e34..21b8ae2b784 100644 --- a/src/core/transport/metadata.h +++ b/src/core/transport/metadata.h @@ -135,6 +135,18 @@ void grpc_mdelem_unref(grpc_mdelem *md); Does not promise that the returned string has no embedded nulls however. */ const char *grpc_mdstr_as_c_string(grpc_mdstr *s); +/* Batch mode metadata functions. + These API's have equivalents above, but allow taking the mdctx just once, + performing a bunch of work, and then leaving the mdctx. */ + +/* Lock the metadata context: it's only safe to call _locked_ functions against + this context from the calling thread until grpc_mdctx_unlock is called */ +void grpc_mdctx_lock(grpc_mdctx *ctx); +/* Unref a metadata element */ +void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, grpc_mdelem *elem); +/* Unlock the metadata context */ +void grpc_mdctx_unlock(grpc_mdctx *ctx); + #define GRPC_MDSTR_KV_HASH(k_hash, v_hash) (GPR_ROTL((k_hash), 2) ^ (v_hash)) #endif /* GRPC_INTERNAL_CORE_TRANSPORT_METADATA_H */ From 4907df078e151f442d03c470d5908b1db76a243a Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 09:31:59 -0700 Subject: [PATCH 45/65] Update the version of googleauth to 0.4 --- src/ruby/grpc.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ruby/grpc.gemspec b/src/ruby/grpc.gemspec index 45cbacfeb04..a50d0351da1 100755 --- a/src/ruby/grpc.gemspec +++ b/src/ruby/grpc.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.add_dependency 'google-protobuf', '~> 3.0.0alpha.1.1' - s.add_dependency 'googleauth', '~> 0.1' + s.add_dependency 'googleauth', '~> 0.4' s.add_dependency 'logging', '~> 1.8' s.add_dependency 'minitest', '~> 5.4' # reqd for interop tests s.add_dependency 'xray', '~> 1.1' From e1fd1bbe144f29a38a505d7b156dfc6aa7ba4ad8 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 09:32:18 -0700 Subject: [PATCH 46/65] Update the version to 0.6.1 --- src/ruby/lib/grpc/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index bfd0cbb3936..072fb9b1aa3 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -29,5 +29,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '0.6.0' + VERSION = '0.6.1' end From 4bda5e39b9a533acdb72a80920c3389e50ff97a8 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 09:32:32 -0700 Subject: [PATCH 47/65] Add a changelog --- src/ruby/CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/ruby/CHANGELOG.md diff --git a/src/ruby/CHANGELOG.md b/src/ruby/CHANGELOG.md new file mode 100644 index 00000000000..79215388e1e --- /dev/null +++ b/src/ruby/CHANGELOG.md @@ -0,0 +1,11 @@ +## 0.6.1 (25/03/2015) + +### Changes + +* Begins this ChangeLog ([@tbetbetbe][]) +* Updates to version 0.4 of googleauth. ([@tbetbetbe][]) +* Switch the extension to use the call API. ([@tbetbetbe][]) +* Refactor the C extension to avoid identifiers used by ruby ([@yugui][]) + +[@tbetbetbe]: https://github.com/tbetbetbe +[@yugui]: https://github.com/yugui From 1e0981262c200e650671e2f6c2d0255330fbd5ec Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 09:42:09 -0700 Subject: [PATCH 48/65] Correct style errors identified by the latest version of RuboCop --- src/ruby/.rubocop_todo.yml | 34 +++++++++++------------------ src/ruby/spec/channel_spec.rb | 2 +- src/ruby/spec/client_server_spec.rb | 12 +++++----- src/ruby/spec/server_spec.rb | 2 +- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/ruby/.rubocop_todo.yml b/src/ruby/.rubocop_todo.yml index d5bb55e5a84..d9fe0a5835c 100644 --- a/src/ruby/.rubocop_todo.yml +++ b/src/ruby/.rubocop_todo.yml @@ -1,42 +1,30 @@ # This configuration was generated by `rubocop --auto-gen-config` -# on 2015-01-16 02:30:04 -0800 using RuboCop version 0.28.0. +# on 2015-04-14 09:35:44 -0700 using RuboCop version 0.29.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 3 -# Lint/UselessAssignment: -# Enabled: false - -# Offense count: 33 +# Offense count: 32 Metrics/AbcSize: - Max: 39 + Max: 36 -# Offense count: 3 +# Offense count: 2 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 231 - -# Offense count: 2 -Metrics/CyclomaticComplexity: - Max: 8 + Max: 183 -# Offense count: 36 +# Offense count: 35 # Configuration parameters: CountComments. Metrics/MethodLength: - Max: 37 + Max: 36 -# Offense count: 8 +# Offense count: 7 # Configuration parameters: CountKeywordArgs. Metrics/ParameterLists: Max: 8 -# Offense count: 2 -Metrics/PerceivedComplexity: - Max: 10 - -# Offense count: 7 +# Offense count: 6 # Configuration parameters: AllowedVariables. Style/GlobalVars: Enabled: false @@ -50,3 +38,7 @@ Style/Next: # Configuration parameters: Methods. Style/SingleLineBlockParams: Enabled: false + +# Offense count: 1 +Style/StructInheritance: + Enabled: false diff --git a/src/ruby/spec/channel_spec.rb b/src/ruby/spec/channel_spec.rb index 31e38d71b81..d471ff5db6f 100644 --- a/src/ruby/spec/channel_spec.rb +++ b/src/ruby/spec/channel_spec.rb @@ -58,7 +58,7 @@ describe GRPC::Core::Channel do it 'does not take a hash with bad values as channel args' do blk = construct_with_args(symbol: Object.new) expect(&blk).to raise_error TypeError - blk = construct_with_args('1' => Hash.new) + blk = construct_with_args('1' => {}) expect(&blk).to raise_error TypeError end diff --git a/src/ruby/spec/client_server_spec.rb b/src/ruby/spec/client_server_spec.rb index 1a2afbe1f9a..68af79f9075 100644 --- a/src/ruby/spec/client_server_spec.rb +++ b/src/ruby/spec/client_server_spec.rb @@ -192,11 +192,11 @@ shared_examples 'GRPC metadata delivery works OK' do describe 'from client => server' do before(:example) do n = 7 # arbitrary number of metadata - diff_keys_fn = proc { |i| [sprintf('k%d', i), sprintf('v%d', i)] } + diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] } diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }] - null_vals_fn = proc { |i| [sprintf('k%d', i), sprintf('v\0%d', i)] } + null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] } null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }] - same_keys_fn = proc { |i| [sprintf('k%d', i), [sprintf('v%d', i)] * n] } + same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] } same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }] symbol_key = { a_key: 'a val' } @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key] @@ -242,11 +242,11 @@ shared_examples 'GRPC metadata delivery works OK' do describe 'from server => client' do before(:example) do n = 7 # arbitrary number of metadata - diff_keys_fn = proc { |i| [sprintf('k%d', i), sprintf('v%d', i)] } + diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] } diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }] - null_vals_fn = proc { |i| [sprintf('k%d', i), sprintf('v\0%d', i)] } + null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] } null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }] - same_keys_fn = proc { |i| [sprintf('k%d', i), [sprintf('v%d', i)] * n] } + same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] } same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }] symbol_key = { a_key: 'a val' } @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key] diff --git a/src/ruby/spec/server_spec.rb b/src/ruby/spec/server_spec.rb index a47e484f971..bb566d1b1fb 100644 --- a/src/ruby/spec/server_spec.rb +++ b/src/ruby/spec/server_spec.rb @@ -152,7 +152,7 @@ describe Server do it 'does not take a hash with bad values as channel args' do blk = construct_with_args(symbol: Object.new) expect(&blk).to raise_error TypeError - blk = construct_with_args('1' => Hash.new) + blk = construct_with_args('1' => {}) expect(&blk).to raise_error TypeError end From 095af673188f5d277ded8ba2cc07810d520ba2e3 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 09:45:30 -0700 Subject: [PATCH 49/65] Revert "Update installation instructions to mention debian binary install" This reverts commit db9eb05eeaafa8e661f7a48948baaa0d195d3055. --- src/ruby/README.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/ruby/README.md b/src/ruby/README.md index 286ae662cc5..9c0eef49b06 100644 --- a/src/ruby/README.md +++ b/src/ruby/README.md @@ -11,19 +11,16 @@ Alpha : Ready for early adopters INSTALLATION PREREQUISITES -------------------------- -This requires Ruby 2.x, as the RPC API surface uses keyword args. +This requires Ruby 2.1, as the RPC API surface uses keyword args. QUICK - INSTALL --------------- -On debian linux systems, install from our released deb package. -Otherwise, install from source, as described below. - -$ wget https://github.com/grpc/grpc/releases/download/release-0_6_0/libgrpc_0.6.0_amd64.deb -$ wget https://github.com/grpc/grpc/releases/download/release-0_6_0/libgrpc-dev_0.6.0_amd64.deb -$ sudo dpkg -i libgrpc_0.6.0_amd64.deb libgrpc-dev_0.6.0_amd64.deb - +- Clone this repository. +- Follow the instructions in [INSTALL](../../INSTALL) to install the gRPC C core. +- If you don't have Ruby 2.1 installed, switch to the more detailed instructions below +- Use bundler to install ```sh $ # from this directory $ gem install bundler && bundle install @@ -32,9 +29,14 @@ $ gem install bundler && bundle install Installing from source ---------------------- -- Clone this repository -- Follow the instructions in [INSTALL](../../INSTALL) to install the gRPC C core. -- Install Ruby 2.x. Consider doing this with [RVM](http://rvm.io), it's a nice way of controlling +- Build the gRPC C core +E.g, from the root of the gRPC [git repo](https://github.com/google/grpc) +```sh +$ cd ../.. +$ make && sudo make install +``` + +- Install Ruby 2.1. Consider doing this with [RVM](http://rvm.io), it's a nice way of controlling the exact ruby version that's used. ```sh $ command curl -sSL https://rvm.io/mpapis.asc | gpg --import - From 81ce8dde304af082fe56d16b6d558f16da93f8fe Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2015 09:50:54 -0700 Subject: [PATCH 50/65] Adding links to individual test logs in test result page. --- tools/gce_setup/cloud_prod_runner.sh | 20 ++++++++++++++------ tools/gce_setup/interop_test_runner.sh | 11 ++++++++--- tools/gce_setup/post.html | 3 +-- tools/gce_setup/pre.html | 1 + 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/tools/gce_setup/cloud_prod_runner.sh b/tools/gce_setup/cloud_prod_runner.sh index e236c921ec8..17441aa7a38 100755 --- a/tools/gce_setup/cloud_prod_runner.sh +++ b/tools/gce_setup/cloud_prod_runner.sh @@ -32,6 +32,7 @@ thisfile=$(readlink -ne "${BASH_SOURCE[0]}") current_time=$(date "+%Y-%m-%d-%H-%M-%S") result_file_name=cloud_prod_result.$current_time.html echo $result_file_name +log_link=https://pantheon.corp.google.com/m/cloudstorage/b/stoked-keyword-656-output/o/log_history main() { source grpc_docker.sh @@ -42,11 +43,14 @@ main() { do for client in "${clients[@]}" do - if grpc_cloud_prod_test $test_case grpc-docker-testclients $client + log_file_name=cloud_{$test_case}_{$client}.txt + if grpc_cloud_prod_test $test_case grpc-docker-testclients $client > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', 'prod', true]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', true, 'log']," >> /tmp/cloud_prod_result.txt else - echo " ['$test_case', '$client', 'prod', false]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', false, 'log']," >> /tmp/cloud_prod_result.txt fi done done @@ -54,11 +58,14 @@ main() { do for client in "${clients[@]}" do - if grpc_cloud_prod_auth_test $test_case grpc-docker-testclients $client + log_file_name=cloud_{$test_case}_{$client}.txt + if grpc_cloud_prod_auth_test $test_case grpc-docker-testclients $client > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', 'prod', true]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', true, 'log']," >> /tmp/cloud_prod_result.txt else - echo " ['$test_case', '$client', 'prod', false]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', false, 'log']," >> /tmp/cloud_prod_result.txt fi done done @@ -69,6 +76,7 @@ main() { gsutil cp /tmp/cloud_prod_result.html gs://stoked-keyword-656-output/result_history/$result_file_name rm /tmp/cloud_prod_result.txt rm /tmp/cloud_prod_result.html + rm /tmp/cloud*.txt fi } diff --git a/tools/gce_setup/interop_test_runner.sh b/tools/gce_setup/interop_test_runner.sh index 1c6122e9ae1..b9f026e5452 100755 --- a/tools/gce_setup/interop_test_runner.sh +++ b/tools/gce_setup/interop_test_runner.sh @@ -32,6 +32,7 @@ thisfile=$(readlink -ne "${BASH_SOURCE[0]}") current_time=$(date "+%Y-%m-%d-%H-%M-%S") result_file_name=interop_result.$current_time.html echo $result_file_name +log_link=https://pantheon.corp.google.com/m/cloudstorage/b/stoked-keyword-656-output/o/log_history main() { source grpc_docker.sh @@ -44,11 +45,14 @@ main() { do for server in "${servers[@]}" do - if grpc_interop_test $test_case grpc-docker-testclients $client grpc-docker-server $server + log_file_name=interop_{$test_case}_{$client}_{$server}.txt + if grpc_interop_test $test_case grpc-docker-testclients $client grpc-docker-server $server > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', '$server', true]," >> /tmp/interop_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', '$server', true, 'log']," >> /tmp/interop_result.txt else - echo " ['$test_case', '$client', '$server', false]," >> /tmp/interop_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', '$server', false, 'log']," >> /tmp/interop_result.txt fi done done @@ -60,6 +64,7 @@ main() { gsutil cp /tmp/interop_result.html gs://stoked-keyword-656-output/result_history/$result_file_name rm /tmp/interop_result.txt rm /tmp/interop_result.html + rm /tmp/interop*.txt fi } diff --git a/tools/gce_setup/post.html b/tools/gce_setup/post.html index 57cbc8c3694..2cea050c084 100644 --- a/tools/gce_setup/post.html +++ b/tools/gce_setup/post.html @@ -1,8 +1,7 @@ ]); var table = new google.visualization.Table(document.getElementById('table_div')); - - table.draw(data, {showRowNumber: true}); + table.draw(data, {showRowNumber: true, allowHtml: true}); } diff --git a/tools/gce_setup/pre.html b/tools/gce_setup/pre.html index 74ce5ce2028..79aa8fa3941 100644 --- a/tools/gce_setup/pre.html +++ b/tools/gce_setup/pre.html @@ -11,4 +11,5 @@ data.addColumn('string', 'Client'); data.addColumn('string', 'Server'); data.addColumn('boolean', 'Pass'); + data.addColumn('string', 'LogLink'); data.addRows([ From c4885ede9673e2f61f350ba4c641e27dbb851846 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 09:51:28 -0700 Subject: [PATCH 51/65] Allow extracting mdctx from creds --- src/core/security/credentials.c | 71 ++++++++++++++++++++++++++++++--- src/core/security/credentials.h | 3 ++ 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c index 698e0991349..e6d2e9e332c 100644 --- a/src/core/security/credentials.c +++ b/src/core/security/credentials.c @@ -111,6 +111,11 @@ void grpc_credentials_get_request_metadata(grpc_credentials *creds, creds->vtable->get_request_metadata(creds, service_url, cb, user_data); } +grpc_mdctx *grpc_credentials_get_metadata_context(grpc_credentials *creds) { + if (creds == NULL) return NULL; + return creds->vtable->get_metadata_context(creds); +} + void grpc_server_credentials_release(grpc_server_credentials *creds) { if (creds == NULL) return; creds->vtable->destroy(creds); @@ -167,8 +172,13 @@ static int ssl_has_request_metadata_only(const grpc_credentials *creds) { return 0; } +static grpc_mdctx *ssl_get_metadata_context(grpc_credentials *creds) { + return NULL; +} + static grpc_credentials_vtable ssl_vtable = { - ssl_destroy, ssl_has_request_metadata, ssl_has_request_metadata_only, NULL}; + ssl_destroy, ssl_has_request_metadata, ssl_has_request_metadata_only, + ssl_get_metadata_context, NULL}; static grpc_server_credentials_vtable ssl_server_vtable = {ssl_server_destroy}; @@ -371,9 +381,14 @@ static void jwt_get_request_metadata(grpc_credentials *creds, } } +static grpc_mdctx *jwt_get_metadata_context(grpc_credentials *creds) { + grpc_jwt_credentials *c = (grpc_jwt_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable jwt_vtable = { jwt_destroy, jwt_has_request_metadata, jwt_has_request_metadata_only, - jwt_get_request_metadata}; + jwt_get_metadata_context, jwt_get_request_metadata}; grpc_credentials *grpc_jwt_credentials_create(const char *json_key, gpr_timespec token_lifetime) { @@ -585,11 +600,19 @@ static void init_oauth2_token_fetcher(grpc_oauth2_token_fetcher_credentials *c, c->fetch_func = fetch_func; } +static grpc_mdctx *oauth2_token_fetcher_get_metadata_context( + grpc_credentials *creds) { + grpc_oauth2_token_fetcher_credentials *c = + (grpc_oauth2_token_fetcher_credentials *)creds; + return c->md_ctx; +} + /* -- ComputeEngine credentials. -- */ static grpc_credentials_vtable compute_engine_vtable = { oauth2_token_fetcher_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void compute_engine_fetch_oauth2( @@ -633,6 +656,7 @@ static void service_account_destroy(grpc_credentials *creds) { static grpc_credentials_vtable service_account_vtable = { service_account_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void service_account_fetch_oauth2( @@ -706,6 +730,7 @@ static void refresh_token_destroy(grpc_credentials *creds) { static grpc_credentials_vtable refresh_token_vtable = { refresh_token_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void refresh_token_fetch_oauth2( @@ -801,9 +826,15 @@ static void fake_oauth2_get_request_metadata(grpc_credentials *creds, } } +static grpc_mdctx *fake_oauth2_get_metadata_context(grpc_credentials *creds) { + grpc_fake_oauth2_credentials *c = (grpc_fake_oauth2_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable fake_oauth2_vtable = { fake_oauth2_destroy, fake_oauth2_has_request_metadata, - fake_oauth2_has_request_metadata_only, fake_oauth2_get_request_metadata}; + fake_oauth2_has_request_metadata_only, fake_oauth2_get_metadata_context, + fake_oauth2_get_request_metadata}; grpc_credentials *grpc_fake_oauth2_credentials_create( const char *token_md_value, int is_async) { @@ -842,10 +873,16 @@ static int fake_transport_security_has_request_metadata_only( return 0; } +static grpc_mdctx *fake_transport_security_get_metadata_context( + grpc_credentials *c) { + return NULL; +} + static grpc_credentials_vtable fake_transport_security_credentials_vtable = { fake_transport_security_credentials_destroy, fake_transport_security_has_request_metadata, - fake_transport_security_has_request_metadata_only, NULL}; + fake_transport_security_has_request_metadata_only, + fake_transport_security_get_metadata_context, NULL}; static grpc_server_credentials_vtable fake_transport_security_server_credentials_vtable = { @@ -995,9 +1032,26 @@ static void composite_get_request_metadata(grpc_credentials *creds, GPR_ASSERT(0); /* Should have exited before. */ } +static grpc_mdctx *composite_get_metadata_context(grpc_credentials *creds) { + grpc_composite_credentials *c = (grpc_composite_credentials *)creds; + grpc_mdctx *ctx = NULL; + size_t i; + for (i = 0; i < c->inner.num_creds; i++) { + grpc_credentials *inner_creds = c->inner.creds_array[i]; + grpc_mdctx *inner_ctx = grpc_credentials_get_metadata_context(inner_creds); + if (inner_ctx) { + GPR_ASSERT(ctx == NULL && + "can only have one metadata context per composite credential"); + ctx = inner_ctx; + } + } + return ctx; +} + static grpc_credentials_vtable composite_credentials_vtable = { composite_destroy, composite_has_request_metadata, - composite_has_request_metadata_only, composite_get_request_metadata}; + composite_has_request_metadata_only, composite_get_metadata_context, + composite_get_request_metadata}; static grpc_credentials_array get_creds_array(grpc_credentials **creds_addr) { grpc_credentials_array result; @@ -1102,9 +1156,14 @@ static void iam_get_request_metadata(grpc_credentials *creds, cb(user_data, md_array, 2, GRPC_CREDENTIALS_OK); } +static grpc_mdctx *iam_get_metadata_context(grpc_credentials *creds) { + grpc_iam_credentials *c = (grpc_iam_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable iam_vtable = { iam_destroy, iam_has_request_metadata, iam_has_request_metadata_only, - iam_get_request_metadata}; + iam_get_metadata_context, iam_get_request_metadata}; grpc_credentials *grpc_iam_credentials_create(const char *token, const char *authority_selector) { diff --git a/src/core/security/credentials.h b/src/core/security/credentials.h index 0f70670ced4..562b3faa337 100644 --- a/src/core/security/credentials.h +++ b/src/core/security/credentials.h @@ -94,6 +94,7 @@ typedef struct { void (*destroy)(grpc_credentials *c); int (*has_request_metadata)(const grpc_credentials *c); int (*has_request_metadata_only)(const grpc_credentials *c); + grpc_mdctx *(*get_metadata_context)(grpc_credentials *c); void (*get_request_metadata)(grpc_credentials *c, const char *service_url, grpc_credentials_metadata_cb cb, @@ -114,6 +115,8 @@ void grpc_credentials_get_request_metadata(grpc_credentials *creds, const char *service_url, grpc_credentials_metadata_cb cb, void *user_data); +grpc_mdctx *grpc_credentials_get_metadata_context(grpc_credentials *creds); + typedef struct { unsigned char *pem_private_key; size_t pem_private_key_size; From b285aab5a7cef450426af7d325898f57f577a24c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 10:35:09 -0700 Subject: [PATCH 52/65] Share mdctx between secure channels --- src/core/security/security_context.c | 17 ++++++++++++++--- src/core/security/security_context.h | 2 +- src/core/surface/secure_channel_create.c | 3 +-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c index e180cad52b2..08137803a32 100644 --- a/src/core/security/security_context.c +++ b/src/core/security/security_context.c @@ -165,6 +165,16 @@ static int check_request_metadata_creds(grpc_credentials *creds) { return 1; } +static grpc_mdctx *get_or_create_mdctx(grpc_credentials *creds) { + grpc_mdctx *mdctx = grpc_credentials_get_metadata_context(creds); + if (mdctx == NULL) { + mdctx = grpc_mdctx_create(); + } else { + grpc_mdctx_ref(mdctx); + } + return mdctx; +} + /* -- Fake implementation. -- */ typedef struct { @@ -626,7 +636,8 @@ grpc_channel *grpc_ssl_channel_create(grpc_credentials *ssl_creds, arg.key = GRPC_ARG_HTTP2_SCHEME; arg.value.string = "https"; new_args = grpc_channel_args_copy_and_add(args, &arg); - channel = grpc_secure_channel_create_internal(target, new_args, ctx); + channel = grpc_secure_channel_create_internal( + target, new_args, ctx, get_or_create_mdctx(request_metadata_creds)); grpc_security_context_unref(&ctx->base); grpc_channel_args_destroy(new_args); return channel; @@ -637,8 +648,8 @@ grpc_channel *grpc_fake_transport_security_channel_create( const char *target, const grpc_channel_args *args) { grpc_channel_security_context *ctx = grpc_fake_channel_security_context_create(request_metadata_creds, 1); - grpc_channel *channel = - grpc_secure_channel_create_internal(target, args, ctx); + grpc_channel *channel = grpc_secure_channel_create_internal( + target, args, ctx, get_or_create_mdctx(request_metadata_creds)); grpc_security_context_unref(&ctx->base); return channel; } diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h index 2b4e38f3ea6..8e7ba34cac2 100644 --- a/src/core/security/security_context.h +++ b/src/core/security/security_context.h @@ -190,7 +190,7 @@ grpc_channel *grpc_fake_transport_security_channel_create( grpc_channel *grpc_secure_channel_create_internal( const char *target, const grpc_channel_args *args, - grpc_channel_security_context *ctx); + grpc_channel_security_context *ctx, grpc_mdctx *mdctx); typedef grpc_channel *(*grpc_secure_channel_factory_func)( grpc_credentials *transport_security_creds, diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index 8e56868d420..96b2fe04fa5 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -205,12 +205,11 @@ static grpc_transport_setup_result complete_setup(void *channel_stack, - perform handshakes */ grpc_channel *grpc_secure_channel_create_internal( const char *target, const grpc_channel_args *args, - grpc_channel_security_context *context) { + grpc_channel_security_context *context, grpc_mdctx *mdctx) { setup *s; grpc_channel *channel; grpc_arg context_arg; grpc_channel_args *args_copy; - grpc_mdctx *mdctx = grpc_mdctx_create(); #define MAX_FILTERS 3 const grpc_channel_filter *filters[MAX_FILTERS]; int n = 0; From a727135d91aea633e81ad9b83b1bb65c12691911 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 10:43:37 -0700 Subject: [PATCH 53/65] Add important comment --- src/core/transport/chttp2/stream_encoder.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index 665f82e65cf..54079177ab6 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -566,6 +566,10 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, curop++; break; case GRPC_OP_METADATA: + /* Encode a metadata element; store the returned value, representing + a metadata element that needs to be unreffed back into the metadata + slot. THIS MAY NOT BE THE SAME ELEMENT (if a decoder table slot got + updated). After this loop, we'll do a batch unref of elements. */ op->data.metadata = hpack_enc(compressor, op->data.metadata, &st); need_unref |= op->data.metadata != NULL; curop++; From 51a4c0846bdaf1cadbbab5cea0b169baa94b24da Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 11:03:37 -0700 Subject: [PATCH 54/65] Corrects the Changelog date --- src/ruby/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ruby/CHANGELOG.md b/src/ruby/CHANGELOG.md index 79215388e1e..8ec6e3cfdb7 100644 --- a/src/ruby/CHANGELOG.md +++ b/src/ruby/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.6.1 (25/03/2015) +## 0.6.1 (2015-04-14) ### Changes From 634346b0a53913de3f89a3228fcc1628a5c1d158 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 11:22:35 -0700 Subject: [PATCH 55/65] Merge with other metadata changes --- src/core/transport/metadata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index e93cad5722a..44f6591c955 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -561,9 +561,9 @@ void grpc_mdctx_lock(grpc_mdctx *ctx) { lock(ctx); } void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; grpc_mdctx *elem_ctx = md->context; - GPR_ASSERT(md->refs); GPR_ASSERT(ctx == elem_ctx); - if (0 == --md->refs) { + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); + if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { ctx->mdtab_free++; } } From c6a3da7d4caae17b17223b016fb1712db0e33cab Mon Sep 17 00:00:00 2001 From: vjpai Date: Tue, 14 Apr 2015 14:30:24 -0700 Subject: [PATCH 56/65] Explicit header path --- src/core/profiling/timers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 4814930a79a..478397d1bfc 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -33,8 +33,8 @@ #ifdef GRPC_LATENCY_PROFILER -#include "timers.h" -#include "timers_preciseclock.h" +#include "src/core/profiling/timers.h" +#include "src/core/profiling/timers_preciseclock.h" #include #include From 650cb25610e87abc2be82d5126be8a963ab72aba Mon Sep 17 00:00:00 2001 From: Masood Malekghassemi Date: Tue, 14 Apr 2015 15:15:59 -0700 Subject: [PATCH 57/65] Fix documentation typo --- 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 c68903b8164..e6e63c607cf 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -1070,7 +1070,7 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_python_cmd() { echo $the_cmd } -# constructs the full dockerized java interop test cmd. +# constructs the full dockerized ruby interop test cmd. # # call-seq: # flags= .... # generic flags to include the command From b553476be70475dc96f4684b05db3957a6f6e54f Mon Sep 17 00:00:00 2001 From: Masood Malekghassemi Date: Tue, 14 Apr 2015 15:16:31 -0700 Subject: [PATCH 58/65] Add Python cloud prod gen interop command --- tools/gce_setup/grpc_docker.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index e6e63c607cf..d142432ef4a 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -1041,6 +1041,19 @@ grpc_interop_gen_python_cmd() { echo $the_cmd } +# constructs the full dockerized python interop test cmd. +# +# call-seq: +# flags= .... # generic flags to include the command +# cmd=$($grpc_gen_test_cmd $flags) +grpc_cloud_prod_gen_python_cmd() { + local cmd_prefix="sudo docker run grpc/python bin/bash -l -c" + local gfe_flags=$(_grpc_prod_gfe_flags) + local env_prefix="SSL_CERT_FILE=/cacerts/roots.pem" + local the_cmd="$cmd_prefix '$env_prefix python -B -m interop.client --use_tls $gfe_flags $@'" + echo $the_cmd +} + # constructs the full dockerized python service_account auth interop test cmd. # # call-seq: From 5547edfa0930244125292c5494c3ce5da1647f14 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2015 15:55:55 -0700 Subject: [PATCH 59/65] Adding python to cloud prod tests. --- tools/gce_setup/cloud_prod_runner.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/gce_setup/cloud_prod_runner.sh b/tools/gce_setup/cloud_prod_runner.sh index 17441aa7a38..0389ac9dc11 100755 --- a/tools/gce_setup/cloud_prod_runner.sh +++ b/tools/gce_setup/cloud_prod_runner.sh @@ -38,7 +38,7 @@ main() { source grpc_docker.sh test_cases=(large_unary empty_unary ping_pong client_streaming server_streaming cancel_after_begin cancel_after_first_response) auth_test_cases=(service_account_creds compute_engine_creds jwt_token_creds) - clients=(cxx java go ruby node csharp_mono) + clients=(cxx java go ruby node csharp_mono python) for test_case in "${test_cases[@]}" do for client in "${clients[@]}" From 7db18b4cbf2585a226a822e4ab1523416e60ab09 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 16:40:44 -0700 Subject: [PATCH 60/65] Automatically adds a key for the jwt_aud_uri to the metadata handled by the metadata_update_proc --- src/ruby/lib/grpc/generic/client_stub.rb | 20 ++++++++++++++++---- src/ruby/spec/generic/rpc_server_spec.rb | 3 ++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ruby/lib/grpc/generic/client_stub.rb b/src/ruby/lib/grpc/generic/client_stub.rb index 6547a1499ec..dc7672d3595 100644 --- a/src/ruby/lib/grpc/generic/client_stub.rb +++ b/src/ruby/lib/grpc/generic/client_stub.rb @@ -52,6 +52,14 @@ module GRPC Core::Channel.new(host, kw, creds) end + def self.update_with_jwt_aud_uri(a_hash, host, method) + last_slash_idx, res = method.rindex('/'), a_hash.clone + return res if last_slash_idx.nil? + service_name = method[0..(last_slash_idx - 1)] + res[:jwt_aud_uri] = "https://#{host}#{service_name}" + res + end + # check_update_metadata is used by #initialize verify that it's a Proc. def self.check_update_metadata(update_metadata) return update_metadata if update_metadata.nil? @@ -147,7 +155,8 @@ module GRPC def request_response(method, req, marshal, unmarshal, timeout = nil, return_op: false, **kw) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.request_response(req, **md) unless return_op # return the operation view of the active_call; define #execute as a @@ -204,7 +213,8 @@ module GRPC def client_streamer(method, requests, marshal, unmarshal, timeout = nil, return_op: false, **kw) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.client_streamer(requests, **md) unless return_op # return the operation view of the active_call; define #execute as a @@ -270,7 +280,8 @@ module GRPC def server_streamer(method, req, marshal, unmarshal, timeout = nil, return_op: false, **kw, &blk) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.server_streamer(req, **md, &blk) unless return_op # return the operation view of the active_call; define #execute @@ -375,7 +386,8 @@ module GRPC def bidi_streamer(method, requests, marshal, unmarshal, timeout = nil, return_op: false, **kw, &blk) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.bidi_streamer(requests, **md, &blk) unless return_op # return the operation view of the active_call; define #execute diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb index f409d73e2fe..245999ea030 100644 --- a/src/ruby/spec/generic/rpc_server_spec.rb +++ b/src/ruby/spec/generic/rpc_server_spec.rb @@ -400,7 +400,8 @@ describe GRPC::RpcServer do end stub = EchoStub.new(@host, **@client_opts) expect(stub.an_rpc(req, k1: 'v1', k2: 'v2')).to be_a(EchoMsg) - wanted_md = [{ 'k1' => 'updated-v1', 'k2' => 'v2' }] + wanted_md = [{ 'k1' => 'updated-v1', 'k2' => 'v2', + 'jwt_aud_uri' => "https://#{@host}/EchoService" }] expect(service.received_md).to eq(wanted_md) @srv.stop t.join From 189d9b0b1d82665c2d83a050d2b2b4382daa7360 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 16:41:28 -0700 Subject: [PATCH 61/65] Adds a jwt_token_creds interop test --- src/ruby/bin/interop/interop_client.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ruby/bin/interop/interop_client.rb b/src/ruby/bin/interop/interop_client.rb index b2a8711c790..af7a1d5b15d 100755 --- a/src/ruby/bin/interop/interop_client.rb +++ b/src/ruby/bin/interop/interop_client.rb @@ -110,6 +110,11 @@ def create_stub(opts) end end + if opts.test_case == 'jwt_token_creds' # don't use a scope + auth_creds = Google::Auth.get_application_default + stub_opts[:update_metadata] = auth_creds.updater_proc + end + logger.info("... connecting securely to #{address}") Grpc::Testing::TestService::Stub.new(address, **stub_opts) else @@ -201,6 +206,15 @@ class NamedTests p 'OK: service_account_creds' end + def jwt_token_creds + json_key = File.read(ENV[AUTH_ENV]) + wanted_email = MultiJson.load(json_key)['client_email'] + resp = perform_large_unary(fill_username: true) + assert_equal(wanted_email, resp.username, + 'service_account_creds: incorrect username') + p 'OK: jwt_token_creds' + end + def compute_engine_creds resp = perform_large_unary(fill_username: true, fill_oauth_scope: true) From 89a5bd726a7e569a72755e8bfb22314073fbf703 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 16:44:46 -0700 Subject: [PATCH 62/65] Updates the pubsub sample so that it no longer uses a scope --- src/ruby/bin/apis/pubsub_demo.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ruby/bin/apis/pubsub_demo.rb b/src/ruby/bin/apis/pubsub_demo.rb index 9bb324ff646..6d69b0f21e5 100755 --- a/src/ruby/bin/apis/pubsub_demo.rb +++ b/src/ruby/bin/apis/pubsub_demo.rb @@ -71,7 +71,7 @@ end # Builds the metadata authentication update proc. def auth_proc(opts) - auth_creds = Google::Auth.get_application_default(opts.oauth_scope) + auth_creds = Google::Auth.get_application_default return auth_creds.updater_proc end @@ -213,17 +213,14 @@ class NamedActions end # Args is used to hold the command line info. -Args = Struct.new(:host, :oauth_scope, :port, :action, :project_id, :topic_name, +Args = Struct.new(:host, :port, :action, :project_id, :topic_name, :sub_name) # validates the the command line options, returning them as an Arg. def parse_args args = Args.new('pubsub-staging.googleapis.com', - 'https://www.googleapis.com/auth/pubsub', 443, 'list_some_topics', 'stoked-keyword-656') OptionParser.new do |opts| - opts.on('--oauth_scope scope', - 'Scope for OAuth tokens') { |v| args['oauth_scope'] = v } opts.on('--server_host SERVER_HOST', 'server hostname') do |v| args.host = v end @@ -250,7 +247,7 @@ def parse_args end def _check_args(args) - %w(host port action oauth_scope).each do |a| + %w(host port action).each do |a| if args[a].nil? raise OptionParser::MissingArgument.new("please specify --#{a}") end From 2988e736dfd9f21aad1a79f134394ad0a78f03a3 Mon Sep 17 00:00:00 2001 From: Tim Emiola Date: Tue, 14 Apr 2015 16:56:55 -0700 Subject: [PATCH 63/65] Adds the command to the interop test runner to run the jwt ruby auth test cmd --- tools/gce_setup/grpc_docker.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index c68903b8164..289e4d5b4f3 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -1150,6 +1150,23 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_ruby_cmd() { echo $the_cmd } +# constructs the full dockerized ruby jwt_tokens auth interop test cmd. +# +# call-seq: +# flags= .... # generic flags to include the command +# cmd=$($grpc_gen_test_cmd $flags) +grpc_cloud_prod_auth_jwt_token_creds_gen_ruby_cmd() { + local cmd_prefix="sudo docker run grpc/ruby bin/bash -l -c"; + local test_script="/var/local/git/grpc/src/ruby/bin/interop/interop_client.rb" + local test_script+=" --use_tls" + local gfe_flags=$(_grpc_prod_gfe_flags) + local added_gfe_flags=$(_grpc_jwt_token_test_flags) + local env_prefix="SSL_CERT_FILE=/cacerts/roots.pem" + env_prefix+=" GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json" + local the_cmd="$cmd_prefix '$env_prefix ruby $test_script $gfe_flags $added_gfe_flags $@'" + echo $the_cmd +} + # constructs the full dockerized Go interop test cmd. # # call-seq: From 3de5aafe1966fc86c3ac1a1f4607b7cf05c72e6e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Apr 2015 21:39:08 -0700 Subject: [PATCH 64/65] Remove (void*)1 This was originally added for my sanity, but it proved unnecessary. --- src/core/transport/chttp2/stream_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index 54079177ab6..708bb06c7f3 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -179,7 +179,7 @@ static grpc_mdelem *add_elem(grpc_chttp2_hpack_compressor *c, gpr_uint32 new_index = c->tail_remote_index + c->table_elems + 1; gpr_uint32 elem_size = 32 + GPR_SLICE_LENGTH(elem->key->slice) + GPR_SLICE_LENGTH(elem->value->slice); - grpc_mdelem *elem_to_unref = (void *)1; + grpc_mdelem *elem_to_unref; /* Reserve space for this element in the remote table: if this overflows the current table, drop elements until it fits, matching the decompressor From 970f5d9c1da01750a10759bfdaebf6eb08318799 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 15 Apr 2015 07:24:06 +0200 Subject: [PATCH 65/65] Removing some bashisms. --- tools/buildgen/generate_projects.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/buildgen/generate_projects.sh b/tools/buildgen/generate_projects.sh index 45f08df38fe..a09395c9e00 100755 --- a/tools/buildgen/generate_projects.sh +++ b/tools/buildgen/generate_projects.sh @@ -46,13 +46,11 @@ end2end_test_build=`mktemp /tmp/genXXXXXX` $gen_build_json > $end2end_test_build global_plugins=`find ./tools/buildgen/plugins -name '*.py' | - sort | grep -v __init__ | - while read p ; do echo -n "-p $p " ; done` + sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` for dir in . ; do local_plugins=`find $dir/templates -name '*.py' | - sort | grep -v __init__ | - while read p ; do echo -n "-p $p " ; done` + sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` plugins="$global_plugins $local_plugins" @@ -60,7 +58,7 @@ for dir in . ; do out=${dir}/${file#$dir/templates/} # strip templates dir prefix out=${out%.*} # strip template extension json_files="build.json $end2end_test_build" - data=`for i in $json_files; do echo -n "-d $i "; done` + data=`for i in $json_files ; do echo $i ; done | awk ' { printf "-d %s ", $0 } '` if [ "x$TEST" = "xtrue" ] ; then actual_out=$out out=`mktemp /tmp/gentXXXXXX`