Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Side by Side Diff: net/dns/mojo_host_resolver_impl_unittest.cc

Issue 892393005: Implement browser-side host resolver Mojo service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@v8-pac-interfaces
Patch Set: Address review comments. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
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/mojo_host_resolver_impl.h"
6
7 #include <string>
8
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/time/time.h"
13 #include "net/base/address_list.h"
14 #include "net/base/net_errors.h"
15 #include "net/base/net_util.h"
16 #include "net/dns/mock_host_resolver.h"
17 #include "net/dns/type_converters.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
20
21 namespace net {
22
23 namespace {
24
25 class TestRequestClient : public interfaces::HostResolverRequestClient {
26 public:
27 explicit TestRequestClient(interfaces::HostResolverRequestClientPtr* ptr)
28 : done_(false), binding_(this) {
Sam McNally 2015/02/06 07:12:32 binding_(this, ptr)
Anand Mistry (off Chromium) 2015/02/08 23:09:21 Done.
29 binding_.Bind(ptr);
30 }
31
32 void WaitForResult();
33
34 // Overridden from interfaces::HostResolverRequestClient.
35 void ReportResult(int32_t error, interfaces::AddressListPtr results) override;
36
37 int32_t error_;
38 interfaces::AddressListPtr results_;
39
40 private:
41 bool done_;
42 base::Closure run_loop_quit_closure_;
43
44 mojo::Binding<interfaces::HostResolverRequestClient> binding_;
45 };
46
47 void TestRequestClient::WaitForResult() {
48 if (done_)
49 return;
50
51 base::RunLoop run_loop;
52 run_loop_quit_closure_ = run_loop.QuitClosure();
53 run_loop.Run();
54 ASSERT_TRUE(done_);
55 }
56
57 void TestRequestClient::ReportResult(int32_t error,
58 interfaces::AddressListPtr results) {
59 ASSERT_FALSE(done_);
60 if (!run_loop_quit_closure_.is_null()) {
61 run_loop_quit_closure_.Run();
Sam McNally 2015/02/06 07:12:32 Before the ASSERT please.
Anand Mistry (off Chromium) 2015/02/08 23:09:21 Done.
62 }
63 error_ = error;
64 results_ = results.Pass();
65 done_ = true;
66 }
67
68 } // namespace
69
70 class MojoHostResolverImplTest : public testing::Test {
71 protected:
72 void SetUp() override {
73 mock_host_resolver_.rules()->AddRule("example.com", "1.2.3.4");
74 mock_host_resolver_.rules()->AddRule("chromium.org", "8.8.8.8");
75 mock_host_resolver_.rules()->AddSimulatedFailure("failure.fail");
76
77 resolver_service_.reset(new MojoHostResolverImpl(&mock_host_resolver_));
78 resolver_service_binding_.reset(
79 new mojo::Binding<interfaces::HostResolver>(resolver_service_.get()));
80 resolver_service_binding_->Bind(&resolver_service_ptr_);
81 }
82
83 interfaces::HostResolverRequestInfoPtr CreateRequest(const std::string& host,
84 uint16_t port,
85 bool is_my_ip_address) {
86 interfaces::HostResolverRequestInfoPtr request =
87 interfaces::HostResolverRequestInfo::New();
88 request->host = host;
89 request->port = port;
90 request->address_family = interfaces::ADDRESS_FAMILY_IPV4;
91 request->is_my_ip_address = is_my_ip_address;
92 return request.Pass();
93 }
94
95 // Wait until the resolver service has received |num| resolve requests.
96 void WaitForRequests(size_t num) {
97 // Neither MojoHostResolverImpl nor MockHostResolver allow us to wait for
98 // a specific number of requests, so just poll. Additionally, we can't just
99 // wait until the message loop is idle and assume that requests have been
100 // made, because Mojo internally ping-pongs between threads. So, the current
101 // message loop may appear idle, but another loop could have callbacks
102 // pending.
103 while (mock_host_resolver_.num_resolve() < num) {
104 base::RunLoop run_loop;
105 base::MessageLoop::current()->PostDelayedTask(
106 FROM_HERE, run_loop.QuitClosure(),
107 base::TimeDelta::FromMilliseconds(10));
108 run_loop.Run();
109 }
110 }
111
112 MockHostResolver mock_host_resolver_;
113 scoped_ptr<MojoHostResolverImpl> resolver_service_;
114
115 scoped_ptr<mojo::Binding<interfaces::HostResolver>> resolver_service_binding_;
116 interfaces::HostResolverPtr resolver_service_ptr_;
117 };
118
119 TEST_F(MojoHostResolverImplTest, Resolve) {
120 interfaces::HostResolverRequestClientPtr client_ptr;
121 TestRequestClient client(&client_ptr);
122
123 interfaces::HostResolverRequestInfoPtr request =
124 CreateRequest("example.com", 80, false);
125 resolver_service_ptr_->Resolve(request.Pass(), client_ptr.Pass());
126 client.WaitForResult();
127
128 EXPECT_EQ(net::OK, client.error_);
129 AddressList address_list = (*client.results_).To<AddressList>();
130 EXPECT_EQ(1U, address_list.size());
131 EXPECT_EQ("1.2.3.4:80", address_list[0].ToString());
132 }
133
134 TEST_F(MojoHostResolverImplTest, ResolveSynchronous) {
135 interfaces::HostResolverRequestClientPtr client_ptr;
136 TestRequestClient client(&client_ptr);
137
138 mock_host_resolver_.set_synchronous_mode(true);
139
140 interfaces::HostResolverRequestInfoPtr request =
141 CreateRequest("example.com", 80, false);
142 resolver_service_ptr_->Resolve(request.Pass(), client_ptr.Pass());
143 client.WaitForResult();
144
145 EXPECT_EQ(net::OK, client.error_);
146 AddressList address_list = (*client.results_).To<AddressList>();
147 EXPECT_EQ(1U, address_list.size());
148 EXPECT_EQ("1.2.3.4:80", address_list[0].ToString());
149 }
150
151 TEST_F(MojoHostResolverImplTest, ResolveMultiple) {
152 interfaces::HostResolverRequestClientPtr client1_ptr;
153 TestRequestClient client1(&client1_ptr);
154 interfaces::HostResolverRequestClientPtr client2_ptr;
155 TestRequestClient client2(&client2_ptr);
156
157 mock_host_resolver_.set_ondemand_mode(true);
158
159 interfaces::HostResolverRequestInfoPtr request1 =
160 CreateRequest("example.com", 80, false);
161 resolver_service_ptr_->Resolve(request1.Pass(), client1_ptr.Pass());
162 interfaces::HostResolverRequestInfoPtr request2 =
163 CreateRequest("chromium.org", 80, false);
164 resolver_service_ptr_->Resolve(request2.Pass(), client2_ptr.Pass());
165 WaitForRequests(2);
166 mock_host_resolver_.ResolveAllPending();
167
168 client1.WaitForResult();
169 client2.WaitForResult();
170
171 EXPECT_EQ(net::OK, client1.error_);
172 AddressList address_list = (*client1.results_).To<AddressList>();
173 EXPECT_EQ(1U, address_list.size());
174 EXPECT_EQ("1.2.3.4:80", address_list[0].ToString());
175 EXPECT_EQ(net::OK, client2.error_);
176 address_list = (*client2.results_).To<AddressList>();
177 EXPECT_EQ(1U, address_list.size());
178 EXPECT_EQ("8.8.8.8:80", address_list[0].ToString());
179 }
180
181 TEST_F(MojoHostResolverImplTest, ResolveDuplicate) {
182 interfaces::HostResolverRequestClientPtr client1_ptr;
183 TestRequestClient client1(&client1_ptr);
184 interfaces::HostResolverRequestClientPtr client2_ptr;
185 TestRequestClient client2(&client2_ptr);
186
187 mock_host_resolver_.set_ondemand_mode(true);
188
189 interfaces::HostResolverRequestInfoPtr request1 =
190 CreateRequest("example.com", 80, false);
191 resolver_service_ptr_->Resolve(request1.Pass(), client1_ptr.Pass());
192 interfaces::HostResolverRequestInfoPtr request2 =
193 CreateRequest("example.com", 80, false);
194 resolver_service_ptr_->Resolve(request2.Pass(), client2_ptr.Pass());
195 WaitForRequests(2);
196 mock_host_resolver_.ResolveAllPending();
197
198 client1.WaitForResult();
199 client2.WaitForResult();
200
201 EXPECT_EQ(net::OK, client1.error_);
202 AddressList address_list = (*client1.results_).To<AddressList>();
203 EXPECT_EQ(1U, address_list.size());
204 EXPECT_EQ("1.2.3.4:80", address_list[0].ToString());
205 EXPECT_EQ(net::OK, client2.error_);
206 address_list = (*client2.results_).To<AddressList>();
207 EXPECT_EQ(1U, address_list.size());
208 EXPECT_EQ("1.2.3.4:80", address_list[0].ToString());
209 }
210
211 TEST_F(MojoHostResolverImplTest, ResolveFailure) {
212 interfaces::HostResolverRequestClientPtr client_ptr;
213 TestRequestClient client(&client_ptr);
214
215 interfaces::HostResolverRequestInfoPtr request =
216 CreateRequest("failure.fail", 80, false);
217 resolver_service_ptr_->Resolve(request.Pass(), client_ptr.Pass());
218 client.WaitForResult();
219
220 EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, client.error_);
221 EXPECT_TRUE(client.results_.is_null());
222 }
223
224 TEST_F(MojoHostResolverImplTest, DestroyClient) {
225 interfaces::HostResolverRequestClientPtr client_ptr;
226 scoped_ptr<TestRequestClient> client(new TestRequestClient(&client_ptr));
227
228 mock_host_resolver_.set_ondemand_mode(true);
229
230 interfaces::HostResolverRequestInfoPtr request =
231 CreateRequest("example.com", 80, false);
232 resolver_service_ptr_->Resolve(request.Pass(), client_ptr.Pass());
233 WaitForRequests(1);
234
235 client.reset();
236 base::RunLoop().RunUntilIdle();
237
238 mock_host_resolver_.ResolveAllPending();
239 base::RunLoop().RunUntilIdle();
240 }
241
242 TEST_F(MojoHostResolverImplTest, DestroyService) {
243 interfaces::HostResolverRequestClientPtr client_ptr;
244 TestRequestClient client(&client_ptr);
245
246 mock_host_resolver_.set_ondemand_mode(true);
247
248 interfaces::HostResolverRequestInfoPtr request =
249 CreateRequest("example.com", 80, false);
250 resolver_service_ptr_->Resolve(request.Pass(), client_ptr.Pass());
251 WaitForRequests(1);
252
253 resolver_service_binding_.reset();
254 resolver_service_.reset();
255 base::RunLoop().RunUntilIdle();
256
257 mock_host_resolver_.ResolveAllPending();
258 base::RunLoop().RunUntilIdle();
259
260 EXPECT_FALSE(client_ptr);
Sam McNally 2015/02/06 07:12:32 I don't think this is testing what you think it is
Anand Mistry (off Chromium) 2015/02/08 23:09:21 Done.
261 }
262
263 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698