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