process_output_watcher_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, 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); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SplitUTF8Character) { 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("test1\xc2", false, "test1")); 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xb5test1", false, "\xc2\xb5test1")); 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SplitSoleUTF8Character) { 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xc2", false, "")); 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xb5", false, "\xc2\xb5")); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SplitUTF8CharacterLength3) { 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("test3\xe2\x82", false, "test3")); 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xac", false, "\xe2\x82\xac")); 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SplitSoleUTF8CharacterThreeWays) { 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xe2", false, "")); 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\x82", false, "")); 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xac", false, "\xe2\x82\xac")); 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, EndsWithThreeByteUTF8Character) { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("test\xe2\x82\xac", false, "test\xe2\x82\xac")); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SoleThreeByteUTF8Character) { 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xe2\x82\xac", false, "\xe2\x82\xac")); 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, HasThreeByteUTF8Character) { 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back( 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestCase("test\xe2\x82\xac_", false, "test\xe2\x82\xac_")); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, MulitByteUTF8CharNullTerminated) { 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("test\xe2\x82\xac", true, "test\xe2\x82\xac")); 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, MultipleMultiByteUTF8Characters) { 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back( 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestCase("test\xe2\x82\xac\xc2", false, "test\xe2\x82\xac")); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xb5", false, "\xc2\xb5")); 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, ContainsInvalidUTF8) { 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xc2_", false, "\xc2_")); 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, InvalidUTF8SeriesOfTrailingBytes) { 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\x82\x82\x82", false, "\x82\x82\x82")); 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\x82\x82\x82", false, "\x82\x82\x82")); 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, EndsWithInvalidUTF8) { 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xff", false, "\xff")); 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, FourByteUTF8) { 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<TestCase> test_cases; 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xf0\xa4\xad", false, "")); 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases.push_back(TestCase("\xa2", false, "\xf0\xa4\xad\xa2")); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(test_cases); 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that sending '\0' generates PROCESS_OUTPUT_TYPE_OUT event and does 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not terminate output watcher. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProcessOutputWatcherTest, SendNull) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<TestCase> test_cases; 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This will send '\0' to output watcher. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases.push_back(TestCase("", true)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's verify that next input also gets detected (i.e. output watcher does 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not exit after seeing '\0' from previous test case). 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases.push_back(TestCase("a", true)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(test_cases); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 311