shill: cellular: Instantiate and propagate CellularOperatorInfo object.

BUG=chrome-os-partner:11985
TEST=Build and run unit tests.

Change-Id: I7bf5d20a15eefe18f92951780f059bf5559bba5d
Reviewed-on: https://gerrit.chromium.org/gerrit/37362
Reviewed-by: Thieu Le <thieule@chromium.org>
Commit-Ready: Ben Chan <benchan@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
diff --git a/cellular.cc b/cellular.cc
index 05ed26a..dd387dd 100644
--- a/cellular.cc
+++ b/cellular.cc
@@ -97,6 +97,7 @@
                    const string &owner,
                    const string &service,
                    const string &path,
+                   CellularOperatorInfo *cellular_operator_info,
                    mobile_provider_db *provider_db,
                    ProxyFactory *proxy_factory)
     : Device(control_interface,
@@ -113,6 +114,7 @@
       dbus_owner_(owner),
       dbus_service_(service),
       dbus_path_(path),
+      cellular_operator_info_(cellular_operator_info),
       provider_db_(provider_db),
       proxy_factory_(proxy_factory),
       allow_roaming_(false) {
diff --git a/cellular.h b/cellular.h
index 860a10d..11a3684 100644
--- a/cellular.h
+++ b/cellular.h
@@ -23,6 +23,7 @@
 namespace shill {
 
 class CellularCapability;
+class CellularOperatorInfo;
 class Error;
 class ProxyFactory;
 
@@ -109,6 +110,7 @@
            const std::string &owner,
            const std::string &service,
            const std::string &path,
+           CellularOperatorInfo *cellular_operator_info,
            mobile_provider_db *provider_db,
            ProxyFactory *proxy_factory);
   virtual ~Cellular();
@@ -150,6 +152,9 @@
   bool IsModemRegistered() const;
   static bool IsEnabledModemState(ModemState state);
 
+  CellularOperatorInfo *cellular_operator_info() const {
+    return cellular_operator_info_;
+  }
   mobile_provider_db *provider_db() const { return provider_db_; }
 
   const std::string &dbus_owner() const { return dbus_owner_; }
@@ -306,6 +311,7 @@
   const std::string dbus_service_;  // org.*.ModemManager*
   const std::string dbus_path_;  // ModemManager.Modem
 
+  CellularOperatorInfo *cellular_operator_info_;
   mobile_provider_db *provider_db_;
   ProxyFactory *proxy_factory_;
 
diff --git a/cellular_capability_cdma_unittest.cc b/cellular_capability_cdma_unittest.cc
index 7deaf90..493e75b 100644
--- a/cellular_capability_cdma_unittest.cc
+++ b/cellular_capability_cdma_unittest.cc
@@ -46,6 +46,7 @@
                                "",
                                "",
                                NULL,
+                               NULL,
                                ProxyFactory::GetInstance())),
         proxy_(new MockModemCDMAProxy()),
         capability_(NULL) {}
diff --git a/cellular_capability_classic_unittest.cc b/cellular_capability_classic_unittest.cc
index 8678e18..03e81c6 100644
--- a/cellular_capability_classic_unittest.cc
+++ b/cellular_capability_classic_unittest.cc
@@ -72,6 +72,7 @@
                                "",
                                "",
                                NULL,
+                               NULL,
                                &proxy_factory_)) {}
 
   virtual ~CellularCapabilityTest() {
diff --git a/cellular_capability_gsm_unittest.cc b/cellular_capability_gsm_unittest.cc
index 5829ed9..a4e2914 100644
--- a/cellular_capability_gsm_unittest.cc
+++ b/cellular_capability_gsm_unittest.cc
@@ -76,6 +76,7 @@
                                "",
                                "",
                                NULL,
+                               NULL,
                                &proxy_factory_)) {}
 
   virtual ~CellularCapabilityGSMTest() {
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index 43dc71d..cf0b0c3 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -89,6 +89,7 @@
                                "",
                                "",
                                NULL,
+                               NULL,
                                &proxy_factory_)),
         service_(new MockCellularService(&control_,
                                          &dispatcher_,
@@ -809,7 +810,7 @@
     MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
     MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
   };
-  for(size_t i = 0; i < arraysize(gsm_technologies); ++i) {
+  for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
     capability_->access_technologies_ = gsm_technologies[i];
     ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
   }
@@ -821,7 +822,7 @@
     MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
     MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
   };
