commit
dcf6c90b33
97 changed files with 6005 additions and 2030 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); |
||||
} |
||||
} |
@ -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 |
@ -0,0 +1,36 @@ |
||||
import argparse |
||||
import xml.etree.cElementTree as ET |
||||
import jobset |
||||
|
||||
argp = argparse.ArgumentParser(description='Run interop tests.') |
||||
argp.add_argument('-l', '--language', |
||||
choices=['build_only', 'c++'], |
||||
nargs='+', |
||||
default=['build_only']) |
||||
args = argp.parse_args() |
||||
|
||||
# build job |
||||
build_steps = 'tools/run_tests/run_interops_build.sh' |
||||
build_job = jobset.JobSpec(cmdline=build_steps, shortname='build') |
||||
|
||||
# test jobs |
||||
_TESTS = ['large_unary', 'empty_unary', 'ping_pong', 'client_streaming', 'server_streaming'] |
||||
jobs = [] |
||||
jobNumber = 0 |
||||
for lang in args.language: |
||||
for test in _TESTS: |
||||
test_job = jobset.JobSpec(cmdline=['tools/run_tests/run_interops_test.sh', '%s' % lang, '%s' % test], shortname=test) |
||||
jobs.append(test_job) |
||||
jobNumber+=1 |
||||
|
||||
root = ET.Element('testsuites') |
||||
testsuite = ET.SubElement(root, 'testsuite', id='1', package='grpc', name='tests') |
||||
|
||||
# always do the build of docker first, and then all the tests can run in parallel |
||||
jobset.run([build_job], maxjobs=1, xml_report=testsuite) |
||||
jobset.run(jobs, maxjobs=jobNumber, xml_report=testsuite) |
||||
|
||||
tree = ET.ElementTree(root) |
||||
tree.write('report.xml', encoding='UTF-8') |
||||
|
||||
|
@ -0,0 +1,47 @@ |
||||
#!/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 |
||||
|
||||
#clean up any old docker files and start mirroring repository if not started already |
||||
sudo docker rmi -f grpc/cxx || true |
||||
sudo docker rmi -f grpc/base || true |
||||
sudo docker rmi -f 0.0.0.0:5000/grpc/base || true |
||||
sudo docker run -d -e GCS_BUCKET=docker-interop-images -e STORAGE_PATH=/admin/docker_images -p 5000:5000 google/docker-registry || true |
||||
|
||||
#prepare building by pulling down base images and necessary files |
||||
sudo docker pull 0.0.0.0:5000/grpc/base |
||||
sudo docker tag -f 0.0.0.0:5000/grpc/base grpc/base |
||||
gsutil cp -R gs://docker-interop-images/admin/service_account tools/dockerfile/grpc_cxx |
||||
gsutil cp -R gs://docker-interop-images/admin/cacerts tools/dockerfile/grpc_cxx |
||||
|
||||
#build docker file, add more languages later |
||||
sudo docker build --no-cache -t grpc/cxx tools/dockerfile/grpc_cxx |
@ -0,0 +1,43 @@ |
||||
#!/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. |
||||
|
||||
language=$1 |
||||
test_case=$2 |
||||
|
||||
set -e |
||||
if [ "$language" = "c++" ] |
||||
then |
||||
sudo docker run grpc/cxx /var/local/git/grpc/bins/opt/interop_client --enable_ssl --use_prod_roots --server_host_override=grpc-test.sandbox.google.com --server_host=grpc-test.sandbox.google.com --server_port=443 --test_case=$test_case |
||||
else |
||||
echo "interop testss not added for $language" |
||||
exit 1 |
||||
fi |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue