liblinphone_tester.h 15.8 KB
Newer Older
jehan's avatar
jehan committed
1
/*
2 3
	liblinphone_tester - liblinphone test suite
	Copyright (C) 2013  Belledonne Communications SARL
jehan's avatar
jehan committed
4

5 6 7 8
	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 2 of the License, or
	(at your option) any later version.
jehan's avatar
jehan committed
9

Guillaume BIENKOWSKI's avatar
Guillaume BIENKOWSKI committed
10 11 12 13
	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.
jehan's avatar
jehan committed
14

Guillaume BIENKOWSKI's avatar
Guillaume BIENKOWSKI committed
15 16
	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
jehan's avatar
jehan committed
17 18
*/

Simon Morlat's avatar
Simon Morlat committed
19

jehan's avatar
jehan committed
20 21 22 23 24
#ifndef LIBLINPHONE_TESTER_H_
#define LIBLINPHONE_TESTER_H_



25
#include "bc_tester_utils.h"
Sylvain Berfini's avatar
Sylvain Berfini committed
26
#include "linphonecore.h"
Simon Morlat's avatar
Simon Morlat committed
27
#include <mediastreamer2/msutils.h>
28 29 30
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
Ghislain MARY's avatar
Ghislain MARY committed
31 32 33 34 35 36 37 38 39 40

#ifdef __cplusplus
extern "C" {
#endif

extern test_suite_t setup_test_suite;
extern test_suite_t register_test_suite;
extern test_suite_t call_test_suite;
extern test_suite_t message_test_suite;
extern test_suite_t presence_test_suite;
Yann Diorcet's avatar
Yann Diorcet committed
41
extern test_suite_t upnp_test_suite;
42
extern test_suite_t event_test_suite;
Simon Morlat's avatar
Simon Morlat committed
43
extern test_suite_t flexisip_test_suite;
Guillaume BIENKOWSKI's avatar
Guillaume BIENKOWSKI committed
44
extern test_suite_t stun_test_suite;
45
extern test_suite_t remote_provisioning_test_suite;
46
extern test_suite_t quality_reporting_test_suite;
47
extern test_suite_t log_collection_test_suite;
48
extern test_suite_t tunnel_test_suite;
49
extern test_suite_t player_test_suite;
50
extern test_suite_t dtmf_test_suite;
51
extern test_suite_t offeranswer_test_suite;
52
extern test_suite_t video_test_suite;
jehan's avatar
jehan committed
53
extern test_suite_t multicast_call_test_suite;
54
extern test_suite_t multi_call_test_suite;
55
extern test_suite_t proxy_config_test_suite;
jehan's avatar
jehan committed
56 57 58
#if HAVE_SIPP
extern test_suite_t complex_sip_call_test_suite;
#endif
59
extern int manager_count;
Ghislain MARY's avatar
Ghislain MARY committed
60

Simon Morlat's avatar
Simon Morlat committed
61
extern int liblinphone_tester_ipv6_available(void);
Ghislain MARY's avatar
Ghislain MARY committed
62

63 64 65
/**
 * @brief Tells the tester whether or not to clean the accounts it has created between runs.
 * @details Setting this to 1 will not clear the list of created accounts between successive
66
 * calls to liblinphone_run_tests(). Some testing APIs call this function for *each* test,
67
 * in which case we should keep the accounts that were created for further testing.
68 69
 *
 * You are supposed to manually call liblinphone_tester_clear_account when all the tests are
70
 * finished.
71
 *
72 73 74 75
 * @param keep 1 to keep the accounts in-between runs, 0 to clear them after each run.
 */
extern void liblinphone_tester_keep_accounts( int keep );

76 77 78 79 80 81
/**
 * @brief Tells the test whether to not remove recorded audio/video files after the tests.
 * @details By default recorded files are erased after the test, unless the test is failed.
**/
void liblinphone_tester_keep_recorded_files(int keep);

82 83 84 85 86 87
/**
 * @brief Disable the automatic object leak detection. This is useful because the object leak detector prevents valgrind from seeing the leaks.
 * @details By default object leak detector is enabled.
**/
void liblinphone_tester_disable_leak_detector(int disabled);

88 89 90 91 92
/**
 * @brief Clears the created accounts during the testing session.
 */
extern void liblinphone_tester_clear_accounts(void);

Ghislain MARY's avatar
Ghislain MARY committed
93

94 95 96 97 98
extern const char* test_domain;
extern const char* auth_domain;
extern const char* test_username;
extern const char* test_password;
extern const char* test_route;
99
extern const char* userhostsfile;
jehan's avatar
jehan committed
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128


typedef struct _stats {
	int number_of_LinphoneRegistrationNone;
	int number_of_LinphoneRegistrationProgress ;
	int number_of_LinphoneRegistrationOk ;
	int number_of_LinphoneRegistrationCleared ;
	int number_of_LinphoneRegistrationFailed ;
	int number_of_auth_info_requested ;


	int number_of_LinphoneCallIncomingReceived;
	int number_of_LinphoneCallOutgoingInit;
	int number_of_LinphoneCallOutgoingProgress;
	int number_of_LinphoneCallOutgoingRinging;
	int number_of_LinphoneCallOutgoingEarlyMedia;
	int number_of_LinphoneCallConnected;
	int number_of_LinphoneCallStreamsRunning;
	int number_of_LinphoneCallPausing;
	int number_of_LinphoneCallPaused;
	int number_of_LinphoneCallResuming;
	int number_of_LinphoneCallRefered;
	int number_of_LinphoneCallError;
	int number_of_LinphoneCallEnd;
	int number_of_LinphoneCallPausedByRemote;
	int number_of_LinphoneCallUpdatedByRemote;
	int number_of_LinphoneCallIncomingEarlyMedia;
	int number_of_LinphoneCallUpdating;
	int number_of_LinphoneCallReleased;
129 130
	int number_of_LinphoneCallEarlyUpdatedByRemote;
	int number_of_LinphoneCallEarlyUpdating;
jehan's avatar
jehan committed
131

jehan's avatar
jehan committed
132
	int number_of_LinphoneTransferCallOutgoingInit;
133 134 135 136 137
	int number_of_LinphoneTransferCallOutgoingProgress;
	int number_of_LinphoneTransferCallOutgoingRinging;
	int number_of_LinphoneTransferCallOutgoingEarlyMedia;
	int number_of_LinphoneTransferCallConnected;
	int number_of_LinphoneTransferCallStreamsRunning;
138
	int number_of_LinphoneTransferCallError;
jehan's avatar
jehan committed
139

jehan's avatar
jehan committed
140
	int number_of_LinphoneMessageReceived;
jehan's avatar
jehan committed
141
	int number_of_LinphoneMessageReceivedWithFile;
142 143 144 145 146
	int number_of_LinphoneMessageReceivedLegacy;
	int number_of_LinphoneMessageExtBodyReceived;
	int number_of_LinphoneMessageInProgress;
	int number_of_LinphoneMessageDelivered;
	int number_of_LinphoneMessageNotDelivered;
Simon Morlat's avatar
Simon Morlat committed
147
	int number_of_LinphoneMessageFileTransferDone;
148 149
	int number_of_LinphoneIsComposingActiveReceived;
	int number_of_LinphoneIsComposingIdleReceived;
johan's avatar
johan committed
150
	int progress_of_LinphoneFileTransfer;
151

jehan's avatar
jehan committed
152
	int number_of_IframeDecoded;
jehan's avatar
jehan committed
153 154 155

	int number_of_NewSubscriptionRequest;
	int number_of_NotifyReceived;
Ghislain MARY's avatar
Ghislain MARY committed
156
	int number_of_NotifyPresenceReceived;
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
	int number_of_LinphonePresenceActivityOffline;
	int number_of_LinphonePresenceActivityOnline;
	int number_of_LinphonePresenceActivityAppointment;
	int number_of_LinphonePresenceActivityAway;
	int number_of_LinphonePresenceActivityBreakfast;
	int number_of_LinphonePresenceActivityBusy;
	int number_of_LinphonePresenceActivityDinner;
	int number_of_LinphonePresenceActivityHoliday;
	int number_of_LinphonePresenceActivityInTransit;
	int number_of_LinphonePresenceActivityLookingForWork;
	int number_of_LinphonePresenceActivityLunch;
	int number_of_LinphonePresenceActivityMeal;
	int number_of_LinphonePresenceActivityMeeting;
	int number_of_LinphonePresenceActivityOnThePhone;
	int number_of_LinphonePresenceActivityOther;
	int number_of_LinphonePresenceActivityPerformance;
	int number_of_LinphonePresenceActivityPermanentAbsence;
	int number_of_LinphonePresenceActivityPlaying;
	int number_of_LinphonePresenceActivityPresentation;
	int number_of_LinphonePresenceActivityShopping;
	int number_of_LinphonePresenceActivitySleeping;
	int number_of_LinphonePresenceActivitySpectator;
	int number_of_LinphonePresenceActivitySteering;
	int number_of_LinphonePresenceActivityTravel;
	int number_of_LinphonePresenceActivityTV;
	int number_of_LinphonePresenceActivityUnknown;
	int number_of_LinphonePresenceActivityVacation;
	int number_of_LinphonePresenceActivityWorking;
	int number_of_LinphonePresenceActivityWorship;
186
	const LinphonePresenceModel *last_received_presence;
Guillaume BIENKOWSKI's avatar
Guillaume BIENKOWSKI committed
187

188
	int number_of_inforeceived;
189
	LinphoneInfoMessage* last_received_info_message;
jehan's avatar
jehan committed
190

191 192 193 194 195 196
	int number_of_LinphoneSubscriptionIncomingReceived;
	int number_of_LinphoneSubscriptionOutgoingInit;
	int number_of_LinphoneSubscriptionPending;
	int number_of_LinphoneSubscriptionActive;
	int number_of_LinphoneSubscriptionTerminated;
	int number_of_LinphoneSubscriptionError;
197
	int number_of_LinphoneSubscriptionExpiring;
jehan's avatar
jehan committed
198

199 200 201 202 203
	int number_of_LinphonePublishProgress;
	int number_of_LinphonePublishOk;
	int number_of_LinphonePublishExpiring;
	int number_of_LinphonePublishError;
	int number_of_LinphonePublishCleared;
204

205 206 207
	int number_of_LinphoneConfiguringSkipped;
	int number_of_LinphoneConfiguringFailed;
	int number_of_LinphoneConfiguringSuccessful;
jehan's avatar
jehan committed
208 209 210

	int number_of_LinphoneCallEncryptedOn;
	int number_of_LinphoneCallEncryptedOff;
211 212
	int number_of_NetworkReachableTrue;
	int number_of_NetworkReachableFalse;
Simon Morlat's avatar
Simon Morlat committed
213
	int number_of_player_eof;
jehan's avatar
jehan committed
214
	LinphoneChatMessage* last_received_chat_message;
215 216

	char * dtmf_list_received;
217
	int dtmf_count;
218

219
	int number_of_LinphoneCallStatsUpdated;
220
	int number_of_rtcp_sent;
Simon Morlat's avatar
Simon Morlat committed
221 222
	int number_of_rtcp_received; /*total number of rtcp packet received */
	int number_of_rtcp_received_via_mux;/*number of rtcp packet received in rtcp-mux mode*/
223

224
	int number_of_video_windows_created;
225

226
	int number_of_LinphoneFileTransferDownloadSuccessful;
227 228 229
	int number_of_LinphoneCoreLogCollectionUploadStateDelivered;
	int number_of_LinphoneCoreLogCollectionUploadStateNotDelivered;
	int number_of_LinphoneCoreLogCollectionUploadStateInProgress;
230 231 232 233 234 235 236 237
	int audio_download_bandwidth[3];
	int *current_audio_download_bandwidth;
	int audio_upload_bandwidth[3];
	int *current_audio_upload_bandwidth;

	int video_download_bandwidth[3];
	int video_upload_bandwidth[3];
	int current_bandwidth_index;
238

239
	int number_of_rtcp_generic_nack;
jehan's avatar
jehan committed
240
}stats;
Ghislain MARY's avatar
Ghislain MARY committed
241

242

jehan's avatar
jehan committed
243 244 245 246 247
typedef struct _LinphoneCoreManager {
	LinphoneCoreVTable v_table;
	LinphoneCore* lc;
	stats stat;
	LinphoneAddress* identity;
248 249
	LinphoneEvent *lev;
	bool_t decline_subscribe;
jehan's avatar
jehan committed
250
	int number_of_cunit_error_at_creation;
jehan's avatar
jehan committed
251 252
} LinphoneCoreManager;

253 254 255
typedef struct _LinphoneCallTestParams {
	LinphoneCallParams *base;
	bool_t sdp_removal;
256
	bool_t sdp_simulate_error;
257 258
} LinphoneCallTestParams;

259

260
void liblinphone_tester_add_suites(void);
261

262 263
LinphoneCoreManager* linphone_core_manager_init(const char* rc_file);
void linphone_core_manager_start(LinphoneCoreManager *mgr, const char* rc_file, int check_for_proxies);
Simon Morlat's avatar
Simon Morlat committed
264 265
LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, int check_for_proxies);
LinphoneCoreManager* linphone_core_manager_new(const char* rc_file);
266
void linphone_core_manager_stop(LinphoneCoreManager *mgr);
jehan's avatar
jehan committed
267 268 269 270 271
void linphone_core_manager_destroy(LinphoneCoreManager* mgr);

