From bb506fce27bf8e3bf96233cb130203b8430234d2 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Tue, 23 Jul 2013 20:58:51 +0000 Subject: [PATCH] Refactor the unit test for MemoryBuffer::getOpenFileSlice Run in two different modes: with and without reopening the temporary file between creating it and mapping it with MemoryBuffer. llvm-svn: 186986 --- llvm/unittests/Support/MemoryBufferTest.cpp | 33 +++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/llvm/unittests/Support/MemoryBufferTest.cpp b/llvm/unittests/Support/MemoryBufferTest.cpp index d5ea8de3c174..de1dbb7ae4de 100644 --- a/llvm/unittests/Support/MemoryBufferTest.cpp +++ b/llvm/unittests/Support/MemoryBufferTest.cpp @@ -19,6 +19,8 @@ using namespace llvm; +namespace { + class MemoryBufferTest : public testing::Test { protected: MemoryBufferTest() @@ -27,13 +29,18 @@ protected: virtual void SetUp() { } + /// Common testing for different modes of getOpenFileSlice. + /// Creates a temporary file with known contents, and uses + /// MemoryBuffer::getOpenFileSlice to map it. + /// If \p Reopen is true, the file is closed after creating and reopened + /// anew before using MemoryBuffer. + void testGetOpenFileSlice(bool Reopen); + typedef OwningPtr OwningBuffer; std::string data; }; -namespace { - TEST_F(MemoryBufferTest, get) { // Default name and null-terminator flag OwningBuffer MB1(MemoryBuffer::getMemBuffer(data)); @@ -97,7 +104,7 @@ TEST_F(MemoryBufferTest, make_new) { EXPECT_EQ(0, Four->getBufferStart()[0]); } -TEST_F(MemoryBufferTest, getOpenFileNoNullTerminator) { +void MemoryBufferTest::testGetOpenFileSlice(bool Reopen) { // Test that MemoryBuffer::getOpenFile works properly when no null // terminator is requested and the size is large enough to trigger // the usage of memory mapping. @@ -105,13 +112,19 @@ TEST_F(MemoryBufferTest, getOpenFileNoNullTerminator) { SmallString<64> TestPath; // Create a temporary file and write data into it. sys::fs::createTemporaryFile("prefix", "temp", TestFD, TestPath); - // OF is responsible for closing the file, and is unbuffered so that - // the results are immediately visible through the fd. - raw_fd_ostream OF(TestFD, true, true); + // OF is responsible for closing the file; If the file is not + // reopened, it will be unbuffered so that the results are + // immediately visible through the fd. + raw_fd_ostream OF(TestFD, true, !Reopen); for (int i = 0; i < 60000; ++i) { OF << "0123456789"; } + if (Reopen) { + OF.close(); + EXPECT_FALSE(sys::fs::openFileForRead(TestPath.c_str(), TestFD)); + } + OwningBuffer Buf; error_code EC = MemoryBuffer::getOpenFileSlice(TestFD, TestPath.c_str(), Buf, 40000, // Size @@ -125,4 +138,12 @@ TEST_F(MemoryBufferTest, getOpenFileNoNullTerminator) { EXPECT_EQ(BufData[9], '9'); } +TEST_F(MemoryBufferTest, getOpenFileNoReopen) { + testGetOpenFileSlice(false); +} + +TEST_F(MemoryBufferTest, getOpenFileReopened) { + testGetOpenFileSlice(true); +} + }