aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-11 14:08:19 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-11 14:08:19 +0100
commit35dbb9cf3c2e5819d6ef14641fb01faf212aabbb (patch)
tree7679ba8327e480b246f8f5a1f3e444436b555c36 /test
parent4f293b584f1e466513a478014e116b3f058eaee8 (diff)
downloadrspamd-35dbb9cf3c2e5819d6ef14641fb01faf212aabbb.tar.gz
rspamd-35dbb9cf3c2e5819d6ef14641fb01faf212aabbb.zip
[Test] More improvements to heap tests
Diffstat (limited to 'test')
-rw-r--r--test/rspamd_heap_test.c93
1 files changed, 67 insertions, 26 deletions
diff --git a/test/rspamd_heap_test.c b/test/rspamd_heap_test.c
index 56f9e0b9c..711ab1c88 100644
--- a/test/rspamd_heap_test.c
+++ b/test/rspamd_heap_test.c
@@ -19,8 +19,8 @@
#include "heap.h"
#include "ottery.h"
-static const niter = 100500;
-static const nrem = 100;
+static const guint niter = 100500;
+static const guint nrem = 100;
static inline
struct rspamd_min_heap_elt *
@@ -48,7 +48,7 @@ heap_nelts_test (guint nelts)
for (i = 0; i < nelts; i ++) {
elts[i].pri = ottery_rand_uint32 () % G_MAXINT32 + 1;
- elts[i].idx = NULL;
+ elts[i].idx = 0;
}
t1 = rspamd_get_virtual_ticks ();
@@ -71,38 +71,96 @@ void
rspamd_heap_test_func (void)
{
struct rspamd_min_heap *heap;
- struct rspamd_min_heap_elt *elt;
- gint i;
+ struct rspamd_min_heap_elt *elt, *telt;
+ guint i;
guint prev;
gdouble t[16];
+ /* Push + update */
heap = rspamd_min_heap_create (32);
+ elt = new_elt (2);
+ elt->data = GINT_TO_POINTER (1);
+ rspamd_min_heap_push (heap, elt);
+ elt = new_elt (3);
+ elt->data = GINT_TO_POINTER (2);
+ rspamd_min_heap_push (heap, elt);
+ elt = new_elt (4);
+ elt->data = GINT_TO_POINTER (3);
+ rspamd_min_heap_push (heap, elt);
- for (i = 100; i >= 0; i --) {
- elt = new_elt (i);
+ rspamd_min_heap_update_elt (heap, elt, 0);
+ elt = rspamd_min_heap_pop (heap);
+ g_assert (elt->data == GINT_TO_POINTER (3));
+
+ rspamd_min_heap_destroy (heap);
+
+ /* Push + remove */
+ heap = rspamd_min_heap_create (32);
+ elt = new_elt (2);
+ elt->data = GINT_TO_POINTER (1);
+ rspamd_min_heap_push (heap, elt);
+ rspamd_min_heap_remove_elt (heap, elt);
+ elt = new_elt (3);
+ elt->data = GINT_TO_POINTER (2);
+ rspamd_min_heap_push (heap, elt);
+ elt = rspamd_min_heap_pop (heap);
+ g_assert (elt->data == GINT_TO_POINTER (2));
+ elt = rspamd_min_heap_pop (heap);
+ g_assert (elt == NULL);
+
+ /* Push + push + remove + pop */
+ elt = new_elt (2);
+ elt->data = GINT_TO_POINTER (1);
+ rspamd_min_heap_push (heap, elt);
+ telt = elt;
+ elt = new_elt (3);
+ elt->data = GINT_TO_POINTER (2);
+ rspamd_min_heap_push (heap, elt);
+ rspamd_min_heap_remove_elt (heap, telt);
+ elt = rspamd_min_heap_pop (heap);
+ g_assert (elt->data == GINT_TO_POINTER (2));
+ rspamd_min_heap_destroy (heap);
+
+ /* Bulk test */
+ heap = rspamd_min_heap_create (32);
+
+ for (i = 100; i > 0; i --) {
+ elt = new_elt (i - 1);
rspamd_min_heap_push (heap, elt);
}
- for (i = 0; i <= 100; i ++) {
+ for (i = 0; i < 100; i ++) {
elt = rspamd_min_heap_pop (heap);
g_assert (elt->pri == i);
}
rspamd_min_heap_destroy (heap);
+
+ /* Fuzz test */
heap = rspamd_min_heap_create (128);
+ /* Add */
for (i = 0; i < niter; i ++) {
elt = new_elt (ottery_rand_uint32 () % G_MAXINT32 + 1);
rspamd_min_heap_push (heap, elt);
}
+ /* Remove */
for (i = 0; i < nrem; i ++) {
elt = rspamd_min_heap_index (heap, ottery_rand_uint32 () % niter);
rspamd_min_heap_remove_elt (heap, elt);
}
+ /* Update */
+ for (i = 0; i < niter / 10; i ++) {
+ elt = rspamd_min_heap_index (heap, ottery_rand_uint32 () % (niter - nrem));
+ rspamd_min_heap_update_elt (heap, elt,
+ ottery_rand_uint32 () % G_MAXINT32 + 1);
+ }
+
prev = 0;
+ /* Pop and check invariant */
for (i = 0; i < niter - nrem; i ++) {
elt = rspamd_min_heap_pop (heap);
@@ -115,24 +173,7 @@ rspamd_heap_test_func (void)
rspamd_min_heap_destroy (heap);
- heap = rspamd_min_heap_create (32);
-
- elt = new_elt (2);
- elt->data = GINT_TO_POINTER (1);
- rspamd_min_heap_push (heap, elt);
- elt = new_elt (3);
- elt->data = GINT_TO_POINTER (2);
- rspamd_min_heap_push (heap, elt);
- elt = new_elt (4);
- elt->data = GINT_TO_POINTER (3);
- rspamd_min_heap_push (heap, elt);
-
- rspamd_min_heap_update_elt (heap, elt, 0);
- elt = rspamd_min_heap_pop (heap);
- g_assert (elt->idx == GINT_TO_POINTER (3));
-
- rspamd_min_heap_destroy (heap);
-
+ /* Complexity test (should be O(n * logn) */
for (i = 1; i <= G_N_ELEMENTS (t); i ++) {
t[i - 1] = heap_nelts_test (0x1 << (i + 4));
}