shill: cellular: Replace g_bus_watch_name with DBusNameWatcher.
This CL changes the ModemManager class to use DBusNameWatcher, instead
of g_bus_watch_name, to monitor the presence of modem manager DBus
service daemons. Glib::BusWatchName and Glib::BusUnwatchName are also
removed.
BUG=chromium:214475
TEST=Tested the following:
1. Build and run unit tests.
2. Manually verify, via /var/log/net.log, that shill can observe and
handle the scenarios when cromo and ModemManager appear on and vanish
from DBus.
Change-Id: I57257f076a05101d9c38d5ff3044884378e91337
Reviewed-on: https://chromium-review.googlesource.com/182052
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Ben Chan <benchan@chromium.org>
diff --git a/modem_manager_unittest.cc b/modem_manager_unittest.cc
index 197e0ea..6450660 100644
--- a/modem_manager_unittest.cc
+++ b/modem_manager_unittest.cc
@@ -7,7 +7,10 @@
#include <ModemManager/ModemManager.h>
#include "shill/manager.h"
+#include "shill/mock_control.h"
#include "shill/mock_dbus_objectmanager_proxy.h"
+#include "shill/mock_dbus_service_proxy.h"
+#include "shill/mock_manager.h"
#include "shill/mock_modem.h"
#include "shill/mock_modem_info.h"
#include "shill/mock_modem_manager_proxy.h"
@@ -22,34 +25,26 @@
using testing::Invoke;
using testing::Pointee;
using testing::Return;
+using testing::SaveArg;
using testing::StrEq;
using testing::Test;
namespace shill {
-// A testing subclass of ModemManager.
-class ModemManagerCore : public ModemManager {
- public:
- ModemManagerCore(const string &service,
- const string &path,
- ModemInfo * modem_info)
- : ModemManager(service,
- path,
- modem_info) {}
-
- virtual ~ModemManagerCore() {}
-
- MOCK_METHOD1(Connect, void(const string &owner));
- MOCK_METHOD0(Disconnect, void());
-};
-
class ModemManagerTest : public Test {
public:
ModemManagerTest()
- : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL) {}
+ : manager_(&control_, &dispatcher_, NULL, NULL),
+ modem_info_(&control_, &dispatcher_, NULL, &manager_, NULL),
+ dbus_service_proxy_(NULL) {}
virtual void SetUp() {
modem_.reset(new StrictModem(kOwner, kService, kModemPath, &modem_info_));
+ manager_.dbus_manager_.reset(new DBusManager());
+ dbus_service_proxy_ = new MockDBusServiceProxy();
+ // Ownership of |dbus_service_proxy_| is transferred to
+ // |manager_.dbus_manager_|.
+ manager_.dbus_manager_->proxy_.reset(dbus_service_proxy_);
}
protected:
@@ -61,7 +56,10 @@
shared_ptr<StrictModem> modem_;
EventDispatcher dispatcher_;
+ MockControl control_;
+ MockManager manager_;
MockModemInfo modem_info_;
+ MockDBusServiceProxy *dbus_service_proxy_;
};
const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
@@ -75,55 +73,52 @@
: ModemManagerTest(),
modem_manager_(kService, kPath, &modem_info_) {}
- virtual void TearDown() {
- modem_manager_.watcher_id_ = 0;
- }
-
protected:
- ModemManagerCore modem_manager_;
+ ModemManager modem_manager_;
};
-TEST_F(ModemManagerCoreTest, Start) {
- const int kWatcher = 123;
- EXPECT_CALL(*modem_info_.mock_glib(),
- BusWatchName(G_BUS_TYPE_SYSTEM,
- StrEq(kService),
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- ModemManager::OnAppear,
- ModemManager::OnVanish,
- &modem_manager_,
- NULL))
- .WillOnce(Return(kWatcher));
- EXPECT_EQ(0, modem_manager_.watcher_id_);
+TEST_F(ModemManagerCoreTest, StartStopWithModemManagerServiceAbsent) {
+ StringCallback get_name_owner_callback;
+ EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _))
+ .WillOnce(SaveArg<2>(&get_name_owner_callback));
modem_manager_.Start();
- EXPECT_EQ(kWatcher, modem_manager_.watcher_id_);
+ get_name_owner_callback.Run("", Error());
+ EXPECT_EQ("", modem_manager_.owner_);
+
+ modem_manager_.Stop();
+ EXPECT_EQ("", modem_manager_.owner_);
}
-TEST_F(ModemManagerCoreTest, Stop) {
- const int kWatcher = 345;
- modem_manager_.watcher_id_ = kWatcher;
- modem_manager_.owner_ = kOwner;
- EXPECT_CALL(*modem_info_.mock_glib(), BusUnwatchName(kWatcher)).Times(1);
- EXPECT_CALL(modem_manager_, Disconnect());
+TEST_F(ModemManagerCoreTest, StartStopWithModemManagerServicePresent) {
+ StringCallback get_name_owner_callback;
+ EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _))
+ .WillOnce(SaveArg<2>(&get_name_owner_callback));
+ modem_manager_.Start();
+ get_name_owner_callback.Run(kOwner, Error());
+ EXPECT_EQ(kOwner, modem_manager_.owner_);
+
modem_manager_.Stop();
+ EXPECT_EQ("", modem_manager_.owner_);
}
TEST_F(ModemManagerCoreTest, OnAppearVanish) {
+ EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _));
+ modem_manager_.Start();
EXPECT_EQ("", modem_manager_.owner_);
- EXPECT_CALL(modem_manager_, Connect(kOwner));
- EXPECT_CALL(modem_manager_, Disconnect());
- ModemManager::OnAppear(NULL, kService, kOwner, &modem_manager_);
- ModemManager::OnVanish(NULL, kService, &modem_manager_);
-}
-TEST_F(ModemManagerCoreTest, Connect) {
- EXPECT_EQ("", modem_manager_.owner_);
- modem_manager_.ModemManager::Connect(kOwner);
+ manager_.dbus_manager()->OnNameOwnerChanged(kService, "", kOwner);
EXPECT_EQ(kOwner, modem_manager_.owner_);
+
+ manager_.dbus_manager()->OnNameOwnerChanged(kService, kOwner, "");
+ EXPECT_EQ("", modem_manager_.owner_);
}
-TEST_F(ModemManagerCoreTest, Disconnect) {
- modem_manager_.owner_ = kOwner;
+TEST_F(ModemManagerCoreTest, ConnectDisconnect) {
+ EXPECT_EQ("", modem_manager_.owner_);
+ modem_manager_.Connect(kOwner);
+ EXPECT_EQ(kOwner, modem_manager_.owner_);
+ EXPECT_EQ(0, modem_manager_.modems_.size());
+
modem_manager_.RecordAddedModem(modem_);
EXPECT_EQ(1, modem_manager_.modems_.size());
@@ -132,12 +127,27 @@
EXPECT_EQ(0, modem_manager_.modems_.size());
}
-TEST_F(ModemManagerCoreTest, ModemExists) {
- modem_manager_.owner_ = kOwner;
-
+TEST_F(ModemManagerCoreTest, AddRemoveModem) {
+ modem_manager_.Connect(kOwner);
EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
+
+ // Remove non-existent modem path.
+ modem_manager_.RemoveModem(kModemPath);
+ EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
+
modem_manager_.RecordAddedModem(modem_);
EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
+
+ // Add an already added modem.
+ modem_manager_.RecordAddedModem(modem_);
+ EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
+
+ modem_manager_.RemoveModem(kModemPath);
+ EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
+
+ // Remove an already removed modem path.
+ modem_manager_.RemoveModem(kModemPath);
+ EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
}
class ModemManagerClassicMockInit : public ModemManagerClassic {