3 changed files with 95 additions and 0 deletions
@ -0,0 +1,75 @@ |
|||||||
|
/* Формат канального события: live/history сохраняются при передаче в GUI, битые события отбрасываются. */ |
||||||
|
#include "../transport/gui_bridge.h" |
||||||
|
#include "../../../lib/debug_config.h" |
||||||
|
#include <QtTest> |
||||||
|
#include <cstring> |
||||||
|
|
||||||
|
struct ReceivedMessage { |
||||||
|
QString channel; |
||||||
|
quint64 author; |
||||||
|
bool initialSync; |
||||||
|
bool guiThread; |
||||||
|
}; |
||||||
|
static QList<ReceivedMessage> received; |
||||||
|
|
||||||
|
static void message_received(const char* channel, int length, uint64_t author, int initial_sync) { |
||||||
|
received.append({QString::fromUtf8(channel, length), author, initial_sync != 0, QThread::currentThread() == qApp->thread()}); |
||||||
|
} |
||||||
|
|
||||||
|
static QByteArray message_event(quint64 author, bool initialSync) { |
||||||
|
const QByteArray channel("12345"); |
||||||
|
QByteArray event(1 + channel.size() + 9, '\0'); |
||||||
|
event[0] = char(channel.size()); |
||||||
|
memcpy(event.data() + 1, channel.constData(), channel.size()); |
||||||
|
memcpy(event.data() + 1 + channel.size(), &author, 8); |
||||||
|
event[event.size() - 1] = initialSync; |
||||||
|
return event; |
||||||
|
} |
||||||
|
|
||||||
|
static void post_message(const QByteArray& event) { |
||||||
|
gui_bridge_post(GUI_EVT_MSG_RECEIVED, reinterpret_cast<const uint8_t*>(event.constData()), event.size()); |
||||||
|
} |
||||||
|
|
||||||
|
class MessageEventTest : public QObject { |
||||||
|
Q_OBJECT |
||||||
|
private slots: |
||||||
|
void initTestCase() { |
||||||
|
debug_config_init(); |
||||||
|
debug_set_level(DEBUG_LEVEL_DEBUG); |
||||||
|
gui_bridge_init(); |
||||||
|
gui_bridge_set_msg_received_cb(message_received); |
||||||
|
} |
||||||
|
void cleanupTestCase() { gui_bridge_set_msg_received_cb(nullptr); } |
||||||
|
void init() { received.clear(); } |
||||||
|
|
||||||
|
void liveAndHistory() { |
||||||
|
post_message(message_event(42, false)); |
||||||
|
post_message(message_event(43, true)); |
||||||
|
QTRY_COMPARE(received.size(), 2); |
||||||
|
QCOMPARE(received[0].channel, QString("12345")); |
||||||
|
QCOMPARE(received[0].author, quint64(42)); |
||||||
|
QVERIFY(!received[0].initialSync); |
||||||
|
QVERIFY(received[0].guiThread); |
||||||
|
QCOMPARE(received[1].author, quint64(43)); |
||||||
|
QVERIFY(received[1].initialSync); |
||||||
|
QVERIFY(received[1].guiThread); |
||||||
|
} |
||||||
|
|
||||||
|
void rejectsMalformedEvents() { |
||||||
|
QByteArray event = message_event(42, false); |
||||||
|
event.chop(1); |
||||||
|
post_message(event); |
||||||
|
event = message_event(42, false); |
||||||
|
event[event.size() - 1] = 2; |
||||||
|
post_message(event); |
||||||
|
event = message_event(42, false); |
||||||
|
event[0] = char(255); |
||||||
|
post_message(event); |
||||||
|
post_message({}); |
||||||
|
QTest::qWait(100); |
||||||
|
QVERIFY(received.isEmpty()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
QTEST_MAIN(MessageEventTest) |
||||||
|
#include "test_message_events.moc" |
||||||
Loading…
Reference in new issue