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