test-mempool-alloconly.c revision 010341a450f29ea6b514c130ab75826fd9477ff1
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* Copyright (c) 2007-2016 Dovecot authors, see the included COPYING file */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#include "test-lib.h"
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncstatic bool mem_has_bytes(const void *mem, size_t size, uint8_t b)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync{
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync const uint8_t *bytes = mem;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync unsigned int i;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync for (i = 0; i < size; i++) {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync if (bytes[i] != b)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FALSE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync }
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return TRUE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync}
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncvoid test_mempool_alloconly(void)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync{
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define PMALLOC_MAX_COUNT 128
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync pool_t pool;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync unsigned int i, j, k;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync void *mem[PMALLOC_MAX_COUNT + 1];
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_begin("mempool_alloconly");
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync for (i = 0; i < 64; i++) {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync for (j = 1; j <= 128; j++) {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync pool = pool_alloconly_create(MEMPOOL_GROWING"test", i);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync mem[0] = p_malloc(pool, j);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync memset(mem[0], j, j);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync for (k = 1; k <= PMALLOC_MAX_COUNT; k++) {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync mem[k] = p_malloc(pool, k);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync memset(mem[k], k, k);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync }
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_assert(mem_has_bytes(mem[0], j, j));
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync for (k = 1; k <= PMALLOC_MAX_COUNT; k++)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_assert(mem_has_bytes(mem[k], k, k));
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync pool_unref(&pool);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync }
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync }
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_end();
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync}
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncenum fatal_test_state fatal_mempool(int stage)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync{
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync static pool_t pool;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync switch(stage) {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync case 0: /* forbidden size */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_begin("fatal_mempool");
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync pool = pool_alloconly_create(MEMPOOL_GROWING"fatal", 1);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync (void)p_malloc(pool, 0);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FATAL_TEST_FAILURE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync case 1: /* logically impossible size */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync (void)p_malloc(pool, SSIZE_T_MAX + 1ULL);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FATAL_TEST_FAILURE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync case 2: /* physically impossible size */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync (void)p_malloc(pool, SSIZE_T_MAX - (size_t)MEM_ALIGN(1));
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FATAL_TEST_FAILURE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync /* Continue with other tests as follows:
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync case 3:
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync something_fatal();
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FATAL_TEST_FAILURE;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync }
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync /* Either our tests have finished, or the test suite has got confused. */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync pool_unref(&pool);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync test_end();
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync return FATAL_TEST_FINISHED;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync}
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync