call_push_incoming_tester.c 10.51 KiB
/*
 * Copyright (c) 2010-2022 Belledonne Communications SARL.
 * This file is part of Liblinphone
 * (see https://gitlab.linphone.org/BC/public/liblinphone).
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero 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 Affero General Public License for more details.
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "belle-sip/sipstack.h"
#include "liblinphone_tester.h"
#include "linphone/core.h"
#include "linphone/lpconfig.h"
#include "mediastreamer2/msutils.h"
#include "tester_utils.h"
#include <bctoolbox/defs.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifdef _WIN32
#define unlink _unlink
#ifndef F_OK
#define F_OK 00 /*visual studio does not define F_OK*/
#endif
#endif
// prototype definition for call_recording()
#ifdef __ANDROID__
#ifdef HAVE_OPENH264
extern void libmsopenh264_init(MSFactory *factory);
#endif
#endif
void simple_push_call_base(bool_t push, bool_t canceled, bool_t decline, bool_t push_early, bool_t network_change) {
	LinphoneCoreManager *marie;
	LinphoneCoreManager *pauline;
	// const LinphoneAddress *from;
	LinphoneCall *pauline_call;
	LinphoneCall *marie_call;
	bool_t did_receive_call;
	marie = linphone_core_manager_new("marie_rc");
	pauline = linphone_core_manager_new("pauline_rc");
	if (push) {
		linphone_core_enter_background(pauline->lc);
	BC_ASSERT_NOT_EQUAL(marie->stat.number_of_LinphoneCoreFirstCallStarted, 1, int, "%d");
	BC_ASSERT_NOT_EQUAL(pauline->stat.number_of_LinphoneCoreFirstCallStarted, 1, int, "%d");
	BC_ASSERT_NOT_EQUAL(marie->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d");
	BC_ASSERT_NOT_EQUAL(pauline->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d");
	BC_ASSERT_PTR_NOT_NULL(marie_call = linphone_core_invite_address(marie->lc, pauline->identity));
	stats initial_caller = marie->stat;
	stats initial_callee = pauline->stat;
	const char *callid = linphone_call_log_get_call_id(linphone_call_get_call_log(marie_call));
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
if (push) { // simulate pushkit linphone_core_start_process_remote_notification(pauline, callid); if (network_change) { linphone_core_set_network_reachable(pauline->lc, FALSE); linphone_core_set_network_reachable(pauline->lc, TRUE); } BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallPushIncomingReceived, 1, int, "%d"); pauline_call = linphone_core_get_current_call(pauline->lc); BC_ASSERT_PTR_NOT_NULL(pauline_call); if (push_early) { if (canceled) { linphone_core_terminate_all_calls(marie->lc); BC_ASSERT_TRUE( wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallEnd, 1, 20000)); BC_ASSERT_TRUE( wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneCallEnd, 1, 20000)); BC_ASSERT_TRUE( wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallReleased, 1, 20000)); BC_ASSERT_TRUE( wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneCallReleased, 1, 20000)); goto end; } else if (decline) { linphone_core_terminate_all_calls(pauline->lc); // test ios simulator needs more time, 3s plus for connectng the network did_receive_call = wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallIncomingReceived, initial_callee.number_of_LinphoneCallIncomingReceived + 1, 12000); if (!push_early) { BC_ASSERT_EQUAL(did_receive_call, 1, int, "%d"); } wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallEnd, 1, 3000); wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneCallEnd, 1, 3000); wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallReleased, 1, 3000); wait_for_until(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneCallReleased, 1, 3000); goto end; } else { goto ok; } } } BC_ASSERT_PTR_NULL(linphone_call_get_remote_params( marie_call)); /*assert that remote params are NULL when no response is received yet*/ // test ios simulator needs more time, 3s plus for connectng the network did_receive_call = wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallIncomingReceived, initial_callee.number_of_LinphoneCallIncomingReceived + 1, 12000); BC_ASSERT_EQUAL(did_receive_call, 1, int, "%d"); if (!did_receive_call) goto end; BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCoreFirstCallStarted, 1, int, "%d"); BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCoreFirstCallStarted, 1, int, "%d"); BC_ASSERT_NOT_EQUAL(marie->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d"); BC_ASSERT_NOT_EQUAL(pauline->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d"); if (canceled) { end_call(marie, pauline); goto end; } else if (decline) { end_call(pauline, marie); goto end; }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
pauline_call = linphone_core_get_current_call(pauline->lc); BC_ASSERT_PTR_NOT_NULL(pauline_call); ok: linphone_call_accept(pauline_call); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallConnected, initial_callee.number_of_LinphoneCallConnected + 1)); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneCallConnected, initial_caller.number_of_LinphoneCallConnected + 1)); liblinphone_tester_check_rtcp(marie, pauline); end_call(marie, pauline); end: BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d"); BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCoreLastCallEnded, 1, int, "%d"); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); } static void simple_accept_call(void) { simple_push_call_base(FALSE, FALSE, FALSE, FALSE, FALSE); } static void push_accept_call(void) { simple_push_call_base(TRUE, FALSE, FALSE, FALSE, FALSE); } static void push_accept_call_with_network_change(void) { simple_push_call_base(TRUE, FALSE, FALSE, FALSE, TRUE); } static void push_early_accept_call(void) { simple_push_call_base(TRUE, FALSE, FALSE, TRUE, FALSE); } static void simple_canceled_call(void) { simple_push_call_base(FALSE, TRUE, FALSE, FALSE, FALSE); } static void push_canceled_call(void) { simple_push_call_base(TRUE, TRUE, FALSE, FALSE, FALSE); } static void push_early_canceled_call(void) { simple_push_call_base(TRUE, TRUE, FALSE, TRUE, FALSE); } static void simple_decline_call(void) { simple_push_call_base(FALSE, FALSE, TRUE, FALSE, FALSE); } static void push_decline_call(void) { simple_push_call_base(TRUE, FALSE, TRUE, FALSE, FALSE); } static void push_early_decline_call(void) { simple_push_call_base(TRUE, FALSE, TRUE, TRUE, FALSE); } #define TEST_GROUP_ID "test group id" void shared_core_accpet_call(void) { LinphoneCall *marie_call; bool_t did_receive_call; LinphoneCoreManager *pauline_main; LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline_ex = linphone_core_manager_create_shared("pauline_rc", TEST_GROUP_ID, FALSE, NULL);
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
linphone_core_manager_start(pauline_ex, TRUE); BC_ASSERT_PTR_NOT_NULL(marie_call = linphone_core_invite_address(marie->lc, pauline_ex->identity)); did_receive_call = wait_for_until(pauline_ex->lc, marie->lc, &pauline_ex->stat.number_of_LinphoneCallIncomingReceived, 1, 12000); BC_ASSERT_EQUAL(did_receive_call, 1, int, "%d"); // Send 503 to keep the call in remote LinphoneErrorInfo *ei = linphone_error_info_new(); linphone_error_info_set(ei, "SIP", LinphoneReasonUnknown, 503, "Media Lost", NULL); linphone_call_terminate_with_error_info(linphone_core_get_current_call(pauline_ex->lc), ei); linphone_error_info_unref(ei); BC_ASSERT_TRUE(wait_for_until(pauline_ex->lc, marie->lc, &pauline_ex->stat.number_of_LinphoneCallEnd, 1, 2000)); BC_ASSERT_TRUE( wait_for_until(pauline_ex->lc, marie->lc, &pauline_ex->stat.number_of_LinphoneCallReleased, 1, 2000)); // start main core, and receive again the same call pauline_main = linphone_core_manager_create_shared("", TEST_GROUP_ID, TRUE, pauline_ex); linphone_core_manager_start(pauline_main, TRUE); did_receive_call = wait_for_until(pauline_main->lc, marie->lc, &pauline_main->stat.number_of_LinphoneCallIncomingReceived, 1, 5000); BC_ASSERT_EQUAL(did_receive_call, 1, int, "%d"); if (!did_receive_call) goto end; linphone_call_accept(linphone_core_get_current_call(pauline_main->lc)); BC_ASSERT_TRUE(wait_for(pauline_main->lc, marie->lc, &pauline_main->stat.number_of_LinphoneCallConnected, 1)); BC_ASSERT_TRUE(wait_for(pauline_main->lc, marie->lc, &marie->stat.number_of_LinphoneCallConnected, 1)); wait_for_until(pauline_main->lc, marie->lc, NULL, 5, 500); end_call(marie, pauline_main); end: if (pauline_main) linphone_core_manager_destroy(pauline_main); linphone_core_manager_destroy(pauline_ex); linphone_core_manager_destroy(marie); } test_t push_incoming_call_tests[] = { TEST_NO_TAG("Simple accept call", simple_accept_call), TEST_NO_TAG("Push accept call", push_accept_call), TEST_NO_TAG("Push accept call with network change", push_accept_call_with_network_change), TEST_NO_TAG("Push early accept call", push_early_accept_call), TEST_NO_TAG("Simple canceled call", simple_canceled_call), TEST_NO_TAG("Push canceled call", push_canceled_call), TEST_NO_TAG("Push early canceled call", push_early_canceled_call), TEST_NO_TAG("Simple decline call", simple_decline_call), TEST_NO_TAG("Push decline call", push_decline_call), TEST_NO_TAG("Push early decline call", push_early_decline_call), TEST_NO_TAG("Shared core accept call", shared_core_accpet_call), }; test_suite_t push_incoming_call_test_suite = {"Push Incoming Call", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, sizeof(push_incoming_call_tests) / sizeof(push_incoming_call_tests[0]), push_incoming_call_tests, 0};