Add ChildProcess::FlushIOThreadForTesting()

This is an attempt to fix the flaky RenderThreadImplBrowserTest
infrastructure (see the bug that this CL is associated with). The last
attempt at fixing the flaky tests there was https://crrev.com/c/2913006,
but this did not work because there are still in-process-test usages of
ChildProcess::io_task_runner() that are causing the thread to post tasks
back to the main thread (where the BrowserTaskEnvironment is housed) and
thus hitting this CHECK() [1] (see [2] where this is described
entirely).

Therefore, https://crrev.com/c/2914499 was posted to explore removing
the remaining direct usages of ChildProcess::io_task_runner() from
ChildThreadImpl, however this seems impossible to follow-through on
given the test failures there. Plus, even if we resolve these failures,
it is technically possible that this IO thread can get used in other
ways, so that is not the best approach to this problem.

So a more maintainable solution would not be to avoid using this thread
in in-process browser tests, but instead properly flush the thread like
the CHECK() mentioned above recommends. This CL introduces
ChildProcess::FlushIOThreadForTesting() that
RenderThreadImplBrowserTest::TearDown() calls to ensure that the thread
is flushed and does not post any tasks to the
BrowserTaskEnvironment-owned TaskRunners anymore. This is necessary
because when the BrowserTaskEnvironment destructs, it CHECK()s that
after it stops its threads, no other threads (that it is not aware of)
are still posting tasks to the task environment.

So now, after this CL the order of events should be as follow:
 1.) A test finishes
 2.) The TearDown() method is called, flushing all tasks on the
     ChildProcess's owned IO base::Thread
 3.) SetUp() is called for the next test, which overwrites
     `RenderThreadImplBrowserTest::browser_threads_`, which is a
     `BrowserTaskEnvironment`.
 4.) The dtor is called on the old |browser_threads_| object, causing us
     to verify that no tasks are posted after shutdown (the CHECK()
     mentioned above). This should be true now (aka we won't trip the
     CHECK()) because the separate base::Thread that is owned by
     ChildProcess is fully flushed.

[1]: https://source.chromium.org/chromium/chromium/src/+/main:content/public/test/browser_task_environment.cc;l=140;drc=f3243dc72e9d290b9ce1d8db978e0b59e9395dff
[2]: https://docs.google.com/document/d/1lzyEc8g5BcfV67SDgBylJhl1_5HAVGjcXRuiD_ydZEw/edit

R=haraken@chromium.org

Bug: 1126157
Change-Id: I747bf400a6a07507ff33353cbfc95cbc0de6501b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2954844
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Commit-Queue: Dominic Farolino <dom@chromium.org>
Cr-Commit-Position: refs/heads/master@{#891557}
2 files changed
tree: beb0c63a9489c1bba6295a2d3a087ab3aaa5c237
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .mailmap
  61. .vpython
  62. .vpython3
  63. .yapfignore
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. ENG_REVIEW_OWNERS
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.