Chromium Code Reviews| Index: chrome/browser/image_decoder_browsertest.cc |
| diff --git a/chrome/browser/image_decoder_browsertest.cc b/chrome/browser/image_decoder_browsertest.cc |
| index 5621815a3bab0fb5a732e41c4c232cf6dc77dd71..f5c81eeb1bbae5eeabdd4a4138ab50d9d5e3a173 100644 |
| --- a/chrome/browser/image_decoder_browsertest.cc |
| +++ b/chrome/browser/image_decoder_browsertest.cc |
| @@ -4,8 +4,15 @@ |
| #include "chrome/browser/image_decoder.h" |
| +#if defined(OS_POSIX) |
| +#include <sys/types.h> |
| +#include <signal.h> |
| +#endif |
| + |
| #include "chrome/test/base/in_process_browser_test.h" |
| +#include "content/public/browser/browser_child_process_observer.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/child_process_data.h" |
| #include "content/public/test/test_utils.h" |
| using content::BrowserThread; |
| @@ -46,6 +53,59 @@ class TestImageRequest : public ImageDecoder::ImageRequest { |
| DISALLOW_COPY_AND_ASSIGN(TestImageRequest); |
| }; |
| +class KillProcessObserver : public content::BrowserChildProcessObserver { |
| + public: |
| + KillProcessObserver() { |
| + Add(this); |
| + } |
| + |
| + ~KillProcessObserver() override { |
| + Remove(this); |
| + } |
| + |
| + private: |
| + void BrowserChildProcessHostConnected( |
| + const content::ChildProcessData& data) override { |
| + base::ProcessHandle handle = data.handle; |
| + |
| + if (handle == base::kNullProcessHandle) |
| + return; |
| + |
| +#if defined(OS_WIN) |
| + // On windows, duplicate the process handle since base::Process closes it on |
| + // destruction. |
| + base::ProcessHandle out_handle; |
| + if (!::DuplicateHandle(GetCurrentProcess(), handle, |
|
Lei Zhang
2015/04/30 08:08:51
I would:
- wrap |data.handle| in a base::Process o
|
| + GetCurrentProcess(), &out_handle, |
| + 0, FALSE, DUPLICATE_SAME_ACCESS)) |
| + return; |
| + handle = out_handle; |
| +#endif |
| + |
| + EXPECT_TRUE(base::Process(handle).Terminate(0, true)); |
| + } |
| +}; |
| + |
| +#if defined(OS_POSIX) |
| +class FreezeProcessObserver : public content::BrowserChildProcessObserver { |
| + public: |
| + FreezeProcessObserver() { |
| + Add(this); |
| + } |
| + |
| + ~FreezeProcessObserver() override { |
| + Remove(this); |
| + } |
| + |
| + private: |
| + void BrowserChildProcessHostConnected( |
| + const content::ChildProcessData& data) override { |
| + if (data.handle != base::kNullProcessHandle) |
| + EXPECT_EQ(0, kill(data.handle, SIGSTOP)); |
| + } |
| +}; |
| +#endif // defined(OS_POSIX) |
| + |
| } // namespace |
| class ImageDecoderBrowserTest : public InProcessBrowserTest { |
| @@ -68,3 +128,25 @@ IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndDestroy) { |
| test_request.reset(); |
| runner->Run(); |
| } |
| + |
| +IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndKillProcess) { |
| + KillProcessObserver observer; |
| + scoped_refptr<content::MessageLoopRunner> runner = |
| + new content::MessageLoopRunner; |
| + scoped_ptr<TestImageRequest> test_request( |
| + new TestImageRequest(runner->QuitClosure())); |
| + ImageDecoder::Start(test_request.get(), std::string()); |
| + runner->Run(); |
| +} |
| + |
| +#if defined(OS_POSIX) |
| +IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndFreezeProcess) { |
| + FreezeProcessObserver observer; |
| + scoped_refptr<content::MessageLoopRunner> runner = |
| + new content::MessageLoopRunner; |
| + scoped_ptr<TestImageRequest> test_request( |
| + new TestImageRequest(runner->QuitClosure())); |
| + ImageDecoder::Start(test_request.get(), std::string()); |
| + runner->Run(); |
| +} |
| +#endif // defined(OS_POSIX) |