shill: wimax: Update WiMAX connectable property based on credential status.

BUG=chrome-os-partner:9841
TEST=unit tests

Change-Id: I4f5d518d86b2e40d7635ee631efef6a782709d1f
Reviewed-on: https://gerrit.chromium.org/gerrit/23120
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/wimax_service.cc b/wimax_service.cc
index bbab451..323c1b0 100644
--- a/wimax_service.cc
+++ b/wimax_service.cc
@@ -89,7 +89,7 @@
                                             wimax_->address().c_str()));
   replace_if(
       storage_id_.begin(), storage_id_.end(), &Service::IllegalChar, '_');
-  set_connectable(true);
+  UpdateConnectable();
   return true;
 }
 
@@ -115,6 +115,25 @@
   return wimax_->GetRpcIdentifier();
 }
 
+bool WiMaxService::Is8021x() const {
+  return true;
+}
+
+void WiMaxService::set_eap(const EapCredentials &eap) {
+  Service::set_eap(eap);
+  UpdateConnectable();
+}
+
+void WiMaxService::UpdateConnectable() {
+  // Don't use Service::Is8021xConnectable because we don't support the full set
+  // of authentication methods.
+  bool is_connectable = false;
+  if (!eap().identity.empty()) {
+    is_connectable = !eap().password.empty();
+  }
+  set_connectable(is_connectable);
+}
+
 void WiMaxService::OnSignalStrengthChanged(int strength) {
   SLOG(WiMax, 2) << __func__ << "(" << strength << ")";
   SetStrength(strength);
diff --git a/wimax_service.h b/wimax_service.h
index fbd3e29..d2fd33a 100644
--- a/wimax_service.h
+++ b/wimax_service.h
@@ -44,15 +44,20 @@
   virtual void Connect(Error *error);
   virtual void Disconnect(Error *error);
   virtual std::string GetStorageIdentifier() const;
+  virtual bool Is8021x() const;
+  virtual void set_eap(const EapCredentials &eap);
 
  private:
   FRIEND_TEST(WiMaxServiceTest, GetDeviceRpcId);
   FRIEND_TEST(WiMaxServiceTest, OnSignalStrengthChanged);
+  FRIEND_TEST(WiMaxServiceTest, SetEAP);
 
   virtual std::string GetDeviceRpcId(Error *error);
 
   void OnSignalStrengthChanged(int strength);
 
+  void UpdateConnectable();
+
   WiMaxRefPtr wimax_;
   scoped_ptr<WiMaxNetworkProxyInterface> proxy_;
   std::string storage_id_;
diff --git a/wimax_service_unittest.cc b/wimax_service_unittest.cc
index 966f60d..8263bc1 100644
--- a/wimax_service_unittest.cc
+++ b/wimax_service_unittest.cc
@@ -113,8 +113,24 @@
   EXPECT_EQ(kName, service_->network_name());
   EXPECT_EQ(kName, service_->friendly_name());
   EXPECT_EQ(kIdentifier, service_->network_identifier());
-  EXPECT_TRUE(service_->connectable());
+  EXPECT_FALSE(service_->connectable());
   EXPECT_FALSE(service_->GetStorageIdentifier().empty());
 }
 
+TEST_F(WiMaxServiceTest, SetEAP) {
+  ServiceRefPtr base_service = service_;
+  EXPECT_TRUE(base_service->Is8021x());
+  EXPECT_TRUE(service_->need_passphrase_);
+  EXPECT_FALSE(base_service->connectable());
+  Service::EapCredentials eap;
+  eap.identity = "TestIdentity";
+  base_service->set_eap(eap);
+  EXPECT_TRUE(service_->need_passphrase_);
+  EXPECT_FALSE(base_service->connectable());
+  eap.password = "TestPassword";
+  base_service->set_eap(eap);
+  EXPECT_TRUE(service_->need_passphrase_);
+  EXPECT_TRUE(base_service->connectable());
+}
+
 }  // namespace shill