vcard_tester.c 23.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
	vcard_tester.c
	Copyright (C) 2015  Belledonne Communications SARL

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "linphonecore.h"
#include "private.h"
#include "liblinphone_tester.h"
22
#include "carddav.h"
23

24 25
#include <time.h>

26
#ifdef VCARD_ENABLED
Sylvain Berfini's avatar
Sylvain Berfini committed
27 28 29 30 31
static char *create_filepath(const char *dir, const char *filename, const char *ext) {
	return ms_strdup_printf("%s/%s.%s", dir, filename, ext);
}

static void linphone_vcard_import_export_friends_test(void) {
32
	LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE);
Sylvain Berfini's avatar
Sylvain Berfini committed
33 34
	char *import_filepath = bc_tester_res("common/vcards.vcf");
	char *export_filepath = create_filepath(bc_tester_get_writable_dir_prefix(), "export_vcards", "vcf");
35 36
	const MSList *friends = linphone_core_get_friend_list(manager->lc);
	int count = 0;
37
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
38 39
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
	
40
	BC_ASSERT_PTR_NOT_NULL_FATAL(linphone_core_get_default_friend_list(manager->lc));
Sylvain Berfini's avatar
Sylvain Berfini committed
41
	count = linphone_core_import_friends_from_vcard4_file(manager->lc, import_filepath);
42 43 44 45
	BC_ASSERT_EQUAL(count, 3, int, "%d");
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 3, int, "%d");
	
Sylvain Berfini's avatar
Sylvain Berfini committed
46
	linphone_core_export_friends_as_vcard4_file(manager->lc, export_filepath);
47
	
48
	linphone_core_remove_friend_list(manager->lc, linphone_core_get_default_friend_list(manager->lc));
Sylvain Berfini's avatar
Sylvain Berfini committed
49 50
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
51
	
52 53 54
	linphone_core_add_friend_list(manager->lc, lfl);
	linphone_friend_list_unref(lfl);
	lfl = NULL;
Sylvain Berfini's avatar
Sylvain Berfini committed
55 56 57 58 59 60
	count = linphone_core_import_friends_from_vcard4_file(manager->lc, export_filepath);
	BC_ASSERT_EQUAL(count, 3, int, "%d");
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 3, int, "%d");
	
	remove(export_filepath);
61 62
	ms_free(import_filepath);
	ms_free(export_filepath);
Sylvain Berfini's avatar
Sylvain Berfini committed
63
	linphone_core_manager_destroy(manager);
64 65
}

66 67 68 69 70
static void linphone_vcard_import_a_lot_of_friends_test(void) {
	LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE);
	char *import_filepath = bc_tester_res("common/thousand_vcards.vcf");
	clock_t start, end;
	double elapsed = 0;
71
	const MSList *friends = NULL;
72 73 74 75 76

	start = clock();
	linphone_core_import_friends_from_vcard4_file(manager->lc, import_filepath);
	end = clock();
	
77
	friends = linphone_core_get_friend_list(manager->lc);
78 79
	BC_ASSERT_EQUAL(ms_list_size(friends), 482, int, "%i"); // Thousand vcards contains 482 contacts with a SIP URI
	
80
	elapsed = (double)(end - start);
81
	ms_error("Imported a thousand of vCards (only %i friends with SIP address found) in %f seconds", ms_list_size(friends), elapsed / CLOCKS_PER_SEC);
82
#ifndef ANDROID
83
	BC_ASSERT_TRUE(elapsed < 1500000); // 1.5 seconds
84
#endif
85 86
	
	ms_free(import_filepath);
87 88 89
	linphone_core_manager_destroy(manager);
}

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
static void friends_if_no_db_set(void) {
	LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE);
	LinphoneFriend *lf = linphone_friend_new();
	LinphoneAddress *addr = linphone_address_new("sip:sylvain@sip.linphone.org");
	const MSList *friends = NULL;
	
	linphone_friend_set_address(lf, addr);
	linphone_friend_set_name(lf, "Sylvain");
	linphone_core_add_friend(manager->lc, lf);
	linphone_friend_unref(lf);
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 1, int, "%d");
	
	linphone_core_remove_friend(manager->lc, lf);
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
	
107
	linphone_address_unref(addr);
108 109 110 111 112
	linphone_core_manager_destroy(manager);
}

#ifdef FRIENDS_SQL_STORAGE_ENABLED
static void friends_migration(void) {
113
	LinphoneCoreManager* manager = linphone_core_manager_new2("friends_rc", FALSE);
114 115 116 117 118 119 120
	const MSList *friends = linphone_core_get_friend_list(manager->lc);
	MSList *friends_from_db = NULL;
	char *friends_db = create_filepath(bc_tester_get_writable_dir_prefix(), "friends", "db");
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
	
	unlink(friends_db);
	linphone_core_set_friends_database_path(manager->lc, friends_db);
121 122
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 3, int, "%d");
123
	friends_from_db = linphone_core_fetch_friends_from_db(manager->lc, linphone_core_get_default_friend_list(manager->lc));
124 125 126 127
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 3, int, "%d");
	if (ms_list_size(friends_from_db) < 3) {
		goto end;
	}
128
	
129
end:
130 131 132 133 134 135 136 137
	unlink(friends_db);
	ms_free(friends_db);
	friends_from_db = ms_list_free_with_data(friends_from_db, (void (*)(void *))linphone_friend_unref);
	linphone_core_manager_destroy(manager);
}

static void friends_sqlite_storage(void) {
	LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE);
138
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
139
	LinphoneVCard *lvc = linphone_vcard_new();
140
	LinphoneFriend *lf = NULL;
141 142 143 144
	LinphoneFriend *lf2 = NULL;
	LinphoneAddress *addr = linphone_address_new("sip:sylvain@sip.linphone.org");
	const MSList *friends = linphone_core_get_friend_list(manager->lc);
	MSList *friends_from_db = NULL;
145
	MSList *friends_lists_from_db = NULL;
146 147 148 149 150
	char *friends_db = create_filepath(bc_tester_get_writable_dir_prefix(), "friends", "db");
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
	
	unlink(friends_db);
	linphone_core_set_friends_database_path(manager->lc, friends_db);
151
	friends_from_db = linphone_core_fetch_friends_from_db(manager->lc, linphone_core_get_default_friend_list(manager->lc));
152
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 0, int, "%d");
153
	
154 155
	linphone_vcard_set_etag(lvc, "\"123-456789\"");
	linphone_vcard_set_url(lvc, "http://dav.somewhere.fr/addressbook/me/someone.vcf");
156
	lf = linphone_friend_new_from_vcard(lvc);
157 158
	linphone_friend_set_address(lf, addr);
	linphone_friend_set_name(lf, "Sylvain");
159 160
	
	linphone_core_add_friend_list(manager->lc, lfl);
161
	linphone_friend_list_unref(lfl);
162
	linphone_friend_list_set_display_name(lfl, "Test");
163
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_friend(lfl, lf), LinphoneFriendListOK, int, "%i");
164
	linphone_friend_unref(lf);
165
	BC_ASSERT_EQUAL(lfl->storage_id, 1, int, "%d");
166
	BC_ASSERT_EQUAL(lf->storage_id, 1, int, "%d");
167 168
	
	friends = linphone_core_get_friend_list(manager->lc);
169 170 171 172
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
	
	friends_lists_from_db = linphone_core_fetch_friends_lists_from_db(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends_lists_from_db), 1, int, "%d");
173 174 175 176 177
	friends_from_db = ((LinphoneFriendList *)friends_lists_from_db->data)->friends;
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 1, int, "%d");
	lf2 = (LinphoneFriend *)friends_from_db->data;
	BC_ASSERT_PTR_NOT_NULL(lf2->lc);
	BC_ASSERT_PTR_NOT_NULL(lf2->friend_list);
178
	friends_lists_from_db = ms_list_free_with_data(friends_lists_from_db, (void (*)(void *))linphone_friend_list_unref);
179
	
180
	friends_from_db = linphone_core_fetch_friends_from_db(manager->lc, lfl);
181
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 1, int, "%d");
182 183 184 185 186 187
	if (ms_list_size(friends_from_db) < 1) {
		goto end;
	}
	lf2 = (LinphoneFriend *)friends_from_db->data;
	BC_ASSERT_STRING_EQUAL(linphone_friend_get_name(lf2), linphone_friend_get_name(lf));
	BC_ASSERT_EQUAL(lf2->storage_id, lf->storage_id, int, "%i");
188 189
	BC_ASSERT_STRING_EQUAL(linphone_vcard_get_etag(linphone_friend_get_vcard(lf2)), linphone_vcard_get_etag(linphone_friend_get_vcard(lf)));
	BC_ASSERT_STRING_EQUAL(linphone_vcard_get_url(linphone_friend_get_vcard(lf2)), linphone_vcard_get_url(linphone_friend_get_vcard(lf)));
190 191 192 193 194 195
	BC_ASSERT_STRING_EQUAL(linphone_address_as_string(linphone_friend_get_address(lf2)), linphone_address_as_string(linphone_friend_get_address(lf)));

	linphone_friend_edit(lf);
	linphone_friend_set_name(lf, "Margaux");
	linphone_friend_done(lf);
	friends_from_db = ms_list_free_with_data(friends_from_db, (void (*)(void *))linphone_friend_unref);
196
	friends_from_db = linphone_core_fetch_friends_from_db(manager->lc, lfl);
197 198 199 200
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 1, int, "%d");
	if (ms_list_size(friends_from_db) < 1) {
		goto end;
	}
201
	lf2 = (LinphoneFriend *)friends_from_db->data;
202 203
	BC_ASSERT_STRING_EQUAL(linphone_friend_get_name(lf2), "Margaux");
	friends_from_db = ms_list_free_with_data(friends_from_db, (void (*)(void *))linphone_friend_unref);
204
	
205 206 207
	linphone_core_remove_friend(manager->lc, lf);
	friends = linphone_core_get_friend_list(manager->lc);
	BC_ASSERT_EQUAL(ms_list_size(friends), 0, int, "%d");
208
	friends_from_db = linphone_core_fetch_friends_from_db(manager->lc, lfl);
209 210 211
	BC_ASSERT_EQUAL(ms_list_size(friends_from_db), 0, int, "%d");

end:
212 213
	unlink(friends_db);
	ms_free(friends_db);
214
	linphone_address_unref(addr);
215 216 217
	linphone_core_manager_destroy(manager);
}
#endif
218

219 220 221 222 223 224 225
typedef struct _LinphoneCardDAVStats {
	int sync_done_count;
	int new_contact_count;
	int removed_contact_count;
	int updated_contact_count;
} LinphoneCardDAVStats;

226
static void carddav_sync_done(LinphoneCardDavContext *c, bool_t success, const char *message) {
227
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_carddav_get_user_data(c);
228
	BC_ASSERT_TRUE(success);
Sylvain Berfini's avatar
Sylvain Berfini committed
229
	stats->sync_done_count++;
230 231
}

232 233 234
static void carddav_new_contact(LinphoneCardDavContext *c, LinphoneFriend *lf) {
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_carddav_get_user_data(c);
	BC_ASSERT_PTR_NOT_NULL_FATAL(lf);
Sylvain Berfini's avatar
Sylvain Berfini committed
235
	stats->new_contact_count++;
236 237 238 239 240
}

static void carddav_removed_contact(LinphoneCardDavContext *c, LinphoneFriend *lf) {
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_carddav_get_user_data(c);
	BC_ASSERT_PTR_NOT_NULL_FATAL(lf);
Sylvain Berfini's avatar
Sylvain Berfini committed
241
	stats->removed_contact_count++;
242 243
}