-  for(size_t i = 0; i < arraysize(cdma_technologies); ++i) {
+  for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
     capability_->access_technologies_ = cdma_technologies[i];
     ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
   }
diff --git a/cellular_service_unittest.cc b/cellular_service_unittest.cc
index ccadc96..e01556a 100644
--- a/cellular_service_unittest.cc
+++ b/cellular_service_unittest.cc
@@ -41,6 +41,7 @@
                              "",
                              "",
                              NULL,
+                             NULL,
                              ProxyFactory::GetInstance())),
         service_(new CellularService(&control_, NULL, &metrics_, &manager_,
                                      device_)),
diff --git a/cellular_unittest.cc b/cellular_unittest.cc
index 35bb403..373f6e5 100644
--- a/cellular_unittest.cc
+++ b/cellular_unittest.cc
@@ -73,6 +73,7 @@
                              "",
                              "",
                              NULL,
+                             NULL,
                              ProxyFactory::GetInstance())) {}
   virtual ~CellularPropertyTest() {}
 
@@ -140,6 +141,7 @@
                              kDBusService,
                              kDBusPath,
                              NULL,
+                             NULL,
                              &proxy_factory_)) {}
 
   virtual ~CellularTest() {
diff --git a/mock_cellular.cc b/mock_cellular.cc
index c631a8c..7b19f73 100644
--- a/mock_cellular.cc
+++ b/mock_cellular.cc
@@ -20,11 +20,12 @@
                            const std::string &owner,
                            const std::string &service,
                            const std::string &path,
+                           CellularOperatorInfo *cellular_operator_info,
                            mobile_provider_db *provider_db,
                            ProxyFactory *proxy_factory)
     : Cellular(control_interface, dispatcher, metrics, manager, link_name,
                address, interface_index, type, owner, service, path,
-               provider_db, proxy_factory) {}
+               cellular_operator_info, provider_db, proxy_factory) {}
 
 MockCellular::~MockCellular() {}
 
diff --git a/mock_cellular.h b/mock_cellular.h
index 8b5be05..9f5c381 100644
--- a/mock_cellular.h
+++ b/mock_cellular.h
@@ -27,6 +27,7 @@
                const std::string &owner,
                const std::string &service,
                const std::string &path,
+               CellularOperatorInfo *cellular_operator_info,
                mobile_provider_db *provider_db,
                ProxyFactory *proxy_factory);
   virtual ~MockCellular();
diff --git a/mock_modem.cc b/mock_modem.cc
index ed9958d..2b4fa26 100644
--- a/mock_modem.cc
+++ b/mock_modem.cc
@@ -13,9 +13,10 @@
                      EventDispatcher *dispatcher,
                      Metrics *metrics,
                      Manager *manager,
+                     CellularOperatorInfo *cellular_operator_info,
                      mobile_provider_db *provider_db)
     : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, provider_db) {}
+            manager, cellular_operator_info, provider_db) {}
 
 MockModem::~MockModem() {}
 
diff --git a/mock_modem.h b/mock_modem.h
index 3f850f9..3be85c8 100644
--- a/mock_modem.h
+++ b/mock_modem.h
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #ifndef SHILL_MOCK_MODEM_H_
-#define SHILL_MOCK_MODEM_H_ 1
+#define SHILL_MOCK_MODEM_H_
 
 #include <string>
 
@@ -22,6 +22,7 @@
             EventDispatcher *dispatcher,
             Metrics *metrics,
             Manager *manager,
+            CellularOperatorInfo *cellular_operator_info,
             mobile_provider_db *provider_db);
   virtual ~MockModem();
 
diff --git a/modem.cc b/modem.cc
index 053fcdc..7eb301c 100644
--- a/modem.cc
+++ b/modem.cc
@@ -31,6 +31,7 @@
              EventDispatcher *dispatcher,
              Metrics *metrics,
              Manager *manager,
+             CellularOperatorInfo *cellular_operator_info,
              mobile_provider_db *provider_db)
     : owner_(owner),
       service_(service),
@@ -39,6 +40,7 @@
       dispatcher_(dispatcher),
       metrics_(metrics),
       manager_(manager),
+      cellular_operator_info_(cellular_operator_info),
       provider_db_(provider_db),
       type_(Cellular::kTypeInvalid),
       pending_device_info_(false),
@@ -91,6 +93,7 @@
                       owner_,
                       service_,
                       path_,
