Use g_usleep() for portability, bug #644465
[platform/upstream/glib.git] / glib / tests / timeout.c
1 #include <glib.h>
2 #include <unistd.h>
3
4 static GMainLoop *loop;
5
6 static gboolean
7 stop_waiting (gpointer data)
8 {
9   g_main_loop_quit (loop);
10
11   return FALSE;
12 }
13
14 static gboolean
15 function (gpointer data)
16 {
17   g_assert_not_reached ();
18 }
19
20 static void
21 test_seconds (void)
22 {
23   /* Bug 642052 mentions that g_timeout_add_seconds(21475) schedules a
24    * job that runs once per second.
25    *
26    * Test that that isn't true anymore by scheduling two jobs:
27    *   - one, as above
28    *   - another that runs in 2100ms
29    *
30    * If everything is working properly, the 2100ms one should run first
31    * (and exit the mainloop).  If we ever see the 21475 second job run
32    * then we have trouble (since it ran in less than 2 seconds).
33    *
34    * We need a timeout of at least 2 seconds because
35    * g_timeout_add_second can add as much as an additional second of
36    * latency.
37    */
38   loop = g_main_loop_new (NULL, FALSE);
39
40   g_timeout_add (2100, stop_waiting, NULL);
41   g_timeout_add_seconds (21475, function, NULL);
42
43   g_main_loop_run (loop);
44 }
45
46 static gint64 last_time;
47 static gint count;
48
49 static gboolean
50 test_func (gpointer data)
51 {
52   gint64 current_time;
53
54   current_time = g_get_monotonic_time ();
55
56   g_assert (current_time / 1000000 - last_time / 1000000 == 1);
57
58   last_time = current_time;
59   count++;
60
61   /* Make the timeout take up to 0.1 seconds.
62    * We should still get scheduled for the next second.
63    */
64   g_usleep (count * 10000);
65
66   if (count < 10)
67     return TRUE;
68
69   g_main_loop_quit (loop);
70
71   return FALSE;
72 }
73
74 static void
75 test_rounding (void)
76 {
77   loop = g_main_loop_new (NULL, FALSE);
78
79   last_time = g_get_monotonic_time ();
80   g_timeout_add_seconds (1, test_func, NULL);
81
82   g_main_loop_run (loop);
83 }
84
85 int
86 main (int argc, char *argv[])
87 {
88   g_test_init (&argc, &argv, NULL);
89
90   g_test_add_func ("/timeout/seconds", test_seconds);
91   g_test_add_func ("/timeout/rounding", test_rounding);
92
93   return g_test_run ();
94 }