/* Unit tests for g_malloc * Copyright (C) 2013 Red Hat, Inc. * * This work is provided "as is"; redistribution and modification * in whole or in part, in any medium, physical or electronic is * permitted without restriction. * * This work is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * In no event shall the authors or contributors be liable for any * direct, indirect, incidental, special, exemplary, or consequential * damages (including, but not limited to, procurement of substitute * goods or services; loss of use, data, or profits; or business * interruption) however caused and on any theory of liability, whether * in contract, strict liability, or tort (including negligence or * otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * * Author: Matthias Clasen */ #include "glib.h" #include static void test_profiler (void) { if (g_test_subprocess ()) { gpointer p; g_mem_set_vtable (glib_mem_profiler_table); p = g_malloc (100); p = g_realloc (p, 200); g_free (p); p = g_malloc0 (1000); g_free (p); p = g_try_malloc (2000); p = g_try_realloc (p, 3000); g_free (p); p = g_malloc (0); p = g_malloc0 (0); p = g_realloc (NULL, 0); p = g_try_malloc (0); p = g_try_realloc (NULL, 0); g_mem_profile (); exit (0); } g_test_trap_subprocess (NULL, 0, 0); g_test_trap_assert_passed (); g_test_trap_assert_stdout ("*GLib Memory statistics*"); } static void test_fallback_calloc (void) { if (g_test_subprocess ()) { GMemVTable vtable = { malloc, realloc, free, NULL, NULL, NULL }; gpointer p; g_mem_set_vtable (&vtable); p = g_malloc0 (1000); g_free (p); exit (0); } g_test_trap_subprocess (NULL, 0, 0); g_test_trap_assert_passed (); } static void test_incomplete_vtable (void) { if (g_test_subprocess ()) { GMemVTable vtable = { malloc, realloc, NULL, NULL, NULL, NULL }; gpointer p; g_mem_set_vtable (&vtable); p = g_malloc0 (1000); g_free (p); exit (0); } g_test_trap_subprocess (NULL, 0, 0); g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*lacks one of*"); } static void test_double_vtable (void) { if (g_test_subprocess ()) { GMemVTable vtable = { malloc, realloc, free, NULL, NULL, NULL }; g_mem_set_vtable (&vtable); g_mem_set_vtable (&vtable); exit (0); } g_test_trap_subprocess (NULL, 0, 0); g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*can only be set once*"); } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_add_func ("/malloc/incomplete-vtable", test_incomplete_vtable); g_test_add_func ("/malloc/double-vtable", test_double_vtable); g_test_add_func ("/malloc/fallback-calloc", test_fallback_calloc); g_test_add_func ("/malloc/profiler", test_profiler); return g_test_run (); }