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(&registry, &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