diff --git a/dhcp_config_unittest.cc b/dhcp_config_unittest.cc
new file mode 100644
index 0000000..aa043e5
--- /dev/null
+++ b/dhcp_config_unittest.cc
@@ -0,0 +1,89 @@
+// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "shill/dhcp_config.h"
+#include "shill/mock_control.h"
+#include "shill/mock_device.h"
+
+using std::string;
+using std::vector;
+using testing::Test;
+
+namespace shill {
+
+class DHCPConfigTest : public Test {
+ public:
+  DHCPConfigTest() :
+      device_(new MockDevice(&control_interface_, NULL, NULL, "testname", 0)) {}
+
+ protected:
+  MockControl control_interface_;
+  scoped_refptr<MockDevice> device_;
+};
+
+TEST_F(DHCPConfigTest, GetIPv4AddressString) {
+  DHCPConfigRefPtr config(new DHCPConfig(NULL, *device_));
+  EXPECT_EQ("255.255.255.255", config->GetIPv4AddressString(0xffffffff));
+  EXPECT_EQ("0.0.0.0", config->GetIPv4AddressString(0));
+  EXPECT_EQ("1.2.3.4", config->GetIPv4AddressString(0x04030201));
+}
+
+TEST_F(DHCPConfigTest, ParseConfiguration) {
+  DHCPConfig::Configuration conf;
+  conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
+      0x01020304);
+  conf[DHCPConfig::kConfigurationKeySubnetCIDR].writer().append_byte(
+      16);
+  conf[DHCPConfig::kConfigurationKeyBroadcastAddress].writer().append_uint32(
+      0x10203040);
+  {
+    DBus::Variant var;
+    vector<unsigned int> routers;
+    routers.push_back(0x02040608);
+    routers.push_back(0x03050709);
+    DBus::MessageIter writer = var.writer();
+    writer << routers;
+    conf[DHCPConfig::kConfigurationKeyRouters] = var;
+  }
+  {
+    DBus::Variant var;
+    vector<unsigned int> dns;
+    dns.push_back(0x09070503);
+    dns.push_back(0x08060402);
+    DBus::MessageIter writer = var.writer();
+    writer << dns;
+    conf[DHCPConfig::kConfigurationKeyDNS] = var;
+  }
+  conf[DHCPConfig::kConfigurationKeyDomainName].writer().append_string(
+      "domain-name");
+  {
+    DBus::Variant var;
+    vector<string> search;
+    search.push_back("foo.com");
+    search.push_back("bar.com");
+    DBus::MessageIter writer = var.writer();
+    writer << search;
+    conf[DHCPConfig::kConfigurationKeyDomainSearch] = var;
+  }
+  conf[DHCPConfig::kConfigurationKeyMTU].writer().append_uint16(600);
+  conf["UnknownKey"] = DBus::Variant();
+
+  DHCPConfigRefPtr config(new DHCPConfig(NULL, *device_));
+  IPConfig::Properties properties;
+  ASSERT_TRUE(config->ParseConfiguration(conf, &properties));
+  EXPECT_EQ("4.3.2.1", properties.address);
+  EXPECT_EQ(16, properties.subnet_cidr);
+  EXPECT_EQ("64.48.32.16", properties.broadcast_address);
+  EXPECT_EQ("8.6.4.2", properties.gateway);
+  ASSERT_EQ(2, properties.dns_servers.size());
+  EXPECT_EQ("3.5.7.9", properties.dns_servers[0]);
+  EXPECT_EQ("2.4.6.8", properties.dns_servers[1]);
+  EXPECT_EQ("domain-name", properties.domain_name);
+  ASSERT_EQ(2, properties.domain_search.size());
+  EXPECT_EQ("foo.com", properties.domain_search[0]);
+  EXPECT_EQ("bar.com", properties.domain_search[1]);
+  EXPECT_EQ(600, properties.mtu);
+}
+
+}  // namespace shill
