mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Fix padding in SAVED_FRIEND struct and add test.
Test covers saving and loading of a Tox instance with a friend added.
This commit is contained in:
parent
f208fb53b1
commit
029c4fb83f
|
@ -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)
|
||||
|
|
128
auto_tests/save_friend_test.c
Normal file
128
auto_tests/save_friend_test.c
Normal file
|
@ -0,0 +1,128 @@
|
|||
/* Auto Tests: Save and load friends.
|
||||
*/
|
||||
|
||||
#include "../toxcore/tox.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32)
|
||||
#include <windows.h>
|
||||
#define c_sleep(x) Sleep(1*x)
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user