1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
5 #include <libebook/libebook.h>
7 #include "data-test-utils.h"
9 /* Optimize queries, just so we can run with BOOKSQL_DEBUG=2 and check the
10 * indexes are properly leverage for cursor queries
13 setup_custom_book (ESource *scratch,
14 ETestServerClosure *closure)
16 ESourceBackendSummarySetup *setup;
18 g_type_class_unref (g_type_class_ref (E_TYPE_SOURCE_BACKEND_SUMMARY_SETUP));
19 setup = e_source_get_extension (scratch, E_SOURCE_EXTENSION_BACKEND_SUMMARY_SETUP);
20 e_source_backend_summary_setup_set_summary_fields (setup,
21 E_CONTACT_FAMILY_NAME,
25 e_source_backend_summary_setup_set_indexed_fields (setup,
26 E_CONTACT_FAMILY_NAME, E_BOOK_INDEX_PREFIX,
27 E_CONTACT_GIVEN_NAME, E_BOOK_INDEX_PREFIX,
28 E_CONTACT_EMAIL, E_BOOK_INDEX_PREFIX,
32 static ETestServerClosure book_closure = { E_TEST_SERVER_ADDRESS_BOOK, setup_custom_book, 0 };
35 ESqliteDBFixture parent_fixture;
39 EContact *contacts[11];
43 cursor_fixture_setup (CursorFixture *fixture,
44 gconstpointer user_data)
46 EContactField sort_fields[] = { E_CONTACT_FAMILY_NAME, E_CONTACT_GIVEN_NAME };
47 EBookSortType sort_types[] = { E_BOOK_SORT_ASCENDING, E_BOOK_SORT_ASCENDING };
49 EBookClient *book_client;
50 EContact **it = fixture->contacts;
52 e_sqlitedb_fixture_setup ((ESqliteDBFixture *)fixture, user_data);
54 book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
57 if (/* N:Jackson;Micheal */
58 !add_contact_from_test_case_verify (book_client, "sorted-1", it++) ||
60 !add_contact_from_test_case_verify (book_client, "sorted-2", it++) ||
62 !add_contact_from_test_case_verify (book_client, "sorted-3", it++) ||
63 /* N:Brown;Big Bobby */
64 !add_contact_from_test_case_verify (book_client, "sorted-4", it++) ||
66 !add_contact_from_test_case_verify (book_client, "sorted-5", it++) ||
67 /* N:%Strange Name;Mister */
68 !add_contact_from_test_case_verify (book_client, "sorted-6", it++) ||
70 !add_contact_from_test_case_verify (book_client, "sorted-7", it++) ||
72 !add_contact_from_test_case_verify (book_client, "sorted-8", it++) ||
74 !add_contact_from_test_case_verify (book_client, "sorted-9", it++) ||
76 !add_contact_from_test_case_verify (book_client, "sorted-10", it++) ||
77 /* FN:Ye Nameless One */
78 !add_contact_from_test_case_verify (book_client, "sorted-11", it++)) {
79 g_error ("Failed to add contacts");
82 fixture->cursor = e_book_backend_sqlitedb_cursor_new (((ESqliteDBFixture *) fixture)->ebsdb,
84 NULL, sort_fields, sort_types, 2, &error);
86 g_assert (fixture->cursor != NULL);
90 cursor_fixture_teardown (CursorFixture *fixture,
91 gconstpointer user_data)
95 for (i = 0; i < G_N_ELEMENTS (fixture->contacts); ++i) {
96 if (fixture->contacts[i])
97 g_object_unref (fixture->contacts[i]);
100 e_book_backend_sqlitedb_cursor_free (((ESqliteDBFixture *) fixture)->ebsdb, fixture->cursor);
101 e_sqlitedb_fixture_teardown ((ESqliteDBFixture *)fixture, user_data);
104 /*****************************************************
105 * Expect the same results twice *
106 *****************************************************/
108 test_cursor_set_target_reset_cursor (CursorFixture *fixture,
109 gconstpointer user_data)
112 GError *error = NULL;
115 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
116 fixture->cursor, 5, &error);
119 g_error ("Error fetching cursor results: %s", error->message);
121 print_results (results);
123 g_assert_cmpint (g_slist_length (results), ==, 5);
125 /* Assert that we got the results ordered as:
130 assert_contacts_order (results,
131 e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
132 e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
133 e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
136 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
137 g_slist_free (results);
140 e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
145 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
146 fixture->cursor, 5, &error);
149 g_error ("Error fetching cursor results: %s", error->message);
151 print_results (results);
153 g_assert_cmpint (g_slist_length (results), ==, 5);
155 /* Assert that we got the results ordered as:
160 assert_contacts_order (results,
161 e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
162 e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
163 e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
166 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
167 g_slist_free (results);
170 /*****************************************************
171 * Expect results with family name starting with 'J' *
172 *****************************************************/
174 test_cursor_set_target_j_next_results (CursorFixture *fixture,
175 gconstpointer user_data)
178 GError *error = NULL;
180 /* Set the cursor at the start of family names beginning with 'J' */
181 e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
182 fixture->cursor, "J", NULL);
184 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
185 fixture->cursor, 3, &error);
188 g_error ("Error fetching cursor results: %s", error->message);
190 print_results (results);
192 g_assert_cmpint (g_slist_length (results), ==, 3);
194 /* Assert that we got the results ordered as:
199 assert_contacts_order (results,
200 e_contact_get_const (fixture->contacts[9], E_CONTACT_UID),
201 e_contact_get_const (fixture->contacts[1], E_CONTACT_UID),
202 e_contact_get_const (fixture->contacts[0], E_CONTACT_UID),
205 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
206 g_slist_free (results);
209 /*****************************************************
210 * Expect results before the letter 'J' *
211 *****************************************************/
213 test_cursor_set_target_j_prev_results (CursorFixture *fixture,
214 gconstpointer user_data)
217 GError *error = NULL;
219 /* Set the cursor at the start of family names beginning with 'J' */
220 e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
221 fixture->cursor, "J", NULL);
223 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
224 fixture->cursor, -5, &error);
227 g_error ("Error fetching cursor results: %s", error->message);
229 print_results (results);
231 g_assert_cmpint (g_slist_length (results), ==, 5);
233 /* Assert that we got the results ordered as:
238 assert_contacts_order (results,
239 e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
240 e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
241 e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
244 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
245 g_slist_free (results);
248 /*****************************************************
249 * Expect results after Bobby Brown *
250 *****************************************************/
252 test_cursor_set_target_bobby_brown_next_results (CursorFixture *fixture,
253 gconstpointer user_data)
256 GError *error = NULL;
258 /* Set the cursor to point exactly to Bobby Brown */
259 e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
261 fixture->contacts[2]);
263 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
264 fixture->cursor, 5, &error);
267 g_error ("Error fetching cursor results: %s", error->message);
269 print_results (results);
271 g_assert_cmpint (g_slist_length (results), ==, 5);
273 /* Assert that we got the results ordered as:
280 assert_contacts_order (results,
281 e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
282 e_contact_get_const (fixture->contacts[6], E_CONTACT_UID),
283 e_contact_get_const (fixture->contacts[9], E_CONTACT_UID),
284 e_contact_get_const (fixture->contacts[1], E_CONTACT_UID),
285 e_contact_get_const (fixture->contacts[0], E_CONTACT_UID),
288 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
289 g_slist_free (results);
292 /*****************************************************
293 * Expect results before Bobby Brown *
294 *****************************************************/
296 test_cursor_set_target_bobby_brown_prev_results (CursorFixture *fixture,
297 gconstpointer user_data)
300 GError *error = NULL;
302 /* Set the cursor to point exactly to Bobby Brown */
303 e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
305 fixture->contacts[2]);
307 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
308 fixture->cursor, -5, &error);
311 g_error ("Error fetching cursor results: %s", error->message);
313 print_results (results);
315 g_assert_cmpint (g_slist_length (results), ==, 2);
317 /* Assert that we got the results ordered as:
321 assert_contacts_order (results,
322 e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
323 e_contact_get_const (fixture->contacts[10], E_CONTACT_UID),
326 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
327 g_slist_free (results);
334 #if !GLIB_CHECK_VERSION (2, 35, 1)
337 g_test_init (&argc, &argv, NULL);
339 /* Ensure that the client and server get the same locale */
340 g_assert (g_setenv ("LC_ALL", "en_US.UTF-8", TRUE));
341 setlocale (LC_ALL, "");
343 g_test_add ("/EbSdbCursor/SetTarget/ResetCursor", CursorFixture, &book_closure,
344 cursor_fixture_setup, test_cursor_set_target_reset_cursor, cursor_fixture_teardown);
345 g_test_add ("/EbSdbCursor/SetTarget/Partial-J/NextResults", CursorFixture, &book_closure,
346 cursor_fixture_setup, test_cursor_set_target_j_next_results, cursor_fixture_teardown);
347 g_test_add ("/EbSdbCursor/SetTarget/Partial-J/PreviousResults", CursorFixture, &book_closure,
348 cursor_fixture_setup, test_cursor_set_target_j_prev_results, cursor_fixture_teardown);
349 g_test_add ("/EbSdbCursor/SetTarget/Exactly-Bobby-Brown/NextResults", CursorFixture, &book_closure,
350 cursor_fixture_setup, test_cursor_set_target_bobby_brown_next_results, cursor_fixture_teardown);
351 g_test_add ("/EbSdbCursor/SetTarget/Exactly-Bobby-Brown/PreviousResults", CursorFixture, &book_closure,
352 cursor_fixture_setup, test_cursor_set_target_bobby_brown_prev_results, cursor_fixture_teardown);
354 return e_test_server_utils_run ();