1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// SPDX-FileCopyrightText: 2015 Jeremy Lainé <jeremy.laine@m4x.org>
//
// SPDX-License-Identifier: LGPL-2.1-or-later
#include "QXmppCallManager.h"
#include "QXmppClient.h"
#include "QXmppServer.h"
#include "util.h"
#include <QBuffer>
class tst_QXmppCallManager : public QObject
{
Q_OBJECT
private:
Q_SLOT void testCall();
};
void tst_QXmppCallManager::testCall()
{
if (!qEnvironmentVariableIsEmpty("QXMPP_TESTS_SKIP_CALL_MANAGER")) {
QSKIP("Skipping because 'QXMPP_TESTS_SKIP_CALL_MANAGER' was set.");
}
QXmppCall *receiverCall = nullptr;
const QString testDomain("localhost");
const QHostAddress testHost(QHostAddress::LocalHost);
const quint16 testPort = 12345;
QXmppLogger logger;
logger.setLoggingType(QXmppLogger::StdoutLogging);
// prepare server
TestPasswordChecker passwordChecker;
passwordChecker.addCredentials("sender", "testpwd");
passwordChecker.addCredentials("receiver", "testpwd");
QXmppServer server;
server.setDomain(testDomain);
server.setPasswordChecker(&passwordChecker);
server.listenForClients(testHost, testPort);
// prepare sender
QXmppClient sender;
auto *senderManager = new QXmppCallManager;
sender.addExtension(senderManager);
sender.setLogger(&logger);
QEventLoop senderLoop;
connect(&sender, &QXmppClient::connected, &senderLoop, &QEventLoop::quit);
connect(&sender, &QXmppClient::disconnected, &senderLoop, &QEventLoop::quit);
QXmppConfiguration config;
config.setDomain(testDomain);
config.setHost(testHost.toString());
config.setPort(testPort);
config.setUser("sender");
config.setPassword("testpwd");
sender.connectToServer(config);
senderLoop.exec();
QCOMPARE(sender.isConnected(), true);
// prepare receiver
QXmppClient receiver;
auto *receiverManager = new QXmppCallManager;
connect(receiverManager, &QXmppCallManager::callReceived, this, [&receiverCall](QXmppCall *call) {
receiverCall = call;
call->accept();
});
receiver.addExtension(receiverManager);
receiver.setLogger(&logger);
QEventLoop receiverLoop;
connect(&receiver, &QXmppClient::connected, &receiverLoop, &QEventLoop::quit);
connect(&receiver, &QXmppClient::disconnected, &receiverLoop, &QEventLoop::quit);
config.setUser("receiver");
config.setPassword("testpwd");
receiver.connectToServer(config);
receiverLoop.exec();
QCOMPARE(receiver.isConnected(), true);
// connect call
qDebug() << "======== CONNECT ========";
QEventLoop loop;
QXmppCall *senderCall = senderManager->call("receiver@localhost/QXmpp");
QVERIFY(senderCall);
connect(senderCall, &QXmppCall::connected, &loop, &QEventLoop::quit);
loop.exec();
QVERIFY(receiverCall);
QCOMPARE(senderCall->direction(), QXmppCall::OutgoingDirection);
QCOMPARE(senderCall->state(), QXmppCall::ActiveState);
QCOMPARE(receiverCall->direction(), QXmppCall::IncomingDirection);
QCOMPARE(receiverCall->state(), QXmppCall::ActiveState);
// exchange some media
qDebug() << "======== TALK ========";
QTimer::singleShot(2000, &loop, &QEventLoop::quit);
loop.exec();
// hangup call
qDebug() << "======== HANGUP ========";
connect(senderCall, &QXmppCall::finished, &loop, &QEventLoop::quit);
senderCall->hangup();
loop.exec();
QCOMPARE(senderCall->direction(), QXmppCall::OutgoingDirection);
QCOMPARE(senderCall->state(), QXmppCall::FinishedState);
QCOMPARE(receiverCall->direction(), QXmppCall::IncomingDirection);
QCOMPARE(receiverCall->state(), QXmppCall::FinishedState);
}
QTEST_MAIN(tst_QXmppCallManager)
#include "tst_qxmppcallmanager.moc"
|