19#include <xcb/xcb_icccm.h>
24static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_xwayland_server_crash-0");
35void XwaylandServerCrashTest::initTestCase()
37 qRegisterMetaType<X11Window *>();
41 QRect(0, 0, 1280, 1024),
42 QRect(1280, 0, 1280, 1024),
45 KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
46 KConfigGroup xwaylandGroup = config->group(QStringLiteral(
"Xwayland"));
47 xwaylandGroup.writeEntry(QStringLiteral(
"XwaylandCrashPolicy"), QStringLiteral(
"Stop"));
49 kwinApp()->setConfig(config);
52 QVERIFY(applicationStartedSpy.wait());
54 QCOMPARE(outputs.count(), 2);
55 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
56 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
59void XwaylandServerCrashTest::testCrash()
65 QVERIFY(!xcb_connection_has_error(c.get()));
66 const QRect windowGeometry(0, 0, 100, 200);
67 xcb_window_t windowId1 = xcb_generate_id(c.get());
68 xcb_create_window(c.get(), XCB_COPY_FROM_PARENT, windowId1,
rootWindow(),
71 windowGeometry.width(),
72 windowGeometry.height(),
73 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0,
nullptr);
74 xcb_size_hints_t hints;
75 memset(&hints, 0,
sizeof(hints));
76 xcb_icccm_size_hints_set_position(&hints, 1, windowGeometry.x(), windowGeometry.y());
77 xcb_icccm_size_hints_set_size(&hints, 1, windowGeometry.width(), windowGeometry.height());
78 xcb_icccm_size_hints_set_min_size(&hints, windowGeometry.width(), windowGeometry.height());
79 xcb_icccm_set_wm_normal_hints(c.get(), windowId1, &hints);
80 xcb_map_window(c.get(), windowId1);
84 QVERIFY(windowCreatedSpy.wait());
85 QPointer<X11Window> window = windowCreatedSpy.last().first().value<X11Window *>();
87 QVERIFY(window->isDecorated());
90 xcb_window_t windowId2 = xcb_generate_id(c.get());
91 const uint32_t values[] = {
true};
92 xcb_create_window(c.get(), XCB_COPY_FROM_PARENT, windowId2,
rootWindow(),
93 windowGeometry.x(), windowGeometry.y(),
94 windowGeometry.width(), windowGeometry.height(), 0,
95 XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT,
96 XCB_CW_OVERRIDE_REDIRECT, values);
97 xcb_map_window(c.get(), windowId2);
101 QVERIFY(unmanagedAddedSpy.wait());
102 QPointer<X11Window> unmanaged = unmanagedAddedSpy.last().first().value<X11Window *>();
107 Xwl::Xwayland *xwayland =
static_cast<Xwl::Xwayland *
>(kwinApp()->xwayland());
108 xwayland->xwaylandLauncher()->process()->terminate();
109 QVERIFY(x11ConnectionChangedSpy.wait());
113 QTRY_VERIFY(!window);
114 QTRY_VERIFY(!unmanaged);
115 QCOMPARE(kwinApp()->x11Connection(),
nullptr);
116 QCOMPARE(kwinApp()->x11RootWindow(), XCB_WINDOW_NONE);
121 QVERIFY(frameRenderedSpy.wait());
127#include "xwaylandserver_crash_test.moc"
void x11ConnectionChanged()
WorkspaceScene * scene() const
static Compositor * self()
void windowAdded(KWin::Window *)
QList< Output * > outputs() const
#define WAYLANDTEST_MAIN(TestObject)
void setOutputConfig(const QList< QRect > &geometries)
XcbConnectionPtr createX11Connection()
std::unique_ptr< xcb_connection_t, XcbConnectionDeleter > XcbConnectionPtr
KWIN_EXPORT xcb_window_t rootWindow()
WaylandServer * waylandServer()