+                      cellular_operator_info_,
                       provider_db_,
                       ProxyFactory::GetInstance());
 }
diff --git a/modem.h b/modem.h
index 7b17108..d74061a 100644
--- a/modem.h
+++ b/modem.h
@@ -22,6 +22,7 @@
 
 namespace shill {
 
+class CellularOperatorInfo;
 class ControlInterface;
 class EventDispatcher;
 class Manager;
@@ -42,8 +43,9 @@
         EventDispatcher *dispatcher,
         Metrics *metrics,
         Manager *manager,
+        CellularOperatorInfo *cellular_operator_info,
         mobile_provider_db *provider_db);
-  ~Modem();
+  virtual ~Modem();
 
   // Asynchronously initializes support for the modem.
   // If the |properties| are valid and the MAC address is present,
@@ -72,6 +74,9 @@
   EventDispatcher *dispatcher() const { return dispatcher_; }
   Manager *manager() const { return manager_; }
   Metrics *metrics() const { return metrics_; }
+  CellularOperatorInfo *cellular_operator_info() const {
+    return cellular_operator_info_;
+  }
   mobile_provider_db *provider_db() const { return provider_db_; }
 
   virtual Cellular *ConstructCellular(const std::string &link_name,
@@ -120,6 +125,7 @@
   EventDispatcher *dispatcher_;
   Metrics *metrics_;
   Manager *manager_;
+  CellularOperatorInfo *cellular_operator_info_;
   mobile_provider_db *provider_db_;
   std::string link_name_;
   Cellular::Type type_;
@@ -141,6 +147,7 @@
                EventDispatcher *dispatcher,
                Metrics *metrics,
                Manager *manager,
+               CellularOperatorInfo *cellular_operator_info,
                mobile_provider_db *provider_db);
   virtual ~ModemClassic();
 
@@ -165,6 +172,7 @@
          EventDispatcher *dispatcher,
          Metrics *metrics,
          Manager *manager,
+         CellularOperatorInfo *cellular_operator_info,
          mobile_provider_db *provider_db);
   virtual ~Modem1();
 
diff --git a/modem_1.cc b/modem_1.cc
index 9d5ef6f..1eea438 100644
--- a/modem_1.cc
+++ b/modem_1.cc
@@ -16,9 +16,11 @@
 namespace shill {
 
 namespace {
+
 // The default place where the system keeps symbolic links for network device
 const char kDefaultNetfilesPath[] = "/sys/class/net";
-} // namespace {}
+
+}  // namespace
 
 Modem1::Modem1(const string &owner,
                const string &service,
@@ -27,9 +29,10 @@
                EventDispatcher *dispatcher,
                Metrics *metrics,
                Manager *manager,
+               CellularOperatorInfo *cellular_operator_info,
                mobile_provider_db *provider_db)
     : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, provider_db),
+            manager, cellular_operator_info, provider_db),
       netfiles_path_(kDefaultNetfilesPath) {
 }
 
@@ -63,7 +66,7 @@
   // FileEnumerator warns that it is a blocking interface; that
   // shouldn't be a problem here.
   file_util::FileEnumerator netfiles(netfiles_path_,
-                                     false, // don't recurse
+                                     false,  // don't recurse
                                      file_util::FileEnumerator::DIRECTORIES);
   for (FilePath link = netfiles.Next(); !link.empty(); link = netfiles.Next()) {
     FilePath target;
diff --git a/modem_1_unittest.cc b/modem_1_unittest.cc
index a290ae7..c5b95ee 100644
--- a/modem_1_unittest.cc
+++ b/modem_1_unittest.cc
@@ -61,6 +61,7 @@
                 &dispatcher_,
                 &metrics_,
                 &manager_,
+                static_cast<CellularOperatorInfo *>(NULL),
                 static_cast<mobile_provider_db *>(NULL))) {}
   virtual void SetUp();
   virtual void TearDown();
diff --git a/modem_classic.cc b/modem_classic.cc
index bb320ff..2d55e3a 100644
--- a/modem_classic.cc
+++ b/modem_classic.cc
@@ -20,9 +20,10 @@
                            EventDispatcher *dispatcher,
                            Metrics *metrics,
                            Manager *manager,
+                           CellularOperatorInfo *cellular_operator_info,
                            mobile_provider_db *provider_db)
     : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, provider_db) {
+            manager, cellular_operator_info, provider_db) {
 }
 
 ModemClassic::~ModemClassic() {}
