test-object.c revision 80a6833b032bc63b4e8c3da6489d3767af1168f3
1db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod/* 2db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Copyright © 2011 Google, Inc. 3db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * 4db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * This is part of HarfBuzz, a text shaping library. 5db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * 6db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Permission is hereby granted, without written agreement and without 7db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 8db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * software and its documentation for any purpose, provided that the 9db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * above copyright notice and the following two paragraphs appear in 10db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * all copies of this software. 11db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * 12db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * DAMAGE. 17db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * 18db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * 24db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Google Author(s): Behdad Esfahbod 25db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod */ 26db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 27db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#include "hb-test.h" 28db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 29db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod/* Unit tests for hb-object-private.h */ 30db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 31db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 32db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#ifdef HAVE_FREETYPE 33db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#include <hb-ft.h> 34db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#endif 35db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 36db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 37db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 38db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob (void) 39db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 40db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod static char data[] = "test data"; 41db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_blob_create (data, sizeof (data), HB_MEMORY_MODE_READONLY, NULL, NULL); 42db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 43db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 44db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob_inert (void) 45db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 4680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod return hb_blob_create (NULL, 0, HB_MEMORY_MODE_DUPLICATE, NULL, NULL); 47db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 48db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 49db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 50db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer (void) 51db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 52db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_buffer_create (0); 53db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 54db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 55db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer_inert (void) 56db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 57db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_buffer_create (-1); 58db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 59db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 60db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 61db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face (void) 62db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 63db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_blob_t *blob = (hb_blob_t *) create_blob (); 64db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_face_t *face = hb_face_create_for_data (blob, 0); 65db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_blob_destroy (blob); 66db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return face; 67db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 68db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 69db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face_inert (void) 70db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 7180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod return hb_face_create_for_data (hb_blob_get_empty (), 0); 72db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 73db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 74db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 75db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font (void) 76db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 7772657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_face_t *face = (hb_face_t *) create_face (); 7872657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_font_t *font = hb_font_create (face); 7972657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_face_destroy (face); 8072657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod return font; 81db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 82db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 83db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_inert (void) 84db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 8580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod return hb_font_create (hb_face_get_empty ()); 86db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 87db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 88db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 89db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs (void) 90db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 91db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_font_funcs_create (); 92db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 93db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 94db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs_inert (void) 95db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 96db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#ifdef HAVE_FREETYPE 97db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_ft_get_font_funcs (); 98db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#else 99db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return NULL; 100db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#endif 101db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 102db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 103db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 104db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs (void) 105db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 106db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_unicode_funcs_create (NULL); 107db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 108db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 109db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs_inert (void) 110db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 111db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_unicode_funcs_get_default (); 112db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 113db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 114db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 115db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 116db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *(*create_func_t) (void); 117db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *(*reference_func_t) (void *obj); 118db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void (*destroy_func_t) (void *obj); 119db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*set_user_data_func_t) (void *obj, hb_user_data_key_t *key, void *data, hb_destroy_func_t destroy); 120db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void * (*get_user_data_func_t) (void *obj, hb_user_data_key_t *key); 121db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void (*make_immutable_func_t) (void *obj); 122db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*is_immutable_func_t) (void *obj); 123db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 124db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct { 125db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod create_func_t create; 126db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod create_func_t create_inert; 12780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod create_func_t get_empty; 128db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod reference_func_t reference; 129db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod destroy_func_t destroy; 130db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod set_user_data_func_t set_user_data; 131db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod get_user_data_func_t get_user_data; 132db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod make_immutable_func_t make_immutable; 133db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod is_immutable_func_t is_immutable; 134db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod const char *name; 135db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} object_t; 136db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 137db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITHOUT_IMMUTABILITY(name) \ 138db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { \ 139db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name, \ 140db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name##_inert, \ 14180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod (create_func_t) hb_##name##_get_empty, \ 142db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (reference_func_t) hb_##name##_reference, \ 143db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (destroy_func_t) hb_##name##_destroy, \ 144db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (set_user_data_func_t) hb_##name##_set_user_data, \ 145db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (get_user_data_func_t) hb_##name##_get_user_data, \ 146db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (make_immutable_func_t) NULL, \ 147db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (is_immutable_func_t) NULL, \ 148db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod #name, \ 149db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 150db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITH_IMMUTABILITY(name) \ 151db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { \ 152db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name, \ 153db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name##_inert, \ 15480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod (create_func_t) hb_##name##_get_empty, \ 155db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (reference_func_t) hb_##name##_reference, \ 156db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (destroy_func_t) hb_##name##_destroy, \ 157db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (set_user_data_func_t) hb_##name##_set_user_data, \ 158db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (get_user_data_func_t) hb_##name##_get_user_data, \ 159db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (make_immutable_func_t) hb_##name##_make_immutable, \ 160db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (is_immutable_func_t) hb_##name##_is_immutable, \ 161db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod #name, \ 162db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 163db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic const object_t objects[] = 164db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 165db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITHOUT_IMMUTABILITY (buffer), 166db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITHOUT_IMMUTABILITY (face), 1671c9f8717eb12c37c219333cbb0d123e1d2da4896Behdad Esfahbod OBJECT_WITH_IMMUTABILITY (blob), 16874f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (font), 169db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (font_funcs), 170db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (unicode_funcs) 171db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}; 172db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#undef OBJECT 173db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 174db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 175db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC0 0x12345678 176db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC1 0x76543210 177db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 178db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct { 179db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod int value; 180db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod gboolean freed; 181db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} data_t; 182db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 183db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic int global_data; 184db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 185db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void global_free_up (void *p G_GNUC_UNUSED) 186db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 187db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data++; 188db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 189db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 190db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up0 (void *p) 191db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 192db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t *data = (data_t *) p; 193db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 194db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmphex (data->value, ==, MAGIC0); 195db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data->freed); 196db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data->freed = TRUE; 197db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 198db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 199db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up1 (void *p) 200db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 201db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t *data = (data_t *) p; 202db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 203db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmphex (data->value, ==, MAGIC1); 204db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data->freed); 205db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data->freed = TRUE; 206db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 207db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 2086a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2096a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodtypedef struct { 2106a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod const object_t *klass; 2116a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod void *object; 2126a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod hb_user_data_key_t key; 2136a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod} deadlock_test_t; 2146a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2156a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodstatic void free_deadlock_test (void *p) 2166a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod{ 2176a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test_t *t = (deadlock_test_t *) p; 2186a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2196a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod g_assert (NULL == t->klass->get_user_data (t->object, &t->key)); 2206a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod} 2216a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2226a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 223db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void 224db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtest_object (void) 225db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 226db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod unsigned int i; 227db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 228db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod for (i = 0; i < G_N_ELEMENTS (objects); i++) { 229db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod const object_t *o = &objects[i]; 230db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod void *obj; 231db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_user_data_key_t key[2]; 232db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 233db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { 234db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod unsigned int i; 235db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 2366a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test_t deadlock_test; 237db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 238db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("Testing object %s", o->name); 239db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 240db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("->create()"); 241db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod obj = o->create (); 242db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj); 243db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 244db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj == o->reference (obj)); 245db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 246db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 247db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) 248db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->is_immutable (obj)); 249db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 250db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0)); 251db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[0]); 252db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 253db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) { 254db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->make_immutable (obj); 255db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->is_immutable (obj)); 256db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 257db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 258db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod /* Should still work even if object is made immutable */ 259db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[1], &data[1], free_up1)); 260db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[1]) == &data[1]); 261db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 262db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->set_user_data (obj, NULL, &data[0], free_up0)); 263db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[0]); 264db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[1], NULL)); 265db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 266db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[1]); 267db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[1].freed); 268db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 269db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data[0].freed = FALSE; 270db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0)); 271db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[0].freed); 272db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, NULL)); 273db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 274db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 275db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data[0].freed = FALSE; 276db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data = 0; 277db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0)); 278db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 0); 279db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, global_free_up)); 280db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 0); 281db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, NULL)); 282db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 1); 283db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 284db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data = 0; 285db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod for (i = 2; i < 1000; i++) 286db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[i], &data[i], global_free_up)); 287db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod for (i = 2; i < 1000; i++) 288db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[i]) == &data[i]); 289db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod for (i = 100; i < 1000; i++) 290db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->set_user_data (obj, &key[i], NULL, NULL)); 291811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod for (i = 2; i < 100; i++) 292811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod g_assert (o->get_user_data (obj, &key[i]) == &data[i]); 293811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod for (i = 100; i < 1000; i++) 294811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod g_assert (!o->get_user_data (obj, &key[i])); 295db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 900); 296db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 2976a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod /* Test set_user_data where the destroy() func calls user_data functions. 2986a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod * Make sure it doesn't deadlock or corrupt memory. */ 2996a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test.klass = o; 3006a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test.object = obj; 3016a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod g_assert (o->set_user_data (obj, &deadlock_test.key, &deadlock_test, free_deadlock_test)); 3026a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod g_assert (o->set_user_data (obj, &deadlock_test.key, NULL, NULL)); 303db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 304db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[1].freed); 305db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 306db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 307db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[1].freed); 308db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 1000-2); 309db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 310db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 311db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { 312db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 313db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 31480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_test_message ("->get_empty()"); 31580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod obj = o->get_empty (); 31680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (obj); 31780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 31880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (obj == o->reference (obj)); 31980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 32080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod if (o->is_immutable) 32280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (o->is_immutable (obj)); 32380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0)); 32580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (!o->get_user_data (obj, &key[0])); 32680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 32880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 32980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 33380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (!data[0].freed); 33480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod } 33580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 33680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod { 33780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 33880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 339db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("->create_inert()"); 340db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod obj = o->create_inert (); 341db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (!obj) 342db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod continue; 34380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod if (obj == o->get_empty ()) 34480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod continue; /* Tested already */ 345db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 346db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj == o->reference (obj)); 347db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 348db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 349db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) 350db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->is_immutable (obj)); 351db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 352db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0)); 353db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->get_user_data (obj, &key[0])); 354db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 355db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 356db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 357db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 358db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 359db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 360db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 361db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[0].freed); 362db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 363db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 364db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 365db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 366db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 367db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodint 368db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodmain (int argc, char **argv) 369db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 370db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_test_init (&argc, &argv); 371db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 372db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_test_add (test_object); 373db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 374db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_test_run (); 375db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 376