2016-12-10 22:12:32 +08:00
|
|
|
/* Auto Tests: Save and load friends.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2018-07-17 06:46:02 +08:00
|
|
|
#include "../testing/misc_tools.h"
|
|
|
|
#include "../toxcore/ccompat.h"
|
|
|
|
#include "../toxcore/crypto_core.h"
|
|
|
|
#include "../toxcore/tox.h"
|
2022-02-22 01:34:02 +08:00
|
|
|
#include "auto_test_support.h"
|
2018-07-17 06:46:02 +08:00
|
|
|
#include "check_compat.h"
|
|
|
|
|
2016-12-10 22:12:32 +08:00
|
|
|
struct test_data {
|
2022-03-31 04:04:01 +08:00
|
|
|
uint8_t *name;
|
|
|
|
uint8_t *status_message;
|
2016-12-10 22:12:32 +08:00
|
|
|
bool received_name;
|
|
|
|
bool received_status_message;
|
|
|
|
};
|
|
|
|
|
2022-03-28 05:34:12 +08:00
|
|
|
static void set_random(Tox *m, const Random *rng, bool (*setter)(Tox *, const uint8_t *, size_t, Tox_Err_Set_Info *), size_t length)
|
2016-12-10 22:12:32 +08:00
|
|
|
{
|
2017-01-21 05:16:55 +08:00
|
|
|
VLA(uint8_t, text, length);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2024-01-24 19:40:56 +08:00
|
|
|
for (uint32_t i = 0; i < length; ++i) {
|
2022-03-28 05:34:12 +08:00
|
|
|
text[i] = random_u08(rng);
|
2016-12-10 22:12:32 +08:00
|
|
|
}
|
|
|
|
|
2024-01-24 19:40:56 +08:00
|
|
|
setter(m, text, length, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
}
|
|
|
|
|
2022-03-31 04:04:01 +08:00
|
|
|
static void alloc_string(uint8_t **to, size_t length)
|
|
|
|
{
|
|
|
|
free(*to);
|
|
|
|
*to = (uint8_t *)malloc(length);
|
|
|
|
ck_assert(*to != nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void set_string(uint8_t **to, const uint8_t *from, size_t length)
|
|
|
|
{
|
|
|
|
alloc_string(to, length);
|
|
|
|
memcpy(*to, from, length);
|
|
|
|
}
|
|
|
|
|
2024-01-14 06:32:37 +08:00
|
|
|
static void namechange_callback(Tox *tox, const Tox_Event_Friend_Name *event, void *user_data)
|
2016-12-10 22:12:32 +08:00
|
|
|
{
|
2024-01-14 06:32:37 +08:00
|
|
|
//const uint32_t friend_number = tox_event_friend_name_get_friend_number(event);
|
|
|
|
const uint8_t *name = tox_event_friend_name_get_name(event);
|
|
|
|
const uint32_t name_length = tox_event_friend_name_get_name_length(event);
|
|
|
|
|
2016-12-10 22:12:32 +08:00
|
|
|
struct test_data *to_compare = (struct test_data *)user_data;
|
2024-01-14 06:32:37 +08:00
|
|
|
set_string(&to_compare->name, name, name_length);
|
2016-12-10 22:12:32 +08:00
|
|
|
to_compare->received_name = true;
|
|
|
|
}
|
|
|
|
|
2024-01-14 06:32:37 +08:00
|
|
|
static void statuschange_callback(Tox *tox, const Tox_Event_Friend_Status_Message *event, void *user_data)
|
2016-12-10 22:12:32 +08:00
|
|
|
{
|
2024-01-14 06:32:37 +08:00
|
|
|
//const uint32_t friend_number = tox_event_friend_status_message_get_friend_number(event);
|
|
|
|
const uint8_t *message = tox_event_friend_status_message_get_message(event);
|
|
|
|
const uint32_t message_length = tox_event_friend_status_message_get_message_length(event);
|
|
|
|
|
2016-12-10 22:12:32 +08:00
|
|
|
struct test_data *to_compare = (struct test_data *)user_data;
|
2024-01-14 06:32:37 +08:00
|
|
|
set_string(&to_compare->status_message, message, message_length);
|
2016-12-10 22:12:32 +08:00
|
|
|
to_compare->received_status_message = true;
|
|
|
|
}
|
|
|
|
|
2018-02-23 10:22:38 +08:00
|
|
|
int main(void)
|
2016-12-10 22:12:32 +08:00
|
|
|
{
|
2018-02-19 01:50:50 +08:00
|
|
|
setvbuf(stdout, nullptr, _IONBF, 0);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2018-02-19 01:50:50 +08:00
|
|
|
Tox *const tox1 = tox_new_log(nullptr, nullptr, nullptr);
|
|
|
|
Tox *const tox2 = tox_new_log(nullptr, nullptr, nullptr);
|
2024-01-14 06:32:37 +08:00
|
|
|
ck_assert(tox1 != nullptr);
|
|
|
|
ck_assert(tox2 != nullptr);
|
|
|
|
|
|
|
|
tox_events_init(tox1);
|
|
|
|
Tox_Dispatch* dispatch1 = tox_dispatch_new(nullptr);
|
|
|
|
ck_assert(dispatch1 != nullptr);
|
2018-02-19 01:50:50 +08:00
|
|
|
|
|
|
|
printf("bootstrapping tox2 off tox1\n");
|
|
|
|
uint8_t dht_key[TOX_PUBLIC_KEY_SIZE];
|
|
|
|
tox_self_get_dht_id(tox1, dht_key);
|
|
|
|
const uint16_t dht_port = tox_self_get_udp_port(tox1, nullptr);
|
|
|
|
|
|
|
|
tox_bootstrap(tox2, "localhost", dht_port, dht_key, nullptr);
|
|
|
|
|
2022-03-31 04:04:01 +08:00
|
|
|
struct test_data to_compare = {nullptr};
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
uint8_t public_key[TOX_PUBLIC_KEY_SIZE];
|
|
|
|
tox_self_get_public_key(tox1, public_key);
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_friend_add_norequest(tox2, public_key, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
tox_self_get_public_key(tox2, public_key);
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_friend_add_norequest(tox1, public_key, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2022-03-31 04:04:01 +08:00
|
|
|
uint8_t *reference_name = (uint8_t *)malloc(tox_max_name_length());
|
|
|
|
uint8_t *reference_status = (uint8_t *)malloc(tox_max_status_message_length());
|
|
|
|
ck_assert(reference_name != nullptr);
|
|
|
|
ck_assert(reference_status != nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2022-03-28 05:34:12 +08:00
|
|
|
const Random *rng = system_random();
|
|
|
|
ck_assert(rng != nullptr);
|
|
|
|
set_random(tox1, rng, tox_self_set_name, tox_max_name_length());
|
|
|
|
set_random(tox2, rng, tox_self_set_name, tox_max_name_length());
|
|
|
|
set_random(tox1, rng, tox_self_set_status_message, tox_max_status_message_length());
|
|
|
|
set_random(tox2, rng, tox_self_set_status_message, tox_max_status_message_length());
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
tox_self_get_name(tox2, reference_name);
|
|
|
|
tox_self_get_status_message(tox2, reference_status);
|
|
|
|
|
2024-01-14 06:32:37 +08:00
|
|
|
tox_events_callback_friend_name(dispatch1, namechange_callback);
|
|
|
|
tox_events_callback_friend_status_message(dispatch1, statuschange_callback);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
while (true) {
|
|
|
|
if (tox_self_get_connection_status(tox1) &&
|
|
|
|
tox_self_get_connection_status(tox2) &&
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_friend_get_connection_status(tox1, 0, nullptr) == TOX_CONNECTION_UDP) {
|
2016-12-10 22:12:32 +08:00
|
|
|
printf("Connected.\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2024-01-14 06:32:37 +08:00
|
|
|
Tox_Err_Events_Iterate err = TOX_ERR_EVENTS_ITERATE_OK;
|
|
|
|
Tox_Events *events = tox_events_iterate(tox1, true, &err);
|
|
|
|
ck_assert(err == TOX_ERR_EVENTS_ITERATE_OK);
|
|
|
|
tox_dispatch_invoke(dispatch1, events, tox1, &to_compare);
|
|
|
|
tox_events_free(events);
|
|
|
|
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_iterate(tox2, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2024-01-14 06:32:37 +08:00
|
|
|
Tox_Err_Events_Iterate err = TOX_ERR_EVENTS_ITERATE_OK;
|
|
|
|
Tox_Events *events = tox_events_iterate(tox1, true, &err);
|
|
|
|
ck_assert(err == TOX_ERR_EVENTS_ITERATE_OK);
|
|
|
|
tox_dispatch_invoke(dispatch1, events, tox1, &to_compare);
|
|
|
|
tox_events_free(events);
|
|
|
|
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_iterate(tox2, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
c_sleep(tox_iteration_interval(tox1));
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t save_size = tox_get_savedata_size(tox1);
|
2022-02-10 04:27:10 +08:00
|
|
|
uint8_t *savedata = (uint8_t *)malloc(save_size);
|
2016-12-10 22:12:32 +08:00
|
|
|
tox_get_savedata(tox1, savedata);
|
|
|
|
|
2018-02-19 01:50:50 +08:00
|
|
|
struct Tox_Options *const options = tox_options_new(nullptr);
|
2016-12-16 01:35:54 +08:00
|
|
|
tox_options_set_savedata_type(options, TOX_SAVEDATA_TYPE_TOX_SAVE);
|
|
|
|
tox_options_set_savedata_data(options, savedata, save_size);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2018-02-19 01:50:50 +08:00
|
|
|
Tox *const tox_to_compare = tox_new_log(options, nullptr, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2022-03-31 04:04:01 +08:00
|
|
|
alloc_string(&to_compare.name, tox_friend_get_name_size(tox_to_compare, 0, nullptr));
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_friend_get_name(tox_to_compare, 0, to_compare.name, nullptr);
|
2022-03-31 04:04:01 +08:00
|
|
|
alloc_string(&to_compare.status_message, tox_friend_get_status_message_size(tox_to_compare, 0, nullptr));
|
2018-01-29 05:30:39 +08:00
|
|
|
tox_friend_get_status_message(tox_to_compare, 0, to_compare.status_message, nullptr);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2022-03-31 04:04:01 +08:00
|
|
|
ck_assert_msg(memcmp(reference_name, to_compare.name, tox_max_name_length()) == 0,
|
2018-07-17 06:46:02 +08:00
|
|
|
"incorrect name: should be all zeroes");
|
2022-03-31 04:04:01 +08:00
|
|
|
ck_assert_msg(memcmp(reference_status, to_compare.status_message, tox_max_status_message_length()) == 0,
|
2018-07-17 06:46:02 +08:00
|
|
|
"incorrect status message: should be all zeroes");
|
2016-12-10 22:12:32 +08:00
|
|
|
|
2016-12-16 01:35:54 +08:00
|
|
|
tox_options_free(options);
|
2024-01-14 06:32:37 +08:00
|
|
|
tox_dispatch_free(dispatch1);
|
2016-12-10 22:12:32 +08:00
|
|
|
tox_kill(tox1);
|
|
|
|
tox_kill(tox2);
|
|
|
|
tox_kill(tox_to_compare);
|
2022-02-10 04:27:10 +08:00
|
|
|
free(savedata);
|
2022-03-31 04:04:01 +08:00
|
|
|
free(to_compare.name);
|
|
|
|
free(to_compare.status_message);
|
|
|
|
free(reference_status);
|
|
|
|
free(reference_name);
|
2016-12-10 22:12:32 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|