xref: /aosp_15_r20/external/cronet/net/dns/nsswitch_reader_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/dns/nsswitch_reader.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker #include <vector>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace net {
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker class TestFileReader {
20*6777b538SAndroid Build Coastguard Worker  public:
TestFileReader(std::string text)21*6777b538SAndroid Build Coastguard Worker   explicit TestFileReader(std::string text) : text_(std::move(text)) {}
22*6777b538SAndroid Build Coastguard Worker   TestFileReader(const TestFileReader&) = delete;
23*6777b538SAndroid Build Coastguard Worker   TestFileReader& operator=(const TestFileReader&) = delete;
24*6777b538SAndroid Build Coastguard Worker 
GetFileReadCall()25*6777b538SAndroid Build Coastguard Worker   NsswitchReader::FileReadCall GetFileReadCall() {
26*6777b538SAndroid Build Coastguard Worker     return base::BindRepeating(&TestFileReader::ReadFile,
27*6777b538SAndroid Build Coastguard Worker                                base::Unretained(this));
28*6777b538SAndroid Build Coastguard Worker   }
29*6777b538SAndroid Build Coastguard Worker 
ReadFile()30*6777b538SAndroid Build Coastguard Worker   std::string ReadFile() {
31*6777b538SAndroid Build Coastguard Worker     CHECK(!already_read_);
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker     already_read_ = true;
34*6777b538SAndroid Build Coastguard Worker     return text_;
35*6777b538SAndroid Build Coastguard Worker   }
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker  private:
38*6777b538SAndroid Build Coastguard Worker   std::string text_;
39*6777b538SAndroid Build Coastguard Worker   bool already_read_ = false;
40*6777b538SAndroid Build Coastguard Worker };
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker class NsswitchReaderTest : public testing::Test {
43*6777b538SAndroid Build Coastguard Worker  public:
44*6777b538SAndroid Build Coastguard Worker   NsswitchReaderTest() = default;
45*6777b538SAndroid Build Coastguard Worker   NsswitchReaderTest(const NsswitchReaderTest&) = delete;
46*6777b538SAndroid Build Coastguard Worker   NsswitchReaderTest& operator=(const NsswitchReaderTest&) = delete;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker  protected:
49*6777b538SAndroid Build Coastguard Worker   NsswitchReader reader_;
50*6777b538SAndroid Build Coastguard Worker };
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker // Attempt to load the actual nsswitch.conf for the test machine and run
53*6777b538SAndroid Build Coastguard Worker // rationality checks for the result.
TEST_F(NsswitchReaderTest,ActualReadAndParseHosts)54*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ActualReadAndParseHosts) {
55*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
56*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // Assume nobody will ever run this on a machine with more than 1000
59*6777b538SAndroid Build Coastguard Worker   // configured services.
60*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services, testing::SizeIs(testing::Le(1000u)));
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Assume no service will ever have more than 10 configured actions per
63*6777b538SAndroid Build Coastguard Worker   // service.
64*6777b538SAndroid Build Coastguard Worker   for (const NsswitchReader::ServiceSpecification& service : services) {
65*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(service.actions, testing::SizeIs(testing::Le(10u)));
66*6777b538SAndroid Build Coastguard Worker   }
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,FileReadErrorResultsInDefault)69*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, FileReadErrorResultsInDefault) {
70*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader("");
71*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
74*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Expect "files dns".
77*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
78*6777b538SAndroid Build Coastguard Worker       services,
79*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
80*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
81*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)));
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,MissingHostsResultsInDefault)84*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, MissingHostsResultsInDefault) {
85*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
86*6777b538SAndroid Build Coastguard Worker       "passwd: files ldap\nshadow: files\ngroup: files ldap\n";
87*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
88*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
91*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker   // Expect "files dns".
94*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
95*6777b538SAndroid Build Coastguard Worker       services,
96*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
97*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
98*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)));
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesAllKnownServices)101*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesAllKnownServices) {
102*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
103*6777b538SAndroid Build Coastguard Worker       "hosts: files dns mdns mdns4 mdns6 mdns_minimal mdns4_minimal "
104*6777b538SAndroid Build Coastguard Worker       "mdns6_minimal myhostname resolve nis";
105*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
106*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
109*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
112*6777b538SAndroid Build Coastguard Worker       services,
113*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
114*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
115*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns),
116*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns),
117*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns4),
118*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns6),
119*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
120*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdnsMinimal),
121*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
122*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdns4Minimal),
123*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
124*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdns6Minimal),
125*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
126*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMyHostname),
127*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
128*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kResolve),
129*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kNis)));
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesRepeatedServices)132*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesRepeatedServices) {
133*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns4 mdns6 mdns6 myhostname";
134*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
135*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
138*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
141*6777b538SAndroid Build Coastguard Worker       services,
142*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
143*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns4),
144*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns6),
145*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns6),
146*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
147*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMyHostname)));
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesAllKnownActions)150*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesAllKnownActions) {
151*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
152*6777b538SAndroid Build Coastguard Worker       "hosts: files [UNAVAIL=RETURN] [UNAVAIL=CONTINUE] [UNAVAIL=MERGE]";
153*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
154*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
157*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
160*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
161*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kFiles,
162*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kUnavailable,
163*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
164*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kUnavailable,
165*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue},
166*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kUnavailable,
167*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kMerge}})));
168*6777b538SAndroid Build Coastguard Worker }
169*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesAllKnownStatuses)170*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesAllKnownStatuses) {
171*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
172*6777b538SAndroid Build Coastguard Worker       "hosts: dns [SUCCESS=RETURN] [NOTFOUND=RETURN] [UNAVAIL=RETURN] "
173*6777b538SAndroid Build Coastguard Worker       "[TRYAGAIN=RETURN]";
174*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
175*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
178*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
181*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
182*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kDns,
183*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kSuccess,
184*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
185*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kNotFound,
186*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
187*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kUnavailable,
188*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
189*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kTryAgain,
190*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn}})));
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesRepeatedActions)193*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesRepeatedActions) {
194*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
195*6777b538SAndroid Build Coastguard Worker       "hosts: nis [!SUCCESS=RETURN] [NOTFOUND=RETURN] [NOTFOUND=RETURN] "
196*6777b538SAndroid Build Coastguard Worker       "[!UNAVAIL=RETURN]";
197*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
198*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
201*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
204*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
205*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kNis,
206*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/true, NsswitchReader::Status::kSuccess,
207*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
208*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kNotFound,
209*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
210*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kNotFound,
211*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
212*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/true, NsswitchReader::Status::kUnavailable,
213*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn}})));
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesCombinedActionLists)216*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesCombinedActionLists) {
217*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
218*6777b538SAndroid Build Coastguard Worker       "hosts: dns [SUCCESS=RETURN !NOTFOUND=RETURN UNAVAIL=RETURN] files";
219*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
220*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
223*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
226*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(
227*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
228*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kDns,
229*6777b538SAndroid Build Coastguard Worker                       {{/*negated=*/false, NsswitchReader::Status::kSuccess,
230*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kReturn},
231*6777b538SAndroid Build Coastguard Worker                        {/*negated=*/true, NsswitchReader::Status::kNotFound,
232*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kReturn},
233*6777b538SAndroid Build Coastguard Worker                        {/*negated=*/false, NsswitchReader::Status::kUnavailable,
234*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kReturn}}),
235*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
236*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kFiles)));
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,HandlesAtypicalWhitespace)239*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, HandlesAtypicalWhitespace) {
240*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
241*6777b538SAndroid Build Coastguard Worker       " database:  service   \n\n   hosts: files\tdns   mdns4 \t mdns6    \t  "
242*6777b538SAndroid Build Coastguard Worker       "\t\n\t\n";
243*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
244*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
247*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
248*6777b538SAndroid Build Coastguard Worker 
249*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
250*6777b538SAndroid Build Coastguard Worker       services,
251*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
252*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
253*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns),
254*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kMdns4),
255*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
256*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdns6)));
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,HandlesAtypicalWhitespaceInActions)259*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, HandlesAtypicalWhitespaceInActions) {
260*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
261*6777b538SAndroid Build Coastguard Worker       "hosts: dns [ !UNAVAIL=MERGE \t NOTFOUND=RETURN\t][ UNAVAIL=CONTINUE]";
262*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
263*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
264*6777b538SAndroid Build Coastguard Worker 
265*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
266*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
267*6777b538SAndroid Build Coastguard Worker 
268*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
269*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
270*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kDns,
271*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/true, NsswitchReader::Status::kUnavailable,
272*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kMerge},
273*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kNotFound,
274*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
275*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kUnavailable,
276*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue}})));
277*6777b538SAndroid Build Coastguard Worker }
278*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesActionsWithoutService)279*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesActionsWithoutService) {
280*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: [SUCCESS=RETURN]";
281*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
282*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
285*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
288*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
289*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kUnknown,
290*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kSuccess,
291*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn}})));
292*6777b538SAndroid Build Coastguard Worker }
293*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesNegatedActions)294*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesNegatedActions) {
295*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
296*6777b538SAndroid Build Coastguard Worker       "hosts: mdns_minimal [!UNAVAIL=RETURN] [NOTFOUND=CONTINUE] "
297*6777b538SAndroid Build Coastguard Worker       "[!TRYAGAIN=CONTINUE]";
298*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
299*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
302*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
305*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
306*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMdnsMinimal,
307*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/true, NsswitchReader::Status::kUnavailable,
308*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kReturn},
309*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kNotFound,
310*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue},
311*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/true, NsswitchReader::Status::kTryAgain,
312*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue}})));
313*6777b538SAndroid Build Coastguard Worker }
314*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesUnrecognizedServiceAsUnknown)315*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesUnrecognizedServiceAsUnknown) {
316*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
317*6777b538SAndroid Build Coastguard Worker       "passwd: files\nhosts: files super_awesome_service myhostname";
318*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
319*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
320*6777b538SAndroid Build Coastguard Worker 
321*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
322*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
323*6777b538SAndroid Build Coastguard Worker 
324*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
325*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
326*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kFiles),
327*6777b538SAndroid Build Coastguard Worker                                    NsswitchReader::ServiceSpecification(
328*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kUnknown),
329*6777b538SAndroid Build Coastguard Worker                                    NsswitchReader::ServiceSpecification(
330*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kMyHostname)));
331*6777b538SAndroid Build Coastguard Worker }
332*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesUnrecognizedStatusAsUnknown)333*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesUnrecognizedStatusAsUnknown) {
334*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
335*6777b538SAndroid Build Coastguard Worker       "hosts: nis [HELLO=CONTINUE]\nshadow: service\ndatabase: cheese";
336*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
337*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
340*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
341*6777b538SAndroid Build Coastguard Worker 
342*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
343*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
344*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kNis,
345*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kUnknown,
346*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue}})));
347*6777b538SAndroid Build Coastguard Worker }
348*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesUnrecognizedActionAsUnknown)349*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesUnrecognizedActionAsUnknown) {
350*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
351*6777b538SAndroid Build Coastguard Worker       "more: service\nhosts: mdns6 [!UNAVAIL=HI]\nshadow: service";
352*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
353*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
356*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
357*6777b538SAndroid Build Coastguard Worker 
358*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
359*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
360*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMdns6,
361*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/true, NsswitchReader::Status::kUnavailable,
362*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kUnknown}})));
363*6777b538SAndroid Build Coastguard Worker }
364*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesInvalidActionsAsUnknown)365*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesInvalidActionsAsUnknown) {
366*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns_minimal [a=b=c] nis";
367*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
368*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
369*6777b538SAndroid Build Coastguard Worker 
370*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
371*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
374*6777b538SAndroid Build Coastguard Worker       services,
375*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
376*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
377*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdnsMinimal,
378*6777b538SAndroid Build Coastguard Worker               {{/*negated=*/false, NsswitchReader::Status::kUnknown,
379*6777b538SAndroid Build Coastguard Worker                 NsswitchReader::Action::kUnknown}}),
380*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kNis)));
381*6777b538SAndroid Build Coastguard Worker }
382*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresInvalidlyClosedActions)383*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresInvalidlyClosedActions) {
384*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: myhostname [SUCCESS=MERGE";
385*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
386*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
389*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
390*6777b538SAndroid Build Coastguard Worker 
391*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
392*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
393*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMyHostname,
394*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kSuccess,
395*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kMerge}})));
396*6777b538SAndroid Build Coastguard Worker }
397*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,ParsesServicesAfterInvalidlyClosedActionsAsUnknown)398*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, ParsesServicesAfterInvalidlyClosedActionsAsUnknown) {
399*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: resolve [SUCCESS=CONTINUE dns";
400*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
401*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
402*6777b538SAndroid Build Coastguard Worker 
403*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
404*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
407*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
408*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kResolve,
409*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kSuccess,
410*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kContinue},
411*6777b538SAndroid Build Coastguard Worker                    {/*negated=*/false, NsswitchReader::Status::kUnknown,
412*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kUnknown}})));
413*6777b538SAndroid Build Coastguard Worker }
414*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresComments)415*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresComments) {
416*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
417*6777b538SAndroid Build Coastguard Worker       "#hosts: files super_awesome_service myhostname\nnetmask: service";
418*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
419*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
422*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
423*6777b538SAndroid Build Coastguard Worker 
424*6777b538SAndroid Build Coastguard Worker   // Expect "files dns" due to not finding an uncommented "hosts:" row.
425*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
426*6777b538SAndroid Build Coastguard Worker       services,
427*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
428*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
429*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)));
430*6777b538SAndroid Build Coastguard Worker }
431*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresEndOfLineComments)432*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresEndOfLineComments) {
433*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
434*6777b538SAndroid Build Coastguard Worker       "hosts: files super_awesome_service myhostname # dns";
435*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
436*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
439*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
440*6777b538SAndroid Build Coastguard Worker 
441*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
442*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
443*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kFiles),
444*6777b538SAndroid Build Coastguard Worker                                    NsswitchReader::ServiceSpecification(
445*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kUnknown),
446*6777b538SAndroid Build Coastguard Worker                                    NsswitchReader::ServiceSpecification(
447*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kMyHostname)));
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresCapitalization)450*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresCapitalization) {
451*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "HoStS: mDNS6 [!uNaVaIl=MeRgE]";
452*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
453*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
456*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
457*6777b538SAndroid Build Coastguard Worker 
458*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
459*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
460*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMdns6,
461*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/true, NsswitchReader::Status::kUnavailable,
462*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kMerge}})));
463*6777b538SAndroid Build Coastguard Worker }
464*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresEmptyActions)465*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresEmptyActions) {
466*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns_minimal [ \t ][] [ ]";
467*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
468*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
471*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
472*6777b538SAndroid Build Coastguard Worker 
473*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
474*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
475*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMdnsMinimal)));
476*6777b538SAndroid Build Coastguard Worker }
477*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresRepeatedActionBrackets)478*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresRepeatedActionBrackets) {
479*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns [[SUCCESS=RETURN]]]dns";
480*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
481*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
482*6777b538SAndroid Build Coastguard Worker 
483*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
484*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
487*6777b538SAndroid Build Coastguard Worker       services,
488*6777b538SAndroid Build Coastguard Worker       testing::ElementsAre(
489*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(
490*6777b538SAndroid Build Coastguard Worker               NsswitchReader::Service::kMdns,
491*6777b538SAndroid Build Coastguard Worker               {{/*negated=*/false, NsswitchReader::Status::kSuccess,
492*6777b538SAndroid Build Coastguard Worker                 NsswitchReader::Action::kReturn}}),
493*6777b538SAndroid Build Coastguard Worker           NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)));
494*6777b538SAndroid Build Coastguard Worker }
495*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresRepeatedActionBracketsWithWhitespace)496*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresRepeatedActionBracketsWithWhitespace) {
497*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns [ [ SUCCESS=RETURN ]\t] ]\t  mdns6";
498*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
499*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
500*6777b538SAndroid Build Coastguard Worker 
501*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
502*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
505*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(
506*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
507*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kMdns,
508*6777b538SAndroid Build Coastguard Worker                       {{/*negated=*/false, NsswitchReader::Status::kSuccess,
509*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kReturn}}),
510*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
511*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kMdns6)));
512*6777b538SAndroid Build Coastguard Worker }
513*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,RejectsNonSensicalActionBrackets)514*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, RejectsNonSensicalActionBrackets) {
515*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: mdns4 [UNAVAIL[=MERGE]]";
516*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
517*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
520*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
523*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
524*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kMdns4,
525*6777b538SAndroid Build Coastguard Worker                   {{/*negated=*/false, NsswitchReader::Status::kUnknown,
526*6777b538SAndroid Build Coastguard Worker                     NsswitchReader::Action::kMerge}})));
527*6777b538SAndroid Build Coastguard Worker }
528*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,RejectsServicesWithBrackets)529*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, RejectsServicesWithBrackets) {
530*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: se]r[vice[name";
531*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
532*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
533*6777b538SAndroid Build Coastguard Worker 
534*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
535*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
538*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
539*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kUnknown)));
540*6777b538SAndroid Build Coastguard Worker }
541*6777b538SAndroid Build Coastguard Worker 
542*6777b538SAndroid Build Coastguard Worker // Other than the case of repeating opening brackets, nested brackets are not
543*6777b538SAndroid Build Coastguard Worker // valid and should just get treated as part of an action label.
TEST_F(NsswitchReaderTest,RejectsNestedActionBrackets)544*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, RejectsNestedActionBrackets) {
545*6777b538SAndroid Build Coastguard Worker   const std::string kFile =
546*6777b538SAndroid Build Coastguard Worker       "hosts: nis [SUCCESS=RETURN [NOTFOUND=CONTINUE] UNAVAIL=MERGE]";
547*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
548*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
551*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
554*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(
555*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
556*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kNis,
557*6777b538SAndroid Build Coastguard Worker                       {{/*negated=*/false, NsswitchReader::Status::kSuccess,
558*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kReturn},
559*6777b538SAndroid Build Coastguard Worker                        {/*negated=*/false, NsswitchReader::Status::kUnknown,
560*6777b538SAndroid Build Coastguard Worker                         NsswitchReader::Action::kContinue}}),
561*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::ServiceSpecification(
562*6777b538SAndroid Build Coastguard Worker                       NsswitchReader::Service::kUnknown)));
563*6777b538SAndroid Build Coastguard Worker }
564*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresEmptyActionWithRepeatedBrackets)565*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresEmptyActionWithRepeatedBrackets) {
566*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: files [[[]]]] mdns";
567*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
568*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
569*6777b538SAndroid Build Coastguard Worker 
570*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
571*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
574*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
575*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kFiles),
576*6777b538SAndroid Build Coastguard Worker                                    NsswitchReader::ServiceSpecification(
577*6777b538SAndroid Build Coastguard Worker                                        NsswitchReader::Service::kMdns)));
578*6777b538SAndroid Build Coastguard Worker }
579*6777b538SAndroid Build Coastguard Worker 
TEST_F(NsswitchReaderTest,IgnoresEmptyActionAtEndOfString)580*6777b538SAndroid Build Coastguard Worker TEST_F(NsswitchReaderTest, IgnoresEmptyActionAtEndOfString) {
581*6777b538SAndroid Build Coastguard Worker   const std::string kFile = "hosts: dns [[";
582*6777b538SAndroid Build Coastguard Worker   TestFileReader file_reader(kFile);
583*6777b538SAndroid Build Coastguard Worker   reader_.set_file_read_call_for_testing(file_reader.GetFileReadCall());
584*6777b538SAndroid Build Coastguard Worker 
585*6777b538SAndroid Build Coastguard Worker   std::vector<NsswitchReader::ServiceSpecification> services =
586*6777b538SAndroid Build Coastguard Worker       reader_.ReadAndParseHosts();
587*6777b538SAndroid Build Coastguard Worker 
588*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(services,
589*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(NsswitchReader::ServiceSpecification(
590*6777b538SAndroid Build Coastguard Worker                   NsswitchReader::Service::kDns)));
591*6777b538SAndroid Build Coastguard Worker }
592*6777b538SAndroid Build Coastguard Worker 
593*6777b538SAndroid Build Coastguard Worker }  // namespace
594*6777b538SAndroid Build Coastguard Worker }  // namespace net
595