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

88 lines
4.3 KiB
C++

/* GUI получает готовую ссылку: выбор LAN-устройства не пересобирает её и ACK не означает JOIN. */
#include "../src/invitedialog.h"
#include "../transport/gui_bridge.h"
#include "../db/db_manager.h"
#include "../../../src/chat/chat_local.h"
#include "../../../src/chat/invite_build.h"
#include "../../../lib/debug_config.h"
#include "../../../lib/mem.h"
#include <QtTest>
#include <QComboBox>
#include <QPushButton>
#include <QLabel>
#include <QDataStream>
#include <QtEndian>
static gui_local_event_fn devices_cb, delivery_cb;
static gui_invite_link_ready_fn link_cb;
static struct chat_local_send_request sent;
static int sends;
QString DbManager::getDisplayName(quint64 id) const { return QString::number(id); }
struct UTUN_INSTANCE* gui_bridge_get_inst(void) { return reinterpret_cast<UTUN_INSTANCE*>(1); }
int gui_bridge_is_uasync_ready(void) { return 1; }
void gui_bridge_set_local_devices_cb(gui_local_event_fn cb) { devices_cb = cb; }
void gui_bridge_set_local_delivery_cb(gui_local_event_fn cb) { delivery_cb = cb; }
void gui_bridge_set_invite_link_ready_cb(gui_invite_link_ready_fn cb) { link_cb = cb; }
void gui_bridge_set_invite_candidates_cb(gui_invite_candidates_fn) {}
void gui_bridge_post_uasync_fn(void (*fn)(void*), void* arg) {
if (fn == chat_local_peers_trampoline) return;
if (fn == chat_local_send_trampoline) { sent = *static_cast<chat_local_send_request*>(arg); sends++; }
u_free(arg);
}
static QByteArray devices(std::initializer_list<quint64> ids) {
QByteArray result;
QDataStream stream(&result, QIODevice::WriteOnly);
stream << quint16(ids.size());
for (quint64 id : ids) { stream << id << quint8(4); stream.writeRawData("Nick", 4); }
return result;
}
class LocalInviteUiTest : public QObject {
Q_OBJECT
private slots:
void initTestCase() { debug_config_init(); }
void deliveryAndDeviceChanges() {
{
ShareInviteDialog dialog("42", nullptr);
auto* combo = dialog.findChild<QComboBox*>("localDevices");
auto* send = dialog.findChild<QPushButton*>("sendLocalInvite");
QVERIFY(combo && send && devices_cb && delivery_cb && link_cb);
QVERIFY(!send->isEnabled());
auto list = devices({7, 8}); devices_cb((const uint8_t*)list.constData(), list.size());
QCOMPARE(combo->count(), 2); QVERIFY(!send->isEnabled());
link_cb("42", 2, 0, "utun://registered-link");
QVERIFY(send->isEnabled()); combo->setCurrentIndex(1);
list = devices({8, 9, 7}); devices_cb((const uint8_t*)list.constData(), list.size());
QCOMPARE(combo->currentData().toULongLong(), quint64(8));
devices_cb((const uint8_t*)list.constData(), list.size() - 1);
QCOMPARE(combo->count(), 3);
QTest::mouseClick(send, Qt::LeftButton);
QCOMPARE(sends, 1); QCOMPARE(sent.peer_id, uint64_t(8));
QCOMPARE(QByteArray(sent.link), QByteArray("utun://registered-link"));
QVERIFY(!send->isEnabled());
uint8_t response[17] = {0};
qToBigEndian<quint64>(sent.request_id + 1, response); response[16] = 1;
delivery_cb(response, sizeof(response)); QVERIFY(!send->isEnabled());
qToBigEndian<quint64>(sent.request_id, response);
delivery_cb(response, sizeof(response)); QVERIFY(send->isEnabled());
QTest::mouseClick(send, Qt::LeftButton); QCOMPARE(sends, 2);
qToBigEndian<quint64>(sent.request_id, response); response[16] = LOCAL_DELIVERY_FORBIDDEN;
delivery_cb(response, sizeof(response)); QVERIFY(send->isEnabled());
bool forbiddenMessage = false;
for (auto* label : dialog.findChildren<QLabel*>())
if (label->text() == "Receiving invitations is forbidden. Enable it in the recipient device's settings.") forbiddenMessage = true;
QVERIFY(forbiddenMessage);
link_cb("42", 2, 0, ""); QVERIFY(!send->isEnabled());
list = devices({}); devices_cb((const uint8_t*)list.constData(), list.size());
QCOMPARE(combo->count(), 0); QVERIFY(!send->isEnabled());
}
QVERIFY(!devices_cb && !delivery_cb && !link_cb);
}
};
QTEST_MAIN(LocalInviteUiTest)
#include "test_local_invite_ui.moc"