diff --git a/autotests/managertest.cpp b/autotests/managertest.cpp --- a/autotests/managertest.cpp +++ b/autotests/managertest.cpp @@ -68,6 +68,26 @@ QVERIFY(NetworkManager::networkInterfaces().isEmpty()); QCOMPARE(removeDeviceSpy.at(0).at(0).toString(), addedDevicePath); + addDeviceSpy.clear(); + + fakeNetwork->addDevice(device); + QVERIFY(addDeviceSpy.wait()); + QCOMPARE(NetworkManager::networkInterfaces().count(), 1); + QCOMPARE(NetworkManager::networkInterfaces().first()->uni(), addDeviceSpy.at(0).at(0).toString()); + + addDeviceSpy.clear(); + removeDeviceSpy.clear(); + + fakeNetwork->unregisterService(); + QTRY_COMPARE(removeDeviceSpy.count(), 1); + + fakeNetwork->registerService(); + QTRY_COMPARE(addDeviceSpy.count(), 1); + + // Make sure deviceAdded is emitted only once + addDeviceSpy.wait(100); + QCOMPARE(addDeviceSpy.count(), 1); + delete device; } diff --git a/src/fakenetwork/fakenetwork.h b/src/fakenetwork/fakenetwork.h --- a/src/fakenetwork/fakenetwork.h +++ b/src/fakenetwork/fakenetwork.h @@ -80,6 +80,8 @@ /* Not part of DBus interface */ void addDevice(Device *device); void removeDevice(Device *device); + void registerService(); + void unregisterService(); private Q_SLOTS: void onConnectionAdded(const QDBusObjectPath &connection); diff --git a/src/fakenetwork/fakenetwork.cpp b/src/fakenetwork/fakenetwork.cpp --- a/src/fakenetwork/fakenetwork.cpp +++ b/src/fakenetwork/fakenetwork.cpp @@ -46,26 +46,16 @@ , m_deviceCounter(0) , m_settings(new Settings(this)) { - QDBusConnection::sessionBus().registerService(QLatin1Literal("org.kde.fakenetwork")); - QDBusConnection::sessionBus().registerObject(QLatin1Literal("/org/kde/fakenetwork"), this, QDBusConnection::ExportScriptableContents); - QDBusConnection::sessionBus().registerObject(QLatin1Literal("/org/kde/fakenetwork/Settings"), m_settings, QDBusConnection::ExportScriptableContents); - + registerService(); connect(m_settings, &Settings::connectionAdded, this, &FakeNetwork::onConnectionAdded); connect(m_settings, &Settings::connectionRemoved, this, &FakeNetwork::onConnectionRemoved); } FakeNetwork::~FakeNetwork() { - Q_FOREACH (const QDBusObjectPath & devicePath, m_devices.keys()) { - QDBusConnection::sessionBus().unregisterObject(devicePath.path()); - Q_EMIT DeviceRemoved(devicePath); - } + unregisterService(); qDeleteAll(m_devices); - delete m_settings; - QDBusConnection::sessionBus().unregisterObject(QLatin1Literal("/org/kde/fakenetwork/Settings")); - QDBusConnection::sessionBus().unregisterObject(QLatin1Literal("/org/kde/fakenetwork")); - QDBusConnection::sessionBus().unregisterService(QLatin1Literal("org.kde.fakenetwork")); } QDBusObjectPath FakeNetwork::activatingConnection() const @@ -199,6 +189,30 @@ Q_EMIT DeviceRemoved(QDBusObjectPath(device->devicePath())); } +void FakeNetwork::registerService() +{ + QDBusConnection::sessionBus().registerService(QLatin1Literal("org.kde.fakenetwork")); + QDBusConnection::sessionBus().registerObject(QLatin1Literal("/org/kde/fakenetwork"), this, QDBusConnection::ExportScriptableContents); + QDBusConnection::sessionBus().registerObject(QLatin1Literal("/org/kde/fakenetwork/Settings"), m_settings, QDBusConnection::ExportScriptableContents); + + Q_FOREACH (const QDBusObjectPath & devicePath, m_devices.keys()) { + QDBusConnection::sessionBus().registerObject(devicePath.path(), m_devices.value(devicePath), QDBusConnection::ExportScriptableContents); + Q_EMIT DeviceAdded(devicePath); + } +} + +void FakeNetwork::unregisterService() +{ + Q_FOREACH (const QDBusObjectPath & devicePath, m_devices.keys()) { + QDBusConnection::sessionBus().unregisterObject(devicePath.path()); + Q_EMIT DeviceRemoved(devicePath); + } + + QDBusConnection::sessionBus().unregisterObject(QLatin1Literal("/org/kde/fakenetwork/Settings")); + QDBusConnection::sessionBus().unregisterObject(QLatin1Literal("/org/kde/fakenetwork")); + QDBusConnection::sessionBus().unregisterService(QLatin1Literal("org.kde.fakenetwork")); +} + QDBusObjectPath FakeNetwork::ActivateConnection(const QDBusObjectPath &connection, const QDBusObjectPath &device, const QDBusObjectPath &specific_object) { ActiveConnection *newActiveConnection = new ActiveConnection(this); diff --git a/src/manager.cpp b/src/manager.cpp --- a/src/manager.cpp +++ b/src/manager.cpp @@ -680,8 +680,8 @@ // qCDebug(NMQT); if (!networkInterfaceMap.contains(objpath.path())) { networkInterfaceMap.insert(objpath.path(), Device::Ptr()); + Q_EMIT deviceAdded(objpath.path()); } - Q_EMIT deviceAdded(objpath.path()); } void NetworkManager::NetworkManagerPrivate::onDeviceRemoved(const QDBusObjectPath &objpath)