shill: Purge service/wifi_service state on Unload

Clear relevant state from Service and WiFiService when manager
notifies the service that it is no longer backed by a Profile.

BUG=chromium-os:22947
TEST=New unit tests

Change-Id: I048d2692fade5b883332e727be39f86caf4ed7f0
Reviewed-on: https://gerrit.chromium.org/gerrit/13880
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/wifi_service_unittest.cc b/wifi_service_unittest.cc
index 7254bd0..99bb635 100644
--- a/wifi_service_unittest.cc
+++ b/wifi_service_unittest.cc
@@ -36,6 +36,7 @@
 using ::testing::Return;
 using ::testing::SetArgumentPointee;
 using ::testing::StrEq;
+using ::testing::StrNe;
 
 class WiFiServiceTest : public PropertyStoreTest {
  public:
@@ -431,6 +432,44 @@
                               false));
 }
 
+TEST_F(WiFiServiceTest, LoadAndUnloadPassphrase) {
+  vector<uint8_t> ssid(5);
+  ssid.push_back(0xff);
+
+  WiFiServiceRefPtr service = new WiFiService(control_interface(),
+                                              dispatcher(),
+                                              manager(),
+                                              wifi(),
+                                              ssid,
+                                              flimflam::kModeManaged,
+                                              flimflam::kSecurityPsk,
+                                              false);
+  NiceMock<MockStore> mock_store;
+  const string storage_id = service->GetStorageIdentifier();
+  EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(mock_store, GetBool(_, _, _))
+      .WillRepeatedly(Return(false));
+  const string passphrase = "passphrase";
+  EXPECT_CALL(mock_store,
+              GetCryptedString(StrEq(storage_id),
+                               WiFiService::kStoragePassphrase, _))
+      .WillRepeatedly(DoAll(SetArgumentPointee<2>(passphrase), Return(true)));
+  EXPECT_CALL(mock_store,
+              GetCryptedString(StrEq(storage_id),
+                               StrNe(WiFiService::kStoragePassphrase), _))
+      .WillRepeatedly(Return(false));
+  EXPECT_TRUE(service->need_passphrase_);
+  EXPECT_TRUE(service->Load(&mock_store));
+  EXPECT_EQ(passphrase, service->passphrase_);
+  EXPECT_TRUE(service->connectable());
+  EXPECT_FALSE(service->need_passphrase_);
+  service->Unload();
+  EXPECT_EQ(string(""), service->passphrase_);
+  EXPECT_FALSE(service->connectable());
+  EXPECT_TRUE(service->need_passphrase_);
+}
+
 TEST_F(WiFiServiceTest, ParseStorageIdentifier) {
   vector<uint8_t> ssid(5);
   ssid.push_back(0xff);