summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/DebugInfo
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2017-03-01 01:04:16 +0000
committerZachary Turner <zturner@google.com>2017-03-01 01:04:16 +0000
commit9538bc4578ebf4c9e776a3eaf6f3ca2f20d27f15 (patch)
tree3dc1a758ac50fe99719333c6078029056521948e /llvm/unittests/DebugInfo
parent24ba722f053d537e6daa04aff71dfa214c1e36fd (diff)
downloadbcm5719-llvm-9538bc4578ebf4c9e776a3eaf6f3ca2f20d27f15.tar.gz
bcm5719-llvm-9538bc4578ebf4c9e776a3eaf6f3ca2f20d27f15.zip
[PDB] Add an additional test for BinaryStreamRef.
A bug was uncovered where if you have a StreamRef whose ViewOffset is > 0, then when you call readLongestContiguousChunk it will succeed even when it shouldn't, and it always return you a buffer that was taken as if the ViewOffset was 0. Fixed this bug and added a test for it. llvm-svn: 296556
Diffstat (limited to 'llvm/unittests/DebugInfo')
-rw-r--r--llvm/unittests/DebugInfo/PDB/BinaryStreamTest.cpp60
1 files changed, 58 insertions, 2 deletions
diff --git a/llvm/unittests/DebugInfo/PDB/BinaryStreamTest.cpp b/llvm/unittests/DebugInfo/PDB/BinaryStreamTest.cpp
index 04561987506..dbb3eb54484 100644
--- a/llvm/unittests/DebugInfo/PDB/BinaryStreamTest.cpp
+++ b/llvm/unittests/DebugInfo/PDB/BinaryStreamTest.cpp
@@ -135,12 +135,16 @@ public:
void SetUp() override {
Streams.clear();
Streams.resize(NumStreams);
+ for (int I = 0; I < NumStreams; ++I)
+ Streams[I].IsContiguous = (I % 2 == 0);
+
InputData.clear();
OutputData.clear();
}
protected:
struct StreamPair {
+ bool IsContiguous;
std::unique_ptr<BinaryStream> Input;
std::unique_ptr<WritableBinaryStream> Output;
};
@@ -210,7 +214,7 @@ protected:
};
// Tests that a we can read from a BinaryByteStream without a StreamReader.
-TEST_F(BinaryStreamTest, BinaryByteStreamProperties) {
+TEST_F(BinaryStreamTest, BinaryByteStreamBounds) {
std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
initializeInput(InputData);
@@ -229,8 +233,60 @@ TEST_F(BinaryStreamTest, BinaryByteStreamProperties) {
}
}
+TEST_F(BinaryStreamTest, StreamRefBounds) {
+ std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
+ initializeInput(InputData);
+
+ for (const auto &Stream : Streams) {
+ ArrayRef<uint8_t> Buffer;
+ BinaryStreamRef Ref(*Stream.Input);
+
+ // Read 1 byte from offset 2 should work
+ ASSERT_EQ(InputData.size(), Ref.getLength());
+ ASSERT_NO_ERROR(Ref.readBytes(2, 1, Buffer));
+ EXPECT_EQ(makeArrayRef(InputData).slice(2, 1), Buffer);
+
+ // Reading everything from offset 2 on.
+ ASSERT_NO_ERROR(Ref.readLongestContiguousChunk(2, Buffer));
+ if (Stream.IsContiguous)
+ EXPECT_EQ(makeArrayRef(InputData).slice(2), Buffer);
+ else
+ EXPECT_FALSE(Buffer.empty());
+
+ // Reading 6 bytes from offset 0 is too big.
+ EXPECT_ERROR(Ref.readBytes(0, 6, Buffer));
+ EXPECT_ERROR(Ref.readLongestContiguousChunk(6, Buffer));
+
+ // Reading 1 byte from offset 2 after dropping 1 byte is the same as reading
+ // 1 byte from offset 3.
+ Ref = Ref.drop_front(1);
+ ASSERT_NO_ERROR(Ref.readBytes(2, 1, Buffer));
+ if (Stream.IsContiguous)
+ EXPECT_EQ(makeArrayRef(InputData).slice(3, 1), Buffer);
+ else
+ EXPECT_FALSE(Buffer.empty());
+
+ // Reading everything from offset 2 on after dropping 1 byte.
+ ASSERT_NO_ERROR(Ref.readLongestContiguousChunk(2, Buffer));
+ if (Stream.IsContiguous)
+ EXPECT_EQ(makeArrayRef(InputData).slice(3), Buffer);
+ else
+ EXPECT_FALSE(Buffer.empty());
+
+ // Reading 2 bytes from offset 2 after dropping 2 bytes is the same as
+ // reading 2 bytes from offset 4, and should fail.
+ Ref = Ref.drop_front(1);
+ EXPECT_ERROR(Ref.readBytes(2, 2, Buffer));
+
+ // But if we read the longest contiguous chunk instead, we should still
+ // get the 1 byte at the end.
+ ASSERT_NO_ERROR(Ref.readLongestContiguousChunk(2, Buffer));
+ EXPECT_EQ(makeArrayRef(InputData).take_back(), Buffer);
+ }
+}
+
// Test that we can write to a BinaryStream without a StreamWriter.
-TEST_F(BinaryStreamTest, MutableBinaryByteStreamProperties) {
+TEST_F(BinaryStreamTest, MutableBinaryByteStreamBounds) {
std::vector<uint8_t> InputData = {'T', 'e', 's', 't', '\0'};
initializeInput(InputData);
initializeOutput(InputData.size());
OpenPOWER on IntegriCloud