FdBuffer_test.cpp revision 254102d858942393482589b8f1e6102b33797b58
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"
1899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include "io_util.h"
190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/file.h>
210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/test_utils.h>
2299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <fcntl.h>
230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <gtest/gtest.h>
240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <signal.h>
250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <string.h>
260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst int READ_TIMEOUT = 5 * 1000;
280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst int BUFFER_SIZE = 16 * 1024;
29b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jinconst int QUICK_TIMEOUT_MS = 100;
300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst std::string HEAD = "[OK]";
310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android;
330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android::base;
340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::Test;
350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinclass FdBufferTest : public Test {
370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinpublic:
380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    virtual void SetUp() override {
390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(tf.fd, -1);
400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(p2cPipe.init(), -1);
410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(c2pPipe.init(), -1);
420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    void AssertBufferReadSuccessful(size_t expected) {
450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_EQ(buffer.size(), expected);
460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.timedOut());
470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.truncated());
480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    void AssertBufferContent(const char* expected) {
5199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin        int i=0;
52c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EncodedBuffer::iterator it = buffer.data();
53c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        while (it.hasNext()) {
54c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin            ASSERT_EQ(it.next(), expected[i++]);
5599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin        }
56c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_EQ(expected[i], '\0');
570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    bool DoDataStream(int rFd, int wFd) {
600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        char buf[BUFFER_SIZE];
610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ssize_t nRead;
620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        while ((nRead = read(rFd, buf, BUFFER_SIZE)) > 0) {
630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            ssize_t nWritten = 0;
640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            while (nWritten < nRead) {
650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                ssize_t amt = write(wFd, buf + nWritten, nRead - nWritten);
660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                if (amt < 0) {
670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                    return false;
680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                }
690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                nWritten += amt;
700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        return nRead == 0;
730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinprotected:
760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    FdBuffer buffer;
770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    TemporaryFile tf;
780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    Fpipe p2cPipe;
790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    Fpipe c2pPipe;
800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string kTestPath = GetExecutableDirectory();
820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string kTestDataPath = kTestPath + "/testdata/";
830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin};
840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadAndWrite) {
860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "FdBuffer test string";
87254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    AssertBufferReadSuccessful(testdata.size());
900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    AssertBufferContent(testdata.c_str());
910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
930ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi JinTEST_F(FdBufferTest, IterateEmpty) {
94c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer::iterator it = buffer.data();
95c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EXPECT_FALSE(it.hasNext());
9699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin}
9799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin
980ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi JinTEST_F(FdBufferTest, ReadAndIterate) {
990ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    std::string testdata = "FdBuffer test string";
100254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1010ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
1020ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
1030ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    int i=0;
104c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer::iterator it = buffer.data();
105c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    while (it.hasNext()) {
106c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_EQ(it.next(), (uint8_t)testdata[i++]);
1070ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    }
1080ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
109c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    it.rp()->rewind();
110c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    it.rp()->move(buffer.size());
1110ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    EXPECT_EQ(it.bytesRead(), testdata.size());
112c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EXPECT_FALSE(it.hasNext());
1130ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin}
1140ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadTimeout) {
1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        while(true) {
1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            write(c2pPipe.writeFd(), "poo", 3);
1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sleep(1);
1240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
125b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_FAILURE);
1260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
129b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        status_t status = buffer.read(c2pPipe.readFd(), QUICK_TIMEOUT_MS);
1300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, status);
1310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.timedOut());
1320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        kill(pid, SIGKILL); // reap the child process
1340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWrite) {
1380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "simply test read in stream";
1390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string expected = HEAD + testdata;
140254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
1470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
1480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(WriteStringToFd(HEAD, c2pPipe.writeFd()));
1490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
1500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1520a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // Must exit here otherwise the child process will continue executing the test binary.
153b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
1540a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd,
1590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT));
1600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(HEAD.size() + testdata.size());
1610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent(expected.c_str());
1620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
1630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWriteAllAtOnce) {
1670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "child process flushes only after all data are read.";
1680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string expected = HEAD + testdata;
169254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
1760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
1770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        std::string data;
1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // wait for read finishes then write.
1790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(ReadFdToString(p2cPipe.readFd(), &data));
1800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        data = HEAD + data;
1810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(WriteStringToFd(data, c2pPipe.writeFd()));
1820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // Must exit here otherwise the child process will continue executing the test binary.
185b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
1860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd,
1910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT));
1920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(HEAD.size() + testdata.size());
1930a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent(expected.c_str());
1940a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
1950a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1960a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamEmpty) {
199254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile("", tf.path));
2000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
2080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
210b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
2110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd,
2160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT));
2170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(0);
2180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent("");
2190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
2200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
2220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamMoreThan4MB) {
2240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string testFile = kTestDataPath + "morethan4MB.txt";
2250ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    size_t fourMB = (size_t) 4 * 1024 * 1024;
22699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin    int fd = open(testFile.c_str(), O_RDONLY | O_CLOEXEC);
2270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_NE(fd, -1);
2280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
2350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
237b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
2380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(fd,
2430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            p2cPipe.writeFd(), c2pPipe.readFd(), READ_TIMEOUT));
2440ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        EXPECT_EQ(buffer.size(), fourMB);
2450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.timedOut());
2460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.truncated());
2470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
248c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EncodedBuffer::iterator it = buffer.data();
249c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        it.rp()->move(fourMB);
2500ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        EXPECT_EQ(it.bytesRead(), fourMB);
251c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_FALSE(it.hasNext());
252c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
253c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        it.rp()->rewind();
254c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        while (it.hasNext()) {
2550ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin            char c = 'A' + (it.bytesRead() % 64 / 8);
256c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin            ASSERT_TRUE(it.next() == c);
2570ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        }
2580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
2600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamTimeOut) {
2620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "timeout test";
263254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
2640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        while (true) {
2720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sleep(1);
2730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
274b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_FAILURE);
2750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd,
280b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin            p2cPipe.writeFd(), c2pPipe.readFd(), QUICK_TIMEOUT_MS));
2810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.timedOut());
2820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        kill(pid, SIGKILL); // reap the child process
2830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
285