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 |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue