shill: Implement DHCPConfig::ReleaseIP

Also, add some unit tests, and some cleanup.

BUG=chromium-os:16365,chromium-os:16013
TEST=unit tests

Change-Id: I896bce08c6f177c9d5f6c5772c9208e8223c39df
Reviewed-on: http://gerrit.chromium.org/gerrit/2486
Reviewed-by: Chris Masone <cmasone@chromium.org>
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
diff --git a/dhcp_config.h b/dhcp_config.h
index 6d4ca2b..1152d61 100644
--- a/dhcp_config.h
+++ b/dhcp_config.h
@@ -7,9 +7,9 @@
 
 #include <base/file_path.h>
 #include <base/memory/scoped_ptr.h>
+#include <dbus-c++/connection.h>
 #include <glib.h>
 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
-#include <dbus-c++/connection.h>
 
 #include "shill/device.h"
 #include "shill/ipconfig.h"
@@ -55,10 +55,18 @@
                           const Configuration &configuration);
 
  private:
+  friend class DHCPConfigTest;
   FRIEND_TEST(DHCPConfigTest, GetIPv4AddressString);
   FRIEND_TEST(DHCPConfigTest, ParseConfiguration);
+  FRIEND_TEST(DHCPConfigTest, ReleaseIP);
+  FRIEND_TEST(DHCPConfigTest, RenewIP);
+  FRIEND_TEST(DHCPConfigTest, RequestIP);
+  FRIEND_TEST(DHCPConfigTest, Restart);
+  FRIEND_TEST(DHCPConfigTest, RestartNoClient);
   FRIEND_TEST(DHCPConfigTest, StartFail);
   FRIEND_TEST(DHCPConfigTest, StartSuccess);
+  FRIEND_TEST(DHCPConfigTest, Stop);
+  FRIEND_TEST(DHCPProviderTest, CreateConfig);
 
   static const char kDHCPCDPath[];
   static const char kDHCPCDPathFormatLease[];
@@ -70,6 +78,10 @@
   // Stops dhcpcd if running.
   void Stop();
 
+  // Stops dhcpcd if already running and then starts it. Returns true on success
+  // and false otherwise.
+  bool Restart();
+
   // Parses |configuration| into |properties|. Returns true on success, and
   // false otherwise.
   bool ParseConfiguration(const Configuration& configuration,
@@ -82,6 +94,8 @@
   // Called when the dhcpcd client process exits.
   static void ChildWatchCallback(GPid pid, gint status, gpointer data);
 
+  // Cleans up remaining state from a running client, if any, including freeing
+  // its GPid, exit watch callback, and state files.
   void CleanupClientState();
 
   DHCPProvider *provider_;