[autotests/wayland_client] Improve TestWaylandShell

Uses our own Wayland server instead of starting Weston and adds
tests for the interface removed signals.
icc-effect-5.14.5
Martin Gräßlin 2014-09-03 21:13:25 +02:00
parent 7748b64ba0
commit 7b2d7d9c54
2 changed files with 115 additions and 41 deletions

View File

@ -27,10 +27,17 @@ set( testWaylandRegistry_SRCS
${KWIN_SOURCE_DIR}/wayland_client/connection_thread.cpp
${KWIN_SOURCE_DIR}/wayland_client/registry.cpp
${CMAKE_BINARY_DIR}/wayland_protocols/wayland-client-fullscreen-shell.c
${KWIN_SOURCE_DIR}/wayland_server/buffer_interface.cpp
${KWIN_SOURCE_DIR}/wayland_server/compositor_interface.cpp
${KWIN_SOURCE_DIR}/wayland_server/display.cpp
${KWIN_SOURCE_DIR}/wayland_server/output_interface.cpp
${KWIN_SOURCE_DIR}/wayland_server/seat_interface.cpp
${KWIN_SOURCE_DIR}/wayland_server/shell_interface.cpp
${KWIN_SOURCE_DIR}/wayland_server/surface_interface.cpp
)
add_executable(testWaylandRegistry ${testWaylandRegistry_SRCS})
add_dependencies(testWaylandRegistry wayland-client-fullscreen-shell)
target_link_libraries( testWaylandRegistry Qt5::Test Wayland::Client)
target_link_libraries( testWaylandRegistry Qt5::Test Qt5::Gui Wayland::Client Wayland::Server)
add_test(kwin-testWaylandRegistry testWaylandRegistry)
ecm_mark_as_test(testWaylandRegistry)

View File

@ -22,6 +22,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// KWin
#include "../../wayland_client/connection_thread.h"
#include "../../wayland_client/registry.h"
#include "../wayland_server/compositor_interface.h"
#include "../../wayland_server/display.h"
#include "../wayland_server/output_interface.h"
#include "../wayland_server/seat_interface.h"
#include "../wayland_server/shell_interface.h"
// Wayland
#include <wayland-client-protocol.h>
@ -40,64 +45,52 @@ private Q_SLOTS:
void testBindOutput();
void testBindShm();
void testBindSeat();
// TODO: add tests for removal - requires more control over the compositor
void testRemoval();
private:
QProcess *m_westonProcess;
KWin::WaylandServer::Display *m_display;
KWin::WaylandServer::CompositorInterface *m_compositor;
KWin::WaylandServer::OutputInterface *m_output;
KWin::WaylandServer::SeatInterface *m_seat;
KWin::WaylandServer::ShellInterface *m_shell;
};
static const QString s_socketName = QStringLiteral("kwin-test-wayland-registry-0");
TestWaylandRegistry::TestWaylandRegistry(QObject *parent)
: QObject(parent)
, m_westonProcess(nullptr)
, m_display(nullptr)
, m_compositor(nullptr)
, m_output(nullptr)
, m_seat(nullptr)
, m_shell(nullptr)
{
}
void TestWaylandRegistry::init()
{
QVERIFY(!m_westonProcess);
// starts weston
m_westonProcess = new QProcess(this);
m_westonProcess->setProgram(QStringLiteral("weston"));
m_westonProcess->setArguments(QStringList({QStringLiteral("--socket=%1").arg(s_socketName), QStringLiteral("--use-pixman")}));
m_westonProcess->start();
QVERIFY(m_westonProcess->waitForStarted());
// wait for the socket to appear
QDir runtimeDir(qgetenv("XDG_RUNTIME_DIR"));
if (runtimeDir.exists(s_socketName)) {
return;
}
QFileSystemWatcher *socketWatcher = new QFileSystemWatcher(QStringList({runtimeDir.absolutePath()}), this);
QSignalSpy socketSpy(socketWatcher, SIGNAL(directoryChanged(QString)));
// limit to maximum of 10 waits
for (int i = 0; i < 10; ++i) {
QVERIFY(socketSpy.wait());
if (runtimeDir.exists(s_socketName)) {
delete socketWatcher;
return;
}
}
m_display = new KWin::WaylandServer::Display();
m_display->setSocketName(s_socketName);
m_display->start();
m_display->createShm();
m_compositor = m_display->createCompositor();
m_compositor->create();
m_output = m_display->createOutput();
m_output->create();
m_seat = m_display->createSeat();
m_seat->create();
m_shell = m_display->createShell();
m_shell->create();
}
void TestWaylandRegistry::cleanup()
{
// terminates weston
m_westonProcess->terminate();
QVERIFY(m_westonProcess->waitForFinished());
delete m_westonProcess;
m_westonProcess = nullptr;
delete m_display;
m_display = nullptr;
}
void TestWaylandRegistry::testCreate()
{
if (m_westonProcess->state() != QProcess::Running) {
QSKIP("This test requires a running wayland server");
}
KWin::Wayland::ConnectionThread connection;
QSignalSpy connectedSpy(&connection, SIGNAL(connected()));
connection.setSocketName(s_socketName);
@ -113,9 +106,6 @@ void TestWaylandRegistry::testCreate()
}
#define TEST_BIND(interface, signalName, bindMethod, destroyFunction) \
if (m_westonProcess->state() != QProcess::Running) { \
QSKIP("This test requires a running wayland server"); \
} \
KWin::Wayland::ConnectionThread connection; \
QSignalSpy connectedSpy(&connection, SIGNAL(connected())); \
connection.setSocketName(s_socketName); \
@ -176,5 +166,82 @@ void TestWaylandRegistry::testBindShm()
#undef TEST_BIND
void TestWaylandRegistry::testRemoval()
{
KWin::Wayland::ConnectionThread connection;
QSignalSpy connectedSpy(&connection, SIGNAL(connected()));
connection.setSocketName(s_socketName);
connection.initConnection();
QVERIFY(connectedSpy.wait());
connect(QCoreApplication::eventDispatcher(), &QAbstractEventDispatcher::aboutToBlock, &connection,
[&connection] {
wl_display_flush(connection.display());
}
);
KWin::Wayland::Registry registry;
QSignalSpy shmAnnouncedSpy(&registry, SIGNAL(shmAnnounced(quint32,quint32)));
QVERIFY(shmAnnouncedSpy.isValid());
QSignalSpy compositorAnnouncedSpy(&registry, SIGNAL(compositorAnnounced(quint32,quint32)));
QVERIFY(compositorAnnouncedSpy.isValid());
QSignalSpy outputAnnouncedSpy(&registry, SIGNAL(outputAnnounced(quint32,quint32)));
QVERIFY(outputAnnouncedSpy.isValid());
QSignalSpy shellAnnouncedSpy(&registry, SIGNAL(shellAnnounced(quint32,quint32)));
QVERIFY(shellAnnouncedSpy.isValid());
QSignalSpy seatAnnouncedSpy(&registry, SIGNAL(seatAnnounced(quint32,quint32)));
QVERIFY(seatAnnouncedSpy.isValid());
QVERIFY(!registry.isValid());
registry.create(connection.display());
registry.setup();
QVERIFY(shmAnnouncedSpy.wait());
QVERIFY(!compositorAnnouncedSpy.isEmpty());
QVERIFY(!outputAnnouncedSpy.isEmpty());
QVERIFY(!shellAnnouncedSpy.isEmpty());
QVERIFY(!seatAnnouncedSpy.isEmpty());
QVERIFY(registry.hasInterface(KWin::Wayland::Registry::Interface::Compositor));
QVERIFY(registry.hasInterface(KWin::Wayland::Registry::Interface::Output));
QVERIFY(registry.hasInterface(KWin::Wayland::Registry::Interface::Seat));
QVERIFY(registry.hasInterface(KWin::Wayland::Registry::Interface::Shell));
QVERIFY(registry.hasInterface(KWin::Wayland::Registry::Interface::Shm));
QVERIFY(!registry.hasInterface(KWin::Wayland::Registry::Interface::FullscreenShell));
QSignalSpy seatRemovedSpy(&registry, SIGNAL(seatRemoved(quint32)));
QVERIFY(seatRemovedSpy.isValid());
delete m_seat;
QVERIFY(seatRemovedSpy.wait());
QCOMPARE(seatRemovedSpy.first().first(), seatAnnouncedSpy.first().first());
QVERIFY(!registry.hasInterface(KWin::Wayland::Registry::Interface::Seat));
QSignalSpy shellRemovedSpy(&registry, SIGNAL(shellRemoved(quint32)));
QVERIFY(shellRemovedSpy.isValid());
delete m_shell;
QVERIFY(shellRemovedSpy.wait());
QCOMPARE(shellRemovedSpy.first().first(), shellAnnouncedSpy.first().first());
QVERIFY(!registry.hasInterface(KWin::Wayland::Registry::Interface::Shell));
QSignalSpy outputRemovedSpy(&registry, SIGNAL(outputRemoved(quint32)));
QVERIFY(outputRemovedSpy.isValid());
delete m_output;
QVERIFY(outputRemovedSpy.wait());
QCOMPARE(outputRemovedSpy.first().first(), outputAnnouncedSpy.first().first());
QVERIFY(!registry.hasInterface(KWin::Wayland::Registry::Interface::Output));
QSignalSpy compositorRemovedSpy(&registry, SIGNAL(compositorRemoved(quint32)));
QVERIFY(compositorRemovedSpy.isValid());
delete m_compositor;
QVERIFY(compositorRemovedSpy.wait());
QCOMPARE(compositorRemovedSpy.first().first(), compositorAnnouncedSpy.first().first());
QVERIFY(!registry.hasInterface(KWin::Wayland::Registry::Interface::Compositor));
// cannot test shmRemoved as there is no functionality for it
}
QTEST_MAIN(TestWaylandRegistry)
#include "test_wayland_registry.moc"