244
static void carddav_updated_contact(LinphoneCardDavContext *c, LinphoneFriend *new_lf, LinphoneFriend *old_lf) {
245
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_carddav_get_user_data(c);
246 247
	BC_ASSERT_PTR_NOT_NULL_FATAL(new_lf);
	BC_ASSERT_PTR_NOT_NULL_FATAL(old_lf);
Sylvain Berfini's avatar
Sylvain Berfini committed
248
	stats->updated_contact_count++;
249 250
}

251
static void carddav_sync(void) {
252
	LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
253
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)ms_new0(LinphoneCardDAVStats, 1);
254 255
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
	LinphoneCardDavContext *c = NULL;
256
	
257
	linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
258
	linphone_core_add_friend_list(manager->lc, lfl);
259
	linphone_friend_list_unref(lfl);
260
	c = linphone_carddav_context_new(lfl);
261 262
	BC_ASSERT_PTR_NOT_NULL_FATAL(c);
	
263
	linphone_carddav_set_user_data(c, stats);
264
	linphone_carddav_set_synchronization_done_callback(c, carddav_sync_done);
265 266 267
	linphone_carddav_set_new_contact_callback(c, carddav_new_contact);
	linphone_carddav_set_removed_contact_callback(c, carddav_removed_contact);
	linphone_carddav_set_updated_contact_callback(c, carddav_updated_contact);
268 269
	linphone_carddav_synchronize(c);
	
270
	wait_for_until(manager->lc, NULL, &stats->new_contact_count, 1, 2000);
Sylvain Berfini's avatar
Sylvain Berfini committed
271
	BC_ASSERT_EQUAL(stats->new_contact_count, 1, int, "%i");
272
	wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
Sylvain Berfini's avatar
Sylvain Berfini committed
273
	BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
Sylvain Berfini's avatar
Sylvain Berfini committed
274 275
	
	ms_free(stats);
276
	linphone_carddav_context_destroy(c);
277 278
	linphone_core_manager_destroy(manager);
}
Sylvain Berfini's avatar
Sylvain Berfini committed
279 280

static void carddav_sync_2(void) {
281
	LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
Sylvain Berfini's avatar
Sylvain Berfini committed
282 283 284
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)ms_new0(LinphoneCardDAVStats, 1);
	LinphoneFriend *lf = linphone_friend_new_with_address("\"Sylvain\" <sip:sylvain@sip.linphone.org>");
	char *friends_db = create_filepath(bc_tester_get_writable_dir_prefix(), "friends", "db");
285 286 287 288
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
	LinphoneCardDavContext *c = NULL;
	
	linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
289
	linphone_core_add_friend_list(manager->lc, lfl);
290
	linphone_friend_list_unref(lfl);
291 292
	c = linphone_carddav_context_new(lfl);
	BC_ASSERT_PTR_NOT_NULL_FATAL(c);
Sylvain Berfini's avatar
Sylvain Berfini committed
293 294 295
	
	unlink(friends_db);
	linphone_core_set_friends_database_path(manager->lc, friends_db);
296
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_friend(lfl, lf), LinphoneFriendListOK, int, "%d");
Sylvain Berfini's avatar
Sylvain Berfini committed
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
	linphone_friend_unref(lf);
	
	linphone_carddav_set_user_data(c, stats);
	linphone_carddav_set_synchronization_done_callback(c, carddav_sync_done);
	linphone_carddav_set_new_contact_callback(c, carddav_new_contact);
	linphone_carddav_set_removed_contact_callback(c, carddav_removed_contact);
	linphone_carddav_set_updated_contact_callback(c, carddav_updated_contact);
	
	linphone_carddav_synchronize(c);
	
	wait_for_until(manager->lc, NULL, &stats->new_contact_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->new_contact_count, 1, int, "%i");
	wait_for_until(manager->lc, NULL, &stats->removed_contact_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->removed_contact_count, 1, int, "%i");
	wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
Sylvain Berfini's avatar
Sylvain Berfini committed
313 314 315 316
	
	ms_free(stats);
	unlink(friends_db);
	ms_free(friends_db);
317
	linphone_carddav_context_destroy(c);
Sylvain Berfini's avatar
Sylvain Berfini committed
318 319 320 321
	linphone_core_manager_destroy(manager);
}

static void carddav_sync_3(void) {
322
	LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
Sylvain Berfini's avatar
Sylvain Berfini committed
323
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)ms_new0(LinphoneCardDAVStats, 1);
324
	LinphoneVCard *lvc = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nUID:1f08dd48-29ac-4097-8e48-8596d7776283\r\nFN:Sylvain Berfini\r\nIMPP;TYPE=work:sip:sylvain@sip.linphone.org\r\nEND:VCARD\r\n");
Sylvain Berfini's avatar
Sylvain Berfini committed
325 326
	LinphoneFriend *lf = linphone_friend_new_from_vcard(lvc);
	char *friends_db = create_filepath(bc_tester_get_writable_dir_prefix(), "friends", "db");
327 328 329 330
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
	LinphoneCardDavContext *c = NULL;
	
	linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
331
	linphone_core_add_friend_list(manager->lc, lfl);
332
	linphone_friend_list_unref(lfl);
333 334
	c = linphone_carddav_context_new(lfl);
	BC_ASSERT_PTR_NOT_NULL_FATAL(c);
Sylvain Berfini's avatar
Sylvain Berfini committed
335 336 337
	
	unlink(friends_db);
	linphone_core_set_friends_database_path(manager->lc, friends_db);
338
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_friend(lfl, lf), LinphoneFriendListOK, int, "%d");
Sylvain Berfini's avatar
Sylvain Berfini committed
339 340 341 342 343 344 345 346 347 348 349 350 351 352
	linphone_friend_unref(lf);
	
	linphone_carddav_set_user_data(c, stats);
	linphone_carddav_set_synchronization_done_callback(c, carddav_sync_done);
	linphone_carddav_set_new_contact_callback(c, carddav_new_contact);
	linphone_carddav_set_removed_contact_callback(c, carddav_removed_contact);
	linphone_carddav_set_updated_contact_callback(c, carddav_updated_contact);
	
	linphone_carddav_synchronize(c);
	
	wait_for_until(manager->lc, NULL, &stats->updated_contact_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->updated_contact_count, 1, int, "%i");
	wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
Sylvain Berfini's avatar
Sylvain Berfini committed
353 354 355 356

	ms_free(stats);
	unlink(friends_db);
	ms_free(friends_db);
357
	linphone_carddav_context_destroy(c);
358 359 360 361
	linphone_core_manager_destroy(manager);
}

static void carddav_sync_4(void) {
362
	LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
363 364 365
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)ms_new0(LinphoneCardDAVStats, 1);
	LinphoneVCard *lvc = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Margaux Clerc\r\nIMPP;TYPE=work:sip:margaux@sip.linphone.org\r\nEND:VCARD\r\n");
	LinphoneFriend *lf = linphone_friend_new_from_vcard(lvc);
366 367
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
	LinphoneCardDavContext *c = NULL;
368
	
369
	linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
370
	linphone_core_add_friend_list(manager->lc, lfl);
371
	linphone_friend_list_unref(lfl);
372
	c = linphone_carddav_context_new(lfl);
373 374 375 376
	BC_ASSERT_PTR_NOT_NULL_FATAL(c);
	
	linphone_carddav_set_user_data(c, stats);
	linphone_carddav_set_synchronization_done_callback(c, carddav_sync_done);
377 378 379
	linphone_carddav_set_new_contact_callback(c, carddav_new_contact);
	linphone_carddav_set_removed_contact_callback(c, carddav_removed_contact);
	linphone_carddav_set_updated_contact_callback(c, carddav_updated_contact);
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
	
	BC_ASSERT_PTR_NULL(linphone_vcard_get_uid(lvc));
	BC_ASSERT_TRUE(linphone_vcard_generate_unique_id(lvc));
	BC_ASSERT_PTR_NOT_NULL(linphone_vcard_get_uid(lvc));
	
	linphone_carddav_put_vcard(c, lf);
	wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
	
	linphone_carddav_delete_vcard(c, lf);
	wait_for_until(manager->lc, NULL, &stats->sync_done_count, 2, 2000);
	BC_ASSERT_EQUAL(stats->sync_done_count, 2, int, "%i");

	linphone_friend_unref(lf);
	ms_free(stats);
395 396 397 398 399 400 401 402 403 404 405 406 407 408
	linphone_carddav_context_destroy(c);
	linphone_core_manager_destroy(manager);
}

static void carddav_contact_created(LinphoneFriendList *list, LinphoneFriend *lf) {
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_friend_list_cbs_get_user_data(list->cbs);
	stats->new_contact_count++;
}

static void carddav_contact_deleted(LinphoneFriendList *list, LinphoneFriend *lf) {
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_friend_list_cbs_get_user_data(list->cbs);
	stats->removed_contact_count++;
}

409 410 411 412 413
static void carddav_contact_updated(LinphoneFriendList *list, LinphoneFriend *new_friend, LinphoneFriend *old_friend) {
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_friend_list_cbs_get_user_data(list->cbs);
	stats->updated_contact_count++;
}

414
static void carddav_integration(void) {
415
	LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
416 417 418
	LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
	LinphoneVCard *lvc = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Margaux Clerc\r\nIMPP;TYPE=work:sip:margaux@sip.linphone.org\r\nEND:VCARD\r\n");
	LinphoneFriend *lf = linphone_friend_new_from_vcard(lvc);
419 420
	LinphoneVCard *lvc2 = NULL;
	LinphoneFriend *lf2 = NULL;
421 422
	LinphoneFriendListCbs *cbs = NULL;
	LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)ms_new0(LinphoneCardDAVStats, 1);
423
	const char *refkey = "toto";
424 425 426 427 428 429
	
	linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
	cbs = linphone_friend_list_get_callbacks(lfl);
	linphone_friend_list_cbs_set_user_data(cbs, stats);
	linphone_friend_list_cbs_set_contact_created(cbs, carddav_contact_created);
	linphone_friend_list_cbs_set_contact_deleted(cbs, carddav_contact_deleted);
430
	linphone_friend_list_cbs_set_contact_updated(cbs, carddav_contact_updated);
431
	linphone_core_add_friend_list(manager->lc, lfl);
432 433 434 435

	BC_ASSERT_PTR_NULL(linphone_vcard_get_uid(lvc));
	BC_ASSERT_TRUE(linphone_vcard_generate_unique_id(lvc));
	BC_ASSERT_PTR_NOT_NULL(linphone_vcard_get_uid(lvc));
436
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_friend(lfl, lf), LinphoneFriendListOK, int, "%d");
437 438 439
	wait_for_until(manager->lc, NULL, NULL, 1, 2000);
	linphone_friend_list_remove_friend(lfl, lf);
	wait_for_until(manager->lc, NULL, NULL, 1, 2000);
440
	linphone_friend_unref(lf);
441
	lf = NULL;
442 443 444

	lvc = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Ghislain Mary\r\nIMPP;TYPE=work:sip:ghislain@sip.linphone.org\r\nEND:VCARD\r\n");
	lf = linphone_friend_new_from_vcard(lvc);
445
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_import_friend(lfl, lf, FALSE), LinphoneFriendListOK, int, "%d");
446
	linphone_friend_unref(lf);
447
	
448
	lvc2 = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Sylvain Berfini\r\nIMPP:sip:sberfini.linphone.org\r\nUID:1f08dd48-29ac-4097-8e48-8596d7776283\r\nEND:VCARD\r\n");
449 450
	linphone_vcard_set_url(lvc2, "/sabredav/addressbookserver.php/addressbooks/sylvain/default/me.vcf");
	lf2 = linphone_friend_new_from_vcard(lvc2);
