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