diff options
author | Craig Tiller <ctiller@google.com> | 2016-04-03 13:04:41 -0700 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2016-04-03 13:04:41 -0700 |
commit | 2d8d13a5726ae673d6fc90d6f92b5c2a384d3131 (patch) | |
tree | 667fa808214a544993c018642d402d24341e1e46 /test | |
parent | da1d7d9d1ec4681ba81c0d84c6070481d1f0479e (diff) |
Server fuzzer progress
Diffstat (limited to 'test')
-rw-r--r-- | test/core/end2end/fuzzers/server_fuzzer.c | 28 | ||||
-rw-r--r-- | test/core/util/mock_endpoint.c | 124 | ||||
-rw-r--r-- | test/core/util/mock_endpoint.h | 9 |
3 files changed, 144 insertions, 17 deletions
diff --git a/test/core/end2end/fuzzers/server_fuzzer.c b/test/core/end2end/fuzzers/server_fuzzer.c index 5b0dea980e..fa4030dd8f 100644 --- a/test/core/end2end/fuzzers/server_fuzzer.c +++ b/test/core/end2end/fuzzers/server_fuzzer.c @@ -33,33 +33,35 @@ #include <grpc/grpc.h> -#if 0 -static void discard_write(gpr_slice slice) { gpr_slice_unref(slice); } +#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" +#include "src/core/lib/surface/server.h" +#include "test/core/util/mock_endpoint.h" + +static void discard_write(gpr_slice slice) {} static void *tag(int n) { return (void *)(uintptr_t)n; } -#endif +static int detag(void *p) { return (int)(uintptr_t)p; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { -#if 0 grpc_init(); + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_endpoint *mock_endpoint = grpc_mock_endpoint_create(discard_write); - grpc_mock_endpoint_put_read(mock_endpoint, - gpr_slice_from_copied_buffer(data, size)); + grpc_mock_endpoint_put_read( + &exec_ctx, mock_endpoint, + gpr_slice_from_copied_buffer((const char *)data, size)); grpc_server *server = grpc_server_create(NULL, NULL); - grpc_completion_queue *cq = grpc_completion_queue_create(); - grpc_server_register_completion_queue(server, cq); + grpc_completion_queue *cq = grpc_completion_queue_create(NULL); + grpc_server_register_completion_queue(server, cq, NULL); // TODO(ctiller): add registered methods (one for POST, one for PUT) // void *registered_method = // grpc_server_register_method(server, "/reg", NULL, 0); - grpc_server_start(server, NULL); - grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_server_start(server); grpc_transport *transport = grpc_create_chttp2_transport(&exec_ctx, NULL, mock_endpoint, 0); grpc_server_setup_transport(&exec_ctx, server, transport, NULL); grpc_chttp2_transport_start_reading(&exec_ctx, transport, NULL, 0); - grpc_exec_ctx_flush(&exec_ctx); grpc_call *call1; grpc_call_details call_details1; @@ -68,8 +70,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { cq, cq, tag(1)); while (1) { + grpc_exec_ctx_flush(&exec_ctx); grpc_event ev = - grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME)); + grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME), NULL); switch (ev.type) { case GRPC_QUEUE_TIMEOUT: goto done; @@ -84,6 +87,5 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { } done: grpc_shutdown(); -#endif return 0; } diff --git a/test/core/util/mock_endpoint.c b/test/core/util/mock_endpoint.c index e69de29bb2..7768413095 100644 --- a/test/core/util/mock_endpoint.c +++ b/test/core/util/mock_endpoint.c @@ -0,0 +1,124 @@ +/* + * + * Copyright 2016, 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/util/mock_endpoint.h" + +#include <grpc/support/alloc.h> +#include <grpc/support/string_util.h> + +typedef struct grpc_mock_endpoint { + grpc_endpoint base; + gpr_mu mu; + void (*on_write)(gpr_slice slice); + gpr_slice_buffer read_buffer; + gpr_slice_buffer *on_read_out; + grpc_closure *on_read; +} grpc_mock_endpoint; + +static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + gpr_slice_buffer *slices, grpc_closure *cb) { + grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; + gpr_mu_lock(&m->mu); + if (m->read_buffer.count > 0) { + gpr_slice_buffer_swap(&m->read_buffer, slices); + grpc_exec_ctx_enqueue(exec_ctx, cb, true, NULL); + } else { + m->on_read = cb; + m->on_read_out = slices; + } + gpr_mu_unlock(&m->mu); +} + +static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + gpr_slice_buffer *slices, grpc_closure *cb) { + grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; + for (size_t i = 0; i < slices->count; i++) { + m->on_write(slices->slices[i]); + } + grpc_exec_ctx_enqueue(exec_ctx, cb, true, NULL); +} + +static void me_add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_pollset *pollset) {} + +static void me_add_to_pollset_set(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_pollset_set *pollset) {} + +static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) { + grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; + gpr_mu_lock(&m->mu); + if (m->on_read) { + grpc_exec_ctx_enqueue(exec_ctx, m->on_read, false, NULL); + m->on_read = NULL; + } + gpr_mu_unlock(&m->mu); +} + +static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) { + grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; + gpr_slice_buffer_destroy(&m->read_buffer); + gpr_free(m); +} + +static char *me_get_peer(grpc_endpoint *ep) { + return gpr_strdup("fake:mock_endpoint"); +} + +static const grpc_endpoint_vtable vtable = { + me_read, me_write, me_add_to_pollset, me_add_to_pollset_set, + me_shutdown, me_destroy, me_get_peer, +}; + +grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(gpr_slice slice)) { + grpc_mock_endpoint *m = gpr_malloc(sizeof(*m)); + m->base.vtable = &vtable; + gpr_slice_buffer_init(&m->read_buffer); + gpr_mu_init(&m->mu); + m->on_write = on_write; + m->on_read = NULL; + return &m->base; +} + +void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + gpr_slice slice) { + grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; + gpr_mu_lock(&m->mu); + if (m->on_read != NULL) { + gpr_slice_buffer_add(m->on_read_out, slice); + grpc_exec_ctx_enqueue(exec_ctx, m->on_read, true, NULL); + m->on_read = NULL; + } else { + gpr_slice_buffer_add(&m->read_buffer, slice); + } + gpr_mu_unlock(&m->mu); +} diff --git a/test/core/util/mock_endpoint.h b/test/core/util/mock_endpoint.h index 5140eab60a..051af9866b 100644 --- a/test/core/util/mock_endpoint.h +++ b/test/core/util/mock_endpoint.h @@ -34,9 +34,10 @@ #ifndef MOCK_ENDPOINT_H #define MOCK_ENDPOINT_H -grpc_endpoint *grpc_mock_endpoint_create(); -void grpc_mock_endpoint_put_read(grpc_endpoint *mock_endpoint, gpr_slice slice); -void grpc_mock_endpoint_on_write(grpc_endpoint *mock_endpoint, - void (*cb)(gpr_slice slice)); +#include "src/core/lib/iomgr/endpoint.h" + +grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(gpr_slice slice)); +void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx, + grpc_endpoint *mock_endpoint, gpr_slice slice); #endif |