Files
utun2/tools/chatgui/tests/test_node_config.cpp
T

108 lines
5.3 KiB
C++

/* Реальный desktop-генератор и общий строгий парсер; --validate проверяет также конфиги Android. */
#include "../transport/node_config.h"
#include "../transport/config_updater.h"
#include <QtTest>
#include <QTemporaryDir>
#include <cstring>
#include <memory>
extern "C" {
#include "config_parser.h"
#include "chat/chat_setting.h"
#include "socket_compat.h"
#include "debug_config.h"
}
using Config = std::unique_ptr<utun_config, decltype(&free_config)>;
class NodeConfigTest : public QObject {
Q_OBJECT
private slots:
void generatedConfigurations_data() {
QTest::addColumn<QString>("protocols");
for (const QString& protocols : {QString("tcp"), QString("udp"), QString("tcp+udp")})
QTest::newRow(qPrintable(protocols)) << protocols;
}
void generatedConfigurations() {
QFETCH(QString, protocols);
QTemporaryDir directory; QVERIFY(directory.isValid());
const QString path = directory.filePath("vibechat.cfg");
NodeConfig config(path); QVERIFY(config.create(QString::fromUtf8("Тест конфигурации"), 1333));
config.setAutoSocketProtocols(protocols);
for (bool utun : {false, true}) {
config.setUtunEnabled(utun);
for (int pass = 0; pass < 3; ++pass) {
QVERIFY(pass == 1 ? config.saveFull() : config.save());
QVERIFY(config.load()); QVERIFY2(!config.hasErrors(), qPrintable(config.errors().join('\n')));
Config parsed(parse_config(qPrintable(path)), free_config); QVERIFY(parsed);
QCOMPARE(QString::fromUtf8(parsed->global.name), config.nodeName());
QCOMPARE(QString::fromLatin1(parsed->global.my_public_key_hex), config.pubKey());
QCOMPARE(QString::fromLatin1(parsed->global.my_private_key_hex), config.privKey());
QCOMPARE(parsed->global.gui_utun_enabled, int(utun));
QCOMPARE(parsed->global.auto_sockets, 1);
const int expected = protocols == "tcp" ? CFG_AUTO_SOCKET_TCP :
protocols == "udp" ? CFG_AUTO_SOCKET_UDP : CFG_AUTO_SOCKET_BOTH;
QCOMPARE(int(parsed->global.auto_socket_protocols), expected);
}
}
}
void settingsUpdatesPreserveValidConfiguration() {
QTemporaryDir directory; QVERIFY(directory.isValid());
const QString path = directory.filePath("settings.cfg");
NodeConfig config(path); QVERIFY(config.create("Settings test", 1333));
QVERIFY(config_rewrite_servers(path, {{"tcp", "127.0.0.1:1333", "tcp", "private", ""},
{"udp", "[::1]:1333", "udp", "local", ""}}));
QVERIFY(config_update_option(path, "chatserver", "storage_unit_size", "23M"));
QVERIFY(config_update_option(path, "chatserver", "storage_total_size", "7G"));
QVERIFY(config_update_option(path, "chatserver", "radio_auto_enabled", "1"));
QVERIFY(config_update_option(path, "chatserver", "radio_auto_mode", "2"));
QVERIFY(config_update_option(path, "client:seed", "fingerprint", "openssl"));
QVERIFY(config_update_option(path, "client:seed", "peer_public_key", config.pubKey()));
QVERIFY(config_update_option(path, "client:seed", "link", "tcp:127.0.0.2:443"));
QVERIFY(config.load()); QVERIFY2(!config.hasErrors(), qPrintable(config.errors().join('\n')));
QVERIFY(config.save());
Config parsed(parse_config(qPrintable(path)), free_config); QVERIFY(parsed);
QCOMPARE(parsed->global.chatserver_storage_unit_size, UINT64_C(23) * 1024 * 1024);
QCOMPARE(parsed->global.chatserver_storage_total_size, UINT64_C(7) * 1024 * 1024 * 1024);
QCOMPARE(chat_setting_get_int_state(&parsed->global.chat_settings, "radio_auto_mode", 0), 2);
QVERIFY(parsed->clients && parsed->clients->links && parsed->servers && parsed->servers->next);
}
void repeatedLoadDoesNotDuplicateDebugOptions() {
QTemporaryDir directory; QVERIFY(directory.isValid());
const QString path = directory.filePath("debug.cfg");
NodeConfig config(path); QVERIFY(config.create("Debug settings", 1333));
QVERIFY(config_update_option(path, "debug", "stream", "debug"));
for (int attempt = 0; attempt < 3; ++attempt) {
QVERIFY(config.load());
QCOMPARE(config.debugCategories(), QString("stream=debug"));
QVERIFY(config.saveFull());
Config parsed(parse_config(qPrintable(path)), free_config); QVERIFY(parsed);
}
}
};
int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
debug_config_init(); debug_set_level(DEBUG_LEVEL_INFO);
if (socket_platform_init()) return 1;
int result = 0;
if (argc >= 3 && !strcmp(argv[1], "--validate")) {
for (int i = 2; i < argc; ++i) {
Config parsed(parse_config(argv[i]), free_config);
if (!parsed) { result = 1; continue; }
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "Config accepted: %s storage_unit=%llu storage_total=%llu", argv[i],
(unsigned long long)parsed->global.chatserver_storage_unit_size,
(unsigned long long)parsed->global.chatserver_storage_total_size);
}
} else {
NodeConfigTest test; result = QTest::qExec(&test, argc, argv);
}
socket_platform_cleanup();
return result;
}
#include "test_node_config.moc"