xref: /aosp_15_r20/external/cronet/net/dns/public/dns_over_https_config_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/dns/public/dns_over_https_config.h"
6 
7 #include "base/values.h"
8 #include "net/dns/public/dns_over_https_server_config.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace net {
13 namespace {
14 
15 const DnsOverHttpsServerConfig kServerConfig1 =
16     *DnsOverHttpsServerConfig::FromString("https://example1.test");
17 const DnsOverHttpsServerConfig kServerConfig2 =
18     *DnsOverHttpsServerConfig::FromString("https://example2.test");
19 
TEST(DnsOverHttpsConfigTest,SingleValue)20 TEST(DnsOverHttpsConfigTest, SingleValue) {
21   DnsOverHttpsConfig config({kServerConfig1});
22   EXPECT_THAT(config.servers(), testing::ElementsAre(kServerConfig1));
23 
24   base::Value::List expected_servers;
25   expected_servers.Append(kServerConfig1.ToValue());
26   base::Value::Dict expected_value;
27   expected_value.Set("servers", std::move(expected_servers));
28   EXPECT_EQ(expected_value, config.ToValue());
29 
30   EXPECT_EQ(config, config);
31 }
32 
TEST(DnsOverHttpsConfigTest,MultiValue)33 TEST(DnsOverHttpsConfigTest, MultiValue) {
34   std::vector<DnsOverHttpsServerConfig> servers{kServerConfig1, kServerConfig2};
35   DnsOverHttpsConfig config(servers);
36   EXPECT_EQ(servers, config.servers());
37 
38   EXPECT_EQ(kServerConfig1.server_template() + "\n" +
39                 kServerConfig2.server_template(),
40             config.ToString());
41 
42   base::Value::List expected_servers;
43   expected_servers.Append(kServerConfig1.ToValue());
44   expected_servers.Append(kServerConfig2.ToValue());
45   base::Value::Dict expected_value;
46   expected_value.Set("servers", std::move(expected_servers));
47   EXPECT_EQ(expected_value, config.ToValue());
48 
49   EXPECT_EQ(config, config);
50 }
51 
TEST(DnsOverHttpsConfigTest,Equal)52 TEST(DnsOverHttpsConfigTest, Equal) {
53   DnsOverHttpsConfig a({kServerConfig1});
54   DnsOverHttpsConfig a2({kServerConfig1});
55   DnsOverHttpsConfig b({kServerConfig1, kServerConfig2});
56   DnsOverHttpsConfig b2({kServerConfig1, kServerConfig2});
57 
58   EXPECT_EQ(a, a2);
59   EXPECT_EQ(b, b2);
60 }
61 
TEST(DnsOverHttpsConfigTest,NotEqual)62 TEST(DnsOverHttpsConfigTest, NotEqual) {
63   DnsOverHttpsConfig a({kServerConfig1});
64   DnsOverHttpsConfig b({kServerConfig2});
65   DnsOverHttpsConfig c({kServerConfig1, kServerConfig2});
66   DnsOverHttpsConfig d({kServerConfig2, kServerConfig1});
67 
68   EXPECT_FALSE(a == b);
69   EXPECT_FALSE(a == c);
70   EXPECT_FALSE(a == d);
71   EXPECT_FALSE(c == d);
72 }
73 
TEST(DnsOverHttpsConfigTest,FromStringSingleValue)74 TEST(DnsOverHttpsConfigTest, FromStringSingleValue) {
75   auto config =
76       DnsOverHttpsConfig::FromString(kServerConfig1.server_template());
77   EXPECT_THAT(config, testing::Optional(DnsOverHttpsConfig({kServerConfig1})));
78 }
79 
TEST(DnsOverHttpsConfigTest,FromStringMultiValue)80 TEST(DnsOverHttpsConfigTest, FromStringMultiValue) {
81   auto config =
82       DnsOverHttpsConfig::FromString(kServerConfig1.server_template() + "\n" +
83                                      kServerConfig2.server_template());
84   EXPECT_THAT(
85       config,
86       testing::Optional(DnsOverHttpsConfig({kServerConfig1, kServerConfig2})));
87 }
88 
TEST(DnsOverHttpsConfigTest,FromStringExtraWhitespace)89 TEST(DnsOverHttpsConfigTest, FromStringExtraWhitespace) {
90   auto config = DnsOverHttpsConfig::FromString(
91       "  \t" + kServerConfig1.server_template() + "    " +
92       kServerConfig2.server_template() + "\n ");
93   EXPECT_THAT(
94       config,
95       testing::Optional(DnsOverHttpsConfig({kServerConfig1, kServerConfig2})));
96 
97   auto config2 =
98       DnsOverHttpsConfig::FromString(kServerConfig1.server_template() + "\t" +
99                                      kServerConfig2.server_template());
100   EXPECT_EQ(config2, config);
101 }
102 
TEST(DnsOverHttpsConfigTest,FromStringEmpty)103 TEST(DnsOverHttpsConfigTest, FromStringEmpty) {
104   EXPECT_FALSE(DnsOverHttpsConfig::FromString(""));
105   EXPECT_EQ(DnsOverHttpsConfig(), DnsOverHttpsConfig::FromStringLax(""));
106 }
107 
TEST(DnsOverHttpsConfigTest,FromStringAllInvalid)108 TEST(DnsOverHttpsConfigTest, FromStringAllInvalid) {
109   EXPECT_FALSE(DnsOverHttpsConfig::FromString("foo"));
110   EXPECT_EQ(DnsOverHttpsConfig(), DnsOverHttpsConfig::FromStringLax("foo"));
111 
112   EXPECT_FALSE(DnsOverHttpsConfig::FromString("foo bar"));
113   EXPECT_EQ(DnsOverHttpsConfig(), DnsOverHttpsConfig::FromStringLax("foo bar"));
114 }
115 
TEST(DnsOverHttpsConfigTest,FromStringSomeInvalid)116 TEST(DnsOverHttpsConfigTest, FromStringSomeInvalid) {
117   std::string some_invalid = "foo " + kServerConfig1.server_template() +
118                              " bar " + kServerConfig2.server_template() +
119                              " baz";
120   EXPECT_FALSE(DnsOverHttpsConfig::FromString(some_invalid));
121   EXPECT_EQ(DnsOverHttpsConfig({kServerConfig1, kServerConfig2}),
122             DnsOverHttpsConfig::FromStringLax(some_invalid));
123 }
124 
TEST(DnsOverHttpsConfigTest,Json)125 TEST(DnsOverHttpsConfigTest, Json) {
126   auto parsed = DnsOverHttpsConfig::FromString(R"(
127     {
128       "servers": [{
129         "template": "https://dnsserver.example.net/dns-query{?dns}",
130         "endpoints": [{
131           "ips": ["192.0.2.1", "2001:db8::1"]
132         }, {
133           "ips": ["192.0.2.2", "2001:db8::2"]
134         }]
135       }]
136     }
137   )");
138 
139   ASSERT_TRUE(parsed);
140   EXPECT_EQ(1u, parsed->servers().size());
141 
142   auto parsed2 = DnsOverHttpsConfig::FromString(parsed->ToString());
143   EXPECT_EQ(parsed, parsed2);
144 }
145 
TEST(DnsOverHttpsConfigTest,JsonWithUnknownKey)146 TEST(DnsOverHttpsConfigTest, JsonWithUnknownKey) {
147   auto parsed = DnsOverHttpsConfig::FromString(R"(
148     {
149       "servers": [{
150         "template": "https://dnsserver.example.net/dns-query{?dns}"
151       }],
152       "unknown key": "value is ignored"
153     }
154   )");
155 
156   ASSERT_TRUE(parsed);
157   EXPECT_EQ(1u, parsed->servers().size());
158 
159   auto parsed2 = DnsOverHttpsConfig::FromString(parsed->ToString());
160   EXPECT_EQ(parsed, parsed2);
161 }
162 
TEST(DnsOverHttpsConfigTest,BadJson)163 TEST(DnsOverHttpsConfigTest, BadJson) {
164   // Not JSON
165   EXPECT_FALSE(DnsOverHttpsConfig::FromString("{"));
166 
167   // No servers
168   EXPECT_FALSE(DnsOverHttpsConfig::FromString("{}"));
169 
170   // Not a Dict
171   EXPECT_FALSE(DnsOverHttpsConfig::FromString("[]"));
172 
173   // Wrong type for "servers"
174   EXPECT_FALSE(DnsOverHttpsConfig::FromString("{\"servers\": 12345}"));
175 
176   // One bad server
177   EXPECT_FALSE(DnsOverHttpsConfig::FromString(R"(
178     {
179       "servers": [{
180         "template": "https://dnsserver.example.net/dns-query{?dns}",
181       }, {
182         "template": "not a valid template"
183       }]
184     }
185   )"));
186 }
187 
TEST(DnsOverHttpsConfigTest,JsonLax)188 TEST(DnsOverHttpsConfigTest, JsonLax) {
189   // Valid JSON is allowed
190   auto parsed = *DnsOverHttpsConfig::FromString(R"(
191     {
192       "servers": [{
193         "template": "https://dnsserver.example.net/dns-query{?dns}",
194         "endpoints": [{
195           "ips": ["192.0.2.1", "2001:db8::1"]
196         }, {
197           "ips": ["192.0.2.2", "2001:db8::2"]
198         }]
199       }]
200     }
201   )");
202   DnsOverHttpsConfig reparsed =
203       DnsOverHttpsConfig::FromStringLax(parsed.ToString());
204   EXPECT_EQ(parsed, reparsed);
205 
206   // Lax parsing does not accept bad servers in JSON.
207   DnsOverHttpsConfig from_bad = DnsOverHttpsConfig::FromStringLax(R"(
208     {
209       "servers": [{
210         "template": "https://dnsserver.example.net/dns-query{?dns}",
211       }, {
212         "template": "not a valid template"
213       }]
214     }
215   )");
216   EXPECT_THAT(from_bad.servers(), testing::IsEmpty());
217 }
218 
219 }  // namespace
220 }  // namespace net
221