Add custom resolver

pull/6160/head
Craig Tiller 9 years ago
parent 151fd6826e
commit 99f67d1a08
  1. 43
      test/core/end2end/fuzzers/api_fuzzer.c

@ -39,6 +39,7 @@
#include <grpc/support/string_util.h>
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/transport/metadata.h"
#include "test/core/util/mock_endpoint.h"
@ -126,6 +127,7 @@ static bool is_eof(input_stream *inp) { return inp->cur == inp->end; }
// global state
static gpr_mu g_mu;
static gpr_cv g_cv;
static gpr_timespec g_now;
extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
@ -134,10 +136,41 @@ static gpr_timespec now_impl(gpr_clock_type clock_type) {
GPR_ASSERT(clock_type != GPR_TIMESPAN);
gpr_mu_lock(&g_mu);
gpr_timespec now = g_now;
gpr_cv_broadcast(&g_cv);
gpr_mu_unlock(&g_mu);
return now;
}
static void wait_until(gpr_timespec when) {
gpr_mu_lock(&g_mu);
while (gpr_time_cmp(when, g_now) < 0) {
gpr_cv_wait(&g_cv, &g_mu, gpr_inf_future(GPR_CLOCK_REALTIME));
}
gpr_mu_unlock(&g_mu);
}
////////////////////////////////////////////////////////////////////////////////
// dns resolution
static grpc_resolved_addresses *my_resolve_address(const char *name,
const char *default_port) {
if (0 == strcmp(name, "server")) {
wait_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
gpr_time_from_seconds(1, GPR_TIMESPAN)));
grpc_resolved_addresses *addrs = gpr_malloc(sizeof(*addrs));
addrs->naddrs = 1;
addrs->addrs = gpr_malloc(sizeof(*addrs->addrs));
addrs->addrs[0].len = 0;
return addrs;
} else if (0 == strcmp(name, "wait")) {
wait_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
gpr_time_from_seconds(1, GPR_TIMESPAN)));
return NULL;
} else {
return NULL;
}
}
////////////////////////////////////////////////////////////////////////////////
// test state
@ -157,7 +190,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_test_only_set_metadata_hash_seed(0);
if (squelch) gpr_set_log_function(dont_log);
input_stream inp = {data, data + size};
grpc_blocking_resolve_address = my_resolve_address;
gpr_mu_init(&g_mu);
gpr_cv_init(&g_cv);
gpr_now_impl = now_impl;
grpc_init();
@ -184,6 +219,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
server = NULL;
}
}
gpr_mu_lock(&g_mu);
g_now = gpr_time_add(g_now, gpr_time_from_seconds(1, GPR_TIMESPAN));
gpr_cv_broadcast(&g_cv);
gpr_mu_unlock(&g_mu);
}
switch (next_byte(&inp)) {
@ -223,7 +263,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (channel == NULL) {
char *target = read_string(&inp);
char *target_uri;
gpr_asprintf(&target_uri, "fuzz-test:%s", target);
gpr_asprintf(&target_uri, "dns:%s", target);
grpc_channel_args *args = read_args(&inp);
channel = grpc_insecure_channel_create(target_uri, args, NULL);
GPR_ASSERT(channel != NULL);
@ -290,5 +330,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_shutdown();
gpr_mu_destroy(&g_mu);
gpr_cv_destroy(&g_cv);
return 0;
}

Loading…
Cancel
Save