void reset_counters( stats* counters);

void registration_state_changed(struct _LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message);
jehan's avatar
jehan committed
272
void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg);
jehan's avatar
jehan committed
273
void linphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state);
jehan's avatar
jehan committed
274 275
void notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf);
void text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from_address, const char *message);
276
void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage* message);
Ghislain MARY's avatar
Ghislain MARY committed
277
void file_transfer_received(LinphoneChatMessage *message, const LinphoneContent* content, const LinphoneBuffer *buffer);
278 279
LinphoneBuffer * tester_file_transfer_send(LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t size);
LinphoneBuffer * tester_memory_file_transfer_send(LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t size);
280
void file_transfer_progress_indication(LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total);
281
void is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room);
282
void info_message_received(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg);
283
void new_subscription_requested(LinphoneCore *lc, LinphoneFriend *lf, const char *url);
284
void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *ev, LinphoneSubscriptionState state);
285
void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, LinphonePublishState state);
286
void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *eventname, const LinphoneContent *content);
287
void linphone_configuration_status(LinphoneCore *lc, LinphoneConfiguringState status, const char *message);
jehan's avatar
jehan committed
288
void linphone_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token);
289
void dtmf_received(LinphoneCore *lc, LinphoneCall *call, int dtmf);
290
void call_stats_updated(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *stats);
291

