aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/liballoc_tests.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/liballoc_tests.c b/tests/liballoc_tests.c
index fed6080..ad45636 100644
--- a/tests/liballoc_tests.c
+++ b/tests/liballoc_tests.c
@@ -121,6 +121,57 @@ START_TEST(free_list_reuse) {
release(new_memory);
}
}
+END_TEST
+
+START_TEST(free_list_coalesce_forward) {
+ size_t size =ALIGNMENT*3;
+ const size_t n = 100;
+ void *ptrs[n];
+
+ for (size_t i=0; i<n; i++) {
+ ptrs[i] = allocate(size);
+ }
+
+ /*
+ * release memory in forward order. Each release should be
+ * coalesced, so there's only ever one free block
+ */
+ size_t cnt = 0;
+ for(size_t i=0; i<n; i++) {
+ release(ptrs[i]);
+ cnt++;
+ free_nd *fl_head = free_list_head();
+ ck_assert_ptr_null(fl_head->next);
+ ck_assert_int_eq(fl_head->size, (cnt)*size + (cnt-1)*sizeof(header));
+ }
+}
+END_TEST
+
+
+START_TEST(free_list_coalesce_backward) {
+ size_t size =ALIGNMENT*3;
+ const size_t n = 100;
+ void *ptrs[n];
+
+ for (size_t i=0; i<n; i++) {
+ ptrs[i] = allocate(size);
+ }
+
+ /*
+ * release memory in reverse order. Each release should be
+ * coalesced, so there's only ever one free block
+ */
+ size_t cnt = 0;
+ for(ssize_t i=n-1; i>=0; i--) {
+ release(ptrs[i]);
+ cnt++;
+ free_nd *fl_head = free_list_head();
+ ck_assert_ptr_null(fl_head->next);
+ ck_assert_int_eq(fl_head->size, (cnt)*size + (cnt-1)*sizeof(header));
+ }
+}
+END_TEST
+
Suite *liballoc_suite(void) {
@@ -136,6 +187,8 @@ Suite *liballoc_suite(void) {
tcase_add_test(unit, basic_release);
tcase_add_test(unit, release_null);
tcase_add_test(unit, free_list_reuse);
+ tcase_add_test(unit, free_list_coalesce_forward);
+ tcase_add_test(unit, free_list_coalesce_backward);
suite_add_tcase(s, unit);
return s;