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