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(®istry, &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"