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