root/opal/mca/event/libevent2022/libevent/test/regress_minheap.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. set_random_timeout
  2. check_heap
  3. test_heap_randomized

   1 /*
   2  * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  * 1. Redistributions of source code must retain the above copyright
   8  *    notice, this list of conditions and the following disclaimer.
   9  * 2. Redistributions in binary form must reproduce the above copyright
  10  *    notice, this list of conditions and the following disclaimer in the
  11  *    documentation and/or other materials provided with the distribution.
  12  * 3. The name of the author may not be used to endorse or promote products
  13  *    derived from this software without specific prior written permission.
  14  *
  15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25  */
  26 
  27 #include <stdlib.h>
  28 #include "event2/event_struct.h"
  29 
  30 #include "tinytest.h"
  31 #include "tinytest_macros.h"
  32 #include "../minheap-internal.h"
  33 
  34 static void
  35 set_random_timeout(struct event *ev)
  36 {
  37         ev->ev_timeout.tv_sec = rand();
  38         ev->ev_timeout.tv_usec = rand() & 0xfffff;
  39         ev->ev_timeout_pos.min_heap_idx = -1;
  40 }
  41 
  42 static void
  43 check_heap(struct min_heap *heap)
  44 {
  45         unsigned i;
  46         for (i = 1; i < heap->n; ++i) {
  47                 unsigned parent_idx = (i-1)/2;
  48                 tt_want(evutil_timercmp(&heap->p[i]->ev_timeout,
  49                         &heap->p[parent_idx]->ev_timeout, >=));
  50         }
  51 }
  52 
  53 static void
  54 test_heap_randomized(void *ptr)
  55 {
  56         struct min_heap heap;
  57         struct event *inserted[1024];
  58         struct event *e, *last_e;
  59         int i;
  60 
  61         min_heap_ctor(&heap);
  62 
  63         for (i = 0; i < 1024; ++i) {
  64                 inserted[i] = malloc(sizeof(struct event));
  65                 set_random_timeout(inserted[i]);
  66                 min_heap_push(&heap, inserted[i]);
  67         }
  68         check_heap(&heap);
  69 
  70         tt_assert(min_heap_size(&heap) == 1024);
  71 
  72         for (i = 0; i < 512; ++i) {
  73                 min_heap_erase(&heap, inserted[i]);
  74                 if (0 == (i % 32))
  75                         check_heap(&heap);
  76         }
  77         tt_assert(min_heap_size(&heap) == 512);
  78 
  79         last_e = min_heap_pop(&heap);
  80         while (1) {
  81                 e = min_heap_pop(&heap);
  82                 if (!e)
  83                         break;
  84                 tt_want(evutil_timercmp(&last_e->ev_timeout,
  85                         &e->ev_timeout, <=));
  86         }
  87         tt_assert(min_heap_size(&heap) == 0);
  88 end:
  89         for (i = 0; i < 1024; ++i)
  90                 free(inserted[i]);
  91 
  92         min_heap_dtor(&heap);
  93 }
  94 
  95 struct testcase_t minheap_testcases[] = {
  96         { "randomized", test_heap_randomized, 0, NULL, NULL },
  97         END_OF_TESTCASES
  98 };

/* [<][>][^][v][top][bottom][index][help] */