diff --git a/modem_info.cc b/modem_info.cc
index 59aa95e..e6d0139 100644
--- a/modem_info.cc
+++ b/modem_info.cc
@@ -4,28 +4,36 @@
 
 #include "shill/modem_info.h"
 
+#include <base/file_path.h>
 #include <mm/mm-modem.h>
 #include <mobile_provider.h>
 
+#include "shill/cellular_operator_info.h"
 #include "shill/logging.h"
 #include "shill/modem_manager.h"
 
 using std::string;
 
-namespace shill {
-
-const char ModemInfo::kCromoService[] = "org.chromium.ModemManager";
-const char ModemInfo::kCromoPath[] = "/org/chromium/ModemManager";
-
 // TODO(rochberg): Fix modemmanager-next-interfaces ebuild to include
 // these so that we can simply include ModemManager.h and use these
 // defines
 #define MM_DBUS_PATH    "/org/freedesktop/ModemManager1"
 #define MM_DBUS_SERVICE "org.freedesktop.ModemManager1"
 
-const char ModemInfo::kMobileProviderDBPath[] =
+namespace shill {
+
+namespace {
+
+const char kCromoService[] = "org.chromium.ModemManager";
+const char kCromoPath[] = "/org/chromium/ModemManager";
+
+const char kCellularOperatorInfoPath[] =
+    "/usr/share/shill/cellular_operator_info";
+const char kMobileProviderDBPath[] =
     "/usr/share/mobile-broadband-provider-info/serviceproviders.bfd";
 
+}  // namespace
+
 ModemInfo::ModemInfo(ControlInterface *control_interface,
                      EventDispatcher *dispatcher,
                      Metrics *metrics,
@@ -44,6 +52,9 @@
 }
 
 void ModemInfo::Start() {
+  cellular_operator_info_.reset(new CellularOperatorInfo(glib_));
+  cellular_operator_info_->Load(FilePath(kCellularOperatorInfoPath));
+
   // TODO(petkov): Consider initializing the mobile provider database lazily
   // only if a GSM modem needs to be registered.
   provider_db_ = mobile_provider_open_db(provider_db_path_.c_str());
@@ -56,6 +67,7 @@
 }
 
 void ModemInfo::Stop() {
+  cellular_operator_info_.reset();
   mobile_provider_close_db(provider_db_);
   provider_db_ = NULL;
   modem_managers_.reset();
@@ -78,6 +90,7 @@
                                  metrics_,
                                  manager_,
                                  glib_,
+                                 cellular_operator_info_.get(),
                                  provider_db_);
   modem_managers_.push_back(manager);  // Passes ownership.
   manager->Start();
diff --git a/modem_info.h b/modem_info.h
index 18faeb3..f8596e9 100644
--- a/modem_info.h
+++ b/modem_info.h
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef SHILL_MODEM_INFO_
-#define SHILL_MODEM_INFO_
+#ifndef SHILL_MODEM_INFO_H_
+#define SHILL_MODEM_INFO_H_
 
 #include <string>
 
+#include <base/memory/scoped_ptr.h>
 #include <base/memory/scoped_vector.h>
 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
@@ -14,6 +15,7 @@
 
 namespace shill {
 
+class CellularOperatorInfo;
 class ControlInterface;
 class EventDispatcher;
 class GLib;
@@ -43,10 +45,6 @@
 
   typedef ScopedVector<ModemManager> ModemManagers;
 
-  static const char kCromoService[];
-  static const char kCromoPath[];
-  static const char kMobileProviderDBPath[];
-
   // Register and start new ModemManagers
   template <class mm> void RegisterModemManager(const std::string &service,
                                                 const std::string &path);
@@ -58,6 +56,7 @@
   Manager *manager_;
   GLib *glib_;
 
+  scoped_ptr<CellularOperatorInfo> cellular_operator_info_;
   std::string provider_db_path_;  // For testing.
   mobile_provider_db *provider_db_;  // Database instance owned by |this|.
 
@@ -66,4 +65,4 @@
 
 }  // namespace shill
 
-#endif  // SHILL_MODEM_INFO_
+#endif  // SHILL_MODEM_INFO_H_
diff --git a/modem_manager.cc b/modem_manager.cc
index 2144f01..89a5ea3 100644
--- a/modem_manager.cc
+++ b/modem_manager.cc
@@ -7,6 +7,7 @@
 #include <base/stl_util.h>
 #include <mm/mm-modem.h>
 
+#include "shill/cellular_operator_info.h"
 #include "shill/error.h"
 #include "shill/logging.h"
 #include "shill/modem.h"
@@ -26,6 +27,7 @@
                            Metrics *metrics,
                            Manager *manager,
                            GLib *glib,
+                           CellularOperatorInfo *cellular_operator_info,
                            mobile_provider_db *provider_db)
     : proxy_factory_(ProxyFactory::GetInstance()),
       service_(service),
@@ -36,6 +38,7 @@
       metrics_(metrics),
       manager_(manager),
       glib_(glib),
+      cellular_operator_info_(cellular_operator_info),
       provider_db_(provider_db) {}
 
 ModemManager::~ModemManager() {
@@ -119,22 +122,25 @@
 }
 
 // ModemManagerClassic
-ModemManagerClassic::ModemManagerClassic(const string &service,
-                                         const string &path,
-                                         ControlInterface *control_interface,
-                                         EventDispatcher *dispatcher,
-                                         Metrics *metrics,
-                                         Manager *manager,
-                                         GLib *glib,
-                                         mobile_provider_db *provider_db) :
-    ModemManager(service,
-                 path,
-                 control_interface,
-                 dispatcher,
-                 metrics,
-                 manager,
-                 glib,
-                 provider_db) {}
+ModemManagerClassic::ModemManagerClassic(
+    const string &service,
+    const string &path,
+    ControlInterface *control_interface,
+    EventDispatcher *dispatcher,
+    Metrics *metrics,
+    Manager *manager,
+    GLib *glib,
+    CellularOperatorInfo *cellular_operator_info,
+    mobile_provider_db *provider_db)
+    : ModemManager(service,
+                   path,
+                   control_interface,
+                   dispatcher,
+                   metrics,
+                   manager,
+                   glib,
+                   cellular_operator_info,
+                   provider_db) {}
 
 ModemManagerClassic::~ModemManagerClassic() {}
 
@@ -161,6 +167,7 @@
                                                   dispatcher(),
                                                   metrics(),
                                                   manager(),
+                                                  cellular_operator_info(),
                                                   provider_db()));
   RecordAddedModem(modem);
   InitModemClassic(modem);