jehan's avatar
jehan committed
292 293
LinphoneAddress * create_linphone_address(const char * domain);
bool_t wait_for(LinphoneCore* lc_1, LinphoneCore* lc_2,int* counter,int value);
jehan's avatar
jehan committed
294
bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms);
jehan's avatar
jehan committed
295
bool_t wait_for_until(LinphoneCore* lc_1, LinphoneCore* lc_2,int* counter,int value,int timout_ms);
Ghislain MARY's avatar
Ghislain MARY committed
296

297 298 299 300
bool_t call_with_params(LinphoneCoreManager* caller_mgr
						,LinphoneCoreManager* callee_mgr
						, const LinphoneCallParams *caller_params
						, const LinphoneCallParams *callee_params);
301 302 303 304 305
bool_t call_with_test_params(LinphoneCoreManager* caller_mgr
				,LinphoneCoreManager* callee_mgr
				,const LinphoneCallTestParams *caller_test_params
				,const LinphoneCallTestParams *callee_test_params);

jehan's avatar
jehan committed
306
bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr);
307
bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t change_video_policy);
308
void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2);
309
void disable_all_audio_codecs_except_one(LinphoneCore *lc, const char *mime, int rate);
310
void disable_all_video_codecs_except_one(LinphoneCore *lc, const char *mime);
311
stats * get_stats(LinphoneCore *lc);
312
bool_t transport_supported(LinphoneTransportType transport);
313
LinphoneCoreManager *get_manager(LinphoneCore *lc);
Simon Morlat's avatar
Simon Morlat committed
314 315 316
const char *liblinphone_tester_get_subscribe_content(void);
const char *liblinphone_tester_get_notify_content(void);
void liblinphone_tester_chat_message_state_change(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud);
317
void liblinphone_tester_chat_message_msg_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state);
Simon Morlat's avatar
Simon Morlat committed
318
void liblinphone_tester_check_rtcp(LinphoneCoreManager* caller, LinphoneCoreManager* callee);
319
void liblinphone_tester_clock_start(MSTimeSpec *start);
320
bool_t liblinphone_tester_clock_elapsed(const MSTimeSpec *start, int value_ms);
321 322 323
void linphone_core_manager_check_accounts(LinphoneCoreManager *m);
void account_manager_destroy(void);
LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, const char* file, void* user_data);
324
void liblinphone_tester_enable_ipv6(bool_t enabled);
Simon Morlat's avatar
Simon Morlat committed
325
void linphone_call_iframe_decoded_cb(LinphoneCall *call,void * user_data);
jehan's avatar
jehan committed
326 327
void call_paused_resumed_base(bool_t multicast);
void simple_call_base(bool_t enable_multicast_recv_side);
328
void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel, const char *marie_rc, const char *pauline_rc);
jehan's avatar
jehan committed
329
void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel);
330 331
bool_t call_with_caller_params(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr, const LinphoneCallParams *params);
bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCoreManager* mgr_2,LinphoneCall* call_2);
332
void compare_files(const char *path1, const char *path2);
333
void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir);
334

