shill: cellular: Avoid null pointer dereference if provider has no networks.

Also:

- Add a SetHomeProvider unit tests to CellularCapabilityUniversal.
- Free the test broadband provider database in CellularCapabilityUniversalTest.

BUG=chromium-os:33375
TEST=unit tests, tested on device

Change-Id: I37086954e51500840d6aa424964c973fccc6b22b
Reviewed-on: https://gerrit.chromium.org/gerrit/29872
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index a696172..2c0d14a 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -97,6 +97,10 @@
     cellular_->service_ = NULL;
     capability_ = NULL;
     device_adaptor_ = NULL;
+    if (provider_db_) {
+      mobile_provider_close_db(provider_db_);
+      provider_db_ = NULL;
+    }
   }
 
   virtual void SetUp() {
@@ -736,4 +740,50 @@
   ASSERT_EQ(capability_->GetTypeString(), "");
 }
 
+TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
+  static const char kTestCarrier[] = "The Cellular Carrier";
+  static const char kCountry[] = "us";
+  static const char kCode[] = "310160";
+  capability_->imsi_ = "310240123456789";
+
+  capability_->SetHomeProvider();  // No mobile provider DB available.
+  EXPECT_TRUE(cellular_->home_provider().GetName().empty());
+  EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
+  EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
+
+  InitProviderDB();
+  capability_->SetHomeProvider();
+  EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
+  EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
+  EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
+  EXPECT_EQ(4, capability_->apn_list_.size());
+  ASSERT_TRUE(capability_->home_provider_);
+  EXPECT_FALSE(capability_->home_provider_->requires_roaming);
+
+  Cellular::Operator oper;
+  cellular_->set_home_provider(oper);
+  capability_->spn_ = kTestCarrier;
+  capability_->SetHomeProvider();
+  EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
+  EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
+  EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
+
+  static const char kCubic[] = "Cubic";
+  capability_->spn_ = kCubic;
+  capability_->SetHomeProvider();
+  EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
+  EXPECT_EQ("", cellular_->home_provider().GetCode());
+  ASSERT_TRUE(capability_->home_provider_);
+  EXPECT_TRUE(capability_->home_provider_->requires_roaming);
+
+  static const char kCUBIC[] = "CUBIC";
+  capability_->spn_ = kCUBIC;
+  capability_->home_provider_ = NULL;
+  capability_->SetHomeProvider();
+  EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
+  EXPECT_EQ("", cellular_->home_provider().GetCode());
+  ASSERT_TRUE(capability_->home_provider_);
+  EXPECT_TRUE(capability_->home_provider_->requires_roaming);
+}
+
 }  // namespace shill