1 /*
2 SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6 // Qt
7 #include <QSignalSpy>
8 #include <QtTest>
9 // Frameworks
10 #include <KIdleTime>
11 #include <KWayland/Client/connection_thread.h>
12 #include <KWayland/Client/fakeinput.h>
13 #include <KWayland/Client/registry.h>
14
15 using namespace KWayland::Client;
16
17 class IdleTest : public QObject
18 {
19 Q_OBJECT
20 private Q_SLOTS:
21 void init();
22 void cleanup();
23
24 void testCatchNextResumeEvent();
25 void testTimeout();
26
27 private:
28 ConnectionThread *m_connection = nullptr;
29 FakeInput *m_fakeInput = nullptr;
30 };
31
init()32 void IdleTest::init()
33 {
34 m_connection = ConnectionThread::fromApplication(this);
35 QVERIFY(m_connection);
36 Registry registry;
37 registry.create(m_connection);
38 QSignalSpy interfacesAnnounced(®istry, &Registry::interfacesAnnounced);
39 QVERIFY(interfacesAnnounced.isValid());
40 registry.setup();
41 QVERIFY(interfacesAnnounced.wait());
42 const auto fakeInterface = registry.interface(Registry::Interface::FakeInput);
43 QVERIFY(fakeInterface.name != 0);
44 m_fakeInput = registry.createFakeInput(fakeInterface.name, fakeInterface.version, this);
45 }
46
cleanup()47 void IdleTest::cleanup()
48 {
49 delete m_fakeInput;
50 m_fakeInput = nullptr;
51 delete m_connection;
52 m_connection = nullptr;
53 }
54
testCatchNextResumeEvent()55 void IdleTest::testCatchNextResumeEvent()
56 {
57 // this test uses catch next resume event to get the resuming from idle signal
58 QSignalSpy spy(KIdleTime::instance(), &KIdleTime::resumingFromIdle);
59 QVERIFY(spy.isValid());
60 KIdleTime::instance()->catchNextResumeEvent();
61 // on Wayland there is a five sec minimum time
62 QTest::qWait(6000);
63 // now fake input
64 QCOMPARE(spy.count(), 0);
65 m_fakeInput->requestPointerMove(QSizeF(1, 2));
66 QVERIFY(spy.wait());
67 }
68
testTimeout()69 void IdleTest::testTimeout()
70 {
71 // this test verifies adding a timeout and firing it
72 QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
73 QSignalSpy timeout1Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int)));
74 QVERIFY(timeout1Spy.isValid());
75 QSignalSpy timeout2Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int, int)));
76 QVERIFY(timeout2Spy.isValid());
77
78 const auto id = KIdleTime::instance()->addIdleTimeout(6000);
79 QCOMPARE(KIdleTime::instance()->idleTimeouts().size(), 1);
80 QVERIFY(KIdleTime::instance()->idleTimeouts().contains(id));
81 QCOMPARE(KIdleTime::instance()->idleTimeouts().value(id), 6000);
82 // Wait some time
83 QTest::qWait(4000);
84 // now we should be able to wait for the timeout
85 QVERIFY(timeout1Spy.wait());
86 QCOMPARE(timeout1Spy.count(), 1);
87 QCOMPARE(timeout2Spy.count(), 1);
88 QCOMPARE(timeout1Spy.first().at(0).toInt(), id);
89 QCOMPARE(timeout2Spy.first().at(0).toInt(), id);
90 QCOMPARE(timeout2Spy.first().at(1).toInt(), 6000);
91
92 // let's fake some input
93 // first wait
94 QTest::qWait(4000);
95 m_fakeInput->requestPointerMove(QSizeF(1, 2));
96 QVERIFY(!timeout1Spy.wait());
97
98 // now let's remove the timeout
99 KIdleTime::instance()->removeIdleTimeout(id);
100 QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
101 // now waiting should not trigger the timeout
102 QTest::qWait(4000);
103 QVERIFY(!timeout1Spy.wait());
104 }
105
106 QTEST_MAIN(IdleTest)
107 #include "idle_test.moc"
108