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

Side by Side Diff: chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc

Issue 2786103002: chromeos: Avoid DCHECK in ProxyResolutionServiceProvider. (Closed)
Patch Set: merge with change to create net::ProxyService in tests Created 3 years, 8 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/dbus/services/proxy_resolution_service_provider.h" 5 #include "chromeos/dbus/services/proxy_resolution_service_provider.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/logging.h"
8 #include "base/macros.h" 10 #include "base/macros.h"
9 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
10 #include "base/run_loop.h" 12 #include "base/run_loop.h"
11 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/test/thread_test_helper.h"
15 #include "base/threading/thread.h"
12 #include "base/threading/thread_task_runner_handle.h" 16 #include "base/threading/thread_task_runner_handle.h"
13 #include "chromeos/dbus/services/service_provider_test_helper.h" 17 #include "chromeos/dbus/services/service_provider_test_helper.h"
14 #include "dbus/message.h" 18 #include "dbus/message.h"
15 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
16 #include "net/proxy/mock_proxy_resolver.h" 20 #include "net/proxy/mock_proxy_resolver.h"
17 #include "net/proxy/proxy_config_service_fixed.h" 21 #include "net/proxy/proxy_config_service_fixed.h"
18 #include "net/proxy/proxy_info.h" 22 #include "net/proxy/proxy_info.h"
19 #include "net/proxy/proxy_resolver.h" 23 #include "net/proxy/proxy_resolver.h"
20 #include "net/url_request/url_request_context.h" 24 #include "net/url_request/url_request_context.h"
21 #include "net/url_request/url_request_test_util.h" 25 #include "net/url_request/url_request_test_util.h"
22 #include "third_party/cros_system_api/dbus/service_constants.h" 26 #include "third_party/cros_system_api/dbus/service_constants.h"
23 27
24 namespace chromeos { 28 namespace chromeos {
25 29
26 namespace { 30 namespace {
27 31
28 // ProxyResolutionServiceProvider will return the proxy info as a D-Bus 32 // ProxyResolutionServiceProvider will return the proxy info as a D-Bus
29 // signal, to the following signal interface and the signal name. 33 // signal, to the following signal interface and the signal name.
30 const char kReturnSignalInterface[] = "org.chromium.TestInterface"; 34 const char kReturnSignalInterface[] = "org.chromium.TestInterface";
31 const char kReturnSignalName[] = "TestSignal"; 35 const char kReturnSignalName[] = "TestSignal";
32 36
37 // Runs all tasks on |task_runner|.
38 void RunAllTasks(scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
39 scoped_refptr<base::ThreadTestHelper> helper =
40 new base::ThreadTestHelper(task_runner);
41 ASSERT_TRUE(helper->Run());
42 }
43
33 // Trivial net::ProxyResolver implementation that returns canned data either 44 // Trivial net::ProxyResolver implementation that returns canned data either
34 // synchronously or asynchronously. 45 // synchronously or asynchronously.
35 class TestProxyResolver : public net::ProxyResolver { 46 class TestProxyResolver : public net::ProxyResolver {
36 public: 47 public:
37 explicit TestProxyResolver( 48 explicit TestProxyResolver(
38 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner) 49 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
39 : network_task_runner_(network_task_runner) { 50 : network_task_runner_(network_task_runner) {
40 proxy_info_.UseDirect(); 51 proxy_info_.UseDirect();
41 } 52 }
42 ~TestProxyResolver() override = default; 53 ~TestProxyResolver() override = default;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 114
104 // Test ProxyResolutionServiceProvider::Delegate implementation. 115 // Test ProxyResolutionServiceProvider::Delegate implementation.
105 class TestDelegate : public ProxyResolutionServiceProvider::Delegate { 116 class TestDelegate : public ProxyResolutionServiceProvider::Delegate {
106 public: 117 public:
107 explicit TestDelegate( 118 explicit TestDelegate(
108 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner, 119 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner,
109 net::ProxyResolver* proxy_resolver) 120 net::ProxyResolver* proxy_resolver)
110 : proxy_resolver_(proxy_resolver), 121 : proxy_resolver_(proxy_resolver),
111 context_getter_( 122 context_getter_(
112 new net::TestURLRequestContextGetter(network_task_runner)) { 123 new net::TestURLRequestContextGetter(network_task_runner)) {
124 // NetworkProxy derives from base::NonThreadSafe, so it needs to be created
125 // on the network thread so it won't blow up when it's called from there
126 // later.
127 network_task_runner->PostTask(
128 FROM_HERE, base::Bind(&TestDelegate::CreateProxyServiceOnNetworkThread,
129 base::Unretained(this)));
130 RunAllTasks(network_task_runner);
Daniel Erat 2017/04/01 00:19:19 yuck.
James Cook 2017/04/03 15:30:23 lol
131 }
132
133 ~TestDelegate() override {
134 context_getter_->GetNetworkTaskRunner()->PostTask(
135 FROM_HERE, base::Bind(&TestDelegate::DeleteProxyServiceOnNetworkThread,
136 base::Unretained(this)));
137 RunAllTasks(context_getter_->GetNetworkTaskRunner());
Daniel Erat 2017/04/01 00:19:19 yuck again.
138 }
139
140 // ProxyResolutionServiceProvider::Delegate:
141 scoped_refptr<net::URLRequestContextGetter> GetRequestContext() override {
142 return context_getter_;
143 }
144
145 private:
146 // Helper method for the constructor that initializes |proxy_service_| and
147 // injects it into |context_getter_|'s context.
148 void CreateProxyServiceOnNetworkThread() {
149 CHECK(context_getter_->GetNetworkTaskRunner()->BelongsToCurrentThread());
150
113 // The config's autodetect property needs to be set in order for 151 // The config's autodetect property needs to be set in order for
114 // net::ProxyService to send requests to our resolver. 152 // net::ProxyService to send requests to our resolver.
115 net::ProxyConfig config = net::ProxyConfig::CreateAutoDetect(); 153 net::ProxyConfig config = net::ProxyConfig::CreateAutoDetect();
116 proxy_service_ = base::MakeUnique<net::ProxyService>( 154 proxy_service_ = base::MakeUnique<net::ProxyService>(
117 base::MakeUnique<net::ProxyConfigServiceFixed>(config), 155 base::MakeUnique<net::ProxyConfigServiceFixed>(config),
118 base::MakeUnique<TestProxyResolverFactory>(proxy_resolver_), 156 base::MakeUnique<TestProxyResolverFactory>(proxy_resolver_),
119 nullptr /* net_log */); 157 nullptr /* net_log */);
120 context_getter_->GetURLRequestContext()->set_proxy_service( 158 context_getter_->GetURLRequestContext()->set_proxy_service(
121 proxy_service_.get()); 159 proxy_service_.get());
122 } 160 }
123 ~TestDelegate() override = default;
124 161
125 // ProxyResolutionServiceProvider::Delegate: 162 // Helper method for the destructor that resets |proxy_service_|.
126 scoped_refptr<net::URLRequestContextGetter> GetRequestContext() override { 163 void DeleteProxyServiceOnNetworkThread() {
127 return context_getter_; 164 CHECK(context_getter_->GetNetworkTaskRunner()->BelongsToCurrentThread());
165 proxy_service_.reset();
128 } 166 }
129 167
130 private:
131 net::ProxyResolver* proxy_resolver_; // Not owned. 168 net::ProxyResolver* proxy_resolver_; // Not owned.
132 std::unique_ptr<net::ProxyService> proxy_service_; 169 std::unique_ptr<net::ProxyService> proxy_service_;
James Cook 2017/04/03 15:30:23 optional: comment that it lives on network thread?
Daniel Erat 2017/04/04 00:01:37 Done.
133 scoped_refptr<net::TestURLRequestContextGetter> context_getter_; 170 scoped_refptr<net::TestURLRequestContextGetter> context_getter_;
134 171
135 DISALLOW_COPY_AND_ASSIGN(TestDelegate); 172 DISALLOW_COPY_AND_ASSIGN(TestDelegate);
136 }; 173 };
137 174
138 } // namespace 175 } // namespace
139 176
140 class ProxyResolutionServiceProviderTest : public testing::Test { 177 class ProxyResolutionServiceProviderTest : public testing::Test {
141 public: 178 public:
142 ProxyResolutionServiceProviderTest() = default; 179 ProxyResolutionServiceProviderTest() : network_thread_("NetworkThread") {
143 ~ProxyResolutionServiceProviderTest() override = default; 180 CHECK(network_thread_.Start());
144 181
145 // testing::Test: 182 proxy_resolver_ =
146 void SetUp() override { 183 base::MakeUnique<TestProxyResolver>(network_thread_.task_runner());
147 proxy_resolver_ = base::MakeUnique<TestProxyResolver>(
148 base::ThreadTaskRunnerHandle::Get());
149 service_provider_ = base::MakeUnique<ProxyResolutionServiceProvider>( 184 service_provider_ = base::MakeUnique<ProxyResolutionServiceProvider>(
150 base::MakeUnique<TestDelegate>(base::ThreadTaskRunnerHandle::Get(), 185 base::MakeUnique<TestDelegate>(network_thread_.task_runner(),
151 proxy_resolver_.get())); 186 proxy_resolver_.get()));
152 test_helper_.SetUp(kResolveNetworkProxy, service_provider_.get()); 187 test_helper_.SetUp(kResolveNetworkProxy, service_provider_.get());
153 } 188 }
154 void TearDown() override { 189
190 ~ProxyResolutionServiceProviderTest() override {
155 test_helper_.TearDown(); 191 test_helper_.TearDown();
192
193 // URLRequestContextGetter posts a task to delete itself to its task runner,
194 // so give it a chance to do that.
195 service_provider_.reset();
196 RunAllTasks(network_thread_.task_runner());
197
198 network_thread_.Stop();
156 } 199 }
157 200
158 protected: 201 protected:
159 // Arguments extracted from a D-Bus signal. 202 // Arguments extracted from a D-Bus signal.
160 struct SignalInfo { 203 struct SignalInfo {
161 std::string source_url; 204 std::string source_url;
162 std::string proxy_info; 205 std::string proxy_info;
163 std::string error_message; 206 std::string error_message;
164 }; 207 };
165 208
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 // signal. OnSignalReceived() will be called upon the delivery. 252 // signal. OnSignalReceived() will be called upon the delivery.
210 test_helper_.SetUpReturnSignal( 253 test_helper_.SetUpReturnSignal(
211 kReturnSignalInterface, kReturnSignalName, 254 kReturnSignalInterface, kReturnSignalName,
212 base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived, 255 base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived,
213 base::Unretained(this)), 256 base::Unretained(this)),
214 base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal, 257 base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal,
215 base::Unretained(this))); 258 base::Unretained(this)));
216 } 259 }
217 260
218 *response_out = test_helper_.CallMethod(&method_call); 261 *response_out = test_helper_.CallMethod(&method_call);
262
263 // Let the main thread perform work on the network thread and then send the
264 // response.
219 base::RunLoop().RunUntilIdle(); 265 base::RunLoop().RunUntilIdle();
266 RunAllTasks(network_thread_.task_runner());
267 base::RunLoop().RunUntilIdle();
Daniel Erat 2017/04/04 00:01:37 sigh, it turns out there's a tricky race here. i t
268
220 *signal_out = std::move(signal_); 269 *signal_out = std::move(signal_);
221 } 270 }
222 271
272 // Thread used to perform network operations.
273 base::Thread network_thread_;
274
223 // Information about the last D-Bus signal received by OnSignalReceived(). 275 // Information about the last D-Bus signal received by OnSignalReceived().
224 std::unique_ptr<SignalInfo> signal_; 276 std::unique_ptr<SignalInfo> signal_;
225 277
226 std::unique_ptr<TestProxyResolver> proxy_resolver_; 278 std::unique_ptr<TestProxyResolver> proxy_resolver_;
227 std::unique_ptr<ProxyResolutionServiceProvider> service_provider_; 279 std::unique_ptr<ProxyResolutionServiceProvider> service_provider_;
228 ServiceProviderTestHelper test_helper_; 280 ServiceProviderTestHelper test_helper_;
229 }; 281 };
230 282
231 // Tests that synchronously-resolved proxy information is returned via a signal. 283 // Tests that synchronously-resolved proxy information is returned via a signal.
232 TEST_F(ProxyResolutionServiceProviderTest, SignalSync) { 284 TEST_F(ProxyResolutionServiceProviderTest, SignalSync) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 std::string proxy_info, error; 354 std::string proxy_info, error;
303 EXPECT_TRUE(reader.PopString(&proxy_info)); 355 EXPECT_TRUE(reader.PopString(&proxy_info));
304 EXPECT_TRUE(reader.PopString(&error)); 356 EXPECT_TRUE(reader.PopString(&error));
305 EXPECT_EQ(proxy_resolver_->proxy_info().ToPacString(), proxy_info); 357 EXPECT_EQ(proxy_resolver_->proxy_info().ToPacString(), proxy_info);
306 EXPECT_EQ("", error); 358 EXPECT_EQ("", error);
307 359
308 // No signal should've been emitted. 360 // No signal should've been emitted.
309 EXPECT_FALSE(signal); 361 EXPECT_FALSE(signal);
310 } 362 }
311 363
312 } // namespace chromeos 364 } // namespace chromeos
James Cook 2017/04/03 15:30:23 Awesome that you were able to make the tests cover
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698