File indexing completed on 2024-05-12 17:00:18

0001 /*
0002     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 // Qt
0007 #include <QSignalSpy>
0008 #include <QtTest>
0009 // Frameworks
0010 #include <KIdleTime>
0011 #include <KWayland/Client/connection_thread.h>
0012 #include <KWayland/Client/fakeinput.h>
0013 #include <KWayland/Client/registry.h>
0014 
0015 using namespace KWayland::Client;
0016 
0017 class IdleTest : public QObject
0018 {
0019     Q_OBJECT
0020 private Q_SLOTS:
0021     void init();
0022     void cleanup();
0023 
0024     void testCatchNextResumeEvent();
0025     void testTimeout();
0026 
0027 private:
0028     ConnectionThread *m_connection = nullptr;
0029     FakeInput *m_fakeInput = nullptr;
0030 };
0031 
0032 void IdleTest::init()
0033 {
0034     m_connection = ConnectionThread::fromApplication(this);
0035     QVERIFY(m_connection);
0036     Registry registry;
0037     registry.create(m_connection);
0038     QSignalSpy interfacesAnnounced(&registry, &Registry::interfacesAnnounced);
0039     QVERIFY(interfacesAnnounced.isValid());
0040     registry.setup();
0041     QVERIFY(interfacesAnnounced.wait());
0042     const auto fakeInterface = registry.interface(Registry::Interface::FakeInput);
0043     QVERIFY(fakeInterface.name != 0);
0044     m_fakeInput = registry.createFakeInput(fakeInterface.name, fakeInterface.version, this);
0045 }
0046 
0047 void IdleTest::cleanup()
0048 {
0049     delete m_fakeInput;
0050     m_fakeInput = nullptr;
0051     delete m_connection;
0052     m_connection = nullptr;
0053 }
0054 
0055 void IdleTest::testCatchNextResumeEvent()
0056 {
0057     // this test uses catch next resume event to get the resuming from idle signal
0058     QSignalSpy spy(KIdleTime::instance(), &KIdleTime::resumingFromIdle);
0059     QVERIFY(spy.isValid());
0060     KIdleTime::instance()->catchNextResumeEvent();
0061     // on Wayland there is a five sec minimum time
0062     QTest::qWait(6000);
0063     // now fake input
0064     QCOMPARE(spy.count(), 0);
0065     m_fakeInput->requestPointerMove(QSizeF(1, 2));
0066     QVERIFY(spy.wait());
0067 }
0068 
0069 void IdleTest::testTimeout()
0070 {
0071     // this test verifies adding a timeout and firing it
0072     QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
0073     QSignalSpy timeout1Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int)));
0074     QVERIFY(timeout1Spy.isValid());
0075     QSignalSpy timeout2Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int, int)));
0076     QVERIFY(timeout2Spy.isValid());
0077 
0078     const auto id = KIdleTime::instance()->addIdleTimeout(6000);
0079     QCOMPARE(KIdleTime::instance()->idleTimeouts().size(), 1);
0080     QVERIFY(KIdleTime::instance()->idleTimeouts().contains(id));
0081     QCOMPARE(KIdleTime::instance()->idleTimeouts().value(id), 6000);
0082     // Wait some time
0083     QTest::qWait(4000);
0084     // now we should be able to wait for the timeout
0085     QVERIFY(timeout1Spy.wait());
0086     QCOMPARE(timeout1Spy.count(), 1);
0087     QCOMPARE(timeout2Spy.count(), 1);
0088     QCOMPARE(timeout1Spy.first().at(0).toInt(), id);
0089     QCOMPARE(timeout2Spy.first().at(0).toInt(), id);
0090     QCOMPARE(timeout2Spy.first().at(1).toInt(), 6000);
0091 
0092     // let's fake some input
0093     // first wait
0094     QTest::qWait(4000);
0095     m_fakeInput->requestPointerMove(QSizeF(1, 2));
0096     QVERIFY(!timeout1Spy.wait());
0097 
0098     // now let's remove the timeout
0099     KIdleTime::instance()->removeIdleTimeout(id);
0100     QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
0101     // now waiting should not trigger the timeout
0102     QTest::qWait(4000);
0103     QVERIFY(!timeout1Spy.wait());
0104 }
0105 
0106 QTEST_MAIN(IdleTest)
0107 #include "idle_test.moc"