FdBuffer_test.cpp revision 0a3406fc4f8e9a8c8a9155fc7886a0496f692496
10a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// Copyright (C) 2017 The Android Open Source Project 20a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// 30a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// Licensed under the Apache License, Version 2.0 (the "License"); 40a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// you may not use this file except in compliance with the License. 50a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// You may obtain a copy of the License at 60a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// 70a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// http://www.apache.org/licenses/LICENSE-2.0 80a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// 90a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// Unless required by applicable law or agreed to in writing, software 100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// distributed under the License is distributed on an "AS IS" BASIS, 110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// See the License for the specific language governing permissions and 130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// limitations under the License. 140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#define LOG_TAG "incidentd" 160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include "FdBuffer.h" 180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/file.h> 200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/test_utils.h> 210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <gmock/gmock.h> 220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <gtest/gtest.h> 230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <signal.h> 240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <string.h> 250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst int READ_TIMEOUT = 5 * 1000; 270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst int BUFFER_SIZE = 16 * 1024; 280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst std::string HEAD = "[OK]"; 290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android; 310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android::base; 320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::StrEq; 330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::Test; 340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::internal::CaptureStdout; 350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::internal::GetCapturedStdout; 360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinclass FdBufferTest : public Test { 380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinpublic: 390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin virtual void SetUp() override { 400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_NE(tf.fd, -1); 410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_NE(p2cPipe.init(), -1); 420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_NE(c2pPipe.init(), -1); 430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin void AssertBufferReadSuccessful(size_t expected) { 460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_EQ(buffer.size(), expected); 470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_FALSE(buffer.timedOut()); 480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_FALSE(buffer.truncated()); 490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin void AssertBufferContent(const char* expected) { 520a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ReportRequestSet requests; 530a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin requests.setMainFd(STDOUT_FILENO); 540a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin CaptureStdout(); 560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.write(&requests)); 570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_THAT(GetCapturedStdout(), StrEq(expected)); 580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin bool DoDataStream(int rFd, int wFd) { 610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin char buf[BUFFER_SIZE]; 620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ssize_t nRead; 630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin while ((nRead = read(rFd, buf, BUFFER_SIZE)) > 0) { 640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ssize_t nWritten = 0; 650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin while (nWritten < nRead) { 660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ssize_t amt = write(wFd, buf + nWritten, nRead - nWritten); 670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (amt < 0) { 680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin return false; 690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin nWritten += amt; 710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin return nRead == 0; 740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinprotected: 770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin FdBuffer buffer; 780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin TemporaryFile tf; 790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin Fpipe p2cPipe; 800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin Fpipe c2pPipe; 810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin const std::string kTestPath = GetExecutableDirectory(); 830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin const std::string kTestDataPath = kTestPath + "/testdata/"; 840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}; 850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadAndWrite) { 870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string testdata = "FdBuffer test string"; 880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFile(testdata, tf.path, false)); 890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT)); 900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferReadSuccessful(testdata.size()); 910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferContent(testdata.c_str()); 920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 930a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 940a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadTimeout) { 950a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 960a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 1000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin while(true) { 1010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin write(c2pPipe.writeFd(), "poo", 3); 1020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin sleep(1); 1030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 1040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_FAILURE); 1050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 1060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin status_t status = buffer.read(c2pPipe.readFd(), 500); 1090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, status); 1100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_TRUE(buffer.timedOut()); 1110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin kill(pid, SIGKILL); // reap the child process 1130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 1140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWrite) { 1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string testdata = "simply test read in stream"; 1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string expected = HEAD + testdata; 1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFile(testdata, tf.path, false)); 1200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 1250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.writeFd()); 1260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 1270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFd(HEAD, c2pPipe.writeFd())); 1280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd())); 1290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin // Must exit here otherwise the child process will continue executing the test binary. 1320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_SUCCESS); 1330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 1340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, 1380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT)); 1390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferReadSuccessful(HEAD.size() + testdata.size()); 1400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferContent(expected.c_str()); 1410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin wait(&pid); 1420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 1430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 1440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWriteAllAtOnce) { 1460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string testdata = "child process flushes only after all data are read."; 1470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string expected = HEAD + testdata; 1480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFile(testdata, tf.path, false)); 1490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 1510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 1520a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1530a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 1540a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.writeFd()); 1550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 1560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string data; 1570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin // wait for read finishes then write. 1580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(ReadFdToString(p2cPipe.readFd(), &data)); 1590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin data = HEAD + data; 1600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFd(data, c2pPipe.writeFd())); 1610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin // Must exit here otherwise the child process will continue executing the test binary. 1640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_SUCCESS); 1650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 1660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, 1700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT)); 1710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferReadSuccessful(HEAD.size() + testdata.size()); 1720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferContent(expected.c_str()); 1730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin wait(&pid); 1740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 1750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 1760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamEmpty) { 1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFile("", tf.path, false)); 1790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 1810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 1820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 1840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.writeFd()); 1850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 1860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd())); 1870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_SUCCESS); 1900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 1910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 1920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 1930a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 1940a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, 1950a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT)); 1960a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferReadSuccessful(0); 1970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin AssertBufferContent(""); 1980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin wait(&pid); 1990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 2000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 2010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamMoreThan4MB) { 2030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin const std::string testFile = kTestDataPath + "morethan4MB.txt"; 2040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int fd = open(testFile.c_str(), O_RDONLY, 0444); 2050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_NE(fd, -1); 2060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 2070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 2080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 2100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.writeFd()); 2110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 2120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd())); 2130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 2140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 2150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_SUCCESS); 2160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 2170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 2180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 2190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(fd, 2210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT)); 2220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_EQ(buffer.size(), (size_t) (4 * 1024 * 1024)); 2230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_FALSE(buffer.timedOut()); 2240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_TRUE(buffer.truncated()); 2250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin wait(&pid); 2260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 2270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 2280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamTimeOut) { 2300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin std::string testdata = "timeout test"; 2310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(WriteStringToFile(testdata, tf.path, false)); 2320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin int pid = fork(); 2340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_TRUE(pid != -1); 2350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin if (pid == 0) { 2370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.writeFd()); 2380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.readFd()); 2390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin while (true) { 2400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin sleep(1); 2410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 2420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin exit(EXIT_FAILURE); 2430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } else { 2440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(p2cPipe.readFd()); 2450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin close(c2pPipe.writeFd()); 2460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin 2470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, 2480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin p2cPipe.writeFd(), c2pPipe.readFd(), 100)); 2490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin EXPECT_TRUE(buffer.timedOut()); 2500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin kill(pid, SIGKILL); // reap the child process 2510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin } 2520a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin} 253