FdBuffer_test.cpp revision b592e3bc3169e39bd6b0bfce9f788631d5d22acd
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.
14b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin#include "Log.h"
150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include "FdBuffer.h"
17b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin#include "incidentd_util.h"
180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/file.h>
200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <android-base/test_utils.h>
2199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <fcntl.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;
28b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jinconst int QUICK_TIMEOUT_MS = 100;
290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst std::string HEAD = "[OK]";
300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android;
320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing namespace android::base;
330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinusing ::testing::Test;
340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinclass FdBufferTest : public Test {
360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinpublic:
370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    virtual void SetUp() override {
380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(tf.fd, -1);
390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(p2cPipe.init(), -1);
400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_NE(c2pPipe.init(), -1);
410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    void AssertBufferReadSuccessful(size_t expected) {
440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_EQ(buffer.size(), expected);
450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.timedOut());
460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.truncated());
470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    void AssertBufferContent(const char* expected) {
50b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        int i = 0;
51c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EncodedBuffer::iterator it = buffer.data();
52c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        while (it.hasNext()) {
53c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin            ASSERT_EQ(it.next(), expected[i++]);
5499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin        }
55c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_EQ(expected[i], '\0');
560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    bool DoDataStream(int rFd, int wFd) {
590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        char buf[BUFFER_SIZE];
600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ssize_t nRead;
610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        while ((nRead = read(rFd, buf, BUFFER_SIZE)) > 0) {
620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            ssize_t nWritten = 0;
630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            while (nWritten < nRead) {
640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                ssize_t amt = write(wFd, buf + nWritten, nRead - nWritten);
650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                if (amt < 0) {
660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                    return false;
670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                }
680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                nWritten += amt;
690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        return nRead == 0;
720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinprotected:
750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    FdBuffer buffer;
760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    TemporaryFile tf;
770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    Fpipe p2cPipe;
780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    Fpipe c2pPipe;
790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string kTestPath = GetExecutableDirectory();
810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string kTestDataPath = kTestPath + "/testdata/";
820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin};
830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadAndWrite) {
850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "FdBuffer test string";
86254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    AssertBufferReadSuccessful(testdata.size());
890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    AssertBufferContent(testdata.c_str());
900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
920ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi JinTEST_F(FdBufferTest, IterateEmpty) {
93c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer::iterator it = buffer.data();
94c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EXPECT_FALSE(it.hasNext());
9599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin}
9699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin
970ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi JinTEST_F(FdBufferTest, ReadAndIterate) {
980ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    std::string testdata = "FdBuffer test string";
99254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1000ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
1010ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
102b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    int i = 0;
103c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer::iterator it = buffer.data();
104c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    while (it.hasNext()) {
105c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_EQ(it.next(), (uint8_t)testdata[i++]);
1060ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    }
1070ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
108c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    it.rp()->rewind();
109c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    it.rp()->move(buffer.size());
1100ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin    EXPECT_EQ(it.bytesRead(), testdata.size());
111c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EXPECT_FALSE(it.hasNext());
1120ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin}
1130ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin
1140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadTimeout) {
1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
120b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        while (true) {
1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            write(c2pPipe.writeFd(), "poo", 3);
1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sleep(1);
1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
124b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_FAILURE);
1250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
128b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        status_t status = buffer.read(c2pPipe.readFd(), QUICK_TIMEOUT_MS);
1290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_EQ(NO_ERROR, status);
1300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.timedOut());
1310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
132b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        kill(pid, SIGKILL);  // reap the child process
1330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWrite) {
1370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "simply test read in stream";
1380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string expected = HEAD + testdata;
139254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
1460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
1470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(WriteStringToFd(HEAD, c2pPipe.writeFd()));
1480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
1490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // Must exit here otherwise the child process will continue executing the test binary.
152b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
1530a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1540a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
157b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, p2cPipe.writeFd(),
158b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                                                             c2pPipe.readFd(), READ_TIMEOUT));
1590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(HEAD.size() + testdata.size());
1600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent(expected.c_str());
1610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
1620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamAndWriteAllAtOnce) {
1660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "child process flushes only after all data are read.";
1670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string expected = HEAD + testdata;
168254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
1690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
1710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
1720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
1740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
1750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
1760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        std::string data;
1770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // wait for read finishes then write.
1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(ReadFdToString(p2cPipe.readFd(), &data));
1790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        data = HEAD + data;
1800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(WriteStringToFd(data, c2pPipe.writeFd()));
1810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // Must exit here otherwise the child process will continue executing the test binary.
184b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
1850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
1860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
1870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
1880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
189b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, p2cPipe.writeFd(),
190b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                                                             c2pPipe.readFd(), READ_TIMEOUT));
1910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(HEAD.size() + testdata.size());
1920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent(expected.c_str());
1930a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
1940a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1950a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1960a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamEmpty) {
198254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile("", tf.path));
1990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
2070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
209b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
2100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
214b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, p2cPipe.writeFd(),
215b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                                                             c2pPipe.readFd(), READ_TIMEOUT));
2160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferReadSuccessful(0);
2170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        AssertBufferContent("");
2180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
2190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
2210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamMoreThan4MB) {
2230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    const std::string testFile = kTestDataPath + "morethan4MB.txt";
224b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    size_t fourMB = (size_t)4 * 1024 * 1024;
22599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin    int fd = open(testFile.c_str(), O_RDONLY | O_CLOEXEC);
2260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_NE(fd, -1);
2270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
2340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
236b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_SUCCESS);
2370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
241b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(fd, p2cPipe.writeFd(),
242b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                                                             c2pPipe.readFd(), READ_TIMEOUT));
2430ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        EXPECT_EQ(buffer.size(), fourMB);
2440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_FALSE(buffer.timedOut());
2450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.truncated());
2460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        wait(&pid);
247c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EncodedBuffer::iterator it = buffer.data();
248c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        it.rp()->move(fourMB);
2490ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        EXPECT_EQ(it.bytesRead(), fourMB);
250c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        EXPECT_FALSE(it.hasNext());
251c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
252c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        it.rp()->rewind();
253c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        while (it.hasNext()) {
2540ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin            char c = 'A' + (it.bytesRead() % 64 / 8);
255c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin            ASSERT_TRUE(it.next() == c);
2560ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin        }
2570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
2590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinTEST_F(FdBufferTest, ReadInStreamTimeOut) {
2610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    std::string testdata = "timeout test";
262254102d858942393482589b8f1e6102b33797b58Wei Wang    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
2630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int pid = fork();
2650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    ASSERT_TRUE(pid != -1);
2660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    if (pid == 0) {
2680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.writeFd());
2690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.readFd());
2700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        while (true) {
2710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sleep(1);
2720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
273b44f7d46b647e24d8ea4fdf45742bbcbbfb03113Yi Jin        _exit(EXIT_FAILURE);
2740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    } else {
2750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(p2cPipe.readFd());
2760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        close(c2pPipe.writeFd());
2770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
278b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(tf.fd, p2cPipe.writeFd(),
279b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                                                             c2pPipe.readFd(), QUICK_TIMEOUT_MS));
2800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        EXPECT_TRUE(buffer.timedOut());
281b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin        kill(pid, SIGKILL);  // reap the child process
2820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
284