LCOV - code coverage report
Current view: top level - test - suite_oomstub.c (source / functions) Hit Total Coverage
Test: liboom.info Lines: 208 208 100.0 %
Date: 2024-12-21 19:58:28 Functions: 11 11 100.0 %

          Line data    Source code
       1             : /**  \file  suite_oomstub.c
       2             :  *  \brief  Unit testing for malloc/free/realloc stubs
       3             :  * \author  François Cerbelle (Fanfan), francois@cerbelle.net
       4             :  *
       5             :  * \internal
       6             :  *       Created:  07/07/2024
       7             :  *      Revision:  none
       8             :  * Last modified:  2024-12-11 15:55
       9             :  *      Compiler:  gcc
      10             :  *  Organization:  Cerbelle.net
      11             :  *     Copyright:  Copyright (c) 2024, François Cerbelle
      12             :  *
      13             :  *  This source code is released for free distribution under the terms of the
      14             :  *  GNU General Public License as published by the Free Software Foundation.
      15             :  */
      16             : 
      17             : #ifdef HAVE_CONFIG_H
      18             : #include "config.h"
      19             : #endif
      20             : 
      21             : #include "liboom/oomstub.h"                        /* OOM simulation */
      22             : #include "checktools.inc"
      23             : #include <check.h>
      24             : #include <stdlib.h>                             /* abort() */
      25             : 
      26           3 : START_TEST(oomstub_malloc) {
      27           3 :     char* a=NULL;
      28             :     int d1,d2;
      29             : 
      30           3 :     oomstub_setcountdown(0);
      31           3 :     d1 = oomstub_getcountdown();
      32           3 :     a = malloc(1);
      33           3 :     d2 = oomstub_getcountdown();
      34           3 :     oomstub_setcountdown(0);
      35           3 :     ck_assert(0==d1);
      36           3 :     ck_assert(0==d2);
      37           3 :     ck_assert(NULL!=a);
      38           3 :     free(a);
      39             : 
      40           3 :     oomstub_setcountdown(1);
      41           3 :     d1 = oomstub_getcountdown();
      42           3 :     a = malloc(1);
      43           3 :     d2 = oomstub_getcountdown();
      44           3 :     oomstub_setcountdown(0);
      45           3 :     ck_assert(1==d1);
      46           3 :     ck_assert(0==d2);
      47           3 :     ck_assert(NULL==a);
      48             : 
      49           3 :     oomstub_setcountdown(2);
      50           3 :     d1 = oomstub_getcountdown();
      51           3 :     a = malloc(1); /* cppcheck-suppress memleak */
      52           3 :     d2 = oomstub_getcountdown();
      53           3 :     oomstub_setcountdown(0);
      54           3 :     ck_assert(2==d1);
      55           3 :     ck_assert(1==d2);
      56           3 :     ck_assert(NULL!=a);
      57           3 :     free(a);
      58           3 : }
      59             : END_TEST
      60             : 
      61           3 : START_TEST(oomstub_calloc) {
      62           3 :     char* a=NULL;
      63             :     int d1,d2;
      64             : 
      65           3 :     oomstub_setcountdown(0);
      66           3 :     d1 = oomstub_getcountdown();
      67           3 :     a = calloc(5,2);
      68           3 :     d2 = oomstub_getcountdown();
      69           3 :     oomstub_setcountdown(0);
      70           3 :     ck_assert(0==d1);
      71           3 :     ck_assert(0==d2);
      72           3 :     ck_assert(NULL!=a);
      73           3 :     free(a);
      74             : 
      75           3 :     oomstub_setcountdown(1);
      76           3 :     d1 = oomstub_getcountdown();
      77           3 :     a = calloc(5,2);
      78           3 :     d2 = oomstub_getcountdown();
      79           3 :     oomstub_setcountdown(0);
      80           3 :     ck_assert(1==d1);
      81           3 :     ck_assert(0==d2);
      82           3 :     ck_assert(NULL==a);
      83             : 
      84           3 :     oomstub_setcountdown(2);
      85           3 :     d1 = oomstub_getcountdown();
      86           3 :     a = calloc(5,2); /* cppcheck-suppress memleak */
      87           3 :     d2 = oomstub_getcountdown();
      88           3 :     oomstub_setcountdown(0);
      89           3 :     ck_assert(2==d1);
      90           3 :     ck_assert(1==d2);
      91           3 :     ck_assert(NULL!=a);
      92           3 :     free(a);
      93           3 : }
      94             : END_TEST
      95             : 
      96             : /* Using NULL as a pointer to reallocate means malloc behavior */
      97           3 : START_TEST(oomstub_realloc_malloc) {
      98             :     void* newptr;
      99             :     int d1,d2;
     100             : 
     101           3 :     oomstub_setcountdown(0); /* No failure */
     102           3 :     d1 = oomstub_getcountdown();
     103           3 :     newptr = realloc(NULL,1);
     104           3 :     d2 = oomstub_getcountdown();
     105           3 :     oomstub_setcountdown(0);
     106           3 :     ck_assert(0==d1);
     107           3 :     ck_assert(0==d2);
     108           3 :     ck_assert(NULL!=newptr);
     109           3 :     free(newptr);
     110             : 
     111           3 :     oomstub_setcountdown(1); /* Immediate failure */
     112           3 :     d1 = oomstub_getcountdown();
     113           3 :     newptr = realloc(NULL,1);
     114           3 :     d2 = oomstub_getcountdown();
     115           3 :     oomstub_setcountdown(0);
     116           3 :     ck_assert(1==d1);
     117           3 :     ck_assert(0==d2);
     118           3 :     ck_assert(NULL==newptr);
     119             : 
     120           3 :     oomstub_setcountdown(2); /* Success first before failure */
     121           3 :     d1 = oomstub_getcountdown();
     122           3 :     newptr = realloc(NULL,1); /* cppcheck-suppress memleak */
     123           3 :     d2 = oomstub_getcountdown();
     124           3 :     oomstub_setcountdown(0);
     125           3 :     ck_assert(2==d1);
     126           3 :     ck_assert(1==d2);
     127           3 :     ck_assert(NULL!=newptr);
     128           3 :     free(newptr);
     129           3 : }
     130             : END_TEST
     131             : 
     132             : /* Using 0 as a size to reallocate means free behavior */
     133           3 : START_TEST(oomstub_realloc_free) {
     134             :     void* oldptr;
     135             :     void* newptr;
     136             :     int d1,d2;
     137             : 
     138           3 :     oldptr = malloc(1);
     139           3 :     oomstub_setcountdown(0); /* No failure */
     140           3 :     d1 = oomstub_getcountdown();
     141           3 :     newptr = realloc(oldptr,0);
     142           3 :     d2 = oomstub_getcountdown();
     143           3 :     oomstub_setcountdown(0);
     144           3 :     ck_assert(0==d1);
     145           3 :     ck_assert(0==d2);
     146           3 :     ck_assert(NULL==newptr);
     147           3 :     free(newptr);
     148             : 
     149           3 :     oldptr = malloc(1);
     150           3 :     oomstub_setcountdown(1); /* Immediate failure */
     151           3 :     d1 = oomstub_getcountdown();
     152           3 :     newptr = realloc(oldptr,0);
     153           3 :     d2 = oomstub_getcountdown();
     154           3 :     oomstub_setcountdown(0);
     155           3 :     ck_assert(1==d1);
     156           3 :     ck_assert(0==d2);
     157           3 :     ck_assert(NULL!=newptr);
     158           3 :     free(newptr); /* Not actually freed because of simulated failure */
     159             : 
     160           3 :     oldptr = malloc(1);
     161           3 :     oomstub_setcountdown(2); /* Success first before failure */
     162           3 :     d1 = oomstub_getcountdown();
     163           3 :     newptr = realloc(oldptr,0);
     164           3 :     d2 = oomstub_getcountdown();
     165           3 :     oomstub_setcountdown(0);
     166           3 :     ck_assert(2==d1);
     167           3 :     ck_assert(1==d2);
     168           3 :     ck_assert(NULL==newptr);
     169           3 :     free(newptr);
     170           3 : }
     171             : END_TEST
     172             : 
     173           3 : START_TEST(oomstub_realloc_downsize) {
     174             :     void* oldptr;
     175             :     void* newptr;
     176             :     int d1,d2;
     177             : 
     178           3 :     oldptr = malloc(1000);
     179           3 :     oomstub_setcountdown(0); /* No failure */
     180           3 :     d1 = oomstub_getcountdown();
     181           3 :     newptr = realloc(oldptr,10);
     182           3 :     d2 = oomstub_getcountdown();
     183           3 :     oomstub_setcountdown(0);
     184           3 :     ck_assert(0==d1);
     185           3 :     ck_assert(0==d2);
     186           3 :     ck_assert(NULL!=newptr);
     187           3 :     free(newptr);
     188             : 
     189           3 :     oldptr = malloc(1000);
     190           3 :     oomstub_setcountdown(1); /* Immediate failure */
     191           3 :     d1 = oomstub_getcountdown();
     192           3 :     newptr = realloc(oldptr,10);
     193           3 :     d2 = oomstub_getcountdown();
     194           3 :     oomstub_setcountdown(0);
     195           3 :     ck_assert(1==d1);
     196           3 :     ck_assert(0==d2);
     197           3 :     ck_assert(NULL==newptr);
     198           3 :     free(oldptr); /* cppcheck-suppress doubleFree */
     199             : 
     200           3 :     oldptr = malloc(1000);
     201           3 :     oomstub_setcountdown(2); /* Success first before failure */
     202           3 :     d1 = oomstub_getcountdown();
     203           3 :     newptr = realloc(oldptr,10); /* cppcheck-suppress memleak */
     204           3 :     d2 = oomstub_getcountdown();
     205           3 :     oomstub_setcountdown(0);
     206           3 :     ck_assert(2==d1);
     207           3 :     ck_assert(1==d2);
     208           3 :     ck_assert(NULL!=newptr);
     209           3 :     free(newptr);
     210           3 : }
     211             : END_TEST
     212             : 
     213           3 : START_TEST(oomstub_realloc_upsize) {
     214             :     void* oldptr;
     215             :     void* newptr;
     216             :     int d1,d2;
     217             : 
     218           3 :     oldptr = malloc(1000);
     219           3 :     oomstub_setcountdown(0); /* No failure */
     220           3 :     d1 = oomstub_getcountdown();
     221           3 :     newptr = realloc(oldptr,2000);
     222           3 :     d2 = oomstub_getcountdown();
     223           3 :     oomstub_setcountdown(0);
     224           3 :     ck_assert(0==d1);
     225           3 :     ck_assert(0==d2);
     226           3 :     ck_assert(NULL!=newptr);
     227           3 :     free(newptr);
     228             : 
     229           3 :     oldptr = malloc(1000);
     230           3 :     oomstub_setcountdown(1); /* Immediate failure */
     231           3 :     d1 = oomstub_getcountdown();
     232           3 :     newptr = realloc(oldptr,2000);
     233           3 :     d2 = oomstub_getcountdown();
     234           3 :     oomstub_setcountdown(0);
     235           3 :     ck_assert(1==d1);
     236           3 :     ck_assert(0==d2);
     237           3 :     ck_assert(NULL==newptr);
     238           3 :     free(oldptr); /* cppcheck-suppress doubleFree */
     239             : 
     240           3 :     oldptr = malloc(1000);
     241           3 :     oomstub_setcountdown(2); /* Success first before failure */
     242           3 :     d1 = oomstub_getcountdown();
     243           3 :     newptr = realloc(oldptr,2000); /* cppcheck-suppress memleak */
     244           3 :     d2 = oomstub_getcountdown();
     245           3 :     oomstub_setcountdown(0);
     246           3 :     ck_assert(2==d1);
     247           3 :     ck_assert(1==d2);
     248           3 :     ck_assert(NULL!=newptr);
     249           3 :     free(newptr);
     250           3 : }
     251             : END_TEST
     252             : 
     253             : /************************************************************************/
     254             : /* Begining of test (potentially in child) */
     255          18 : void oomstub_checked_uninitialized_setup() {
     256          18 :     signals_catch();
     257          18 :     forktest_gprofdir();
     258          18 : }
     259             : 
     260             : /* End of test (potentially in child) */
     261          18 : void oomstub_checked_uninitialized_teardown() {
     262          18 :     signals_release();
     263          18 : }
     264             : /************************************************************************/
     265             : /* Begining of test case */
     266          15 : void oomstub_unchecked_setup() {
     267          15 :     forktest_init();
     268          15 : }
     269             : /* End of testcase */
     270           3 : void oomstub_unchecked_teardown() {
     271           3 : }
     272             : /************************************************************************/
     273         367 : Suite* oomstub_suite() {
     274             :     Suite *s;
     275             :     TCase *tc;
     276             : 
     277         367 :     s = suite_create("OOMStub");
     278             : 
     279         367 :     tc = tcase_create("Uninitialized");
     280         367 :     tcase_set_tags(tc,"oom");
     281             :     /* tcase_set_timeout(tc,5); */ /* seconds */
     282         367 :     tcase_add_checked_fixture(tc, oomstub_checked_uninitialized_setup, oomstub_checked_uninitialized_teardown);
     283         367 :     tcase_add_unchecked_fixture(tc, oomstub_unchecked_setup, oomstub_unchecked_teardown);
     284         367 :     suite_add_tcase(s, tc);
     285             : 
     286         367 :     tcase_add_test(tc, oomstub_malloc);
     287         367 :     tcase_add_test(tc, oomstub_calloc);
     288         367 :     tcase_add_test(tc, oomstub_realloc_malloc);
     289         367 :     tcase_add_test(tc, oomstub_realloc_free);
     290         367 :     tcase_add_test(tc, oomstub_realloc_downsize);
     291         367 :     tcase_add_test(tc, oomstub_realloc_upsize);
     292         367 :     return s;
     293             : }
     294             : /* vim: set tw=80: */

Generated by: LCOV version 1.16