12d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===- llvm/unittest/Support/MemoryBufferTest.cpp - MemoryBuffer tests ----===//
22d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//
32d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//                     The LLVM Compiler Infrastructure
42d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//
52d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// This file is distributed under the University of Illinois Open Source
62d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// License. See LICENSE.TXT for details.
72d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//
82d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===----------------------------------------------------------------------===//
92d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//
102d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor// This file implements unit tests for the MemoryBuffer support class.
112d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//
122d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor//===----------------------------------------------------------------------===//
132d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
14f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky#include "llvm/Support/FileSystem.h"
152d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor#include "llvm/Support/MemoryBuffer.h"
16f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky#include "llvm/Support/raw_ostream.h"
172d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor#include "gtest/gtest.h"
182d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
192d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorusing namespace llvm;
202d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
21ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Benderskynamespace {
22ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky
232d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorclass MemoryBufferTest : public testing::Test {
242d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylorprotected:
252d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  MemoryBufferTest()
262d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  : data("this is some data")
272d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  { }
282d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  void SetUp() override {}
302d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
31ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  /// Common testing for different modes of getOpenFileSlice.
32ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  /// Creates a temporary file with known contents, and uses
33ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  /// MemoryBuffer::getOpenFileSlice to map it.
34ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  /// If \p Reopen is true, the file is closed after creating and reopened
35ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  /// anew before using MemoryBuffer.
36ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  void testGetOpenFileSlice(bool Reopen);
37ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  typedef std::unique_ptr<MemoryBuffer> OwningBuffer;
392d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
402d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  std::string data;
412d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor};
422d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
432d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, get) {
442d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // Default name and null-terminator flag
452d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer MB1(MemoryBuffer::getMemBuffer(data));
46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != MB1.get());
472d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
482d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // RequiresNullTerminator = false
492d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer MB2(MemoryBuffer::getMemBuffer(data, "one", false));
50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != MB2.get());
512d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
522d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // RequiresNullTerminator = true
532d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer MB3(MemoryBuffer::getMemBuffer(data, "two", true));
54c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != MB3.get());
552d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
562d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // verify all 3 buffers point to the same address
572d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  EXPECT_EQ(MB1->getBufferStart(), MB2->getBufferStart());
582d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  EXPECT_EQ(MB2->getBufferStart(), MB3->getBufferStart());
592d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
602d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // verify the original data is unmodified after deleting the buffers
612d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  MB1.reset();
622d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  MB2.reset();
632d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  MB3.reset();
642d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  EXPECT_EQ("this is some data", data);
652d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor}
662d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
67072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri GribenkoTEST_F(MemoryBufferTest, NullTerminator4K) {
68072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  // Test that a file with size that is a multiple of the page size can be null
69072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  // terminated correctly by MemoryBuffer.
70072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  int TestFD;
71072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  SmallString<64> TestPath;
72072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  sys::fs::createTemporaryFile("MemoryBufferTest_NullTerminator4K", "temp",
73072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko                               TestFD, TestPath);
74072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  raw_fd_ostream OF(TestFD, true, /*unbuffered=*/true);
75072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  for (unsigned i = 0; i < 4096 / 16; ++i) {
76072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko    OF << "0123456789abcdef";
77072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  }
78072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  OF.close();
79072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko
80c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  ErrorOr<OwningBuffer> MB = MemoryBuffer::getFile(TestPath.c_str());
81c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code EC = MB.getError();
82072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  ASSERT_FALSE(EC);
83072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko
84c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  const char *BufData = MB.get()->getBufferStart();
85072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  EXPECT_EQ('f', BufData[4095]);
86072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko  EXPECT_EQ('\0', BufData[4096]);
87072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko}
88072bd45a36e06dd9ae0a46ce4bb029bea0ca9eaeDmitri Gribenko
892d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, copy) {
902d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // copy with no name
912d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer MBC1(MemoryBuffer::getMemBufferCopy(data));
92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != MBC1.get());
932d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
942d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // copy with a name
952d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer MBC2(MemoryBuffer::getMemBufferCopy(data, "copy"));
96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != MBC2.get());
972d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
982d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // verify the two copies do not point to the same place
992d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  EXPECT_NE(MBC1->getBufferStart(), MBC2->getBufferStart());
1002d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor}
1012d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
1022d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew KaylorTEST_F(MemoryBufferTest, make_new) {
1032d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // 0-sized buffer
1042d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer Zero(MemoryBuffer::getNewUninitMemBuffer(0));
105c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != Zero.get());
1062d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
1072d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // uninitialized buffer with no name
1082d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer One(MemoryBuffer::getNewUninitMemBuffer(321));
109c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != One.get());
1102d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
1112d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // uninitialized buffer with name
1122d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer Two(MemoryBuffer::getNewUninitMemBuffer(123, "bla"));
113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != Two.get());
1142d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
1152d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // 0-initialized buffer with no name
1162d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer Three(MemoryBuffer::getNewMemBuffer(321, data));
117c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != Three.get());
1182d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  for (size_t i = 0; i < 321; ++i)
1192d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor    EXPECT_EQ(0, Three->getBufferStart()[0]);
1202d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
1212d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  // 0-initialized buffer with name
1222d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  OwningBuffer Four(MemoryBuffer::getNewMemBuffer(123, "zeros"));
123c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EXPECT_TRUE(nullptr != Four.get());
1242d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor  for (size_t i = 0; i < 123; ++i)
1252d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor    EXPECT_EQ(0, Four->getBufferStart()[0]);
1262d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor}
1272d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor
128ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Benderskyvoid MemoryBufferTest::testGetOpenFileSlice(bool Reopen) {
129f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  // Test that MemoryBuffer::getOpenFile works properly when no null
130f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  // terminator is requested and the size is large enough to trigger
131f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  // the usage of memory mapping.
132f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  int TestFD;
133f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  SmallString<64> TestPath;
134f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  // Create a temporary file and write data into it.
135f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  sys::fs::createTemporaryFile("prefix", "temp", TestFD, TestPath);
13637693da119853a4b2a31df4a6b7213043fe97e1aNAKAMURA Takumi  // OF is responsible for closing the file; If the file is not
137ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  // reopened, it will be unbuffered so that the results are
138ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  // immediately visible through the fd.
139ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  raw_fd_ostream OF(TestFD, true, !Reopen);
140f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  for (int i = 0; i < 60000; ++i) {
141f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky    OF << "0123456789";
142f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  }
143f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky
144ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  if (Reopen) {
145ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky    OF.close();
146ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky    EXPECT_FALSE(sys::fs::openFileForRead(TestPath.c_str(), TestFD));
147ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  }
148ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky
149c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  ErrorOr<OwningBuffer> Buf =
150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      MemoryBuffer::getOpenFileSlice(TestFD, TestPath.c_str(),
151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                     40000, // Size
152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                     80000  // Offset
153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                     );
154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code EC = Buf.getError();
156f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  EXPECT_FALSE(EC);
157f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky
158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  StringRef BufData = Buf.get()->getBuffer();
159f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  EXPECT_EQ(BufData.size(), 40000U);
160f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  EXPECT_EQ(BufData[0], '0');
161f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky  EXPECT_EQ(BufData[9], '9');
162f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky}
163f65712bfe35a038e5895ffc859bcf43fda35a8fdEli Bendersky
164ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli BenderskyTEST_F(MemoryBufferTest, getOpenFileNoReopen) {
165ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  testGetOpenFileSlice(false);
166ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky}
167ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky
168ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli BenderskyTEST_F(MemoryBufferTest, getOpenFileReopened) {
169ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky  testGetOpenFileSlice(true);
170ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky}
171ab99d04c59d649ed6d309603b9e77fc1d36cca4dEli Bendersky
17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesTEST_F(MemoryBufferTest, slice) {
17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Create a file that is six pages long with different data on each page.
17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int FD;
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SmallString<64> TestPath;
17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  sys::fs::createTemporaryFile("MemoryBufferTest_Slice", "temp", FD, TestPath);
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  raw_fd_ostream OF(FD, true, /*unbuffered=*/true);
17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (unsigned i = 0; i < 0x2000 / 8; ++i) {
18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    OF << "12345678";
18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (unsigned i = 0; i < 0x2000 / 8; ++i) {
18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    OF << "abcdefgh";
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (unsigned i = 0; i < 0x2000 / 8; ++i) {
18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    OF << "ABCDEFGH";
18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OF.close();
18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Try offset of one page.
19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ErrorOr<OwningBuffer> MB = MemoryBuffer::getFileSlice(TestPath.str(),
19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                        0x4000, 0x1000);
19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::error_code EC = MB.getError();
19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ASSERT_FALSE(EC);
19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_EQ(0x4000UL, MB.get()->getBufferSize());
19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef BufData = MB.get()->getBuffer();
19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x0000,8).equals("12345678"));
19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x0FF8,8).equals("12345678"));
20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x1000,8).equals("abcdefgh"));
20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x2FF8,8).equals("abcdefgh"));
20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x3000,8).equals("ABCDEFGH"));
20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData.substr(0x3FF8,8).equals("ABCDEFGH"));
20437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Try non-page aligned.
20637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ErrorOr<OwningBuffer> MB2 = MemoryBuffer::getFileSlice(TestPath.str(),
20737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                         0x3000, 0x0800);
20837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EC = MB2.getError();
20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ASSERT_FALSE(EC);
21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_EQ(0x3000UL, MB2.get()->getBufferSize());
21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
21237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef BufData2 = MB2.get()->getBuffer();
21337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData2.substr(0x0000,8).equals("12345678"));
21437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData2.substr(0x17F8,8).equals("12345678"));
21537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData2.substr(0x1800,8).equals("abcdefgh"));
21637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EXPECT_TRUE(BufData2.substr(0x2FF8,8).equals("abcdefgh"));
21737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
21837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
21937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
22037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
22137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2222d6d585c85ce8c56461f17b7b49fff24eed7b8fbAndrew Kaylor}
223