#include <stdio.h>
#include "CUnit/Test.h"
#include "dds/ddsrt/cdtors.h"
#include "dds/ddsrt/heap.h"
CU_Init(ddsrt_heap)
{
ddsrt_init();
return 0;
}
CU_Clean(ddsrt_heap)
{
ddsrt_fini();
return 0;
}
static const size_t allocsizes[] = {0, 1, 2, 3, 4, 5, 10, 20, 257, 1024};
static const size_t nof_allocsizes = sizeof allocsizes / sizeof *allocsizes;
CU_Test(ddsrt_heap, malloc)
{
for(size_t i = 0; i < nof_allocsizes; i++) {
for(size_t j = 0; j < nof_allocsizes; j++) {
size_t s = allocsizes[i] * allocsizes[j];
void *ptr = ddsrt_malloc(s);
CU_ASSERT_NEQ_FATAL (ptr, NULL);
memset(ptr, 0, s);
ddsrt_free(ptr);
}
}
CU_PASS("ddsrt_malloc");
}
CU_Test(ddsrt_heap, calloc)
{
for(size_t i = 0; i < nof_allocsizes; i++) {
for(size_t j = 0; j < nof_allocsizes; j++) {
char *ptr = ddsrt_calloc(allocsizes[i], allocsizes[j]);
CU_ASSERT_NEQ (ptr, NULL);
if(allocsizes[i] * allocsizes[j] > 0) {
CU_ASSERT (ptr[0] == 0 && !memcmp(ptr, ptr + 1, (allocsizes[i] * allocsizes[j]) - 1));
}
ddsrt_free(ptr);
}
}
CU_PASS("ddsrt_calloc");
}
CU_Test(ddsrt_heap, realloc)
{
char *ptr = NULL;
size_t unchanged, s, prevs = 0;
for(size_t i = 0; i < nof_allocsizes; i++) {
for(size_t j = 0; j < nof_allocsizes; j++) {
s = allocsizes[i] * allocsizes[j];
printf("ddsrt_realloc(%p) %zu -> %zu\n", ptr, prevs, s);
ptr = ddsrt_realloc(ptr, s);
CU_ASSERT_NEQ_FATAL (ptr, NULL);
unchanged = (prevs < s) ? prevs : s;
if(unchanged) {
CU_ASSERT (ptr && ptr[0] == 1 && !memcmp(ptr, ptr + 1, unchanged - 1));
}
memset(ptr, 1, s);
prevs = s;
}
}
ddsrt_free(ptr);
CU_PASS("ddsrt_realloc");
}
static const size_t allocsizes_s[] = {0, 1, 2, 3, 4, 5, 10, 20, 257, 1024, 8192};
static const size_t nof_allocsizes_s = sizeof allocsizes_s / sizeof *allocsizes_s;
CU_Test(ddsrt_heap, malloc_s)
{
for(size_t i = 0; i < nof_allocsizes_s; i++) {
for(size_t j = 0; j < nof_allocsizes_s; j++) {
size_t s = allocsizes_s[i] * allocsizes_s[j];
void *ptr = ddsrt_malloc_s(s);
if(ptr) {
memset(ptr, 0, s);
} else if (s <= 16) {
CU_FAIL("ddsrt_malloc_s(<=16) returned NULL");
}
ddsrt_free(ptr);
}
}
CU_PASS("ddsrt_malloc_s");
}
CU_Test(ddsrt_heap, calloc_s)
{
for(size_t i = 0; i < nof_allocsizes_s; i++) {
for(size_t j = 0; j < nof_allocsizes_s; j++) {
size_t s = allocsizes_s[i] * allocsizes_s[j];
char *ptr = ddsrt_calloc_s(allocsizes_s[i], allocsizes_s[j]);
if(ptr) {
if(s) {
CU_ASSERT (ptr[0] == 0 && !memcmp(ptr, ptr + 1, s - 1));
}
} else if (s <= 16) {
CU_FAIL("ddsrt_calloc_s(<=16) returned NULL");
}
ddsrt_free(ptr);
}
}
CU_PASS("ddsrt_calloc_s");
}
CU_Test(ddsrt_heap, ddsrt_realloc_s)
{
char *newptr, *ptr = NULL;
size_t unchanged, s, prevs = 0;
for(size_t i = 0; i < nof_allocsizes_s; i++) {
for(size_t j = 0; j < nof_allocsizes_s; j++) {
s = allocsizes_s[i] * allocsizes_s[j];
newptr = ddsrt_realloc_s(ptr, s);
printf("%p = ddsrt_realloc_s(%p) %zu -> %zu\n", newptr, ptr, prevs, s);
if (s <= 16) {
CU_ASSERT_NEQ (newptr, NULL);
}
if(newptr){
unchanged = (prevs < s) ? prevs : s;
if(unchanged) {
CU_ASSERT (newptr[0] == 1 && !memcmp(newptr, newptr + 1, unchanged - 1));
}
memset(newptr, 1, s);
}
prevs = s;
ptr = newptr;
}
}
ddsrt_free(ptr);
CU_PASS("ddsrt_realloc_s");
}