451
	linphone_friend_set_ref_key(lf2, refkey);
452
	BC_ASSERT_EQUAL_FATAL(linphone_friend_list_import_friend(lfl, lf2, FALSE), LinphoneFriendListOK, int, "%d");
453 454
	linphone_friend_unref(lf2);
	
455 456
	BC_ASSERT_EQUAL(lfl->revision, 0, int, "%i");
	linphone_friend_list_synchronize_friends_from_server(lfl);
457 458
	wait_for_until(manager->lc, NULL, &stats->new_contact_count, 0, 2000);
	BC_ASSERT_EQUAL(stats->new_contact_count, 0, int, "%i");
459 460
	wait_for_until(manager->lc, NULL, &stats->removed_contact_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->removed_contact_count, 1, int, "%i");
461 462
	wait_for_until(manager->lc, NULL, &stats->updated_contact_count, 1, 2000);
	BC_ASSERT_EQUAL(stats->updated_contact_count, 1, int, "%i");
463 464
	BC_ASSERT_NOT_EQUAL(lfl->revision, 0, int, "%i");
	
465 466
	BC_ASSERT_EQUAL_FATAL(ms_list_size(lfl->friends), 1, int, "%i");
	lf = (LinphoneFriend *)lfl->friends->data;
467 468 469 470
	BC_ASSERT_STRING_EQUAL(lf->refkey, refkey);
	BC_ASSERT_EQUAL(lf->storage_id, lf2->storage_id, int, "%i");
	BC_ASSERT_STRING_EQUAL(linphone_address_as_string_uri_only(lf->uri), "sip:sylvain@sip.linphone.org");
	
471 472 473 474 475 476 477 478 479 480
	linphone_friend_edit(lf);
	linphone_friend_done(lf);
	BC_ASSERT_EQUAL(ms_list_size(lf->friend_list->dirty_friends_to_update), 0, int, "%i");
	
	linphone_core_set_network_reachable(manager->lc, FALSE); //To prevent the CardDAV update
	linphone_friend_edit(lf);
	linphone_friend_set_name(lf, "François Grisez");
	linphone_friend_done(lf);
	BC_ASSERT_EQUAL(ms_list_size(lf->friend_list->dirty_friends_to_update), 1, int, "%i");
	
481 482
	ms_free(stats);
	linphone_friend_list_unref(lfl);
Sylvain Berfini's avatar
Sylvain Berfini committed
483 484 485
	linphone_core_manager_destroy(manager);
}

486 487 488
#else
static void dummy_test(void) {
}
489
#endif
490

491
test_t vcard_tests[] = {
492
#ifdef VCARD_ENABLED
Sylvain Berfini's avatar
Sylvain Berfini committed
493
	{ "Import / Export friends from vCards", linphone_vcard_import_export_friends_test },
494
	{ "Import a lot of friends from vCards", linphone_vcard_import_a_lot_of_friends_test },
495 496 497 498
#ifdef FRIENDS_SQL_STORAGE_ENABLED
	{ "Friends working if no db set", friends_if_no_db_set },
	{ "Friends storage migration from rc to db", friends_migration },
	{ "Friends storage in sqlite database", friends_sqlite_storage },
499
#endif
500
	{ "CardDAV synchronization", carddav_sync },
Sylvain Berfini's avatar
Sylvain Berfini committed
501 502
	{ "CardDAV synchronization 2", carddav_sync_2 },
	{ "CardDAV synchronization 3", carddav_sync_3 },
503
	{ "CardDAV synchronization 4", carddav_sync_4 },
504
	{ "CardDAV integration", carddav_integration },
505 506
#else
	{ "Dummy test", dummy_test }
507
#endif
508 509 510 511 512 513 514
};

test_suite_t vcard_test_suite = {
	"VCard", NULL, NULL, 
	liblinphone_tester_before_each, liblinphone_tester_after_each,
	sizeof(vcard_tests) / sizeof(vcard_tests[0]), vcard_tests
};