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

Side by Side Diff: net/proxy/proxy_config_service_linux_unittest.cc

Issue 10912132: Move ProxyConfigService construction onto the IO thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adjust comments Created 8 years, 2 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 | Annotate | Revision Log
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 "net/proxy/proxy_config_service_linux.h" 5 #include "net/proxy/proxy_config_service_linux.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 255
256 // This helper class runs ProxyConfigServiceLinux::GetLatestProxyConfig() on 256 // This helper class runs ProxyConfigServiceLinux::GetLatestProxyConfig() on
257 // the IO thread and synchronously waits for the result. 257 // the IO thread and synchronously waits for the result.
258 // Some code duplicated from proxy_script_fetcher_unittest.cc. 258 // Some code duplicated from proxy_script_fetcher_unittest.cc.
259 class SynchConfigGetter { 259 class SynchConfigGetter {
260 public: 260 public:
261 // Takes ownership of |config_service|. 261 // Takes ownership of |config_service|.
262 explicit SynchConfigGetter(net::ProxyConfigServiceLinux* config_service) 262 explicit SynchConfigGetter(net::ProxyConfigServiceLinux* config_service)
263 : event_(false, false), 263 : event_(false, false),
264 io_thread_("IO_Thread"), 264 io_thread_("IO_Thread"),
265 glib_task_runner_(base::MessageLoopProxy::current()),
265 config_service_(config_service) { 266 config_service_(config_service) {
266 // Start an IO thread. 267 // Start an IO thread.
267 base::Thread::Options options; 268 base::Thread::Options options;
268 options.message_loop_type = MessageLoop::TYPE_IO; 269 options.message_loop_type = MessageLoop::TYPE_IO;
269 io_thread_.StartWithOptions(options); 270 io_thread_.StartWithOptions(options);
270 271
271 // Make sure the thread started. 272 // Make sure the thread started.
272 io_thread_.message_loop()->PostTask(FROM_HERE, 273 io_thread_.message_loop()->PostTask(FROM_HERE,
273 base::Bind(&SynchConfigGetter::Init, base::Unretained(this))); 274 base::Bind(&SynchConfigGetter::Init, base::Unretained(this)));
274 Wait(); 275 Wait();
275 } 276 }
276 277
277 ~SynchConfigGetter() { 278 ~SynchConfigGetter() {
278 // Let the config service post a destroy message to the IO thread 279 // Let the config service post a destroy message to the IO thread
279 // before cleaning up that thread. 280 // before cleaning up that thread.
280 delete config_service_; 281 delete config_service_;
281 // Clean up the IO thread. 282 // Clean up the IO thread.
282 io_thread_.message_loop()->PostTask(FROM_HERE, 283 io_thread_.message_loop()->PostTask(FROM_HERE,
283 base::Bind(&SynchConfigGetter::CleanUp, base::Unretained(this))); 284 base::Bind(&SynchConfigGetter::CleanUp, base::Unretained(this)));
284 Wait(); 285 Wait();
285 } 286 }
286 287
287 // Does gconf setup and initial fetch of the proxy config, 288 // Does gconf setup and initial fetch of the proxy config.
288 // all on the calling thread (meant to be the thread with the
289 // default glib main loop, which is the UI thread).
290 void SetupAndInitialFetch() { 289 void SetupAndInitialFetch() {
291 MessageLoop* file_loop = io_thread_.message_loop(); 290 io_thread_.message_loop()->PostTask(FROM_HERE,
292 DCHECK_EQ(MessageLoop::TYPE_IO, file_loop->type()); 291 base::Bind(&SynchConfigGetter::SetupAndInitialFetchOnIOThread,
293 // We pass the mock IO thread as both the IO and file threads. 292 base::Unretained(this)));
294 config_service_->SetupAndFetchInitialConfig( 293 Wait();
295 base::MessageLoopProxy::current(), io_thread_.message_loop_proxy(), 294 // ProxyConfigServiceLinux will post back to the UI thread, so let it run
296 static_cast<MessageLoopForIO*>(file_loop)); 295 MessageLoop::current()->RunAllPending();
296 // ProxyConfigServiceLinux will post back to the IO thread, so let it run
297 io_thread_.message_loop()->PostTask(FROM_HERE,
298 base::Bind(&SynchConfigGetter::CleanUp, base::Unretained(this)));
299 Wait();
297 } 300 }
298 // Synchronously gets the proxy config. 301 // Synchronously gets the proxy config.
299 net::ProxyConfigService::ConfigAvailability SyncGetLatestProxyConfig( 302 net::ProxyConfigService::ConfigAvailability SyncGetLatestProxyConfig(
300 net::ProxyConfig* config) { 303 net::ProxyConfig* config) {
301 io_thread_.message_loop()->PostTask(FROM_HERE, 304 io_thread_.message_loop()->PostTask(FROM_HERE,
302 base::Bind(&SynchConfigGetter::GetLatestConfigOnIOThread, 305 base::Bind(&SynchConfigGetter::GetLatestConfigOnIOThread,
303 base::Unretained(this))); 306 base::Unretained(this)));
304 Wait(); 307 Wait();
305 *config = proxy_config_; 308 *config = proxy_config_;
306 return get_latest_config_result_; 309 return get_latest_config_result_;
307 } 310 }
308 311
309 private: 312 private:
310 // [Runs on |io_thread_|] 313 // [Runs on |io_thread_|]
311 void Init() { 314 void Init() {
312 event_.Signal(); 315 event_.Signal();
313 } 316 }
314 317
315 // Calls GetLatestProxyConfig, running on |io_thread_| Signals |event_| 318 // Calls GetLatestProxyConfig, running on |io_thread_| Signals |event_|
316 // on completion. 319 // on completion.
317 void GetLatestConfigOnIOThread() { 320 void GetLatestConfigOnIOThread() {
318 get_latest_config_result_ = 321 get_latest_config_result_ =
319 config_service_->GetLatestProxyConfig(&proxy_config_); 322 config_service_->GetLatestProxyConfig(&proxy_config_);
320 event_.Signal(); 323 event_.Signal();
321 } 324 }
322 325
326 void SetupAndInitialFetchOnIOThread() {
327 MessageLoop* file_loop = io_thread_.message_loop();
328 DCHECK_EQ(MessageLoop::TYPE_IO, file_loop->type());
329 DCHECK(io_thread_.message_loop_proxy()->RunsTasksOnCurrentThread());
330 // We pass the mock IO thread as both the IO and file threads.
331 config_service_->SetupAndFetchInitialConfig(
332 glib_task_runner_, io_thread_.message_loop_proxy(),
333 static_cast<MessageLoopForIO*>(file_loop));
334 event_.Signal();
335 }
336
323 // [Runs on |io_thread_|] Signals |event_| on cleanup completion. 337 // [Runs on |io_thread_|] Signals |event_| on cleanup completion.
324 void CleanUp() { 338 void CleanUp() {
325 MessageLoop::current()->RunAllPending(); 339 MessageLoop::current()->RunAllPending();
326 event_.Signal(); 340 event_.Signal();
327 } 341 }
328 342
329 void Wait() { 343 void Wait() {
330 event_.Wait(); 344 event_.Wait();
331 event_.Reset(); 345 event_.Reset();
332 } 346 }
333 347
334 base::WaitableEvent event_; 348 base::WaitableEvent event_;
335 base::Thread io_thread_; 349 base::Thread io_thread_;
350 base::SingleThreadTaskRunner *glib_task_runner_;
336 351
337 net::ProxyConfigServiceLinux* config_service_; 352 net::ProxyConfigServiceLinux* config_service_;
338 353
339 // The config obtained by |io_thread_| and read back by the main 354 // The config obtained by |io_thread_| and read back by the main
340 // thread. 355 // thread.
341 net::ProxyConfig proxy_config_; 356 net::ProxyConfig proxy_config_;
342 357
343 // Return value from GetLatestProxyConfig(). 358 // Return value from GetLatestProxyConfig().
344 net::ProxyConfigService::ConfigAvailability get_latest_config_result_; 359 net::ProxyConfigService::ConfigAvailability get_latest_config_result_;
345 }; 360 };
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 ProxyConfig config; 1622 ProxyConfig config;
1608 sync_config_getter.SetupAndInitialFetch(); 1623 sync_config_getter.SetupAndInitialFetch();
1609 EXPECT_EQ(ProxyConfigService::CONFIG_VALID, 1624 EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
1610 sync_config_getter.SyncGetLatestProxyConfig(&config)); 1625 sync_config_getter.SyncGetLatestProxyConfig(&config));
1611 EXPECT_TRUE(config.auto_detect()); 1626 EXPECT_TRUE(config.auto_detect());
1612 EXPECT_EQ(GURL(), config.pac_url()); 1627 EXPECT_EQ(GURL(), config.pac_url());
1613 } 1628 }
1614 } 1629 }
1615 1630
1616 } // namespace net 1631 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698