Update to version 2.33.1
[profile/ivi/glib2.git] / glib / tests / logging.c
1 #include <stdlib.h>
2 #include <glib.h>
3
4 /* Test g_warn macros */
5 static void
6 test_warnings (void)
7 {
8   if (!g_test_undefined ())
9     return;
10
11   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
12     {
13       g_warn_if_reached ();
14     }
15   g_test_trap_assert_failed();
16   g_test_trap_assert_stderr ("*WARNING*test_warnings*should not be reached*");
17
18   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
19     {
20       g_warn_if_fail (FALSE);
21     }
22   g_test_trap_assert_failed();
23   g_test_trap_assert_stderr ("*WARNING*test_warnings*runtime check failed*");
24 }
25
26 static guint log_count = 0;
27
28 static void
29 log_handler (const gchar    *log_domain,
30              GLogLevelFlags  log_level,
31              const gchar    *message,
32              gpointer        user_data)
33 {
34   g_assert_cmpstr (log_domain, ==, "bu");
35   g_assert_cmpint (log_level, ==, G_LOG_LEVEL_INFO);
36
37   log_count++;
38 }
39
40 /* test that custom log handlers only get called for
41  * their domain and level
42  */
43 static void
44 test_set_handler (void)
45 {
46   guint id;
47
48   id = g_log_set_handler ("bu", G_LOG_LEVEL_INFO, log_handler, NULL);
49
50   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
51     {
52       g_log ("bu", G_LOG_LEVEL_DEBUG, "message");
53       g_log ("ba", G_LOG_LEVEL_DEBUG, "message");
54       g_log ("bu", G_LOG_LEVEL_INFO, "message");
55       g_log ("ba", G_LOG_LEVEL_INFO, "message");
56
57       g_assert_cmpint (log_count, ==, 1);
58       exit (0);
59     }
60   g_test_trap_assert_passed ();
61
62   g_log_remove_handler ("bu", id);
63 }
64
65 static void
66 test_default_handler (void)
67 {
68   if (g_test_undefined ())
69     {
70       if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
71         {
72           g_error ("message1");
73           exit (0);
74         }
75       g_test_trap_assert_failed ();
76       g_test_trap_assert_stderr ("*ERROR*message1*");
77
78       if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
79         {
80           g_critical ("message2");
81           exit (0);
82         }
83       g_test_trap_assert_failed ();
84       g_test_trap_assert_stderr ("*CRITICAL*message2*");
85
86       if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
87         {
88           g_warning ("message3");
89           exit (0);
90         }
91       g_test_trap_assert_failed ();
92       g_test_trap_assert_stderr ("*WARNING*message3*");
93     }
94
95   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
96     {
97       g_message ("message4");
98       exit (0);
99     }
100   g_test_trap_assert_passed ();
101   g_test_trap_assert_stderr ("*Message*message4*");
102
103   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
104     {
105       g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "message5");
106       exit (0);
107     }
108   g_test_trap_assert_passed ();
109   g_test_trap_assert_stdout_unmatched ("*INFO*message5*");
110
111   g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE);
112   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
113     {
114       g_log ("bar", G_LOG_LEVEL_INFO, "message5");
115       exit (0);
116     }
117   g_test_trap_assert_passed ();
118   g_test_trap_assert_stdout ("*INFO*message5*");
119
120   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
121     {
122       g_log ("baz", G_LOG_LEVEL_DEBUG, "message6");
123       exit (0);
124     }
125   g_test_trap_assert_passed ();
126   g_test_trap_assert_stdout ("*DEBUG*message6*");
127
128   g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
129   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
130     {
131       g_log ("foo", G_LOG_LEVEL_DEBUG, "6");
132       g_log ("bar", G_LOG_LEVEL_DEBUG, "6");
133       g_log ("baz", G_LOG_LEVEL_DEBUG, "6");
134       exit (0);
135     }
136   g_test_trap_assert_passed ();
137   g_test_trap_assert_stdout ("*DEBUG*6*6*6*");
138
139   g_unsetenv ("G_MESSAGES_DEBUG");
140   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
141     {
142       g_log (G_LOG_DOMAIN, 1<<10, "message7");
143       exit (0);
144     }
145   g_test_trap_assert_passed ();
146   g_test_trap_assert_stdout ("*LOG-0x400*message7*");
147 }
148
149 /* test that setting levels as fatal works */
150 static void
151 test_fatal_log_mask (void)
152 {
153   GLogLevelFlags flags;
154
155   if (!g_test_undefined ())
156     return;
157
158   flags = g_log_set_fatal_mask ("bu", G_LOG_LEVEL_INFO);
159   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT))
160     g_log ("bu", G_LOG_LEVEL_INFO, "fatal");
161   g_test_trap_assert_failed ();
162   g_log_set_fatal_mask ("bu", flags);
163 }
164
165 static gint my_print_count = 0;
166 static void
167 my_print_handler (const gchar *text)
168 {
169   my_print_count++;
170 }
171
172 static void
173 test_print_handler (void)
174 {
175   GPrintFunc old_print_handler;
176
177   old_print_handler = g_set_print_handler (my_print_handler);
178   g_assert (old_print_handler == NULL);
179
180   my_print_count = 0;
181   g_print ("bu ba");
182   g_assert_cmpint (my_print_count, ==, 1);
183
184   g_set_print_handler (NULL);
185 }
186
187 static void
188 test_printerr_handler (void)
189 {
190   GPrintFunc old_printerr_handler;
191
192   old_printerr_handler = g_set_printerr_handler (my_print_handler);
193   g_assert (old_printerr_handler == NULL);
194
195   my_print_count = 0;
196   g_printerr ("bu ba");
197   g_assert_cmpint (my_print_count, ==, 1);
198
199   g_set_printerr_handler (NULL);
200 }
201
202 static char *fail_str = "foo";
203 static char *log_str = "bar";
204
205 static gboolean
206 good_failure_handler (const gchar    *log_domain,
207                       GLogLevelFlags  log_level,
208                       const gchar    *msg,
209                       gpointer        user_data)
210 {
211   g_test_message ("The Good Fail Message Handler\n");
212   g_assert ((char *)user_data != log_str);
213   g_assert ((char *)user_data == fail_str);
214
215   return FALSE;
216 }
217
218 static gboolean
219 bad_failure_handler (const gchar    *log_domain,
220                      GLogLevelFlags  log_level,
221                      const gchar    *msg,
222                      gpointer        user_data)
223 {
224   g_test_message ("The Bad Fail Message Handler\n");
225   g_assert ((char *)user_data == log_str);
226   g_assert ((char *)user_data != fail_str);
227
228   return FALSE;
229 }
230
231 static void
232 test_handler (const gchar    *log_domain,
233               GLogLevelFlags  log_level,
234               const gchar    *msg,
235               gpointer        user_data)
236 {
237   g_test_message ("The Log Message Handler\n");
238   g_assert ((char *)user_data != fail_str);
239   g_assert ((char *)user_data == log_str);
240 }
241
242 static void
243 bug653052 (void)
244 {
245   if (!g_test_undefined ())
246     return;
247
248   g_test_bug ("653052");
249
250   g_test_log_set_fatal_handler (good_failure_handler, fail_str);
251   g_log_set_default_handler (test_handler, log_str);
252
253   g_return_if_fail (0);
254
255   g_test_log_set_fatal_handler (bad_failure_handler, fail_str);
256   g_log_set_default_handler (test_handler, log_str);
257
258   g_return_if_fail (0);
259 }
260
261 int
262 main (int argc, char *argv[])
263 {
264   g_unsetenv ("G_MESSAGES_DEBUG");
265
266   g_test_init (&argc, &argv, NULL);
267   g_test_bug_base ("http://bugzilla.gnome.org/");
268
269   g_test_add_func ("/logging/default-handler", test_default_handler);
270   g_test_add_func ("/logging/warnings", test_warnings);
271   g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask);
272   g_test_add_func ("/logging/set-handler", test_set_handler);
273   g_test_add_func ("/logging/print-handler", test_print_handler);
274   g_test_add_func ("/logging/printerr-handler", test_printerr_handler);
275   g_test_add_func ("/logging/653052", bug653052);
276
277   return g_test_run ();
278 }
279