From 9bba7a0434d0967d5dd76b8afc7783ea2edad0cf Mon Sep 17 00:00:00 2001 From: mannol Date: Wed, 29 Apr 2015 01:01:25 +0200 Subject: Done --- auto_tests/toxav_many_test.c | 459 +++++++++++++------------------------------ 1 file changed, 137 insertions(+), 322 deletions(-) (limited to 'auto_tests/toxav_many_test.c') diff --git a/auto_tests/toxav_many_test.c b/auto_tests/toxav_many_test.c index 4287118f..ef59b2b2 100644 --- a/auto_tests/toxav_many_test.c +++ b/auto_tests/toxav_many_test.c @@ -14,6 +14,7 @@ #include #include "../toxcore/tox.h" +#include "../toxcore/util.h" #include "../toxcore/logger.h" #include "../toxcore/crypto_core.h" #include "../toxav/toxav.h" @@ -26,359 +27,177 @@ #define c_sleep(x) usleep(1000*x) #endif -pthread_mutex_t muhmutex; -typedef enum _CallStatus { - none, - InCall, - Ringing, - Ended, - Rejected, - Canceled +typedef struct { + bool incoming; + uint32_t state; + +} CallControl; -} CallStatus; -typedef struct _Party { - CallStatus status; - ToxAv *av; - int id; -} Party; - -typedef struct _ACall { - pthread_t tid; - int idx; - - Party Caller; - Party Callee; -} ACall; - -typedef struct _Status { - ACall calls[3]; /* Make 3 calls for this test */ -} Status; - -Status status_control; - -void accept_friend_request(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata) -{ - if (length == 7 && memcmp("gentoo", data, 7) == 0) { - tox_friend_add_norequest(m, public_key, 0); - } -} - - -/******************************************************************************/ -void callback_recv_invite ( void *av, int32_t call_index, void *_arg ) +/** + * Callbacks + */ +void t_toxav_call_cb(ToxAV *av, uint32_t friend_number, bool audio_enabled, bool video_enabled, void *user_data) { - Status *cast = _arg; - cast->calls[call_index].Callee.status = Ringing; + printf("Handling CALL callback\n"); + ((CallControl*)user_data)->incoming = true; } -void callback_recv_ringing ( void *av, int32_t call_index, void *_arg ) +void t_toxav_call_state_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_data) { - Status *cast = _arg; - cast->calls[call_index].Caller.status = Ringing; + printf("Handling CALL STATE callback: %d\n", state); + ((CallControl*)user_data)->state = state; } -void callback_call_ended ( void *av, int32_t call_index, void *_arg ) +void t_toxav_receive_video_frame_cb(ToxAV *av, uint32_t friend_number, + uint16_t width, uint16_t height, + uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, + void *user_data) { - Status *cast = _arg; - - if (av == cast->calls[call_index].Caller.av) - cast->calls[call_index].Caller.status = Ended; - else - cast->calls[call_index].Callee.status = Ended; + (void) av; + (void) friend_number; + (void) width; + (void) height; + (void) y; + (void) u; + (void) v; + (void) ystride; + (void) ustride; + (void) vstride; + (void) user_data; } -void callback_call_started ( void *av, int32_t call_index, void *_arg ) +void t_toxav_receive_audio_frame_cb(ToxAV *av, uint32_t friend_number, + int16_t const *pcm, + size_t sample_count, + uint8_t channels, + uint32_t sampling_rate, + void *user_data) { - Status *cast = _arg; - - if (av == cast->calls[call_index].Caller.av) - cast->calls[call_index].Caller.status = InCall; - else - cast->calls[call_index].Callee.status = InCall; + (void) av; + (void) friend_number; + (void) pcm; + (void) sample_count; + (void) channels; + (void) sampling_rate; + (void) user_data; } -void callback_call_canceled ( void *av, int32_t call_index, void *_arg ) +void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata) { + if (length == 7 && memcmp("gentoo", data, 7) == 0) { + assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); + } } -void callback_call_rejected ( void *av, int32_t call_index, void *_arg ) -{ - Status *cast = _arg; - cast->calls[call_index].Caller.status = Rejected; -} - -void callback_requ_timeout ( void *av, int32_t call_index, void *_arg ) -{ - ck_assert_msg(0, "No answer!"); -} - -void callback_audio (void *agent, int32_t call_idx, const int16_t *PCM, uint16_t size, void *data) -{} -void callback_video (void *agent, int32_t call_idx, const vpx_image_t *img, void *data) -{} -void register_callbacks(ToxAv *av, void *data) +/** + * Iterate helper + */ +ToxAV* setup_av_instance(Tox* tox, CallControl *CC) { - toxav_register_callstate_callback(av, callback_call_started, av_OnStart, data); - toxav_register_callstate_callback(av, callback_call_canceled, av_OnCancel, data); - toxav_register_callstate_callback(av, callback_call_rejected, av_OnReject, data); - toxav_register_callstate_callback(av, callback_call_ended, av_OnEnd, data); - toxav_register_callstate_callback(av, callback_recv_invite, av_OnInvite, data); - toxav_register_callstate_callback(av, callback_recv_ringing, av_OnRinging, data); - toxav_register_callstate_callback(av, callback_requ_timeout, av_OnRequestTimeout, data); - - - toxav_register_audio_callback(av, callback_audio, NULL); - toxav_register_video_callback(av, callback_video, NULL); + TOXAV_ERR_NEW error; + + ToxAV* av = toxav_new(tox, &error); + assert(error == TOXAV_ERR_NEW_OK); + + toxav_callback_call(av, t_toxav_call_cb, CC); + toxav_callback_call_state(av, t_toxav_call_state_cb, CC); + toxav_callback_receive_video_frame(av, t_toxav_receive_video_frame_cb, CC); + toxav_callback_receive_audio_frame(av, t_toxav_receive_audio_frame_cb, CC); + + return av; } -/*************************************************************************************************/ - -int call_running[3]; - -void *in_thread_call (void *arg) +void* call_thread(ToxAV* Alice, ToxAV* Bob) { -#define call_print(call, what, args...) printf("[%d] " what "\n", call, ##args) - - ACall *this_call = arg; - uint64_t start = 0; - int step = 0; - int call_idx; - - const int frame_size = (av_DefaultSettings.audio_sample_rate * av_DefaultSettings.audio_frame_duration / 1000); - int16_t sample_payload[frame_size]; - randombytes((uint8_t *)sample_payload, sizeof(int16_t) * frame_size); - - uint8_t prepared_payload[RTP_PAYLOAD_SIZE]; - - register_callbacks(this_call->Caller.av, &status_control); - register_callbacks(this_call->Callee.av, arg); - - /* NOTE: CALLEE WILL ALWAHYS NEED CALL_IDX == 0 */ - pthread_mutex_lock(&muhmutex); - - while (call_running[this_call->idx]) { - - pthread_mutex_unlock(&muhmutex); - - switch ( step ) { - case 0: /* CALLER */ - toxav_call(this_call->Caller.av, &call_idx, this_call->Callee.id, &av_DefaultSettings, 10); - call_print(call_idx, "Calling ..."); - step++; - break; - - case 1: /* CALLEE */ - pthread_mutex_lock(&muhmutex); - - if (this_call->Caller.status == Ringing) { - call_print(call_idx, "Callee answers ..."); - pthread_mutex_unlock(&muhmutex); - toxav_answer(this_call->Callee.av, 0, &av_DefaultSettings); - step++; - start = time(NULL); - pthread_mutex_lock(&muhmutex); - } - - pthread_mutex_unlock(&muhmutex); - break; - - case 2: /* Rtp transmission */ - pthread_mutex_lock(&muhmutex); - - if (this_call->Caller.status == InCall) { /* I think this is okay */ - call_print(call_idx, "Sending rtp ..."); - pthread_mutex_unlock(&muhmutex); - - c_sleep(1000); /* We have race condition here */ - toxav_prepare_transmission(this_call->Callee.av, 0, 1); - toxav_prepare_transmission(this_call->Caller.av, call_idx, 1); - - int payload_size = toxav_prepare_audio_frame(this_call->Caller.av, call_idx, prepared_payload, RTP_PAYLOAD_SIZE, - sample_payload, frame_size); - - if ( payload_size < 0 ) { - ck_assert_msg ( 0, "Failed to encode payload" ); - } - - - while (time(NULL) - start < 10) { /* 10 seconds */ - /* Both send */ - toxav_send_audio(this_call->Caller.av, call_idx, prepared_payload, payload_size); - - toxav_send_audio(this_call->Callee.av, 0, prepared_payload, payload_size); - - /* Both receive */ - int16_t storage[RTP_PAYLOAD_SIZE]; - int recved; - - c_sleep(20); - } - - step++; /* This terminates the loop */ - - pthread_mutex_lock(&muhmutex); - toxav_kill_transmission(this_call->Callee.av, 0); - toxav_kill_transmission(this_call->Caller.av, call_idx); - pthread_mutex_unlock(&muhmutex); - - /* Call over CALLER hangs up */ - toxav_hangup(this_call->Caller.av, call_idx); - call_print(call_idx, "Hanging up ..."); - - pthread_mutex_lock(&muhmutex); - } - - pthread_mutex_unlock(&muhmutex); - break; - - case 3: /* Wait for Both to have status ended */ - pthread_mutex_lock(&muhmutex); - - if (this_call->Caller.status == Ended) { - pthread_mutex_unlock(&muhmutex); - c_sleep(1000); /* race condition */ - pthread_mutex_lock(&muhmutex); - this_call->Callee.status = Ended; - call_running[this_call->idx] = 0; - } - - pthread_mutex_unlock(&muhmutex); - - break; - - } - - c_sleep(20); - - pthread_mutex_lock(&muhmutex); - } - - pthread_mutex_unlock(&muhmutex); - call_print(call_idx, "Call ended successfully!"); pthread_exit(NULL); } - - - - START_TEST(test_AV_three_calls) -// void test_AV_three_calls() { - long long unsigned int cur_time = time(NULL); - Tox *bootstrap_node = tox_new(0, 0, 0, 0); - Tox *caller = tox_new(0, 0, 0, 0); - Tox *callees[3] = { - tox_new(0, 0, 0, 0), - tox_new(0, 0, 0, 0), - tox_new(0, 0, 0, 0), - }; - - - ck_assert_msg(bootstrap_node != NULL, "Failed to create bootstrap node"); - + Tox* Alice, *bootstrap, *Bobs[3]; + ToxAV* AliceAV, *BobsAV[3]; + + CallControl AliceCC[3], BobsCC[3]; + int i = 0; - - for (; i < 3; i ++) { - ck_assert_msg(callees[i] != NULL, "Failed to create 3 tox instances"); - } - - for ( i = 0; i < 3; i ++ ) { - uint32_t to_compare = 974536; - tox_callback_friend_request(callees[i], accept_friend_request, &to_compare); - uint8_t address[TOX_ADDRESS_SIZE]; - tox_self_get_address(callees[i], address); - - uint32_t test = tox_friend_add(caller, address, (uint8_t *)"gentoo", 7, 0); - ck_assert_msg( test == i, "Failed to add friend error code: %i", test); + { + TOX_ERR_NEW error; + + bootstrap = tox_new(NULL, NULL, 0, &error); + assert(error == TOX_ERR_NEW_OK); + + Alice = tox_new(NULL, NULL, 0, &error); + assert(error == TOX_ERR_NEW_OK); + + for (; i < 3; i ++) { + BobsAV[i] = tox_new(NULL, NULL, 0, &error); + assert(error == TOX_ERR_NEW_OK); + } } - + + printf("Created 5 instances of Tox\n"); + printf("Preparing network...\n"); + long long unsigned int cur_time = time(NULL); + + uint32_t to_compare = 974536; + uint8_t address[TOX_ADDRESS_SIZE]; + + tox_callback_friend_request(Alice, t_accept_friend_request_cb, &to_compare); + tox_self_get_address(Alice, address); + + + assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + uint8_t off = 1; - + while (1) { - tox_iterate(bootstrap_node); - tox_iterate(caller); - - for (i = 0; i < 3; i ++) { - tox_iterate(callees[i]); - } - - - if (tox_self_get_connection_status(bootstrap_node) && - tox_self_get_connection_status(caller) && - tox_self_get_connection_status(callees[0]) && - tox_self_get_connection_status(callees[1]) && - tox_self_get_connection_status(callees[2]) && off) { + tox_iterate(bootstrap); + tox_iterate(Alice); + tox_iterate(Bobs[0]); + tox_iterate(Bobs[1]); + tox_iterate(Bobs[2]); + + if (tox_self_get_connection_status(bootstrap) && + tox_self_get_connection_status(Alice) && + tox_self_get_connection_status(Bobs[0]) && + tox_self_get_connection_status(Bobs[1]) && + tox_self_get_connection_status(Bobs[2]) && off) { printf("Toxes are online, took %llu seconds\n", time(NULL) - cur_time); off = 0; } - - - if (tox_friend_get_connection_status(caller, 0, 0) && - tox_friend_get_connection_status(caller, 1, 0) && - tox_friend_get_connection_status(caller, 2, 0) ) + + if (tox_friend_get_connection_status(Alice, 0, NULL) == TOX_CONNECTION_UDP && + tox_friend_get_connection_status(Alice, 1, NULL) == TOX_CONNECTION_UDP && + tox_friend_get_connection_status(Alice, 2, NULL) == TOX_CONNECTION_UDP && + tox_friend_get_connection_status(Bobs[0], 0, NULL) == TOX_CONNECTION_UDP && + tox_friend_get_connection_status(Bobs[1], 0, NULL) == TOX_CONNECTION_UDP && + tox_friend_get_connection_status(Bobs[2], 0, NULL) == TOX_CONNECTION_UDP) break; - + c_sleep(20); } - - printf("All set after %llu seconds! Starting call...\n", time(NULL) - cur_time); - - ToxAv *uniqcallerav = toxav_new(caller, 3); - + + AliceAV = setup_av_instance(Alice, &AliceCC); + BobsAV[0] = setup_av_instance(Bobs[0], &BobsCC[0]); + BobsAV[1] = setup_av_instance(Bobs[1], &BobsCC[1]); + BobsAV[2] = setup_av_instance(Bobs[2], &BobsCC[2]); + + printf("Created 4 instances of ToxAV\n"); + printf("All set after %llu seconds!\n", time(NULL) - cur_time); + + + + tox_kill(bootstrap); + tox_kill(Alice); + toxav_kill(AliceAV); + for (i = 0; i < 3; i ++) { - status_control.calls[i].idx = i; - - status_control.calls[i].Caller.av = uniqcallerav; - status_control.calls[i].Caller.id = 0; - status_control.calls[i].Caller.status = none; - - status_control.calls[i].Callee.av = toxav_new(callees[i], 1); - status_control.calls[i].Callee.id = i; - status_control.calls[i].Callee.status = none; + tox_kill(Bobs[i]); + toxav_kill(BobsAV[i]); } - - pthread_mutex_init(&muhmutex, NULL); - - for ( i = 0; i < 3; i++ ) { - call_running[i] = 1; - pthread_create(&status_control.calls[i].tid, NULL, in_thread_call, &status_control.calls[i]); - } - - /* Now start 3 calls and they'll run for 10 s */ - - for ( i = 0; i < 3; i++ ) - pthread_detach(status_control.calls[i].tid); - - while (call_running[0] || call_running[1] || call_running[2]) { - pthread_mutex_lock(&muhmutex); - - tox_iterate(bootstrap_node); - tox_iterate(caller); - tox_iterate(callees[0]); - tox_iterate(callees[1]); - tox_iterate(callees[2]); - - for ( i = 0; i < 3; i++ ) - toxav_do(status_control.calls[0].Caller.av); - - toxav_do(status_control.calls[0].Callee.av); - toxav_do(status_control.calls[1].Callee.av); - toxav_do(status_control.calls[2].Callee.av); - - pthread_mutex_unlock(&muhmutex); - c_sleep(20); - } - - toxav_kill(status_control.calls[0].Caller.av); - toxav_kill(status_control.calls[0].Callee.av); - toxav_kill(status_control.calls[1].Callee.av); - toxav_kill(status_control.calls[2].Callee.av); - - tox_kill(bootstrap_node); - tox_kill(caller); - - for ( i = 0; i < 3; i ++) - tox_kill(callees[i]); - + + printf("\nTest successful!\n"); } END_TEST @@ -410,8 +229,4 @@ int main(int argc, char *argv[]) srunner_free(test_runner); return number_failed; - -// test_AV_three_calls(); - -// return 0; } -- cgit v1.2.3