ECalClient tests: Use async apis to open the client for every async test.
[platform/upstream/evolution-data-server.git] / tests / libecal / client / test-client-get-view.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 #include <stdlib.h>
4 #include <libecal/libecal.h>
5 #include <libical/ical.h>
6
7 #include "e-test-server-utils.h"
8
9 static ETestServerClosure cal_closure_sync =
10         { E_TEST_SERVER_CALENDAR, NULL, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, FALSE, NULL, FALSE };
11 static ETestServerClosure cal_closure_async =
12         { E_TEST_SERVER_CALENDAR, NULL, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, FALSE, NULL, TRUE };
13
14 typedef enum {
15         SUBTEST_OBJECTS_ADDED,
16         SUBTEST_OBJECTS_MODIFIED,
17         SUBTEST_OBJECTS_REMOVED,
18         SUBTEST_VIEW_DONE,
19         NUM_SUBTESTS,
20         SUBTEST_RESET
21 } SubTestId;
22
23 static void
24 subtest_passed (SubTestId id,
25                 GMainLoop *loop)
26 {
27         static guint subtests_complete = 0;
28
29         if (id == SUBTEST_RESET) {
30                 subtests_complete = 0;
31                 return;
32         }
33
34         subtests_complete |= (1 << id);
35
36         if (subtests_complete == ((1 << NUM_SUBTESTS) - 1))
37                 g_main_loop_quit (loop);
38 }
39
40 static void
41 objects_added_cb (GObject *object,
42                   const GSList *objects,
43                   gpointer data)
44 {
45         GMainLoop *loop = (GMainLoop *) data;
46         const GSList *l;
47
48         for (l = objects; l; l = l->next)
49                 g_print ("Object added %s (%s)\n", icalcomponent_get_uid (l->data), icalcomponent_get_summary (l->data));
50
51         subtest_passed (SUBTEST_OBJECTS_ADDED, loop);
52 }
53
54 static void
55 objects_modified_cb (GObject *object,
56                      const GSList *objects,
57                      gpointer data)
58 {
59         GMainLoop *loop = (GMainLoop *) data;
60         const GSList *l;
61
62         for (l = objects; l; l = l->next)
63                 g_print ("Object modified %s (%s)\n", icalcomponent_get_uid (l->data), icalcomponent_get_summary (l->data));
64
65         subtest_passed (SUBTEST_OBJECTS_MODIFIED, loop);
66 }
67
68 static void
69 objects_removed_cb (GObject *object,
70                     const GSList *objects,
71                     gpointer data)
72 {
73         GMainLoop *loop = (GMainLoop *) data;
74         const GSList *l;
75
76         for (l = objects; l; l = l->next) {
77                 ECalComponentId *id = l->data;
78
79                 g_print ("Object removed: uid: %s, rid: %s\n", id->uid, id->rid);
80         }
81
82         subtest_passed (SUBTEST_OBJECTS_REMOVED, loop);
83 }
84
85 static void
86 complete_cb (GObject *object,
87              const GError *error,
88              gpointer data)
89 {
90         GMainLoop *loop = (GMainLoop *) data;
91
92         g_print ("View complete (status: %d, error_msg:%s)\n", error ? error->code : 0, error ? error->message : "NULL");
93
94         subtest_passed (SUBTEST_VIEW_DONE, loop);
95 }
96
97 static gpointer
98 alter_cal_client (gpointer user_data)
99 {
100         ECalClient *cal_client = user_data;
101         GError *error = NULL;
102         icalcomponent *icalcomp;
103         struct icaltimetype now;
104         gchar *uid = NULL;
105
106         g_return_val_if_fail (cal_client != NULL, NULL);
107
108         now = icaltime_current_time_with_zone (icaltimezone_get_utc_timezone ());
109         icalcomp = icalcomponent_new (ICAL_VEVENT_COMPONENT);
110         icalcomponent_set_summary (icalcomp, "Initial event summary");
111         icalcomponent_set_dtstart (icalcomp, now);
112         icalcomponent_set_dtend   (icalcomp, icaltime_from_timet (icaltime_as_timet (now) + 60 * 60 * 60, 0));
113
114         if (!e_cal_client_create_object_sync (cal_client, icalcomp, &uid, NULL, &error))
115                 g_error ("create object sync: %s", error->message);
116
117         icalcomponent_set_uid (icalcomp, uid);
118         icalcomponent_set_summary (icalcomp, "Modified event summary");
119
120         if (!e_cal_client_modify_object_sync (cal_client, icalcomp, E_CAL_OBJ_MOD_ALL, NULL, &error))
121                 g_error ("modify object sync: %s", error->message);
122
123         if (!e_cal_client_remove_object_sync (cal_client, uid, NULL, E_CAL_OBJ_MOD_ALL, NULL, &error))
124                 g_error ("remove object sync: %s", error->message);
125
126         g_free (uid);
127         icalcomponent_free (icalcomp);
128
129         return FALSE;
130 }
131
132 static void
133 async_get_view_ready (GObject *source_object,
134                       GAsyncResult *result,
135                       gpointer user_data)
136 {
137         ECalClient *cal_client = E_CAL_CLIENT (source_object);
138         ECalClientView *view = NULL;
139         GError *error = NULL;
140         GMainLoop *loop = (GMainLoop *) user_data;
141
142         g_return_if_fail (cal_client != NULL);
143
144         if (!e_cal_client_get_view_finish (cal_client, result, &view, &error))
145                 g_error ("get view finish: %s", error->message);
146
147         g_object_set_data_full (G_OBJECT (cal_client), "cal-view", view, g_object_unref);
148
149         subtest_passed (SUBTEST_RESET, loop);
150         g_signal_connect (view, "objects_added", G_CALLBACK (objects_added_cb), loop);
151         g_signal_connect (view, "objects_modified", G_CALLBACK (objects_modified_cb), loop);
152         g_signal_connect (view, "objects_removed", G_CALLBACK (objects_removed_cb), loop);
153         g_signal_connect (view, "complete", G_CALLBACK (complete_cb), loop);
154
155         e_cal_client_view_set_fields_of_interest (view, NULL, &error);
156         if (error)
157                 g_error ("set fields of interest: %s", error->message);
158         e_cal_client_view_start (view, NULL);
159
160         alter_cal_client (cal_client);
161 }
162
163 static void
164 test_get_view_async (ETestServerFixture *fixture,
165                      gconstpointer user_data)
166 {
167         ECalClient *cal_client;
168
169         cal_client = E_TEST_SERVER_UTILS_SERVICE (fixture, ECalClient);
170
171         e_cal_client_get_view (cal_client, "(contains? \"any\" \"event\")", NULL, async_get_view_ready, fixture->loop);
172         g_main_loop_run (fixture->loop);
173
174         /* Will unref the view */
175         g_object_set_data (G_OBJECT (cal_client), "cal-view", NULL);
176 }
177
178 static void
179 test_get_view_sync (ETestServerFixture *fixture,
180                     gconstpointer user_data)
181 {
182         ECalClient *cal_client;
183         GError *error = NULL;
184         ECalClientView *view = NULL;
185
186         cal_client = E_TEST_SERVER_UTILS_SERVICE (fixture, ECalClient);
187
188         if (!e_cal_client_get_view_sync (cal_client, "(contains? \"any\" \"event\")", &view, NULL, &error))
189                 g_error ("get view sync: %s", error->message);
190
191         subtest_passed (SUBTEST_RESET, fixture->loop);
192         g_signal_connect (view, "objects_added", G_CALLBACK (objects_added_cb), fixture->loop);
193         g_signal_connect (view, "objects_modified", G_CALLBACK (objects_modified_cb), fixture->loop);
194         g_signal_connect (view, "objects_removed", G_CALLBACK (objects_removed_cb), fixture->loop);
195         g_signal_connect (view, "complete", G_CALLBACK (complete_cb), NULL);
196
197         e_cal_client_view_set_fields_of_interest (view, NULL, &error);
198         if (error)
199                 g_error ("set fields of interest: %s", error->message);
200         e_cal_client_view_start (view, NULL);
201
202         g_idle_add ((GSourceFunc) alter_cal_client, cal_client);
203         g_main_loop_run (fixture->loop);
204
205         g_object_unref (view);
206 }
207
208 gint
209 main (gint argc,
210       gchar **argv)
211 {
212 #if !GLIB_CHECK_VERSION (2, 35, 1)
213         g_type_init ();
214 #endif
215         g_test_init (&argc, &argv, NULL);
216         g_test_bug_base ("http://bugzilla.gnome.org/");
217
218         g_test_add (
219                 "/ECalClient/GetView/Sync",
220                 ETestServerFixture,
221                 &cal_closure_sync,
222                 e_test_server_utils_setup,
223                 test_get_view_sync,
224                 e_test_server_utils_teardown);
225         g_test_add (
226                 "/ECalClient/GetView/Async",
227                 ETestServerFixture,
228                 &cal_closure_async,
229                 e_test_server_utils_setup,
230                 test_get_view_async,
231                 e_test_server_utils_teardown);
232
233         return e_test_server_utils_run ();
234 }