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