| Index: chrome/browser/chromeos/process_proxy/process_proxy_browsertest.cc
|
| diff --git a/chrome/browser/chromeos/process_proxy/process_proxy_browsertest.cc b/chrome/browser/chromeos/process_proxy/process_proxy_browsertest.cc
|
| deleted file mode 100644
|
| index 323dbe0ab025a876afab3b8feb0c3f211b1104be..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/process_proxy/process_proxy_browsertest.cc
|
| +++ /dev/null
|
| @@ -1,253 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <gtest/gtest.h>
|
| -
|
| -#include <string>
|
| -#include <sys/wait.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/posix/eintr_wrapper.h"
|
| -#include "base/process_util.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/threading/thread.h"
|
| -#include "chrome/browser/chromeos/process_proxy/process_proxy_registry.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/ui_test_utils.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace {
|
| -
|
| -// The test line must have all distinct characters.
|
| -const char kTestLineToSend[] = "abcdefgh\n";
|
| -const char kTestLineExpected[] = "abcdefgh\r\n";
|
| -
|
| -const char kCatCommand[] = "cat";
|
| -const char kStdoutType[] = "stdout";
|
| -const int kTestLineNum = 100;
|
| -
|
| -class TestRunner {
|
| - public:
|
| - virtual ~TestRunner() {}
|
| - virtual void SetupExpectations(pid_t pid) = 0;
|
| - virtual void OnSomeRead(pid_t pid, const std::string& type,
|
| - const std::string& output) = 0;
|
| - virtual void StartRegistryTest(ProcessProxyRegistry* registry) = 0;
|
| -
|
| - protected:
|
| - pid_t pid_;
|
| -};
|
| -
|
| -class RegistryTestRunner : public TestRunner {
|
| - public:
|
| - virtual ~RegistryTestRunner() {}
|
| -
|
| - virtual void SetupExpectations(pid_t pid) OVERRIDE {
|
| - pid_ = pid;
|
| - left_to_check_index_[0] = 0;
|
| - left_to_check_index_[1] = 0;
|
| - // We consider that a line processing has started if a value in
|
| - // left_to_check__[index] is set to 0, thus -2.
|
| - lines_left_ = 2 * kTestLineNum - 2;
|
| - expected_line_ = kTestLineExpected;
|
| - }
|
| -
|
| - // Method to test validity of received input. We will receive two streams of
|
| - // the same data. (input will be echoed twice by the testing process). Each
|
| - // stream will contain the same string repeated |kTestLineNum| times. So we
|
| - // have to match 2 * |kTestLineNum| lines. The problem is the received lines
|
| - // from different streams may be interleaved (e.g. we may receive
|
| - // abc|abcdef|defgh|gh). To deal with that, we allow to test received text
|
| - // against two lines. The lines MUST NOT have two same characters for this
|
| - // algorithm to work.
|
| - virtual void OnSomeRead(pid_t pid, const std::string& type,
|
| - const std::string& output) OVERRIDE {
|
| - EXPECT_EQ(type, kStdoutType);
|
| - EXPECT_EQ(pid_, pid);
|
| -
|
| - bool valid = true;
|
| - for (size_t i = 0; i < output.length(); i++) {
|
| - // The character output[i] should be next in at least one of the lines we
|
| - // are testing.
|
| - valid = (ProcessReceivedCharacter(output[i], 0) ||
|
| - ProcessReceivedCharacter(output[i], 1));
|
| - EXPECT_TRUE(valid) << "Received: " << output;
|
| - }
|
| -
|
| - if (!valid || TestSucceeded()) {
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| - MessageLoop::QuitClosure());
|
| - }
|
| - }
|
| -
|
| - virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
|
| - for (int i = 0; i < kTestLineNum; i++) {
|
| - EXPECT_TRUE(registry->SendInput(pid_, kTestLineToSend));
|
| - }
|
| - }
|
| -
|
| - private:
|
| - bool ProcessReceivedCharacter(char received, size_t stream) {
|
| - if (stream >= arraysize(left_to_check_index_))
|
| - return false;
|
| - bool success = left_to_check_index_[stream] < expected_line_.length() &&
|
| - expected_line_[left_to_check_index_[stream]] == received;
|
| - if (success)
|
| - left_to_check_index_[stream]++;
|
| - if (left_to_check_index_[stream] == expected_line_.length() &&
|
| - lines_left_ > 0) {
|
| - // Take another line to test for this stream, if there are any lines left.
|
| - // If not, this stream is done.
|
| - left_to_check_index_[stream] = 0;
|
| - lines_left_--;
|
| - }
|
| - return success;
|
| - }
|
| -
|
| - bool TestSucceeded() {
|
| - return left_to_check_index_[0] == expected_line_.length() &&
|
| - left_to_check_index_[1] == expected_line_.length() &&
|
| - lines_left_ == 0;
|
| - }
|
| -
|
| - size_t left_to_check_index_[2];
|
| - size_t lines_left_;
|
| - std::string expected_line_;
|
| -};
|
| -
|
| -class RegistryNotifiedOnProcessExitTestRunner : public TestRunner {
|
| - public:
|
| - virtual ~RegistryNotifiedOnProcessExitTestRunner() {}
|
| -
|
| - virtual void SetupExpectations(pid_t pid) OVERRIDE {
|
| - output_received_ = false;
|
| - pid_ = pid;
|
| - }
|
| -
|
| - virtual void OnSomeRead(pid_t pid, const std::string& type,
|
| - const std::string& output) OVERRIDE {
|
| - EXPECT_EQ(pid_, pid);
|
| - if (!output_received_) {
|
| - output_received_ = true;
|
| - EXPECT_EQ(type, "stdout");
|
| - EXPECT_EQ(output, "p");
|
| - base::KillProcess(pid_, 0 , true);
|
| - return;
|
| - }
|
| - EXPECT_EQ("exit", type);
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| - MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
|
| - EXPECT_TRUE(registry->SendInput(pid_, "p"));
|
| - }
|
| -
|
| - private:
|
| - bool output_received_;
|
| -};
|
| -
|
| -class SigIntTestRunner : public TestRunner {
|
| - public:
|
| - virtual ~SigIntTestRunner() {}
|
| -
|
| - virtual void SetupExpectations(pid_t pid) OVERRIDE {
|
| - pid_ = pid;
|
| - }
|
| -
|
| - virtual void OnSomeRead(pid_t pid, const std::string& type,
|
| - const std::string& output) OVERRIDE {
|
| - EXPECT_EQ(pid_, pid);
|
| - // We may receive ^C on stdout, but we don't care about that, as long as we
|
| - // eventually received exit event.
|
| - if (type == "exit") {
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| - MessageLoop::QuitClosure());
|
| - }
|
| - }
|
| -
|
| - virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
|
| - // Send SingInt and verify the process exited.
|
| - EXPECT_TRUE(registry->SendInput(pid_, "\003"));
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class ProcessProxyTest : public InProcessBrowserTest {
|
| - public:
|
| - ProcessProxyTest() {}
|
| - virtual ~ProcessProxyTest() {}
|
| -
|
| - protected:
|
| - void InitRegistryTest() {
|
| - registry_ = ProcessProxyRegistry::Get();
|
| -
|
| - EXPECT_TRUE(registry_->OpenProcess(kCatCommand, &pid_,
|
| - base::Bind(&TestRunner::OnSomeRead,
|
| - base::Unretained(test_runner_.get()))));
|
| -
|
| - test_runner_->SetupExpectations(pid_);
|
| - test_runner_->StartRegistryTest(registry_);
|
| - }
|
| -
|
| - void EndRegistryTest() {
|
| - registry_->CloseProcess(pid_);
|
| -
|
| - base::TerminationStatus status = base::GetTerminationStatus(pid_, NULL);
|
| - EXPECT_NE(base::TERMINATION_STATUS_STILL_RUNNING, status);
|
| - if (status == base::TERMINATION_STATUS_STILL_RUNNING)
|
| - base::KillProcess(pid_, 0, true);
|
| -
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| - MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - void RunTest() {
|
| - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&ProcessProxyTest::InitRegistryTest,
|
| - base::Unretained(this)));
|
| -
|
| - // Wait until all data from output watcher is received (QuitTask will be
|
| - // fired on watcher thread).
|
| - content::RunMessageLoop();
|
| -
|
| - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&ProcessProxyTest::EndRegistryTest,
|
| - base::Unretained(this)));
|
| -
|
| - // Wait until we clean up the process proxy.
|
| - content::RunMessageLoop();
|
| - }
|
| -
|
| - scoped_ptr<TestRunner> test_runner_;
|
| -
|
| - private:
|
| - ProcessProxyRegistry* registry_;
|
| - pid_t pid_;
|
| -};
|
| -
|
| -// Test will open new process that will run cat command, and verify data we
|
| -// write to process gets echoed back.
|
| -IN_PROC_BROWSER_TEST_F(ProcessProxyTest, RegistryTest) {
|
| - test_runner_.reset(new RegistryTestRunner());
|
| - RunTest();
|
| -}
|
| -
|
| -// Open new process, then kill it. Verifiy that we detect when the process dies.
|
| -IN_PROC_BROWSER_TEST_F(ProcessProxyTest, RegistryNotifiedOnProcessExit) {
|
| - test_runner_.reset(new RegistryNotifiedOnProcessExitTestRunner());
|
| - RunTest();
|
| -}
|
| -
|
| -// Test verifies that \003 message send to process is processed as SigInt.
|
| -// Timing out on the waterfall: http://crbug.com/115064
|
| -IN_PROC_BROWSER_TEST_F(ProcessProxyTest, DISABLED_SigInt) {
|
| - test_runner_.reset(new SigIntTestRunner());
|
| - RunTest();
|
| -}
|
|
|