shill: Ignore certan DNS search paths

Add a manager property to provide a list of DNS Search paths
that should be ignored when applying DHCP parameters.  This
covers a list of DNS search suffixes that are popularly
provided, but are generally unlikely to provide any useful
results, therefore significantly reducing DNS lookup performance.

BUG=chromium-os:34495
TEST=Unit-tests + Manual: Add a domain to the default search list and make sure it is filtered from the "search" line in resolv.conf.
CQ-DEPENDS: I54bdd33a05bb704d8c3ff05f71e034fe42635e89

Change-Id: Id92b39f1ad0ae64b3ff50c7671cdf388d92a07af
Reviewed-on: https://gerrit.chromium.org/gerrit/33460
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/resolver_unittest.cc b/resolver_unittest.cc
index 2ede654..5988c12 100644
--- a/resolver_unittest.cc
+++ b/resolver_unittest.cc
@@ -24,6 +24,7 @@
 const char kNameServer1[] = "8.8.9.9";
 const char kSearchDomain0[] = "chromium.org";
 const char kSearchDomain1[] = "google.com";
+const char kSearchDomain2[] = "crosbug.com";
 const char kExpectedOutput[] =
   "nameserver 8.8.8.8\n"
   "nameserver 8.8.9.9\n"
@@ -34,6 +35,11 @@
   "nameserver 8.8.9.9\n"
   "search chromium.org google.com\n"
   "options single-request timeout-ms:300 attempts:15\n";
+const char kExpectedIgnoredSearchOutput[] =
+  "nameserver 8.8.8.8\n"
+  "nameserver 8.8.9.9\n"
+  "search google.com\n"
+  "options single-request timeout:1 attempts:3\n";
 }  // namespace {}
 
 class ResolverTest : public Test {
@@ -117,4 +123,27 @@
   EXPECT_FALSE(file_util::PathExists(path_));
 }
 
+TEST_F(ResolverTest, IgnoredSearchList) {
+  EXPECT_FALSE(file_util::PathExists(path_));
+  EXPECT_TRUE(resolver_->ClearDNS());
+
+  MockControl control;
+  vector<string> dns_servers;
+  vector<string> domain_search;
+  dns_servers.push_back(kNameServer0);
+  dns_servers.push_back(kNameServer1);
+  domain_search.push_back(kSearchDomain0);
+  domain_search.push_back(kSearchDomain1);
+  vector<string> ignored_search;
+  ignored_search.push_back(kSearchDomain0);
+  ignored_search.push_back(kSearchDomain2);
+  resolver_->set_ignored_search_list(ignored_search);
+  EXPECT_TRUE(resolver_->SetDNSFromLists(
+      dns_servers, domain_search, Resolver::kDefaultTimeout));
+  EXPECT_TRUE(file_util::PathExists(path_));
+  EXPECT_EQ(kExpectedIgnoredSearchOutput, ReadFile());
+
+  EXPECT_TRUE(resolver_->ClearDNS());
+}
+
 }  // namespace shill