Simon Morlat's avatar
Simon Morlat committed
335
extern const MSAudioDiffParams audio_cmp_params;
336

337 338 339 340
/*
 * this function return max value in the last 3 seconds*/
int linphone_core_manager_get_max_audio_down_bw(const LinphoneCoreManager *mgr);
int linphone_core_manager_get_max_audio_up_bw(const LinphoneCoreManager *mgr);
Simon Morlat's avatar
Simon Morlat committed
341 342 343
int linphone_core_manager_get_mean_audio_down_bw(const LinphoneCoreManager *mgr);
int linphone_core_manager_get_mean_audio_up_bw(const LinphoneCoreManager *mgr);

344
void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled);
Ghislain MARY's avatar
Ghislain MARY committed
345

346 347
void liblinphone_tester_before_each(void);
void liblinphone_tester_after_each(void);
Ghislain MARY's avatar
Ghislain MARY committed
348 349
void liblinphone_tester_init(void(*ftester_printf)(int level, const char *fmt, va_list args));
void liblinphone_tester_uninit(void);
350
int liblinphone_tester_set_log_file(const char *filename);
351
bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee, LinphoneIceState state);
Ghislain MARY's avatar
Ghislain MARY committed
352

353 354
extern const char *liblinphone_tester_mire_id;

jehan's avatar
jehan committed
355 356 357 358
FILE *sip_start(const char *senario, const char* dest_username, LinphoneAddress* dest_addres);

		

Ghislain MARY's avatar
Ghislain MARY committed
359 360 361 362

#ifdef __cplusplus
};
#endif
363 364

#endif /* LIBLINPHONE_TESTER_H_ */