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 Esfahbodstatic void * 33db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob (void) 34db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 35db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod static char data[] = "test data"; 36db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_blob_create (data, sizeof (data), HB_MEMORY_MODE_READONLY, NULL, NULL); 37db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 38db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 39db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob_inert (void) 40db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 4180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod return hb_blob_create (NULL, 0, HB_MEMORY_MODE_DUPLICATE, NULL, NULL); 42db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 43db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 44db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 45db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer (void) 46db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 47e6c09cdf43201ff1b7f38e411ae1f9977e4f9271Behdad Esfahbod return hb_buffer_create (); 48db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 49db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 50db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer_inert (void) 51db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 52e6c09cdf43201ff1b7f38e411ae1f9977e4f9271Behdad Esfahbod return NULL; 53db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 54db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 55db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 56b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbodcreate_set (void) 57b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod{ 58b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod return hb_set_create (); 59b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod} 60b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbodstatic void * 61b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbodcreate_set_inert (void) 62b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod{ 63b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod return NULL; 64b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod} 65b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod 66b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbodstatic void * 67db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face (void) 68db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 69db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_blob_t *blob = (hb_blob_t *) create_blob (); 709a14688e40e926b9453fcb75891f27bff1e45c49Behdad Esfahbod hb_face_t *face = hb_face_create (blob, 0); 71db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_blob_destroy (blob); 72db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return face; 73db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 74db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 75db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face_inert (void) 76db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 779a14688e40e926b9453fcb75891f27bff1e45c49Behdad Esfahbod return hb_face_create (hb_blob_get_empty (), 0); 78db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 79db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 80db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 81db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font (void) 82db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 8372657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_face_t *face = (hb_face_t *) create_face (); 8472657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_font_t *font = hb_font_create (face); 8572657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_face_destroy (face); 8672657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod return font; 87db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 88db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 89db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_inert (void) 90db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 9180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod return hb_font_create (hb_face_get_empty ()); 92db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 93db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 94db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 95db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs (void) 96db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 97db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_font_funcs_create (); 98db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 99db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 100db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs_inert (void) 101db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 102db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return NULL; 103db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 104db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 105db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 106db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs (void) 107db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 108db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_unicode_funcs_create (NULL); 109db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 110db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void * 111db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs_inert (void) 112db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 113db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_unicode_funcs_get_default (); 114db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 115db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 116db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 117db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 118db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *(*create_func_t) (void); 119db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *(*reference_func_t) (void *obj); 120db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void (*destroy_func_t) (void *obj); 12133ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbodtypedef hb_bool_t (*set_user_data_func_t) (void *obj, hb_user_data_key_t *key, void *data, hb_destroy_func_t destroy, hb_bool_t replace); 122db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void * (*get_user_data_func_t) (void *obj, hb_user_data_key_t *key); 123db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void (*make_immutable_func_t) (void *obj); 124db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*is_immutable_func_t) (void *obj); 125db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 126db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct { 127db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod create_func_t create; 128db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod create_func_t create_inert; 12980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod create_func_t get_empty; 130db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod reference_func_t reference; 131db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod destroy_func_t destroy; 132db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod set_user_data_func_t set_user_data; 133db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod get_user_data_func_t get_user_data; 134db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod make_immutable_func_t make_immutable; 135db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod is_immutable_func_t is_immutable; 136db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod const char *name; 137db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} object_t; 138db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 139db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITHOUT_IMMUTABILITY(name) \ 140db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { \ 141db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name, \ 142db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name##_inert, \ 14380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod (create_func_t) hb_##name##_get_empty, \ 144db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (reference_func_t) hb_##name##_reference, \ 145db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (destroy_func_t) hb_##name##_destroy, \ 146db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (set_user_data_func_t) hb_##name##_set_user_data, \ 147db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (get_user_data_func_t) hb_##name##_get_user_data, \ 148db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (make_immutable_func_t) NULL, \ 149db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (is_immutable_func_t) NULL, \ 150db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod #name, \ 151db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 152db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITH_IMMUTABILITY(name) \ 153db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { \ 154db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name, \ 155db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (create_func_t) create_##name##_inert, \ 15680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod (create_func_t) hb_##name##_get_empty, \ 157db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (reference_func_t) hb_##name##_reference, \ 158db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (destroy_func_t) hb_##name##_destroy, \ 159db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (set_user_data_func_t) hb_##name##_set_user_data, \ 160db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (get_user_data_func_t) hb_##name##_get_user_data, \ 161db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (make_immutable_func_t) hb_##name##_make_immutable, \ 162db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod (is_immutable_func_t) hb_##name##_is_immutable, \ 163db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod #name, \ 164db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 165db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic const object_t objects[] = 166db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 167db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITHOUT_IMMUTABILITY (buffer), 168b9d28f696c433b94c5ffbad8d7c87cf3acff4056Behdad Esfahbod OBJECT_WITHOUT_IMMUTABILITY (set), 1691c9f8717eb12c37c219333cbb0d123e1d2da4896Behdad Esfahbod OBJECT_WITH_IMMUTABILITY (blob), 1707fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (face), 17174f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (font), 172db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (font_funcs), 173db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod OBJECT_WITH_IMMUTABILITY (unicode_funcs) 174db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}; 175db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#undef OBJECT 176db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 177db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 178db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC0 0x12345678 179db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC1 0x76543210 180db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 181db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct { 182db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod int value; 183db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod gboolean freed; 184db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} data_t; 185db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 186db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic int global_data; 187db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 188db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void global_free_up (void *p G_GNUC_UNUSED) 189db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 190db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data++; 191db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 192db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 193db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up0 (void *p) 194db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 195db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t *data = (data_t *) p; 196db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 197db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmphex (data->value, ==, MAGIC0); 198db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data->freed); 199db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data->freed = TRUE; 200db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 201db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 202db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up1 (void *p) 203db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 204db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t *data = (data_t *) p; 205db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 206db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmphex (data->value, ==, MAGIC1); 207db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data->freed); 208db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data->freed = TRUE; 209db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 210db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 2116a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2126a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodtypedef struct { 2136a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod const object_t *klass; 2146a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod void *object; 2156a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod hb_user_data_key_t key; 2166a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod} deadlock_test_t; 2176a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2186a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodstatic void free_deadlock_test (void *p) 2196a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod{ 2206a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test_t *t = (deadlock_test_t *) p; 2216a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2226a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod g_assert (NULL == t->klass->get_user_data (t->object, &t->key)); 2236a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod} 2246a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 2256a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod 226db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void 227db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtest_object (void) 228db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 229db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod unsigned int i; 230db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 231db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod for (i = 0; i < G_N_ELEMENTS (objects); i++) { 232db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod const object_t *o = &objects[i]; 233db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod void *obj; 234c8d4f8b0fe56ce909e3ca07f8a30cb4fb940868bBehdad Esfahbod hb_user_data_key_t key[1001]; 235db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 236db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { 23731f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod unsigned int j; 238db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 2396a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test_t deadlock_test; 240db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 241db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("Testing object %s", o->name); 242db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 243db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("->create()"); 244db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod obj = o->create (); 245db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj); 246db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 247db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj == o->reference (obj)); 248db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 249db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 250db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) 251db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->is_immutable (obj)); 252db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 25333ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0, TRUE)); 254db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[0]); 255db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 256db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) { 257db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->make_immutable (obj); 258db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->is_immutable (obj)); 259db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 260db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 261db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod /* Should still work even if object is made immutable */ 26233ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[1], &data[1], free_up1, TRUE)); 263db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[1]) == &data[1]); 264db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 26533ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (!o->set_user_data (obj, NULL, &data[0], free_up0, TRUE)); 266db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[0]); 26733ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[1], NULL, TRUE)); 268db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 269db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->get_user_data (obj, &key[0]) == &data[1]); 270db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[1].freed); 271db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 272db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data[0].freed = FALSE; 27333ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0, TRUE)); 274db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[0].freed); 27533ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, NULL, TRUE)); 276db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 277db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 278db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data[0].freed = FALSE; 279db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data = 0; 28033ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0, TRUE)); 28133ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0, FALSE)); 282db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 0); 28333ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, global_free_up, TRUE)); 284db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 0); 28533ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[0], NULL, NULL, TRUE)); 286db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 1); 287db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 288db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod global_data = 0; 28931f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod for (j = 2; j < 1000; j++) 29033ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[j], &data[j], global_free_up, TRUE)); 29131f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod for (j = 2; j < 1000; j++) 29231f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod g_assert (o->get_user_data (obj, &key[j]) == &data[j]); 29331f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod for (j = 100; j < 1000; j++) 29433ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &key[j], NULL, NULL, TRUE)); 29531f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod for (j = 2; j < 100; j++) 29631f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod g_assert (o->get_user_data (obj, &key[j]) == &data[j]); 29731f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod for (j = 100; j < 1000; j++) 29831f18abecb149f8888a72510f2660328dd6de16dBehdad Esfahbod g_assert (!o->get_user_data (obj, &key[j])); 299db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 900); 300db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 3016a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod /* Test set_user_data where the destroy() func calls user_data functions. 3026a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod * Make sure it doesn't deadlock or corrupt memory. */ 3036a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test.klass = o; 3046a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod deadlock_test.object = obj; 30533ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &deadlock_test.key, &deadlock_test, free_deadlock_test, TRUE)); 30633ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (o->set_user_data (obj, &deadlock_test.key, NULL, NULL, TRUE)); 307db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 308db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[1].freed); 309db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 310db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[0].freed); 311db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (data[1].freed); 312db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert_cmpuint (global_data, ==, 1000-2); 313db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 314db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 315db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod { 316db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 317db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 31880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_test_message ("->get_empty()"); 31980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod obj = o->get_empty (); 32080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (obj); 32180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (obj == o->reference (obj)); 32380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 32480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod if (o->is_immutable) 32680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (o->is_immutable (obj)); 32780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 32833ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0, TRUE)); 32980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (!o->get_user_data (obj, &key[0])); 33080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 33180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod o->destroy (obj); 33680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 33780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod g_assert (!data[0].freed); 33880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod } 33980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 34080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod { 34180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; 34280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod 343db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_test_message ("->create_inert()"); 344db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod obj = o->create_inert (); 345db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (!obj) 346db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod continue; 34780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod if (obj == o->get_empty ()) 34880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod continue; /* Tested already */ 349db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 350db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (obj == o->reference (obj)); 351db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 352db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 353db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod if (o->is_immutable) 354db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (o->is_immutable (obj)); 355db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 35633ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0, TRUE)); 357db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!o->get_user_data (obj, &key[0])); 358db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 359db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 360db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 361db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 362db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 363db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod o->destroy (obj); 364db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 365db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod g_assert (!data[0].freed); 366db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 367db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod } 368db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 369db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 370db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 371db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodint 372db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodmain (int argc, char **argv) 373db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{ 374db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_test_init (&argc, &argv); 375db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 376db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod hb_test_add (test_object); 377db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod 378db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod return hb_test_run (); 379db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} 380