1 /*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 #include "kwin_wayland_test.h"
10 #include "abstract_client.h"
11 #include "keyboard_input.h"
12 #include "keyboard_layout.h"
13 #include "platform.h"
14 #include "virtualdesktops.h"
15 #include "wayland_server.h"
16 #include "workspace.h"
17
18 #include <KConfigGroup>
19 #include <KGlobalAccel>
20
21 #include <linux/input.h>
22
23 using namespace KWin;
24 using namespace KWayland::Client;
25
26 static const QString s_socketName = QStringLiteral("wayland_test_kwin_keymap_creation_failure-0");
27
28 class KeymapCreationFailureTest : public QObject
29 {
30 Q_OBJECT
31 private Q_SLOTS:
32 void initTestCase();
33 void init();
34 void cleanup();
35
36 void testPointerButton();
37 };
38
initTestCase()39 void KeymapCreationFailureTest::initTestCase()
40 {
41 // situation for for BUG 381210
42 // this will fail to create keymap
43 qputenv("XKB_DEFAULT_RULES", "no");
44 qputenv("XKB_DEFAULT_MODEL", "no");
45 qputenv("XKB_DEFAULT_LAYOUT", "no");
46 qputenv("XKB_DEFAULT_VARIANT", "no");
47 qputenv("XKB_DEFAULT_OPTIONS", "no");
48
49 qRegisterMetaType<KWin::AbstractClient*>();
50 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
51 QVERIFY(applicationStartedSpy.isValid());
52 kwinApp()->platform()->setInitialWindowSize(QSize(1280, 1024));
53 QVERIFY(waylandServer()->init(s_socketName));
54
55 kwinApp()->setConfig(KSharedConfig::openConfig(QString(), KConfig::SimpleConfig));
56 kwinApp()->setKxkbConfig(KSharedConfig::openConfig(QString(), KConfig::SimpleConfig));
57 KConfigGroup layoutGroup = kwinApp()->kxkbConfig()->group("Layout");
58 layoutGroup.writeEntry("LayoutList", QStringLiteral("no"));
59 layoutGroup.writeEntry("Model", "no");
60 layoutGroup.writeEntry("Options", "no");
61 layoutGroup.sync();
62
63 kwinApp()->start();
64 QVERIFY(applicationStartedSpy.wait());
65 Test::initWaylandWorkspace();
66 }
67
init()68 void KeymapCreationFailureTest::init()
69 {
70 QVERIFY(Test::setupWaylandConnection());
71 }
72
cleanup()73 void KeymapCreationFailureTest::cleanup()
74 {
75 Test::destroyWaylandConnection();
76 }
77
testPointerButton()78 void KeymapCreationFailureTest::testPointerButton()
79 {
80 // test case for BUG 381210
81 // pressing a pointer button results in crash
82
83 // now create the crashing condition
84 // which is sending in a pointer event
85 kwinApp()->platform()->pointerButtonPressed(BTN_LEFT, 0);
86 kwinApp()->platform()->pointerButtonReleased(BTN_LEFT, 1);
87 }
88
89 WAYLANDTEST_MAIN(KeymapCreationFailureTest)
90 #include "keymap_creation_failure_test.moc"
91