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 <queue>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/message_loop/message_loop.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/posix/eintr_wrapper.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/process_proxy/process_output_watcher.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestCase {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestCase(const std::string& input, bool send_terminating_null)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : input(input),
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        should_send_terminating_null(send_terminating_null),
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        expected_output(input) {}
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Conctructor for cases where the output is not expected to be the same as
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // input.
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestCase(const std::string& input,
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           bool send_terminating_null,
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           const std::string& expected_output)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : input(input),
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        should_send_terminating_null(send_terminating_null),
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        expected_output(expected_output) {}
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string input;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_send_terminating_null;
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string expected_output;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProcessWatcherExpectations {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessWatcherExpectations() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetTestCase(const TestCase& test_case) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_from_out_ = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    out_expectations_ = test_case.expected_output;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (test_case.should_send_terminating_null)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      out_expectations_.append(std::string("", 1));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckExpectations(const std::string& data, ProcessOutputType type) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(PROCESS_OUTPUT_TYPE_OUT, type);
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (type != PROCESS_OUTPUT_TYPE_OUT)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (out_expectations_.length() == 0 && data.length() == 0)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(received_from_out_, out_expectations_.length());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (received_from_out_ >= out_expectations_.length())
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(received_from_out_,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              out_expectations_.find(data, received_from_out_));
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (received_from_out_ != out_expectations_.find(data, received_from_out_))
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_from_out_ += data.length();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsDone() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return received_from_out_ >= out_expectations_.length();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out_expectations_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t received_from_out_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProcessOutputWatcherTest : public testing::Test {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProcessOutputWatcherTest() : output_watch_thread_started_(false),
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               failed_(false) {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~ProcessOutputWatcherTest() {}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (output_watch_thread_started_)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      output_watch_thread_->Stop();
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void StartWatch(int pt, int stop) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This will delete itself.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProcessOutputWatcher* crosh_watcher = new ProcessOutputWatcher(pt, stop,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ProcessOutputWatcherTest::OnRead, base::Unretained(this)));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crosh_watcher->Start();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRead(ProcessOutputType type, const std::string& output) {
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_FALSE(failed_);
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    failed_ = !expectations_.CheckExpectations(output, type);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (failed_ || expectations_.IsDone()) {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ASSERT_FALSE(test_case_done_callback_.is_null());
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      message_loop_.PostTask(FROM_HERE, test_case_done_callback_);
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      test_case_done_callback_.Reset();
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string VeryLongString() {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result = "0123456789";
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 8; i++)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = result.append(result);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(const std::vector<TestCase>& test_cases) {
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_FALSE(output_watch_thread_started_);
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    output_watch_thread_.reset(new base::Thread("ProcessOutpuWatchThread"));
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    output_watch_thread_started_ = output_watch_thread_->Start();
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(output_watch_thread_started_);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int pt_pipe[2], stop_pipe[2];
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(HANDLE_EINTR(pipe(pt_pipe)));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(HANDLE_EINTR(pipe(stop_pipe)));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    output_watch_thread_->message_loop()->PostTask(
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_HERE,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ProcessOutputWatcherTest::StartWatch,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this),
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   pt_pipe[0],
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   stop_pipe[0]));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < test_cases.size(); i++) {
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      expectations_.SetTestCase(test_cases[i]);
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::RunLoop run_loop;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ASSERT_TRUE(test_case_done_callback_.is_null());
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      test_case_done_callback_ = run_loop.QuitClosure();
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::string& test_str = test_cases[i].input;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Let's make inputs not NULL terminated, unless other is specified in
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the test case.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssize_t test_size = test_str.length() * sizeof(*test_str.c_str());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (test_cases[i].should_send_terminating_null)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_size += sizeof(*test_str.c_str());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(test_size,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::WriteFileDescriptor(pt_pipe[1], test_str.c_str(),
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          test_size));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      run_loop.Run();
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EXPECT_TRUE(expectations_.IsDone());
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (failed_)
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        break;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send stop signal. It is not important which string we send.
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, base::WriteFileDescriptor(stop_pipe[1], "q", 1));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_NE(-1, IGNORE_EINTR(close(stop_pipe[1])));
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_NE(-1, IGNORE_EINTR(close(pt_pipe[1])));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure test_case_done_callback_;
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop message_loop_;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Thread> output_watch_thread_;
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool output_watch_thread_started_;
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool failed_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessWatcherExpectations expectations_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TestCase> exp;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_OutputWatcher) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TestCase> test_cases;
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("t", false));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing output\n", false));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing error\n", false));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing error1\n", false));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing output1\n", false));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing output2\n", false));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing output3\n", false));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase(VeryLongString(), false));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("testing error2\n", false));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(test_cases);
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_SplitUTF8Character) {
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("test1\xc2", false, "test1"));
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xb5test1", false, "\xc2\xb5test1"));
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_SplitSoleUTF8Character) {
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xc2", false, ""));
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xb5", false, "\xc2\xb5"));
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_SplitUTF8CharacterLength3) {
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("test3\xe2\x82", false, "test3"));
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xac", false, "\xe2\x82\xac"));
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_SplitSoleUTF8CharacterThreeWays) {
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xe2", false, ""));
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\x82", false, ""));
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xac", false, "\xe2\x82\xac"));
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, EndsWithThreeByteUTF8Character) {
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("test\xe2\x82\xac", false, "test\xe2\x82\xac"));
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SoleThreeByteUTF8Character) {
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xe2\x82\xac", false, "\xe2\x82\xac"));
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, HasThreeByteUTF8Character) {
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TestCase("test\xe2\x82\xac_", false, "test\xe2\x82\xac_"));
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, MulitByteUTF8CharNullTerminated) {
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("test\xe2\x82\xac", true, "test\xe2\x82\xac"));
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_MultipleMultiByteUTF8Characters) {
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TestCase("test\xe2\x82\xac\xc2", false, "test\xe2\x82\xac"));
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xb5", false, "\xc2\xb5"));
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, ContainsInvalidUTF8) {
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xc2_", false, "\xc2_"));
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_InvalidUTF8SeriesOfTrailingBytes) {
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\x82\x82\x82", false, "\x82\x82\x82"));
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\x82\x82\x82", false, "\x82\x82\x82"));
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, EndsWithInvalidUTF8) {
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xff", false, "\xff"));
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_FourByteUTF8) {
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<TestCase> test_cases;
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xf0\xa4\xad", false, ""));
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_cases.push_back(TestCase("\xa2", false, "\xf0\xa4\xad\xa2"));
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest(test_cases);
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that sending '\0' generates PROCESS_OUTPUT_TYPE_OUT event and does
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not terminate output watcher.
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396496
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ProcessOutputWatcherTest, DISABLED_SendNull) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TestCase> test_cases;
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This will send '\0' to output watcher.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("", true));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's verify that next input also gets detected (i.e. output watcher does
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not exit after seeing '\0' from previous test case).
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cases.push_back(TestCase("a", true));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(test_cases);
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
319