diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-14 23:37:58 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-14 23:37:58 +0000 |
commit | 1346ecce2c718b2237cbb8ba95e9674f2e381943 (patch) | |
tree | ce8bb66e9b68e4953ecbf74b789b1de81238aa8a | |
parent | 067688e1b8ee508aeb512db7073aeb9250890f7f (diff) | |
download | chromium_src-1346ecce2c718b2237cbb8ba95e9674f2e381943.zip chromium_src-1346ecce2c718b2237cbb8ba95e9674f2e381943.tar.gz chromium_src-1346ecce2c718b2237cbb8ba95e9674f2e381943.tar.bz2 |
RendererMainTest: die quickly if our child process dies
Also, switch to using TestTimeouts.
TEST=make subprocess die on startup; we don't sit in MessageLoop::Run
waiting for it
Review URL: http://codereview.chromium.org/3794004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62676 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/renderer/renderer_main_unittest.cc | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/chrome/renderer/renderer_main_unittest.cc b/chrome/renderer/renderer_main_unittest.cc index f30103c..176cc5d 100644 --- a/chrome/renderer/renderer_main_unittest.cc +++ b/chrome/renderer/renderer_main_unittest.cc @@ -5,6 +5,7 @@ #include "base/message_loop.h" #include "base/process_util.h" #include "base/test/multiprocess_test.h" +#include "base/test/test_timeouts.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/main_function_params.h" #include "ipc/ipc_channel.h" @@ -25,6 +26,8 @@ extern int RendererMain(const MainFunctionParams& parameters); // functionality, we should combine them. class RendererMainTest : public base::MultiProcessTest { protected: + RendererMainTest() {} + // Create a new MessageLoopForIO For each test. virtual void SetUp(); virtual void TearDown(); @@ -65,7 +68,11 @@ ProcessHandle RendererMainTest::SpawnChild(const std::string& procname, // Listener class that kills the message loop when it connects. class SuicidalListener : public IPC::Channel::Listener { public: + explicit SuicidalListener(bool* suicide_success) + : suicide_success_(suicide_success) {} + void OnChannelConnected(int32 peer_pid) { + *suicide_success_ = true; MessageLoop::current()->Quit(); } @@ -73,6 +80,9 @@ class SuicidalListener : public IPC::Channel::Listener { // We shouldn't receive any messages ASSERT_TRUE(false); } + + // A flag that we set when we have successfully suicided. + bool* suicide_success_; }; MULTIPROCESS_TEST_MAIN(SimpleRenderer) { @@ -85,19 +95,28 @@ MULTIPROCESS_TEST_MAIN(SimpleRenderer) { } TEST_F(RendererMainTest, CreateDestroy) { - SuicidalListener listener; + bool suicide_success = false; + SuicidalListener listener(&suicide_success); IPC::Channel control_channel(kRendererTestChannelName, IPC::Channel::MODE_SERVER, &listener); base::ProcessHandle renderer_pid = SpawnChild("SimpleRenderer", &control_channel); - control_channel.Connect(); + ASSERT_TRUE(control_channel.Connect()); + + // The SuicidalListener *should* cause the following MessageLoop run + // to quit, but just in case it doesn't, insert a QuitTask at the back + // of the queue. + MessageLoop::current()->PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask, + TestTimeouts::action_timeout_ms()); MessageLoop::current()->Run(); + ASSERT_TRUE(suicide_success); // The renderer should exit when we close the channel. control_channel.Close(); - EXPECT_TRUE(base::WaitForSingleProcess(renderer_pid, 5000)); + EXPECT_TRUE(base::WaitForSingleProcess(renderer_pid, + TestTimeouts::action_timeout_ms())); } #endif // defined(OS_POSIX) |