diff --git a/modem_manager.h b/modem_manager.h
index ad5d3ae..89f6b40 100644
--- a/modem_manager.h
+++ b/modem_manager.h
@@ -23,8 +23,8 @@
 
 namespace shill {
 
+class CellularOperatorInfo;
 class ControlInterface;
-
 class DBusObjectManagerProxyInterface;
 class DBusPropertiesProxyInterface;
 class EventDispatcher;
@@ -46,6 +46,7 @@
                Metrics *metrics,
                Manager *manager,
                GLib *glib,
+               CellularOperatorInfo *cellular_operator_info_,
                mobile_provider_db *provider_db);
   virtual ~ModemManager();
 
@@ -69,6 +70,9 @@
   const std::string &service() const { return service_; }
   const std::string &path() const { return path_; }
   ProxyFactory *proxy_factory() const { return proxy_factory_; }
+  CellularOperatorInfo *cellular_operator_info() const {
+    return cellular_operator_info_;
+  }
   mobile_provider_db *provider_db() const { return provider_db_; }
 
   // Connect/Disconnect to a modem manager service.
@@ -126,6 +130,7 @@
   Metrics *metrics_;
   Manager *manager_;
   GLib *glib_;
+  CellularOperatorInfo *cellular_operator_info_;
   mobile_provider_db *provider_db_;
 
   DISALLOW_COPY_AND_ASSIGN(ModemManager);
@@ -140,6 +145,7 @@
                       Metrics *metrics,
                       Manager *manager,
                       GLib *glib,
+                      CellularOperatorInfo *cellular_operator_info,
                       mobile_provider_db *provider_db);
 
   virtual ~ModemManagerClassic();
@@ -173,6 +179,7 @@
                 Metrics *metrics,
                 Manager *manager,
                 GLib *glib,
+                CellularOperatorInfo *cellular_operator_info,
                 mobile_provider_db *provider_db);
 
   virtual ~ModemManager1();
