1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
17b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart#include "shill/resolver.h"
18b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
1911c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
205ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart#include <base/files/scoped_temp_dir.h>
213e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/stl_util.h>
22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
23b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart#include <gtest/gtest.h>
24b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
25b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart#include "shill/mock_control.h"
26b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
270e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
28b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartusing std::string;
29b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartusing std::vector;
30b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartusing testing::Test;
31b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
32b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartnamespace shill {
33b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
34b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartnamespace {
35b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartconst char kNameServer0[] = "8.8.8.8";
36b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartconst char kNameServer1[] = "8.8.9.9";
37b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartconst char kSearchDomain0[] = "chromium.org";
38b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartconst char kSearchDomain1[] = "google.com";
39ee6b3d7f9d49fa52072a352fbb59f06127b1ba4cPaul Stewartconst char kSearchDomain2[] = "crbug.com";
40b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartconst char kExpectedOutput[] =
41b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  "nameserver 8.8.8.8\n"
42b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  "nameserver 8.8.9.9\n"
433bd0faa1bb82cec28874926a96165c2dab78a543Thieu Le  "search chromium.org google.com\n"
44f01ddd48950b26c1882caa50245df31c3b13067emukesh agrawal  "options single-request timeout:1 attempts:5\n";
454d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewartconst char kExpectedIgnoredSearchOutput[] =
464d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  "nameserver 8.8.8.8\n"
474d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  "nameserver 8.8.9.9\n"
484d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  "search google.com\n"
49f01ddd48950b26c1882caa50245df31c3b13067emukesh agrawal  "options single-request timeout:1 attempts:5\n";
508a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko}  // namespace
51b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
52b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartclass ResolverTest : public Test {
53b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart public:
54b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  ResolverTest() : resolver_(Resolver::GetInstance()) {}
55b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
56b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  virtual void SetUp() {
57b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
58b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart    path_ = temp_dir_.path().Append("resolver");
59b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart    resolver_->set_path(path_);
60b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  }
61b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
62b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  virtual void TearDown() {
63b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart    resolver_->set_path(FilePath(""));  // Don't try to save the store.
64b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart    ASSERT_TRUE(temp_dir_.Delete());
65b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  }
66b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
67b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart protected:
68b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  string ReadFile();
69b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
705ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart  base::ScopedTempDir temp_dir_;
713b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  Resolver* resolver_;
72b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  FilePath path_;
73b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart};
74b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
75b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartstring ResolverTest::ReadFile() {
76b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  string data;
77a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::ReadFileToString(resolver_->path_, &data));
78b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  return data;
79b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart}
80b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
81b6063942a712bc2825e78dc026a24a5d7b6131fcPaul StewartTEST_F(ResolverTest, NonEmpty) {
82a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_FALSE(base::PathExists(path_));
83b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  EXPECT_TRUE(resolver_->ClearDNS());
84b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
85b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  MockControl control;
866f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  vector<string> dns_servers;
876f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  vector<string> domain_search;
886f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  dns_servers.push_back(kNameServer0);
896f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  dns_servers.push_back(kNameServer1);
906f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  domain_search.push_back(kSearchDomain0);
916f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  domain_search.push_back(kSearchDomain1);
926f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart
9323ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_TRUE(resolver_->SetDNSFromLists(dns_servers, domain_search));
94a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::PathExists(path_));
95b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  EXPECT_EQ(kExpectedOutput, ReadFile());
96b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
97b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  EXPECT_TRUE(resolver_->ClearDNS());
98b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart}
99b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
100b6063942a712bc2825e78dc026a24a5d7b6131fcPaul StewartTEST_F(ResolverTest, Empty) {
101a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_FALSE(base::PathExists(path_));
102b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
103b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  MockControl control;
1046f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  vector<string> dns_servers;
1056f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  vector<string> domain_search;
106b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
10723ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_TRUE(resolver_->SetDNSFromLists(dns_servers, domain_search));
108a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_FALSE(base::PathExists(path_));
109b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart}
110b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
1114d5efb7d5d130e3e6e52ab732127a273bcb95261Paul StewartTEST_F(ResolverTest, IgnoredSearchList) {
112a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_FALSE(base::PathExists(path_));
1134d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  EXPECT_TRUE(resolver_->ClearDNS());
1144d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart
1154d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  MockControl control;
1164d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  vector<string> dns_servers;
1174d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  vector<string> domain_search;
1184d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  dns_servers.push_back(kNameServer0);
1194d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  dns_servers.push_back(kNameServer1);
1204d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  domain_search.push_back(kSearchDomain0);
1214d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  domain_search.push_back(kSearchDomain1);
1224d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  vector<string> ignored_search;
1234d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  ignored_search.push_back(kSearchDomain0);
1244d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  ignored_search.push_back(kSearchDomain2);
1254d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  resolver_->set_ignored_search_list(ignored_search);
12623ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_TRUE(resolver_->SetDNSFromLists(dns_servers, domain_search));
127a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::PathExists(path_));
1284d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  EXPECT_EQ(kExpectedIgnoredSearchOutput, ReadFile());
1294d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart
1304d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  EXPECT_TRUE(resolver_->ClearDNS());
1314d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart}
1324d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart
133b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart}  // namespace shill
134