13#include <wayland-server.h>
15#include <sys/socket.h>
25 void testSocketName();
27 void testClientConnection();
28 void testConnectNoSocket();
29 void testAutoSocketName();
32void TestWaylandServerDisplay::testSocketName()
35 QSignalSpy changedSpy(&display, &KWin::Display::socketNamesChanged);
37 const QString testSName = QStringLiteral(
"fooBar");
39 QCOMPARE(display.
socketNames(), QStringList{testSName});
40 QCOMPARE(changedSpy.count(), 1);
44 QCOMPARE(changedSpy.count(), 1);
47void TestWaylandServerDisplay::testStartStop()
49 const QString testSocketName = QStringLiteral(
"kwin-wayland-server-display-test-0");
50 QDir runtimeDir(qgetenv(
"XDG_RUNTIME_DIR"));
51 QVERIFY(runtimeDir.exists());
52 QVERIFY(!runtimeDir.exists(testSocketName));
55 QSignalSpy runningSpy(display.get(), &KWin::Display::runningChanged);
60 QCOMPARE(runningSpy.count(), 1);
61 QVERIFY(runningSpy.first().first().toBool());
63 QVERIFY(runtimeDir.exists(testSocketName));
66 QVERIFY(!runtimeDir.exists(testSocketName));
69void TestWaylandServerDisplay::testClientConnection()
72 display.
addSocketName(QStringLiteral(
"kwin-wayland-server-display-test-client-connection"));
74 QSignalSpy connectedSpy(&display, &KWin::Display::clientConnected);
75 QSignalSpy disconnectedSpy(&display, &KWin::Display::clientDisconnected);
78 QVERIFY(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) >= 0);
80 auto client = wl_client_create(display, sv[0]);
83 QVERIFY(connectedSpy.isEmpty());
89 QEXPECT_FAIL(
"",
"Please don't run test as root", Continue);
93 QEXPECT_FAIL(
"",
"Please don't run test as root", Continue);
98 QCOMPARE(
connection->executablePath(), QCoreApplication::applicationFilePath());
101 QCOMPARE((wl_client *)constRef, client);
102 QCOMPARE(connectedSpy.count(), 1);
108 QCOMPARE(connectedSpy.count(), 1);
112 QVERIFY(socketpair(AF_UNIX, SOCK_STREAM, 0, sv2) >= 0);
116 QVERIFY(connection2);
117 QCOMPARE(connection2, client2);
118 QCOMPARE(connectedSpy.count(), 2);
120 QCOMPARE(connectedSpy.last().first().value<
ClientConnection *>(), connection2);
124 QCOMPARE(display.
connections().last(), connection2);
128 QVERIFY(disconnectedSpy.isEmpty());
129 wl_client_destroy(client);
130 QCOMPARE(disconnectedSpy.count(), 1);
131 QSignalSpy clientDestroyedSpy(client2, &QObject::destroyed);
133 QCOMPARE(clientDestroyedSpy.count(), 1);
134 QCOMPARE(disconnectedSpy.count(), 2);
142void TestWaylandServerDisplay::testConnectNoSocket()
150 QVERIFY(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) >= 0);
154 wl_client_destroy(client->client());
159void TestWaylandServerDisplay::testAutoSocketName()
161 QTemporaryDir runtimeDir;
162 QVERIFY(runtimeDir.isValid());
163 QVERIFY(qputenv(
"XDG_RUNTIME_DIR", runtimeDir.path().toUtf8()));
166 QSignalSpy socketNameChangedSpy0(&display0, &KWin::Display::socketNamesChanged);
167 QVERIFY(socketNameChangedSpy0.isValid());
171 QCOMPARE(socketNameChangedSpy0.count(), 1);
174 QSignalSpy socketNameChangedSpy1(&display1, &KWin::Display::socketNamesChanged);
175 QVERIFY(socketNameChangedSpy1.isValid());
179 QCOMPARE(socketNameChangedSpy1.count(), 1);
183#include "test_display.moc"
Convenient Class which represents a wl_client.
Class holding the Wayland server display loop.
ClientConnection * createClient(int fd)
QStringList socketNames() const
QList< ClientConnection * > connections() const
ClientConnection * getConnection(wl_client *client)
bool addSocketName(const QString &name=QString())
KWIN_EXPORT xcb_connection_t * connection()