shill: Static IP: Save DHCP-supplied IP parameters

Before Static IP parameters are applied to an IPConfig, save
all DHCP-supplied parameters to corresponding "SavedIP.*"
values in the service.  This way the UI can display:

 * The current IP address confgured on the interface by
   showing the IPConfig value.
 * The current user-supplied static IP parameter by showing
   the "StaticIP.*" parameter.
 * The DHCP-supplied IP parameter by first checking for a
   "SavedIP.*" parameter, failing that, using the IPConfig
   parameter.

BUG=chromium-os:33223
TEST=New unit test + manual (set StaticIP.Address parameter,
reconnect, and confirm that both SavedIP.Address and StaticIP.Address
parameters are set on the service)

Change-Id: I6410b003bbdc63097a193cfb09881c862dcef5bd
Reviewed-on: https://gerrit.chromium.org/gerrit/29130
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/static_ip_parameters_unittest.cc b/static_ip_parameters_unittest.cc
index 73397c7..649f5fe 100644
--- a/static_ip_parameters_unittest.cc
+++ b/static_ip_parameters_unittest.cc
@@ -38,8 +38,6 @@
  public:
   StaticIpParametersTest() {}
 
-  void PopulateParams();
-  void PopulateProps();
   void ExpectEmpty() {
     EXPECT_TRUE(props_.address.empty());
     EXPECT_TRUE(props_.gateway.empty());
@@ -172,4 +170,65 @@
   static_params_.Save(&store, kID);
 }
 
+TEST_F(StaticIpParametersTest, SavedParameters) {
+  const int32 kOffset = 1234;
+  const string kPrefix("xxx");
+  PropertyStore store;
+  static_params_.PlumbPropertyStore(&store);
+  Error error;
+  store.SetStringProperty("StaticIP.Address", kPrefix + kAddress, &error);
+  store.SetStringProperty("StaticIP.Gateway", kPrefix + kGateway, &error);
+  store.SetInt32Property("StaticIP.Mtu", kOffset + kMtu, &error);
+  store.SetStringProperty(
+      "StaticIP.NameServers", kPrefix + kNameServers, &error);
+  store.SetStringProperty(
+      "StaticIP.PeerAddress", kPrefix + kPeerAddress, &error);
+  store.SetInt32Property("StaticIP.Prefixlen", kOffset + kPrefixLen, &error);
+  Populate();
+  static_params_.ApplyTo(&props_);
+
+  PropertyStoreInspector inspector(&store);
+  string string_value;
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.Address", &string_value));
+  EXPECT_EQ(kAddress, string_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.Gateway", &string_value));
+  EXPECT_EQ(kGateway, string_value);
+  int32 int_value;
+  EXPECT_TRUE(inspector.GetInt32Property("SavedIP.Mtu", &int_value));
+  EXPECT_EQ(kMtu, int_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.NameServers",
+                                          &string_value));
+  EXPECT_EQ(kNameServers, string_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.PeerAddress",
+                                          &string_value));
+  EXPECT_EQ(kPeerAddress, string_value);
+  EXPECT_TRUE(inspector.GetInt32Property("SavedIP.Prefixlen",
+                                         &int_value));
+  EXPECT_EQ(kPrefixLen, int_value);
+
+  store.ClearProperty("StaticIP.Address", &error);
+  store.ClearProperty("StaticIP.Gateway", &error);
+  store.ClearProperty("StaticIP.Mtu", &error);
+  store.ClearProperty( "StaticIP.NameServers", &error);
+  store.ClearProperty( "StaticIP.PeerAddress", &error);
+  store.ClearProperty("StaticIP.Prefixlen", &error);
+
+  static_params_.ApplyTo(&props_);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.Address", &string_value));
+  EXPECT_EQ(kPrefix + kAddress, string_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.Gateway", &string_value));
+  EXPECT_EQ(kPrefix + kGateway, string_value);
+  EXPECT_TRUE(inspector.GetInt32Property("SavedIP.Mtu", &int_value));
+  EXPECT_EQ(kOffset + kMtu, int_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.NameServers",
+                                          &string_value));
+  EXPECT_EQ(kPrefix + kNameServers, string_value);
+  EXPECT_TRUE(inspector.GetStringProperty("SavedIP.PeerAddress",
+                                          &string_value));
+  EXPECT_EQ(kPrefix + kPeerAddress, string_value);
+  EXPECT_TRUE(inspector.GetInt32Property("SavedIP.Prefixlen",
+                                         &int_value));
+  EXPECT_EQ(kOffset + kPrefixLen, int_value);
+}
+
 }  // namespace shill