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