Add an additional test

pull/5662/head
Craig Tiller 9 years ago
parent 08e0c191be
commit 0e6e34e4fa
  1. 108
      test/core/iomgr/timer_heap_test.c

@ -38,6 +38,8 @@
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/useful.h>
#include "test/core/util/test_config.h"
static gpr_timespec random_deadline(void) {
@ -81,6 +83,10 @@ static void check_valid(grpc_timer_heap *pq) {
}
}
/*******************************************************************************
* test1
*/
static void test1(void) {
grpc_timer_heap pq;
const size_t num_test_elements = 200;
@ -89,7 +95,7 @@ static void test1(void) {
grpc_timer *test_elements = create_test_elements(num_test_elements);
uint8_t *inpq = gpr_malloc(num_test_elements);
gpr_log(GPR_DEBUG, "******************************************* test1");
gpr_log(GPR_INFO, "test1");
grpc_timer_heap_init(&pq);
memset(inpq, 0, num_test_elements);
@ -136,7 +142,106 @@ static void test1(void) {
gpr_free(inpq);
}
/*******************************************************************************
* test2
*/
typedef struct {
grpc_timer elem;
bool inserted;
} elem_struct;
static elem_struct *search_elems(elem_struct *elems, size_t count, bool inserted) {
size_t *search_order = gpr_malloc(count * sizeof(*search_order));
for (size_t i = 0; i < count; i++) {
search_order[i] = i;
}
for (size_t i = 0; i < count * 2; i++) {
size_t a = (size_t)rand() % count;
size_t b = (size_t)rand() % count;
GPR_SWAP(size_t, search_order[a], search_order[b]);
}
elem_struct *out = NULL;
for (size_t i = 0; out == NULL && i < count; i++) {
if (elems[search_order[i]].inserted == inserted) {
out = &elems[search_order[i]];
}
}
gpr_free(search_order);
return out;
}
static void test2(void) {
gpr_log(GPR_INFO, "test2");
grpc_timer_heap pq;
elem_struct elems[1000];
size_t num_inserted = 0;
grpc_timer_heap_init(&pq);
memset(elems, 0, sizeof(elems));
for (size_t round = 0; round < 10000; round++) {
int r = (size_t)rand() % 1000;
if (r <= 550) {
/* 55% of the time we try to add something */
elem_struct *el = search_elems(elems, GPR_ARRAY_SIZE(elems), false);
if (el != NULL) {
el->elem.deadline = random_deadline();
grpc_timer_heap_add(&pq, &el->elem);
el->inserted = true;
num_inserted++;
check_valid(&pq);
}
} else if (r <= 650) {
/* 10% of the time we try to remove something */
elem_struct *el = search_elems(elems, GPR_ARRAY_SIZE(elems), true);
if (el != NULL) {
grpc_timer_heap_remove(&pq, &el->elem);
el->inserted = false;
num_inserted--;
check_valid(&pq);
}
} else {
/* the remaining times we pop */
if (num_inserted > 0) {
grpc_timer *top = grpc_timer_heap_top(&pq);
grpc_timer_heap_pop(&pq);
for (size_t i = 0; i < GPR_ARRAY_SIZE(elems); i++) {
if (top == &elems[i].elem) {
GPR_ASSERT(elems[i].inserted);
elems[i].inserted = false;
}
}
num_inserted--;
check_valid(&pq);
}
}
if (num_inserted) {
gpr_timespec *min_deadline = NULL;
for (size_t i = 0; i < GPR_ARRAY_SIZE(elems); i++) {
if (elems[i].inserted) {
if (min_deadline == NULL) {
min_deadline = &elems[i].elem.deadline;
} else {
if (gpr_time_cmp(elems[i].elem.deadline, *min_deadline) < 0) {
min_deadline = &elems[i].elem.deadline;
}
}
}
}
GPR_ASSERT(0 == gpr_time_cmp(grpc_timer_heap_top(&pq)->deadline, *min_deadline));
}
}
grpc_timer_heap_destroy(&pq);
}
static void shrink_test(void) {
gpr_log(GPR_INFO, "shrink_test");
grpc_timer_heap pq;
size_t i;
size_t expected_size;
@ -200,6 +305,7 @@ int main(int argc, char **argv) {
for (i = 0; i < 5; i++) {
test1();
test2();
shrink_test();
}

Loading…
Cancel
Save