15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/kill.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/process_proxy/process_proxy_registry.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test line must have all distinct characters.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestLineToSend[] = "abcdefgh\n";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestLineExpected[] = "abcdefgh\r\n";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCatCommand[] = "cat";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStdoutType[] = "stdout";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTestLineNum = 100;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestRunner {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestRunner() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupExpectations(pid_t pid) = 0;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSomeRead(pid_t pid, const std::string& type,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& output) = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartRegistryTest(ProcessProxyRegistry* registry) = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pid_t pid_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RegistryTestRunner : public TestRunner {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RegistryTestRunner() {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupExpectations(pid_t pid) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pid_ = pid;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    left_to_check_index_[0] = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    left_to_check_index_[1] = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We consider that a line processing has started if a value in
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left_to_check__[index] is set to 0, thus -2.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lines_left_ = 2 * kTestLineNum - 2;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_line_ = kTestLineExpected;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Method to test validity of received input. We will receive two streams of
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the same data. (input will be echoed twice by the testing process). Each
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stream will contain the same string repeated |kTestLineNum| times. So we
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have to match 2 * |kTestLineNum| lines. The problem is the received lines
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from different streams may be interleaved (e.g. we may receive
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // abc|abcdef|defgh|gh). To deal with that, we allow to test received text
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // against two lines. The lines MUST NOT have two same characters for this
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // algorithm to work.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSomeRead(pid_t pid, const std::string& type,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& output) OVERRIDE {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(type, kStdoutType);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pid_, pid);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool valid = true;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < output.length(); i++) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The character output[i] should be next in at least one of the lines we
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // are testing.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      valid = (ProcessReceivedCharacter(output[i], 0) ||
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ProcessReceivedCharacter(output[i], 1));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(valid) << "Received: " << output;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!valid || TestSucceeded()) {
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                             base::MessageLoop::QuitClosure());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < kTestLineNum; i++) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(registry->SendInput(pid_, kTestLineToSend));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessReceivedCharacter(char received, size_t stream) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream >= arraysize(left_to_check_index_))
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = left_to_check_index_[stream] < expected_line_.length() &&
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_line_[left_to_check_index_[stream]] == received;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (success)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_to_check_index_[stream]++;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (left_to_check_index_[stream] == expected_line_.length() &&
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lines_left_ > 0) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Take another line to test for this stream, if there are any lines left.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If not, this stream is done.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_to_check_index_[stream] = 0;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lines_left_--;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return success;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool TestSucceeded() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return left_to_check_index_[0] == expected_line_.length() &&
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        left_to_check_index_[1] == expected_line_.length() &&
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        lines_left_ == 0;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t left_to_check_index_[2];
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t lines_left_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_line_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RegistryNotifiedOnProcessExitTestRunner : public TestRunner {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RegistryNotifiedOnProcessExitTestRunner() {}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupExpectations(pid_t pid) OVERRIDE {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output_received_ = false;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pid_ = pid;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSomeRead(pid_t pid, const std::string& type,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& output) OVERRIDE {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pid_, pid);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!output_received_) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output_received_ = true;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(type, "stdout");
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(output, "p");
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::KillProcess(pid_, 0 , true);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("exit", type);
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::MessageLoop::QuitClosure());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(registry->SendInput(pid_, "p"));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool output_received_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SigIntTestRunner : public TestRunner {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SigIntTestRunner() {}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupExpectations(pid_t pid) OVERRIDE {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pid_ = pid;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSomeRead(pid_t pid, const std::string& type,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& output) OVERRIDE {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pid_, pid);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We may receive ^C on stdout, but we don't care about that, as long as we
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // eventually received exit event.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == "exit") {
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                             base::MessageLoop::QuitClosure());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartRegistryTest(ProcessProxyRegistry* registry) OVERRIDE {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send SingInt and verify the process exited.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(registry->SendInput(pid_, "\003"));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProcessProxyTest : public testing::Test {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessProxyTest() {}
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ProcessProxyTest() {}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitRegistryTest() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_ = ProcessProxyRegistry::Get();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(registry_->OpenProcess(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    kCatCommand, &pid_,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    base::Bind(&TestRunner::OnSomeRead,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::Unretained(test_runner_.get()))));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_runner_->SetupExpectations(pid_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_runner_->StartRegistryTest(registry_);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndRegistryTest() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_->CloseProcess(pid_);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TerminationStatus status = base::GetTerminationStatus(pid_, NULL);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(base::TERMINATION_STATUS_STILL_RUNNING, status);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == base::TERMINATION_STATUS_STILL_RUNNING)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::KillProcess(pid_, 0, true);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::MessageLoop::QuitClosure());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest() {
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&ProcessProxyTest::InitRegistryTest,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Unretained(this)));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait until all data from output watcher is received (QuitTask will be
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fired on watcher thread).
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->Run();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&ProcessProxyTest::EndRegistryTest,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Unretained(this)));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait until we clean up the process proxy.
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->Run();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestRunner> test_runner_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessProxyRegistry* registry_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pid_t pid_;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop message_loop_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test will open new process that will run cat command, and verify data we
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// write to process gets echoed back.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProcessProxyTest, RegistryTest) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_runner_.reset(new RegistryTestRunner());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open new process, then kill it. Verifiy that we detect when the process dies.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProcessProxyTest, RegistryNotifiedOnProcessExit) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_runner_.reset(new RegistryNotifiedOnProcessExitTestRunner());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test verifies that \003 message send to process is processed as SigInt.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Timing out on the waterfall: http://crbug.com/115064
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProcessProxyTest, DISABLED_SigInt) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_runner_.reset(new SigIntTestRunner());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
255