From ac74de22c7bedb0c24c361abe326fbb58af307fd Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 21 Apr 2023 14:54:50 +0300 Subject: [PATCH] autotests: Fix testPlasmaVirtualDesktop The test fails because it incorrectly handles the server-side and the client-side virtual desktops being removed within one event loop cycle. In order to fix the test, this change makes the removal of server-side virtual desktop object take effect immediately. --- .../client/test_plasma_virtual_desktop.cpp | 56 +++++++++---------- .../plasmavirtualdesktop_interface.cpp | 24 ++++---- src/wayland/plasmavirtualdesktop_interface.h | 2 +- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/wayland/autotests/client/test_plasma_virtual_desktop.cpp b/src/wayland/autotests/client/test_plasma_virtual_desktop.cpp index f40d8239af..be10cf4cfa 100644 --- a/src/wayland/autotests/client/test_plasma_virtual_desktop.cpp +++ b/src/wayland/autotests/client/test_plasma_virtual_desktop.cpp @@ -174,19 +174,19 @@ void TestVirtualDesktop::testCreate() KWaylandServer::PlasmaVirtualDesktopInterface *desktop1Int = m_plasmaVirtualDesktopManagementInterface->createDesktop(QStringLiteral("0-1")); desktop1Int->setName("Desktop 1"); - desktopCreatedSpy.wait(); + QVERIFY(desktopCreatedSpy.wait()); QList arguments = desktopCreatedSpy.takeFirst(); QCOMPARE(arguments.at(0).toString(), QStringLiteral("0-1")); QCOMPARE(arguments.at(1).toUInt(), (quint32)0); m_plasmaVirtualDesktopManagementInterface->sendDone(); - managementDoneSpy.wait(); + QVERIFY(managementDoneSpy.wait()); QCOMPARE(m_plasmaVirtualDesktopManagement->desktops().length(), 1); KWayland::Client::PlasmaVirtualDesktop *desktop1 = m_plasmaVirtualDesktopManagement->desktops().first(); QSignalSpy desktop1DoneSpy(desktop1, &KWayland::Client::PlasmaVirtualDesktop::done); desktop1Int->sendDone(); - desktop1DoneSpy.wait(); + QVERIFY(desktop1DoneSpy.wait()); QCOMPARE(desktop1->id(), QStringLiteral("0-1")); QCOMPARE(desktop1->name(), QStringLiteral("Desktop 1")); @@ -194,7 +194,7 @@ void TestVirtualDesktop::testCreate() // on those createDesktop the bind will already be done KWaylandServer::PlasmaVirtualDesktopInterface *desktop2Int = m_plasmaVirtualDesktopManagementInterface->createDesktop(QStringLiteral("0-2")); desktop2Int->setName("Desktop 2"); - desktopCreatedSpy.wait(); + QVERIFY(desktopCreatedSpy.wait()); arguments = desktopCreatedSpy.takeFirst(); QCOMPARE(arguments.at(0).toString(), QStringLiteral("0-2")); QCOMPARE(arguments.at(1).toUInt(), (quint32)1); @@ -202,24 +202,24 @@ void TestVirtualDesktop::testCreate() KWaylandServer::PlasmaVirtualDesktopInterface *desktop3Int = m_plasmaVirtualDesktopManagementInterface->createDesktop(QStringLiteral("0-3")); desktop3Int->setName("Desktop 3"); - desktopCreatedSpy.wait(); + QVERIFY(desktopCreatedSpy.wait()); arguments = desktopCreatedSpy.takeFirst(); QCOMPARE(arguments.at(0).toString(), QStringLiteral("0-3")); QCOMPARE(m_plasmaVirtualDesktopManagement->desktops().length(), 3); m_plasmaVirtualDesktopManagementInterface->sendDone(); - managementDoneSpy.wait(); + QVERIFY(managementDoneSpy.wait()); // get the clients KWayland::Client::PlasmaVirtualDesktop *desktop2 = m_plasmaVirtualDesktopManagement->desktops()[1]; QSignalSpy desktop2DoneSpy(desktop2, &KWayland::Client::PlasmaVirtualDesktop::done); desktop2Int->sendDone(); - desktop2DoneSpy.wait(); + QVERIFY(desktop2DoneSpy.wait()); KWayland::Client::PlasmaVirtualDesktop *desktop3 = m_plasmaVirtualDesktopManagement->desktops()[2]; QSignalSpy desktop3DoneSpy(desktop3, &KWayland::Client::PlasmaVirtualDesktop::done); desktop3Int->sendDone(); - desktop3DoneSpy.wait(); + QVERIFY(desktop3DoneSpy.wait()); QCOMPARE(desktop1->id(), QStringLiteral("0-1")); QCOMPARE(desktop1->name(), QStringLiteral("Desktop 1")); @@ -275,7 +275,7 @@ void TestVirtualDesktop::testConnectNewClient() QSignalSpy managementDoneSpy(otherPlasmaVirtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::done); - managementDoneSpy.wait(); + QVERIFY(managementDoneSpy.wait()); QCOMPARE(otherPlasmaVirtualDesktopManagement->desktops().length(), 3); delete otherPlasmaVirtualDesktopManagement; @@ -295,9 +295,9 @@ void TestVirtualDesktop::testDestroy() m_plasmaVirtualDesktopManagementInterface->removeDesktop(QStringLiteral("0-1")); // test that both server and client desktoip interfaces go away - desktop1IntDestroyedSpy.wait(); - desktop1RemovedSpy.wait(); - desktop1DestroyedSpy.wait(); + QVERIFY(!desktop1IntDestroyedSpy.isEmpty()); + QVERIFY(desktop1RemovedSpy.wait()); + QVERIFY(desktop1DestroyedSpy.wait()); // coherence of order between client and server QCOMPARE(m_plasmaVirtualDesktopManagementInterface->desktops().length(), 2); @@ -310,7 +310,7 @@ void TestVirtualDesktop::testDestroy() // Test the desktopRemoved signal of the manager, remove another desktop as the signals can't be tested at the same time QSignalSpy desktopManagerRemovedSpy(m_plasmaVirtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::desktopRemoved); m_plasmaVirtualDesktopManagementInterface->removeDesktop(QStringLiteral("0-2")); - desktopManagerRemovedSpy.wait(); + QVERIFY(desktopManagerRemovedSpy.wait()); QCOMPARE(desktopManagerRemovedSpy.takeFirst().at(0).toString(), QStringLiteral("0-2")); QCOMPARE(m_plasmaVirtualDesktopManagementInterface->desktops().length(), 1); @@ -335,7 +335,7 @@ void TestVirtualDesktop::testActivate() QSignalSpy activatedSpy(desktop2, &KWayland::Client::PlasmaVirtualDesktop::activated); desktop2->requestActivate(); - requestActivateSpy.wait(); + QVERIFY(requestActivateSpy.wait()); // This simulates a compositor which supports only one active desktop at a time for (auto *deskInt : m_plasmaVirtualDesktopManagementInterface->desktops()) { @@ -345,7 +345,7 @@ void TestVirtualDesktop::testActivate() deskInt->setActive(false); } } - activatedSpy.wait(); + QVERIFY(activatedSpy.wait()); // correct state in the server QVERIFY(desktop2Int->isActive()); @@ -364,7 +364,7 @@ void TestVirtualDesktop::testActivate() deskInt->setActive(false); } } - deactivatedSpy.wait(); + QVERIFY(deactivatedSpy.wait()); } void TestVirtualDesktop::testEnterLeaveDesktop() @@ -373,7 +373,7 @@ void TestVirtualDesktop::testEnterLeaveDesktop() QSignalSpy enterRequestedSpy(m_windowInterface, &KWaylandServer::PlasmaWindowInterface::enterPlasmaVirtualDesktopRequested); m_window->requestEnterVirtualDesktop(QStringLiteral("0-1")); - enterRequestedSpy.wait(); + QVERIFY(enterRequestedSpy.wait()); QCOMPARE(enterRequestedSpy.takeFirst().at(0).toString(), QStringLiteral("0-1")); @@ -385,14 +385,14 @@ void TestVirtualDesktop::testEnterLeaveDesktop() QCOMPARE(m_windowInterface->plasmaVirtualDesktops().first(), QStringLiteral("0-1")); // check if the client received the enter - virtualDesktopEnteredSpy.wait(); + QVERIFY(virtualDesktopEnteredSpy.wait()); QCOMPARE(virtualDesktopEnteredSpy.takeFirst().at(0).toString(), QStringLiteral("0-1")); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 1); QCOMPARE(m_window->plasmaVirtualDesktops().first(), QStringLiteral("0-1")); // add another desktop, server side m_windowInterface->addPlasmaVirtualDesktop(QStringLiteral("0-3")); - virtualDesktopEnteredSpy.wait(); + QVERIFY(virtualDesktopEnteredSpy.wait()); QCOMPARE(virtualDesktopEnteredSpy.takeFirst().at(0).toString(), QStringLiteral("0-3")); QCOMPARE(m_windowInterface->plasmaVirtualDesktops().length(), 2); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 2); @@ -405,7 +405,7 @@ void TestVirtualDesktop::testEnterLeaveDesktop() // remove a desktop QSignalSpy leaveRequestedSpy(m_windowInterface, &KWaylandServer::PlasmaWindowInterface::leavePlasmaVirtualDesktopRequested); m_window->requestLeaveVirtualDesktop(QStringLiteral("0-1")); - leaveRequestedSpy.wait(); + QVERIFY(leaveRequestedSpy.wait()); QCOMPARE(leaveRequestedSpy.takeFirst().at(0).toString(), QStringLiteral("0-1")); @@ -417,7 +417,7 @@ void TestVirtualDesktop::testEnterLeaveDesktop() QCOMPARE(m_windowInterface->plasmaVirtualDesktops().first(), QStringLiteral("0-3")); // check if the client received the leave - virtualDesktopLeftSpy.wait(); + QVERIFY(virtualDesktopLeftSpy.wait()); QCOMPARE(virtualDesktopLeftSpy.takeFirst().at(0).toString(), QStringLiteral("0-1")); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 1); QCOMPARE(m_window->plasmaVirtualDesktops().first(), QStringLiteral("0-3")); @@ -425,7 +425,7 @@ void TestVirtualDesktop::testEnterLeaveDesktop() // Destroy desktop 2 m_plasmaVirtualDesktopManagementInterface->removeDesktop(QStringLiteral("0-3")); // the window should receive a left signal from the destroyed desktop - virtualDesktopLeftSpy.wait(); + QVERIFY(virtualDesktopLeftSpy.wait()); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 0); } @@ -439,14 +439,14 @@ void TestVirtualDesktop::testAllDesktops() // in the beginning the window is on desktop 1 and desktop 3 m_windowInterface->addPlasmaVirtualDesktop(QStringLiteral("0-1")); m_windowInterface->addPlasmaVirtualDesktop(QStringLiteral("0-3")); - virtualDesktopEnteredSpy.wait(); + QVERIFY(virtualDesktopEnteredSpy.wait()); // setting on all desktops QCOMPARE(m_window->plasmaVirtualDesktops().length(), 2); m_windowInterface->setOnAllDesktops(true); // setting on all desktops, the window will leave every desktop - virtualDesktopLeftSpy.wait(); + QVERIFY(virtualDesktopLeftSpy.wait()); QCOMPARE(virtualDesktopLeftSpy.count(), 2); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 0); QVERIFY(m_window->isOnAllDesktops()); @@ -456,7 +456,7 @@ void TestVirtualDesktop::testAllDesktops() // return to the active desktop (0-1) m_windowInterface->setOnAllDesktops(false); - virtualDesktopEnteredSpy.wait(); + QVERIFY(virtualDesktopEnteredSpy.wait()); QCOMPARE(m_window->plasmaVirtualDesktops().length(), 1); QCOMPARE(m_windowInterface->plasmaVirtualDesktops().first(), QStringLiteral("0-1")); QVERIFY(!m_window->isOnAllDesktops()); @@ -473,7 +473,7 @@ void TestVirtualDesktop::testCreateRequested() // listen for createdRequested m_plasmaVirtualDesktopManagement->requestCreateVirtualDesktop(QStringLiteral("Desktop"), 1); - desktopCreateRequestedSpy.wait(); + QVERIFY(desktopCreateRequestedSpy.wait()); QCOMPARE(desktopCreateRequestedSpy.first().first().toString(), QStringLiteral("Desktop")); QCOMPARE(desktopCreateRequestedSpy.first().at(1).toUInt(), (quint32)1); @@ -484,7 +484,7 @@ void TestVirtualDesktop::testCreateRequested() QCOMPARE(desktopInt->id(), QStringLiteral("0-4")); desktopInt->setName(QStringLiteral("Desktop")); - desktopCreatedSpy.wait(); + QVERIFY(desktopCreatedSpy.wait()); QCOMPARE(desktopCreatedSpy.first().first().toString(), QStringLiteral("0-4")); QCOMPARE(m_plasmaVirtualDesktopManagement->desktops().count(), 4); @@ -510,7 +510,7 @@ void TestVirtualDesktop::testRemoveRequested() // request a remove, just check the request arrived, ignore the request. m_plasmaVirtualDesktopManagement->requestRemoveVirtualDesktop(QStringLiteral("0-1")); - desktopRemoveRequestedSpy.wait(); + QVERIFY(desktopRemoveRequestedSpy.wait()); QCOMPARE(desktopRemoveRequestedSpy.first().first().toString(), QStringLiteral("0-1")); } diff --git a/src/wayland/plasmavirtualdesktop_interface.cpp b/src/wayland/plasmavirtualdesktop_interface.cpp index fc7cb2a68f..90851b9a0a 100644 --- a/src/wayland/plasmavirtualdesktop_interface.cpp +++ b/src/wayland/plasmavirtualdesktop_interface.cpp @@ -19,12 +19,10 @@ static const quint32 s_version = 2; class PlasmaVirtualDesktopInterfacePrivate : public QtWaylandServer::org_kde_plasma_virtual_desktop { public: - PlasmaVirtualDesktopInterfacePrivate(PlasmaVirtualDesktopInterface *q, PlasmaVirtualDesktopManagementInterface *c); + PlasmaVirtualDesktopInterfacePrivate(PlasmaVirtualDesktopInterface *q); ~PlasmaVirtualDesktopInterfacePrivate(); PlasmaVirtualDesktopInterface *q; - PlasmaVirtualDesktopManagementInterface *vdm; - QString id; QString name; bool active = false; @@ -121,7 +119,10 @@ PlasmaVirtualDesktopManagementInterface::PlasmaVirtualDesktopManagementInterface PlasmaVirtualDesktopManagementInterface::~PlasmaVirtualDesktopManagementInterface() { - qDeleteAll(d->desktops); + while (!d->desktops.isEmpty()) { + const QString id = d->desktops[0]->id(); + removeDesktop(id); + } } void PlasmaVirtualDesktopManagementInterface::setRows(quint32 rows) @@ -159,7 +160,7 @@ PlasmaVirtualDesktopInterface *PlasmaVirtualDesktopManagementInterface::createDe const quint32 actualPosition = std::min(position, (quint32)d->desktops.count()); - auto desktop = new PlasmaVirtualDesktopInterface(this); + auto desktop = new PlasmaVirtualDesktopInterface(); desktop->d->id = id; const auto desktopClientResources = desktop->d->resourceMap(); @@ -199,8 +200,10 @@ void PlasmaVirtualDesktopManagementInterface::removeDesktop(const QString &id) d->send_desktop_removed(resource->handle, id); } - (*deskIt)->deleteLater(); + PlasmaVirtualDesktopInterface *desktop = *deskIt; d->desktops.erase(deskIt); + + delete desktop; } QList PlasmaVirtualDesktopManagementInterface::desktops() const @@ -223,10 +226,9 @@ void PlasmaVirtualDesktopInterfacePrivate::org_kde_plasma_virtual_desktop_reques Q_EMIT q->activateRequested(); } -PlasmaVirtualDesktopInterfacePrivate::PlasmaVirtualDesktopInterfacePrivate(PlasmaVirtualDesktopInterface *q, PlasmaVirtualDesktopManagementInterface *c) +PlasmaVirtualDesktopInterfacePrivate::PlasmaVirtualDesktopInterfacePrivate(PlasmaVirtualDesktopInterface *q) : QtWaylandServer::org_kde_plasma_virtual_desktop() , q(q) - , vdm(c) { } @@ -252,15 +254,13 @@ void PlasmaVirtualDesktopInterfacePrivate::org_kde_plasma_virtual_desktop_bind_r } } -PlasmaVirtualDesktopInterface::PlasmaVirtualDesktopInterface(PlasmaVirtualDesktopManagementInterface *parent) - : QObject() - , d(new PlasmaVirtualDesktopInterfacePrivate(this, parent)) +PlasmaVirtualDesktopInterface::PlasmaVirtualDesktopInterface() + : d(new PlasmaVirtualDesktopInterfacePrivate(this)) { } PlasmaVirtualDesktopInterface::~PlasmaVirtualDesktopInterface() { - d->vdm->removeDesktop(id()); } QString PlasmaVirtualDesktopInterface::id() const diff --git a/src/wayland/plasmavirtualdesktop_interface.h b/src/wayland/plasmavirtualdesktop_interface.h index b1e00010b3..a1cc41e995 100644 --- a/src/wayland/plasmavirtualdesktop_interface.h +++ b/src/wayland/plasmavirtualdesktop_interface.h @@ -140,7 +140,7 @@ Q_SIGNALS: void activateRequested(); private: - explicit PlasmaVirtualDesktopInterface(PlasmaVirtualDesktopManagementInterface *parent); + PlasmaVirtualDesktopInterface(); friend class PlasmaVirtualDesktopManagementInterface; friend class PlasmaVirtualDesktopManagementInterfacePrivate;