diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dc9d20c..58979a34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -417,6 +417,7 @@ auto_test(encryptsave) auto_test(messenger) auto_test(network) auto_test(onion) +auto_test(save_friend) auto_test(skeleton) auto_test(tox) auto_test(tox_many) diff --git a/auto_tests/save_friend_test.c b/auto_tests/save_friend_test.c new file mode 100644 index 00000000..db59a24a --- /dev/null +++ b/auto_tests/save_friend_test.c @@ -0,0 +1,128 @@ +/* Auto Tests: Save and load friends. + */ + +#include "../toxcore/tox.h" + +#include +#include +#include +#include + +#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) +#include +#define c_sleep(x) Sleep(1*x) +#else +#include +#define c_sleep(x) usleep(1000*x) +#endif + +struct test_data { + uint8_t name[TOX_MAX_NAME_LENGTH]; + uint8_t status_message[TOX_MAX_STATUS_MESSAGE_LENGTH]; + bool received_name; + bool received_status_message; +}; + +static void set_random(Tox *m, bool (*setter)(Tox *, const uint8_t *, size_t, TOX_ERR_SET_INFO *), size_t length) +{ + uint8_t text[length]; + uint32_t i; + + for (i = 0; i < length; ++i) { + text[i] = rand(); + } + + setter(m, text, sizeof(text), 0); +} + +void namechange_callback(Tox *tox, uint32_t friend_number, const uint8_t *name, size_t length, void *user_data) +{ + struct test_data *to_compare = (struct test_data *)user_data; + memcpy(to_compare->name, name, length); + to_compare->received_name = true; +} + +void statuschange_callback(Tox *tox, uint32_t friend_number, const uint8_t *message, size_t length, void *user_data) +{ + struct test_data *to_compare = (struct test_data *)user_data; + memcpy(to_compare->status_message, message, length); + to_compare->received_status_message = true; +} + +int main(int argc, char *argv[]) +{ + Tox *tox1 = tox_new(tox_options_new(NULL), 0); + Tox *tox2 = tox_new(tox_options_new(NULL), 0); + + struct test_data to_compare = { { 0 } }; + + uint8_t public_key[TOX_PUBLIC_KEY_SIZE]; + tox_self_get_public_key(tox1, public_key); + tox_friend_add_norequest(tox2, public_key, NULL); + tox_self_get_public_key(tox2, public_key); + tox_friend_add_norequest(tox1, public_key, NULL); + + uint8_t reference_name[TOX_MAX_NAME_LENGTH] = { 0 }; + uint8_t reference_status[TOX_MAX_STATUS_MESSAGE_LENGTH] = { 0 }; + + set_random(tox1, tox_self_set_name, TOX_MAX_NAME_LENGTH); + set_random(tox2, tox_self_set_name, TOX_MAX_NAME_LENGTH); + set_random(tox1, tox_self_set_status_message, TOX_MAX_STATUS_MESSAGE_LENGTH); + set_random(tox2, tox_self_set_status_message, TOX_MAX_STATUS_MESSAGE_LENGTH); + + tox_self_get_name(tox2, reference_name); + tox_self_get_status_message(tox2, reference_status); + + tox_callback_friend_name(tox1, namechange_callback); + tox_callback_friend_status_message(tox1, statuschange_callback); + + while (true) { + if (tox_self_get_connection_status(tox1) && + tox_self_get_connection_status(tox2) && + tox_friend_get_connection_status(tox1, 0, 0) == TOX_CONNECTION_UDP) { + printf("Connected.\n"); + break; + } + + tox_iterate(tox1, &to_compare); + tox_iterate(tox2, NULL); + + c_sleep(tox_iteration_interval(tox1)); + } + + while (true) { + if (to_compare.received_name && to_compare.received_status_message) { + printf("Exchanged names and status messages.\n"); + break; + } + + tox_iterate(tox1, &to_compare); + tox_iterate(tox2, NULL); + + c_sleep(tox_iteration_interval(tox1)); + } + + size_t save_size = tox_get_savedata_size(tox1); + uint8_t savedata[save_size]; + tox_get_savedata(tox1, savedata); + + struct Tox_Options options; + tox_options_default(&options); + options.savedata_type = TOX_SAVEDATA_TYPE_TOX_SAVE; + options.savedata_data = savedata; + options.savedata_length = save_size; + + Tox *tox_to_compare = tox_new(&options, 0); + + tox_friend_get_name(tox_to_compare, 0, to_compare.name, 0); + tox_friend_get_status_message(tox_to_compare, 0, to_compare.status_message, 0); + + assert(memcmp(reference_name, to_compare.name, TOX_MAX_NAME_LENGTH) == 0); + assert(memcmp(reference_status, to_compare.status_message, TOX_MAX_STATUS_MESSAGE_LENGTH) == 0); + + tox_kill(tox1); + tox_kill(tox2); + tox_kill(tox_to_compare); + + return 0; +} diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index d906e178..79f28742 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c @@ -2663,9 +2663,9 @@ static uint32_t friend_size() data++; // padding VALUE_MEMBER(info_size); ARRAY_MEMBER(name); - data++; // padding VALUE_MEMBER(name_length); ARRAY_MEMBER(statusmessage); + data++; // padding VALUE_MEMBER(statusmessage_length); VALUE_MEMBER(userstatus); data += 3; // padding @@ -2700,9 +2700,9 @@ static uint8_t *friend_save(const struct SAVED_FRIEND *temp, uint8_t *data) data++; // padding VALUE_MEMBER(info_size); ARRAY_MEMBER(name); - data++; // padding VALUE_MEMBER(name_length); ARRAY_MEMBER(statusmessage); + data++; // padding VALUE_MEMBER(statusmessage_length); VALUE_MEMBER(userstatus); data += 3; // padding @@ -2784,9 +2784,9 @@ static const uint8_t *friend_load(struct SAVED_FRIEND *temp, const uint8_t *data data++; // padding VALUE_MEMBER(info_size); ARRAY_MEMBER(name); - data++; // padding VALUE_MEMBER(name_length); ARRAY_MEMBER(statusmessage); + data++; // padding VALUE_MEMBER(statusmessage_length); VALUE_MEMBER(userstatus); data += 3; // padding