diff options
author | Julien Boeuf <jboeuf@google.com> | 2015-05-29 15:15:09 -0700 |
---|---|---|
committer | Julien Boeuf <jboeuf@google.com> | 2015-05-29 15:15:09 -0700 |
commit | f720bc5428562f9d08e4c96bb32187a7f9162514 (patch) | |
tree | 89ab8a84d31f3fc5d5082ba842b9c1a8f5a37765 /test/core | |
parent | b7bf14f51680d112af8276817c1ea6572c670fe5 (diff) | |
parent | eaee2bcb32e203a9ae79e514f552f31e254d74f6 (diff) |
Merge branch 'master' of github.com:grpc/grpc into server_auth_context
Diffstat (limited to 'test/core')
-rw-r--r-- | test/core/bad_client/bad_client.c | 136 | ||||
-rw-r--r-- | test/core/bad_client/bad_client.h | 52 | ||||
-rwxr-xr-x | test/core/bad_client/gen_build_json.py | 79 | ||||
-rw-r--r-- | test/core/bad_client/tests/connection_prefix.c | 79 | ||||
-rw-r--r-- | test/core/support/cmdline_test.c | 23 |
5 files changed, 369 insertions, 0 deletions
diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c new file mode 100644 index 0000000000..c3725b5909 --- /dev/null +++ b/test/core/bad_client/bad_client.c @@ -0,0 +1,136 @@ +/* + * + * 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/bad_client/bad_client.h" + +#include "src/core/channel/channel_stack.h" +#include "src/core/channel/http_server_filter.h" +#include "src/core/iomgr/endpoint_pair.h" +#include "src/core/surface/completion_queue.h" +#include "src/core/surface/server.h" +#include "src/core/transport/chttp2_transport.h" + +#include <grpc/support/sync.h> +#include <grpc/support/thd.h> + +typedef struct { + grpc_server *server; + grpc_completion_queue *cq; + grpc_bad_client_server_side_validator validator; + gpr_event done_thd; + gpr_event done_write; +} thd_args; + +static void thd_func(void *arg) { + thd_args *a = arg; + a->validator(a->server, a->cq); + gpr_event_set(&a->done_thd, (void *)1); +} + +static void done_write(void *arg, grpc_endpoint_cb_status status) { + thd_args *a = arg; + gpr_event_set(&a->done_write, (void *)1); +} + +static grpc_transport_setup_result server_setup_transport( + void *ts, grpc_transport *transport, grpc_mdctx *mdctx) { + thd_args *a = ts; + static grpc_channel_filter const *extra_filters[] = { + &grpc_http_server_filter}; + return grpc_server_setup_transport(a->server, transport, extra_filters, + GPR_ARRAY_SIZE(extra_filters), mdctx); +} + +void grpc_run_bad_client_test(const char *name, const char *client_payload, + size_t client_payload_length, + grpc_bad_client_server_side_validator validator) { + grpc_endpoint_pair sfd; + thd_args a; + gpr_thd_id id; + gpr_slice slice = + gpr_slice_from_copied_buffer(client_payload, client_payload_length); + + /* Add a debug log */ + gpr_log(GPR_INFO, "TEST: %s", name); + + /* Init grpc */ + grpc_init(); + + /* Create endpoints */ + sfd = grpc_iomgr_create_endpoint_pair(65536); + + /* Create server, completion events */ + a.server = grpc_server_create_from_filters(NULL, 0, NULL); + a.cq = grpc_completion_queue_create(); + gpr_event_init(&a.done_thd); + gpr_event_init(&a.done_write); + a.validator = validator; + grpc_server_register_completion_queue(a.server, a.cq); + grpc_server_start(a.server); + grpc_create_chttp2_transport(server_setup_transport, &a, NULL, sfd.server, + NULL, 0, grpc_mdctx_create(), 0); + + /* Bind everything into the same pollset */ + grpc_endpoint_add_to_pollset(sfd.client, grpc_cq_pollset(a.cq)); + grpc_endpoint_add_to_pollset(sfd.server, grpc_cq_pollset(a.cq)); + + /* Check a ground truth */ + GPR_ASSERT(grpc_server_has_open_connections(a.server)); + + /* Start validator */ + gpr_thd_new(&id, thd_func, &a, NULL); + + /* Write data */ + switch (grpc_endpoint_write(sfd.client, &slice, 1, done_write, &a)) { + case GRPC_ENDPOINT_WRITE_DONE: + done_write(&a, 1); + break; + case GRPC_ENDPOINT_WRITE_PENDING: + break; + case GRPC_ENDPOINT_WRITE_ERROR: + done_write(&a, 0); + break; + } + + /* Await completion */ + GPR_ASSERT( + gpr_event_wait(&a.done_write, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5))); + GPR_ASSERT(gpr_event_wait(&a.done_thd, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5))); + + /* Shutdown */ + grpc_endpoint_destroy(sfd.client); + grpc_server_destroy(a.server); + grpc_completion_queue_destroy(a.cq); + + grpc_shutdown(); +} diff --git a/test/core/bad_client/bad_client.h b/test/core/bad_client/bad_client.h new file mode 100644 index 0000000000..4834e86cce --- /dev/null +++ b/test/core/bad_client/bad_client.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_TEST_CORE_BAD_CLIENT_BAD_CLIENT_H +#define GRPC_TEST_CORE_BAD_CLIENT_BAD_CLIENT_H + +#include <grpc/grpc.h> +#include "test/core/util/test_config.h" + +typedef void (*grpc_bad_client_server_side_validator)( + grpc_server *server, grpc_completion_queue *cq); + +/* Test runner. + + Create a server, and send client_payload to it as bytes from a client. + Execute validator in a separate thread to assert that the bytes are + handled as expected. */ +void grpc_run_bad_client_test(const char *name, const char *client_payload, + size_t client_payload_length, + grpc_bad_client_server_side_validator validator); + +#endif /* GRPC_TEST_CORE_BAD_CLIENT_BAD_CLIENT_H */ diff --git a/test/core/bad_client/gen_build_json.py b/test/core/bad_client/gen_build_json.py new file mode 100755 index 0000000000..67969a1a12 --- /dev/null +++ b/test/core/bad_client/gen_build_json.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# 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. + + +"""Generates the appropriate build.json data for all the end2end tests.""" + + +import simplejson +import collections + +TestOptions = collections.namedtuple('TestOptions', 'flaky') +default_test_options = TestOptions(False) + +# maps test names to options +BAD_CLIENT_TESTS = { + 'connection_prefix': default_test_options, +} + +def main(): + json = { + '#': 'generated with test/bad_client/gen_build_json.py', + 'libs': [ + { + 'name': 'bad_client_test', + 'build': 'private', + 'language': 'c', + 'src': [ + 'test/core/bad_client/bad_client.c' + ] + }], + 'targets': [ + { + 'name': '%s_bad_client_test' % t, + 'build': 'test', + 'language': 'c', + 'secure': 'no', + 'src': ['test/core/bad_client/tests/%s.c' % t], + 'flaky': 'invoke_large_request' in t, + 'deps': [ + 'bad_client_test', + 'grpc_test_util_unsecure', + 'grpc_unsecure', + 'gpr_test_util', + 'gpr' + ] + } + for t in sorted(BAD_CLIENT_TESTS.keys())]} + print simplejson.dumps(json, sort_keys=True, indent=2 * ' ') + + +if __name__ == '__main__': + main() diff --git a/test/core/bad_client/tests/connection_prefix.c b/test/core/bad_client/tests/connection_prefix.c new file mode 100644 index 0000000000..e8bf935710 --- /dev/null +++ b/test/core/bad_client/tests/connection_prefix.c @@ -0,0 +1,79 @@ +/* + * + * 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/bad_client/bad_client.h" +#include "src/core/surface/server.h" + +static void verifier(grpc_server *server, grpc_completion_queue *cq) { + while (grpc_server_has_open_connections(server)) { + GPR_ASSERT(grpc_completion_queue_next( + cq, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(20)).type == + GRPC_QUEUE_TIMEOUT); + } +} + +int main(int argc, char **argv) { + grpc_test_init(argc, argv); + + grpc_run_bad_client_test("conpfx_1", "X", 1, verifier); + grpc_run_bad_client_test("conpfx_2", "PX", 2, verifier); + grpc_run_bad_client_test("conpfx_3", "PRX", 3, verifier); + grpc_run_bad_client_test("conpfx_4", "PRIX", 4, verifier); + grpc_run_bad_client_test("conpfx_5", "PRI X", 5, verifier); + grpc_run_bad_client_test("conpfx_6", "PRI *X", 6, verifier); + grpc_run_bad_client_test("conpfx_7", "PRI * X", 7, verifier); + grpc_run_bad_client_test("conpfx_8", "PRI * HX", 8, verifier); + grpc_run_bad_client_test("conpfx_9", "PRI * HTX", 9, verifier); + grpc_run_bad_client_test("conpfx_10", "PRI * HTTX", 10, verifier); + grpc_run_bad_client_test("conpfx_11", "PRI * HTTPX", 11, verifier); + grpc_run_bad_client_test("conpfx_12", "PRI * HTTP/X", 12, verifier); + grpc_run_bad_client_test("conpfx_13", "PRI * HTTP/2X", 13, verifier); + grpc_run_bad_client_test("conpfx_14", "PRI * HTTP/2.X", 14, verifier); + grpc_run_bad_client_test("conpfx_15", "PRI * HTTP/2.0X", 15, verifier); + grpc_run_bad_client_test("conpfx_16", "PRI * HTTP/2.0\rX", 16, verifier); + grpc_run_bad_client_test("conpfx_17", "PRI * HTTP/2.0\r\nX", 17, verifier); + grpc_run_bad_client_test("conpfx_18", "PRI * HTTP/2.0\r\n\rX", 18, verifier); + grpc_run_bad_client_test("conpfx_19", "PRI * HTTP/2.0\r\n\r\nX", 19, + verifier); + grpc_run_bad_client_test("conpfx_20", "PRI * HTTP/2.0\r\n\r\nSX", 20, + verifier); + grpc_run_bad_client_test("conpfx_21", "PRI * HTTP/2.0\r\n\r\nSMX", 21, + verifier); + grpc_run_bad_client_test("conpfx_22", "PRI * HTTP/2.0\r\n\r\nSM\rX", 22, + verifier); + grpc_run_bad_client_test("conpfx_23", "PRI * HTTP/2.0\r\n\r\nSM\r\nX", 23, + verifier); + grpc_run_bad_client_test("conpfx_24", "PRI * HTTP/2.0\r\n\r\nSM\r\n\rX", 24, + verifier); + return 0; +} diff --git a/test/core/support/cmdline_test.c b/test/core/support/cmdline_test.c index a7767ace5e..26153b192c 100644 --- a/test/core/support/cmdline_test.c +++ b/test/core/support/cmdline_test.c @@ -35,6 +35,7 @@ #include <string.h> +#include <grpc/support/alloc.h> #include <grpc/support/log.h> #include <grpc/support/useful.h> #include "test/core/util/test_config.h" @@ -272,6 +273,27 @@ static void test_many(void) { gpr_cmdline_destroy(cl); } +static void test_usage(void) { + gpr_cmdline *cl; + char *usage; + + char *str = NULL; + int x = 0; + int flag = 2; + + cl = gpr_cmdline_create(NULL); + gpr_cmdline_add_string(cl, "str", NULL, &str); + gpr_cmdline_add_int(cl, "x", NULL, &x); + gpr_cmdline_add_flag(cl, "flag", NULL, &flag); + + usage = gpr_cmdline_usage_string(cl, "test"); + GPR_ASSERT(0 == strcmp(usage, + "Usage: test [--str=string] [--x=int] [--flag|--no-flag]\n")); + gpr_free(usage); + + gpr_cmdline_destroy(cl); +} + int main(int argc, char **argv) { grpc_test_init(argc, argv); test_simple_int(); @@ -289,5 +311,6 @@ int main(int argc, char **argv) { test_flag_val_true(); test_flag_val_false(); test_many(); + test_usage(); return 0; } |