mirror of https://github.com/grpc/grpc.git
Merge branch 'master' of https://github.com/grpc/grpc into zookeeper
commit
62b9080a1d
119 changed files with 7184 additions and 2547 deletions
@ -0,0 +1,191 @@ |
||||
/*
|
||||
* |
||||
* 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/surface/channel.h" |
||||
|
||||
#include <grpc/support/alloc.h> |
||||
#include <grpc/support/log.h> |
||||
|
||||
#include "src/core/channel/client_channel.h" |
||||
#include "src/core/iomgr/alarm.h" |
||||
#include "src/core/surface/completion_queue.h" |
||||
|
||||
grpc_connectivity_state grpc_channel_check_connectivity_state( |
||||
grpc_channel *channel, int try_to_connect) { |
||||
/* forward through to the underlying client channel */ |
||||
grpc_channel_element *client_channel_elem = |
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel)); |
||||
if (client_channel_elem->filter != &grpc_client_channel_filter) { |
||||
gpr_log(GPR_ERROR, |
||||
"grpc_channel_check_connectivity_state called on something that is " |
||||
"not a client channel, but '%s'", |
||||
client_channel_elem->filter->name); |
||||
return GRPC_CHANNEL_FATAL_FAILURE; |
||||
} |
||||
return grpc_client_channel_check_connectivity_state(client_channel_elem, |
||||
try_to_connect); |
||||
} |
||||
|
||||
typedef enum { |
||||
WAITING, |
||||
CALLING_BACK, |
||||
CALLING_BACK_AND_FINISHED, |
||||
CALLED_BACK |
||||
} callback_phase; |
||||
|
||||
typedef struct { |
||||
gpr_mu mu; |
||||
callback_phase phase; |
||||
int success; |
||||
grpc_iomgr_closure on_complete; |
||||
grpc_alarm alarm; |
||||
grpc_connectivity_state state; |
||||
grpc_connectivity_state *optional_new_state; |
||||
grpc_completion_queue *cq; |
||||
grpc_cq_completion completion_storage; |
||||
grpc_channel *channel; |
||||
void *tag; |
||||
} state_watcher; |
||||
|
||||
static void delete_state_watcher(state_watcher *w) { |
||||
grpc_channel_element *client_channel_elem = |
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(w->channel)); |
||||
grpc_client_channel_del_interested_party(client_channel_elem, grpc_cq_pollset(w->cq)); |
||||
GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_connectivity"); |
||||
gpr_mu_destroy(&w->mu); |
||||
gpr_free(w); |
||||
} |
||||
|
||||
static void finished_completion(void *pw, grpc_cq_completion *ignored) { |
||||
int delete = 0; |
||||
state_watcher *w = pw; |
||||
gpr_mu_lock(&w->mu); |
||||
switch (w->phase) { |
||||
case WAITING: |
||||
case CALLED_BACK: |
||||
gpr_log(GPR_ERROR, "should never reach here"); |
||||
abort(); |
||||
break; |
||||
case CALLING_BACK: |
||||
w->phase = CALLED_BACK; |
||||
break; |
||||
case CALLING_BACK_AND_FINISHED: |
||||
delete = 1; |
||||
break; |
||||
} |
||||
gpr_mu_unlock(&w->mu); |
||||
|
||||
if (delete) { |
||||
delete_state_watcher(w); |
||||
} |
||||
} |
||||
|
||||
static void partly_done(state_watcher *w, int due_to_completion) { |
||||
int delete = 0; |
||||
|
||||
if (due_to_completion) { |
||||
gpr_mu_lock(&w->mu); |
||||
w->success = 1; |
||||
gpr_mu_unlock(&w->mu); |
||||
grpc_alarm_cancel(&w->alarm); |
||||
} |
||||
|
||||
gpr_mu_lock(&w->mu); |
||||
switch (w->phase) { |
||||
case WAITING: |
||||
w->phase = CALLING_BACK; |
||||
if (w->optional_new_state) { |
||||
*w->optional_new_state = w->state; |
||||
} |
||||
grpc_cq_end_op(w->cq, w->tag, w->success, finished_completion, w, |
||||
&w->completion_storage); |
||||
break; |
||||
case CALLING_BACK: |
||||
w->phase = CALLING_BACK_AND_FINISHED; |
||||
break; |
||||
case CALLING_BACK_AND_FINISHED: |
||||
gpr_log(GPR_ERROR, "should never reach here"); |
||||
abort(); |
||||
break; |
||||
case CALLED_BACK: |
||||
delete = 1; |
||||
break; |
||||
} |
||||
gpr_mu_unlock(&w->mu); |
||||
|
||||
if (delete) { |
||||
delete_state_watcher(w); |
||||
} |
||||
} |
||||
|
||||
static void watch_complete(void *pw, int success) { partly_done(pw, 1); } |
||||
|
||||
static void timeout_complete(void *pw, int success) { partly_done(pw, 0); } |
||||
|
||||
void grpc_channel_watch_connectivity_state( |
||||
grpc_channel *channel, grpc_connectivity_state last_observed_state, |
||||
grpc_connectivity_state *optional_new_state, gpr_timespec deadline, |
||||
grpc_completion_queue *cq, void *tag) { |
||||
grpc_channel_element *client_channel_elem = |
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel)); |
||||
state_watcher *w = gpr_malloc(sizeof(*w)); |
||||
|
||||
grpc_cq_begin_op(cq); |
||||
|
||||
gpr_mu_init(&w->mu); |
||||
grpc_iomgr_closure_init(&w->on_complete, watch_complete, w); |
||||
w->phase = WAITING; |
||||
w->state = last_observed_state; |
||||
w->success = 0; |
||||
w->optional_new_state = optional_new_state; |
||||
w->cq = cq; |
||||
w->tag = tag; |
||||
w->channel = channel; |
||||
|
||||
grpc_alarm_init( |
||||
&w->alarm, gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
|
||||
timeout_complete, w, gpr_now(GPR_CLOCK_MONOTONIC)); |
||||
|
||||
if (client_channel_elem->filter != &grpc_client_channel_filter) { |
||||
gpr_log(GPR_ERROR, |
||||
"grpc_channel_watch_connectivity_state called on something that is " |
||||
"not a client channel, but '%s'", |
||||
client_channel_elem->filter->name); |
||||
grpc_iomgr_add_delayed_callback(&w->on_complete, 1); |
||||
} else { |
||||
GRPC_CHANNEL_INTERNAL_REF(channel, "watch_connectivity"); |
||||
grpc_client_channel_add_interested_party(client_channel_elem, grpc_cq_pollset(cq)); |
||||
grpc_client_channel_watch_connectivity_state(client_channel_elem, &w->state, |
||||
&w->on_complete); |
||||
} |
||||
} |
Binary file not shown.
@ -0,0 +1,5 @@ |
||||
Contents |
||||
-------- |
||||
|
||||
- Grpc.public.snk: |
||||
Public key to verify strong name of gRPC assemblies. |
@ -0,0 +1,22 @@ |
||||
{ |
||||
"tags": { |
||||
"allowUnknownTags": true |
||||
}, |
||||
"source": { |
||||
"include": [ "index.js", "src" ], |
||||
"includePattern": ".+\\.js(doc)?$", |
||||
"excludePattern": "(^|\\/|\\\\)_" |
||||
}, |
||||
"opts": { |
||||
"package": "package.json", |
||||
"readme": "README.md" |
||||
}, |
||||
"plugins": [], |
||||
"templates": { |
||||
"cleverLinks": false, |
||||
"monospaceLinks": false, |
||||
"default": { |
||||
"outputSourceFiles": true |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,42 @@ |
||||
#!/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. |
||||
|
||||
GRPC_CPP_PLUGIN_PATH=`which grpc_cpp_plugin` |
||||
|
||||
cd `dirname $0`/../.. |
||||
|
||||
find ./test -type f -name "*.proto" | |
||||
while read p ; do |
||||
echo "processing $p" |
||||
DIR=$(dirname "$p") |
||||
protoc $p --grpc_out=./ --plugin=protoc-gen-grpc=$GRPC_CPP_PLUGIN_PATH |
||||
protoc $p --cpp_out=./ |
||||
done |
@ -0,0 +1,124 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include "test/core/end2end/end2end_tests.h" |
||||
|
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <unistd.h> |
||||
|
||||
#include "src/core/channel/client_channel.h" |
||||
#include "src/core/channel/connected_channel.h" |
||||
#include "src/core/channel/http_server_filter.h" |
||||
#include "src/core/support/string.h" |
||||
#include "src/core/surface/channel.h" |
||||
#include "src/core/surface/server.h" |
||||
#include "src/core/transport/chttp2_transport.h" |
||||
#include <grpc/support/alloc.h> |
||||
#include <grpc/support/host_port.h> |
||||
#include <grpc/support/log.h> |
||||
#include <grpc/support/string_util.h> |
||||
#include <grpc/support/sync.h> |
||||
#include <grpc/support/thd.h> |
||||
#include <grpc/support/useful.h> |
||||
#include "test/core/util/port.h" |
||||
#include "test/core/util/test_config.h" |
||||
|
||||
typedef struct fullstack_fixture_data { |
||||
char *localaddr; |
||||
} fullstack_fixture_data; |
||||
|
||||
static int unique = 1; |
||||
|
||||
static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( |
||||
grpc_channel_args *client_args, grpc_channel_args *server_args) { |
||||
grpc_end2end_test_fixture f; |
||||
fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data)); |
||||
memset(&f, 0, sizeof(f)); |
||||
|
||||
gpr_asprintf(&ffd->localaddr, "unix:/tmp/grpc_fullstack_test.%d.%d", getpid(), |
||||
unique++); |
||||
|
||||
f.fixture_data = ffd; |
||||
f.cq = grpc_completion_queue_create(); |
||||
|
||||
return f; |
||||
} |
||||
|
||||
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f, |
||||
grpc_channel_args *client_args) { |
||||
fullstack_fixture_data *ffd = f->fixture_data; |
||||
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args); |
||||
} |
||||
|
||||
void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f, |
||||
grpc_channel_args *server_args) { |
||||
fullstack_fixture_data *ffd = f->fixture_data; |
||||
if (f->server) { |
||||
grpc_server_destroy(f->server); |
||||
} |
||||
f->server = grpc_server_create(server_args); |
||||
grpc_server_register_completion_queue(f->server, f->cq); |
||||
GPR_ASSERT(grpc_server_add_http2_port(f->server, ffd->localaddr)); |
||||
grpc_server_start(f->server); |
||||
} |
||||
|
||||
void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) { |
||||
fullstack_fixture_data *ffd = f->fixture_data; |
||||
gpr_free(ffd->localaddr); |
||||
gpr_free(ffd); |
||||
} |
||||
|
||||
/* All test configurations */ |
||||
static grpc_end2end_test_config configs[] = { |
||||
{"chttp2/fullstack_uds", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION, |
||||
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack, |
||||
chttp2_init_server_fullstack, chttp2_tear_down_fullstack}, |
||||
}; |
||||
|
||||
int main(int argc, char **argv) { |
||||
size_t i; |
||||
|
||||
grpc_platform_become_multipoller = grpc_poll_become_multipoller; |
||||
|
||||
grpc_test_init(argc, argv); |
||||
grpc_init(); |
||||
|
||||
for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) { |
||||
grpc_end2end_tests(configs[i]); |
||||
} |
||||
|
||||
grpc_shutdown(); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,123 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include "test/core/end2end/end2end_tests.h" |
||||
|
||||
#include <grpc/support/log.h> |
||||
#include <grpc/support/time.h> |
||||
|
||||
#include "test/core/end2end/cq_verifier.h" |
||||
|
||||
static void *tag(gpr_intptr t) { return (void *)t; } |
||||
|
||||
static void test_connectivity(grpc_end2end_test_config config) { |
||||
grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL); |
||||
grpc_connectivity_state state; |
||||
cq_verifier *cqv = cq_verifier_create(f.cq); |
||||
|
||||
config.init_client(&f, NULL); |
||||
|
||||
/* channels should start life in IDLE, and stay there */ |
||||
GPR_ASSERT(grpc_channel_check_connectivity_state(f.client, 0) == GRPC_CHANNEL_IDLE); |
||||
gpr_sleep_until(GRPC_TIMEOUT_MILLIS_TO_DEADLINE(100)); |
||||
GPR_ASSERT(grpc_channel_check_connectivity_state(f.client, 0) == GRPC_CHANNEL_IDLE); |
||||
|
||||
/* start watching for a change */ |
||||
grpc_channel_watch_connectivity_state( |
||||
f.client, GRPC_CHANNEL_IDLE, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(1)); |
||||
/* nothing should happen */ |
||||
cq_verify_empty(cqv); |
||||
|
||||
/* check that we're still in idle, and start connecting */ |
||||
GPR_ASSERT(grpc_channel_check_connectivity_state(f.client, 1) == GRPC_CHANNEL_IDLE); |
||||
|
||||
/* and now the watch should trigger */ |
||||
cq_expect_completion(cqv, tag(1), 1); |
||||
cq_verify(cqv); |
||||
GPR_ASSERT(state == GRPC_CHANNEL_CONNECTING); |
||||
|
||||
/* quickly followed by a transition to TRANSIENT_FAILURE */ |
||||
grpc_channel_watch_connectivity_state( |
||||
f.client, GRPC_CHANNEL_CONNECTING, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(2)); |
||||
cq_expect_completion(cqv, tag(2), 1); |
||||
cq_verify(cqv); |
||||
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE); |
||||
|
||||
gpr_log(GPR_DEBUG, "*** STARTING SERVER ***"); |
||||
|
||||
/* now let's bring up a server to connect to */ |
||||
config.init_server(&f, NULL); |
||||
|
||||
gpr_log(GPR_DEBUG, "*** STARTED SERVER ***"); |
||||
|
||||
/* we'll go through some set of transitions (some might be missed), until
|
||||
READY is reached */ |
||||
while (state != GRPC_CHANNEL_READY) { |
||||
grpc_channel_watch_connectivity_state( |
||||
f.client, state, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(3)); |
||||
cq_expect_completion(cqv, tag(3), 1); |
||||
cq_verify(cqv); |
||||
GPR_ASSERT(state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_CONNECTING || state == GRPC_CHANNEL_TRANSIENT_FAILURE); |
||||
} |
||||
|
||||
/* bring down the server again */ |
||||
/* we should go immediately to TRANSIENT_FAILURE */ |
||||
gpr_log(GPR_DEBUG, "*** SHUTTING DOWN SERVER ***"); |
||||
|
||||
grpc_channel_watch_connectivity_state( |
||||
f.client, GRPC_CHANNEL_READY, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(4)); |
||||
|
||||
grpc_server_shutdown_and_notify(f.server, f.cq, tag(0xdead)); |
||||
|
||||
cq_expect_completion(cqv, tag(4), 1); |
||||
cq_expect_completion(cqv, tag(0xdead), 1); |
||||
cq_verify(cqv); |
||||
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE); |
||||
|
||||
/* cleanup server */ |
||||
grpc_server_destroy(f.server); |
||||
|
||||
gpr_log(GPR_DEBUG, "*** SHUTDOWN SERVER ***"); |
||||
|
||||
grpc_channel_destroy(f.client); |
||||
grpc_completion_queue_shutdown(f.cq); |
||||
grpc_completion_queue_destroy(f.cq); |
||||
config.tear_down_data(&f); |
||||
|
||||
cq_verifier_destroy(cqv); |
||||
} |
||||
|
||||
void grpc_end2end_tests(grpc_end2end_test_config config) { |
||||
GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION); |
||||
test_connectivity(config); |
||||
} |
@ -0,0 +1,76 @@ |
||||
#!/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 |
||||
|
||||
if [ "x$TEST" = "x" ] ; then |
||||
TEST=false |
||||
fi |
||||
|
||||
|
||||
cd `dirname $0`/../.. |
||||
mako_renderer=tools/buildgen/mako_renderer.py |
||||
|
||||
if [ "x$TEST" != "x" ] ; then |
||||
tools/buildgen/build-cleaner.py build.json |
||||
fi |
||||
|
||||
. tools/buildgen/generate_build_additions.sh |
||||
|
||||
global_plugins=`find ./tools/buildgen/plugins -name '*.py' | |
||||
sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` |
||||
|
||||
for dir in . ; do |
||||
local_plugins=`find $dir/templates -name '*.py' | |
||||
sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` |
||||
|
||||
plugins="$global_plugins $local_plugins" |
||||
|
||||
find -L $dir/templates -type f -and -name *.template | while read file ; do |
||||
out=${dir}/${file#$dir/templates/} # strip templates dir prefix |
||||
out=${out%.*} # strip template extension |
||||
echo "generating file: $out" |
||||
json_files="build.json $gen_build_files" |
||||
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` |
||||
fi |
||||
mkdir -p `dirname $out` # make sure dest directory exist |
||||
$mako_renderer $plugins $data -o $out $file |
||||
if [ "x$TEST" = "xtrue" ] ; then |
||||
diff -q $out $actual_out |
||||
rm $out |
||||
fi |
||||
done |
||||
done |
||||
|
||||
rm $gen_build_files |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue