[autotest] Add a test case for Idle interface
Reviewers: #plasma Subscribers: plasma-devel Projects: #plasma Differential Revision: https://phabricator.kde.org/D1389
This commit is contained in:
parent
194e359b9d
commit
6e4391d01b
2 changed files with 193 additions and 0 deletions
|
@ -255,3 +255,14 @@ add_executable(testPlasmaShell ${testPlasmaShell_SRCS})
|
||||||
target_link_libraries( testPlasmaShell Qt5::Test Qt5::Gui KF5::WaylandClient KF5::WaylandServer Wayland::Client)
|
target_link_libraries( testPlasmaShell Qt5::Test Qt5::Gui KF5::WaylandClient KF5::WaylandServer Wayland::Client)
|
||||||
add_test(kwayland-testPlasmaShell testPlasmaShell)
|
add_test(kwayland-testPlasmaShell testPlasmaShell)
|
||||||
ecm_mark_as_test(testPlasmaShell)
|
ecm_mark_as_test(testPlasmaShell)
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Test Idle
|
||||||
|
########################################################
|
||||||
|
set( testIdle_SRCS
|
||||||
|
test_idle.cpp
|
||||||
|
)
|
||||||
|
add_executable(testIdle ${testIdle_SRCS})
|
||||||
|
target_link_libraries( testIdle Qt5::Test Qt5::Gui KF5::WaylandClient KF5::WaylandServer)
|
||||||
|
add_test(kwayland-testIdle testIdle)
|
||||||
|
ecm_mark_as_test(testIdle)
|
||||||
|
|
182
src/wayland/autotests/client/test_idle.cpp
Normal file
182
src/wayland/autotests/client/test_idle.cpp
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/********************************************************************
|
||||||
|
Copyright 2016 Martin Gräßlin <mgraesslin@kde.org>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) version 3, or any
|
||||||
|
later version accepted by the membership of KDE e.V. (or its
|
||||||
|
successor approved by the membership of KDE e.V.), which shall
|
||||||
|
act as a proxy defined in Section 6 of version 3 of the license.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*********************************************************************/
|
||||||
|
// Qt
|
||||||
|
#include <QtTest/QtTest>
|
||||||
|
// client
|
||||||
|
#include "../../src/client/connection_thread.h"
|
||||||
|
#include "../../src/client/event_queue.h"
|
||||||
|
#include "../../src/client/idle.h"
|
||||||
|
#include "../../src/client/registry.h"
|
||||||
|
#include "../../src/client/seat.h"
|
||||||
|
// server
|
||||||
|
#include "../../src/server/display.h"
|
||||||
|
#include "../../src/server/idle_interface.h"
|
||||||
|
#include "../../src/server/seat_interface.h"
|
||||||
|
|
||||||
|
using namespace KWayland::Client;
|
||||||
|
using namespace KWayland::Server;
|
||||||
|
|
||||||
|
class IdleTest : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private Q_SLOTS:
|
||||||
|
void init();
|
||||||
|
void cleanup();
|
||||||
|
|
||||||
|
void testTimeout();
|
||||||
|
void testSimulateUserActivity();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Display *m_display = nullptr;
|
||||||
|
SeatInterface *m_seatInterface = nullptr;
|
||||||
|
IdleInterface *m_idleInterface = nullptr;
|
||||||
|
ConnectionThread *m_connection = nullptr;
|
||||||
|
QThread *m_thread = nullptr;
|
||||||
|
EventQueue *m_queue = nullptr;
|
||||||
|
Seat *m_seat = nullptr;
|
||||||
|
Idle *m_idle = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const QString s_socketName = QStringLiteral("kwayland-test-idle-0");
|
||||||
|
|
||||||
|
void IdleTest::init()
|
||||||
|
{
|
||||||
|
delete m_display;
|
||||||
|
m_display = new Display(this);
|
||||||
|
m_display->setSocketName(s_socketName);
|
||||||
|
m_display->start();
|
||||||
|
QVERIFY(m_display->isRunning());
|
||||||
|
m_display->createShm();
|
||||||
|
m_seatInterface = m_display->createSeat();
|
||||||
|
m_seatInterface->setName(QStringLiteral("seat0"));
|
||||||
|
m_seatInterface->create();
|
||||||
|
m_idleInterface = m_display->createIdle();
|
||||||
|
m_idleInterface->create();
|
||||||
|
|
||||||
|
// setup connection
|
||||||
|
m_connection = new KWayland::Client::ConnectionThread;
|
||||||
|
QSignalSpy connectedSpy(m_connection, &ConnectionThread::connected);
|
||||||
|
QVERIFY(connectedSpy.isValid());
|
||||||
|
m_connection->setSocketName(s_socketName);
|
||||||
|
|
||||||
|
m_thread = new QThread(this);
|
||||||
|
m_connection->moveToThread(m_thread);
|
||||||
|
m_thread->start();
|
||||||
|
|
||||||
|
m_connection->initConnection();
|
||||||
|
QVERIFY(connectedSpy.wait());
|
||||||
|
|
||||||
|
m_queue = new EventQueue(this);
|
||||||
|
m_queue->setup(m_connection);
|
||||||
|
|
||||||
|
Registry registry;
|
||||||
|
QSignalSpy interfacesAnnouncedSpy(®istry, &Registry::interfacesAnnounced);
|
||||||
|
QVERIFY(interfacesAnnouncedSpy.isValid());
|
||||||
|
registry.setEventQueue(m_queue);
|
||||||
|
registry.create(m_connection);
|
||||||
|
QVERIFY(registry.isValid());
|
||||||
|
registry.setup();
|
||||||
|
QVERIFY(interfacesAnnouncedSpy.wait());
|
||||||
|
|
||||||
|
m_seat = registry.createSeat(registry.interface(Registry::Interface::Seat).name,
|
||||||
|
registry.interface(Registry::Interface::Seat).version,
|
||||||
|
this);
|
||||||
|
QVERIFY(m_seat->isValid());
|
||||||
|
m_idle = registry.createIdle(registry.interface(Registry::Interface::Idle).name,
|
||||||
|
registry.interface(Registry::Interface::Idle).version,
|
||||||
|
this);
|
||||||
|
QVERIFY(m_idle->isValid());
|
||||||
|
}
|
||||||
|
|
||||||
|
void IdleTest::cleanup()
|
||||||
|
{
|
||||||
|
#define CLEANUP(variable) \
|
||||||
|
if (variable) { \
|
||||||
|
delete variable; \
|
||||||
|
variable = nullptr; \
|
||||||
|
}
|
||||||
|
CLEANUP(m_idle)
|
||||||
|
CLEANUP(m_seat)
|
||||||
|
CLEANUP(m_queue)
|
||||||
|
if (m_connection) {
|
||||||
|
m_connection->deleteLater();
|
||||||
|
m_connection = nullptr;
|
||||||
|
}
|
||||||
|
if (m_thread) {
|
||||||
|
m_thread->quit();
|
||||||
|
m_thread->wait();
|
||||||
|
delete m_thread;
|
||||||
|
m_thread = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CLEANUP(m_idleInterface)
|
||||||
|
CLEANUP(m_seatInterface)
|
||||||
|
CLEANUP(m_display)
|
||||||
|
#undef CLEANUP
|
||||||
|
}
|
||||||
|
|
||||||
|
void IdleTest::testTimeout()
|
||||||
|
{
|
||||||
|
// this test verifies the basic functionality of a timeout, that it gets fired
|
||||||
|
// and that it resumes from idle, etc.
|
||||||
|
QScopedPointer<IdleTimeout> timeout(m_idle->getTimeout(1, m_seat));
|
||||||
|
QVERIFY(timeout->isValid());
|
||||||
|
QSignalSpy idleSpy(timeout.data(), &IdleTimeout::idle);
|
||||||
|
QVERIFY(idleSpy.isValid());
|
||||||
|
QSignalSpy resumedFormIdleSpy(timeout.data(), &IdleTimeout::resumeFromIdle);
|
||||||
|
QVERIFY(resumedFormIdleSpy.isValid());
|
||||||
|
|
||||||
|
// we requested a timeout of 1 msec, but the minimum the server sets is 5 sec
|
||||||
|
QVERIFY(!idleSpy.wait(500));
|
||||||
|
// the default of 5 sec will now pass
|
||||||
|
QVERIFY(idleSpy.wait());
|
||||||
|
|
||||||
|
// simulate some activity
|
||||||
|
QVERIFY(resumedFormIdleSpy.isEmpty());
|
||||||
|
m_seatInterface->setTimestamp(1);
|
||||||
|
QVERIFY(resumedFormIdleSpy.wait());
|
||||||
|
}
|
||||||
|
|
||||||
|
void IdleTest::testSimulateUserActivity()
|
||||||
|
{
|
||||||
|
// this test verifies that simulate user activity doesn't fire the timer
|
||||||
|
QScopedPointer<IdleTimeout> timeout(m_idle->getTimeout(6000, m_seat));
|
||||||
|
QVERIFY(timeout->isValid());
|
||||||
|
QSignalSpy idleSpy(timeout.data(), &IdleTimeout::idle);
|
||||||
|
QVERIFY(idleSpy.isValid());
|
||||||
|
QSignalSpy resumedFormIdleSpy(timeout.data(), &IdleTimeout::resumeFromIdle);
|
||||||
|
QVERIFY(resumedFormIdleSpy.isValid());
|
||||||
|
m_connection->flush();
|
||||||
|
|
||||||
|
QTest::qWait(4000);
|
||||||
|
timeout->simulateUserActivity();
|
||||||
|
// waiting default five sec should fail
|
||||||
|
QVERIFY(!idleSpy.wait());
|
||||||
|
// another 2 sec should fire
|
||||||
|
QVERIFY(idleSpy.wait(2000));
|
||||||
|
|
||||||
|
// now simulating user activity should emit a resumedFromIdle
|
||||||
|
QVERIFY(resumedFormIdleSpy.isEmpty());
|
||||||
|
timeout->simulateUserActivity();
|
||||||
|
QVERIFY(resumedFormIdleSpy.wait());
|
||||||
|
}
|
||||||
|
|
||||||
|
QTEST_GUILESS_MAIN(IdleTest)
|
||||||
|
#include "test_idle.moc"
|
Loading…
Reference in a new issue