diff --git a/modem_manager_1.cc b/modem_manager_1.cc
index 9d116db..6357d13 100644
--- a/modem_manager_1.cc
+++ b/modem_manager_1.cc
@@ -27,6 +27,7 @@
                              Metrics *metrics,
                              Manager *manager,
                              GLib *glib,
+                             CellularOperatorInfo *cellular_operator_info,
                              mobile_provider_db *provider_db)
     : ModemManager(service,
                    path,
@@ -35,6 +36,7 @@
                    metrics,
                    manager,
                    glib,
+                   cellular_operator_info,
                    provider_db),
       weak_ptr_factory_(this) {}
 
@@ -76,6 +78,7 @@
                                        dispatcher(),
                                        metrics(),
                                        manager(),
+                                       cellular_operator_info(),
                                        provider_db()));
   RecordAddedModem(modem1);
   InitModem1(modem1, properties);
diff --git a/modem_manager_unittest.cc b/modem_manager_unittest.cc
index f61aaa5..4266737 100644
--- a/modem_manager_unittest.cc
+++ b/modem_manager_unittest.cc
@@ -40,6 +40,7 @@
                    Metrics *metrics,
                    Manager *manager,
                    GLib *glib,
+                   CellularOperatorInfo *cellular_operator_info,
                    mobile_provider_db *provider_db)
       : ModemManager(service,
                      path,
@@ -48,6 +49,7 @@
                      metrics,
                      manager,
                      glib,
+                     cellular_operator_info,
                      provider_db) {}
 
   virtual ~ModemManagerCore() {}
@@ -65,8 +67,10 @@
   virtual void SetUp() {
     modem_.reset(new StrictModem(
         kOwner, kService, kModemPath, &control_interface_, &dispatcher_,
-        &metrics_, &manager_, static_cast<mobile_provider_db *>(NULL)));
+        &metrics_, &manager_, static_cast<CellularOperatorInfo *>(NULL),
+        static_cast<mobile_provider_db *>(NULL)));
   }
+
  protected:
   static const char kService[];
   static const char kPath[];
@@ -98,6 +102,7 @@
                        &metrics_,
                        &manager_,
                        &glib_,
+                       NULL,
                        NULL) {}
 
   virtual void TearDown() {
@@ -173,6 +178,7 @@
                               Metrics *metrics,
                               Manager *manager,
                               GLib *glib,
+                              CellularOperatorInfo *cellular_operator_info,
                               mobile_provider_db *provider_db) :
       ModemManagerClassic(service,
                           path,
@@ -181,6 +187,7 @@
                           metrics,
                           manager,
                           glib,
+                          cellular_operator_info,
                           provider_db) {}
   MOCK_METHOD1(InitModemClassic, void(shared_ptr<ModemClassic>));
 };
@@ -196,6 +203,7 @@
                        &metrics_,
                        &manager_,
                        &glib_,
+                       NULL,
                        NULL),
         proxy_(new MockModemManagerProxy()),
         proxy_factory_(this) {
@@ -256,6 +264,7 @@
                         Metrics *metrics,
                         Manager *manager,
                         GLib *glib,
+                        CellularOperatorInfo *cellular_operator_info,
                         mobile_provider_db *provider_db) :
       ModemManager1(service,
                     path,
@@ -264,6 +273,7 @@
                     metrics,
                     manager,
                     glib,
+                    cellular_operator_info,
                     provider_db) {}
   MOCK_METHOD2(InitModem1, void(shared_ptr<Modem1>,
                                 const DBusInterfaceToProperties &));
@@ -281,6 +291,7 @@
                        &metrics_,
                        &manager_,
                        &glib_,
+                       NULL,
                        NULL),
         proxy_(new MockDBusObjectManagerProxy()),
         proxy_factory_(this) {
diff --git a/modem_unittest.cc b/modem_unittest.cc
index 5023e45..5648122 100644
--- a/modem_unittest.cc
+++ b/modem_unittest.cc
@@ -75,6 +75,7 @@
                 &dispatcher_,
                 &metrics_,
                 &manager_,
+                static_cast<CellularOperatorInfo *>(NULL),
                 static_cast<mobile_provider_db *>(NULL))) {}
   virtual void SetUp();
   virtual void TearDown();
@@ -170,6 +171,7 @@
       kOwner,
       kService,
       kPath,
+      static_cast<CellularOperatorInfo *>(NULL),
       static_cast<mobile_provider_db *>(NULL),
       ProxyFactory::GetInstance());