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