Files
utun2/tests/test_chat_profile.c
T

50 lines
3.3 KiB
C

/* Подписанный профиль: ошибка чтения не даёт успешный/частичный снимок. */
#include "../src/utun_instance.h"
#include "../src/chat/chat_core.h"
#include "../src/chat/member_sync.h"
#include "../lib/debug_config.h"
#include "../lib/mem.h"
#include "../lib/json_flat.h"
#include <assert.h>
#include <string.h>
static int fail_read;
static void unicode(void) {
const char* json = "{\"name\":\"\\u0410\\uD83D\\uDE00\",\"protect\":\"yes\",\"control\":\"\\u0001\"}";
char value[64]; assert(!json_flat_get(json, "name", value, sizeof(value)) && !strcmp(value, "А😀"));
assert(!json_flat_get(json, "protect", value, sizeof(value)) && !strcmp(value, "yes"));
assert(!json_flat_get(json, "control", value, sizeof(value)) && value[0] == 1 && !value[1]);
const char* invalid[] = {"{\"a\":\"\\u0000\"}", "{\"a\":\"\\uD800\"}", "{\"a\":\"\\uDC00\"}",
"{\"a\":\"\\uD800\\u0001\"}", "{\"a\":\"\\uXX12\"}", "{\"a\":\"\\u123\"}", "{\"a\":\"raw\nline\"}"};
for (unsigned i = 0; i < sizeof(invalid) / sizeof(invalid[0]); i++) assert(json_flat_parse(invalid[i], NULL, NULL) < 0);
puts("PASS profile Unicode reader:UTF-8,surrogate pair,control,following policy field;invalid Unicode/NUL/raw control refused");
}
extern int __real_sqlite3_finalize(sqlite3_stmt*);
int __wrap_sqlite3_finalize(sqlite3_stmt* st) {
const char* prefix = "SELECT userinfo,update_sig,update_ts";
int fail = fail_read && st && !strncmp(sqlite3_sql(st), prefix, strlen(prefix));
if (fail) { fail_read = 0; DEBUG_WARN(DEBUG_CATEGORY_CHAT, "profile test: injected read finalize failure"); }
int rc = __real_sqlite3_finalize(st); return fail ? SQLITE_IOERR : rc;
}
int main(void) {
debug_config_init(); debug_set_level(DEBUG_LEVEL_ERROR); size_t baseline = u_get_allocated_count();
unicode();
utun_instance_set_tun_init_enabled(0); struct UASYNC* ua = uasync_create(); assert(ua);
struct UTUN_INSTANCE* inst = utun_instance_create_from_str(ua,
"[global]\nmy_node_name=profile test\n[ntp]\nenabled=no\n[chatserver]\ngroup_autoconnect=0\nstorage_autoload=0\n");
assert(inst && !utun_core_start(inst) && !chat_service_start(inst));
uint64_t group = chat_core_create_channel_auto(inst, "profile"); assert(group); char channel[32];
snprintf(channel, sizeof(channel), "%llu", (unsigned long long)group);
char profile[MS_USERINFO_MAX + 1], previous[MS_USERINFO_MAX + 1]; uint8_t signature[64], old_signature[64];
memset(profile, 0xa5, sizeof(profile)); memcpy(previous, profile, sizeof(profile));
memset(signature, 0xa5, sizeof(signature)); memcpy(old_signature, signature, sizeof(signature)); uint64_t timestamp = 123;
fail_read = 1; int rc = chat_core_get_my_profile(inst, channel, profile, sizeof(profile), signature, &timestamp);
DEBUG_ERROR(DEBUG_CATEGORY_CHAT, "profile test: failed finalize rc=%d pending=%d", rc, fail_read);
assert(rc < 0 && !fail_read && timestamp == 123 && !memcmp(profile, previous, sizeof(profile)) && !memcmp(signature, old_signature, 64));
assert(!chat_core_get_my_profile(inst, channel, profile, sizeof(profile), signature, &timestamp) && timestamp > 0);
utun_instance_destroy(inst); uasync_poll(ua, 0); uasync_destroy(ua, 0); assert(u_get_allocated_count() == baseline);
puts("PASS profile complete read and retry"); return 0;
}