annotate unittests/Support/BinaryStreamTest.cpp @ 121:803732b1fca8

LLVM 5.0
author kono
date Fri, 27 Oct 2017 17:07:41 +0900
parents
children 3a76565eade5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
1 //===- llvm/unittest/Support/BinaryStreamTest.cpp -------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
2 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
4 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
7 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
9
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
10 #include "llvm/Support/BinaryByteStream.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
11 #include "llvm/Support/BinaryItemStream.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
12 #include "llvm/Support/BinaryStreamArray.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
13 #include "llvm/Support/BinaryStreamReader.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
14 #include "llvm/Support/BinaryStreamRef.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
15 #include "llvm/Support/BinaryStreamWriter.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
16 #include "llvm/Testing/Support/Error.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
17
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
18 #include "gtest/gtest.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
19
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
20 #include <unordered_map>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
21 #include <utility>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
22
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
23 using namespace llvm;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
24 using namespace llvm::support;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
25
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
26 namespace {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
27
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
28 class BrokenStream : public WritableBinaryStream {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
29 public:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
30 BrokenStream(MutableArrayRef<uint8_t> Data, endianness Endian,
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
31 uint32_t Align)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
32 : Data(Data), PartitionIndex(alignDown(Data.size() / 2, Align)),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
33 Endian(Endian) {}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
34
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
35 endianness getEndian() const override { return Endian; }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
36
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
37 Error readBytes(uint32_t Offset, uint32_t Size,
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
38 ArrayRef<uint8_t> &Buffer) override {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
39 if (auto EC = checkOffset(Offset, Size))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
40 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
41 uint32_t S = startIndex(Offset);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
42 auto Ref = Data.drop_front(S);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
43 if (Ref.size() >= Size) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
44 Buffer = Ref.take_front(Size);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
45 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
46 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
47
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
48 uint32_t BytesLeft = Size - Ref.size();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
49 uint8_t *Ptr = Allocator.Allocate<uint8_t>(Size);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
50 ::memcpy(Ptr, Ref.data(), Ref.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
51 ::memcpy(Ptr + Ref.size(), Data.data(), BytesLeft);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
52 Buffer = makeArrayRef<uint8_t>(Ptr, Size);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
53 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
54 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
55
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
56 Error readLongestContiguousChunk(uint32_t Offset,
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
57 ArrayRef<uint8_t> &Buffer) override {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
58 if (auto EC = checkOffset(Offset, 1))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
59 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
60 uint32_t S = startIndex(Offset);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
61 Buffer = Data.drop_front(S);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
62 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
63 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
65 uint32_t getLength() override { return Data.size(); }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
66
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
67 Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> SrcData) override {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
68 if (auto EC = checkOffset(Offset, SrcData.size()))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
69 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
70 if (SrcData.empty())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
71 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
72
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
73 uint32_t S = startIndex(Offset);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
74 MutableArrayRef<uint8_t> Ref(Data);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
75 Ref = Ref.drop_front(S);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
76 if (Ref.size() >= SrcData.size()) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
77 ::memcpy(Ref.data(), SrcData.data(), SrcData.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
78 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
79 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
80
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
81 uint32_t BytesLeft = SrcData.size() - Ref.size();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
82 ::memcpy(Ref.data(), SrcData.data(), Ref.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
83 ::memcpy(&Data[0], SrcData.data() + Ref.size(), BytesLeft);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
84 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
85 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
86 Error commit() override { return Error::success(); }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
87
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
88 private:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
89 uint32_t startIndex(uint32_t Offset) const {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
90 return (Offset + PartitionIndex) % Data.size();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
91 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
92
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
93 uint32_t endIndex(uint32_t Offset, uint32_t Size) const {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
94 return (startIndex(Offset) + Size - 1) % Data.size();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
95 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
96
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
97 // Buffer is organized like this:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
98 // -------------------------------------------------
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
99 // | N/2 | N/2+1 | ... | N-1 | 0 | 1 | ... | N/2-1 |
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
100 // -------------------------------------------------
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
101 // So reads from the beginning actually come from the middle.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
102 MutableArrayRef<uint8_t> Data;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
103 uint32_t PartitionIndex = 0;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
104 endianness Endian;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
105 BumpPtrAllocator Allocator;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
106 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
107
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
108 constexpr endianness Endians[] = {big, little, native};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
109 constexpr uint32_t NumEndians = llvm::array_lengthof(Endians);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
110 constexpr uint32_t NumStreams = 2 * NumEndians;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
111
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
112 class BinaryStreamTest : public testing::Test {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
113
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
114 public:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
115 BinaryStreamTest() {}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
116
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
117 void SetUp() override {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
118 Streams.clear();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
119 Streams.resize(NumStreams);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
120 for (uint32_t I = 0; I < NumStreams; ++I)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
121 Streams[I].IsContiguous = (I % 2 == 0);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
122
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
123 InputData.clear();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
124 OutputData.clear();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
125 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
126
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
127 protected:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
128 struct StreamPair {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
129 bool IsContiguous;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
130 std::unique_ptr<BinaryStream> Input;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
131 std::unique_ptr<WritableBinaryStream> Output;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
132 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
133
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
134 void initializeInput(ArrayRef<uint8_t> Input, uint32_t Align) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
135 InputData = Input;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
136
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
137 BrokenInputData.resize(InputData.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
138 if (!Input.empty()) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
139 uint32_t PartitionIndex = alignDown(InputData.size() / 2, Align);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
140 uint32_t RightBytes = InputData.size() - PartitionIndex;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
141 uint32_t LeftBytes = PartitionIndex;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
142 if (RightBytes > 0)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
143 ::memcpy(&BrokenInputData[PartitionIndex], Input.data(), RightBytes);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
144 if (LeftBytes > 0)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
145 ::memcpy(&BrokenInputData[0], Input.data() + RightBytes, LeftBytes);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
146 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
147
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
148 for (uint32_t I = 0; I < NumEndians; ++I) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
149 auto InByteStream =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
150 llvm::make_unique<BinaryByteStream>(InputData, Endians[I]);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
151 auto InBrokenStream = llvm::make_unique<BrokenStream>(
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
152 BrokenInputData, Endians[I], Align);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
153
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
154 Streams[I * 2].Input = std::move(InByteStream);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
155 Streams[I * 2 + 1].Input = std::move(InBrokenStream);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
156 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
157 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
158
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
159 void initializeOutput(uint32_t Size, uint32_t Align) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
160 OutputData.resize(Size);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
161 BrokenOutputData.resize(Size);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
162
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
163 for (uint32_t I = 0; I < NumEndians; ++I) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
164 Streams[I * 2].Output =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
165 llvm::make_unique<MutableBinaryByteStream>(OutputData, Endians[I]);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
166 Streams[I * 2 + 1].Output = llvm::make_unique<BrokenStream>(
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
167 BrokenOutputData, Endians[I], Align);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
168 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
169 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
170
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
171 void initializeOutputFromInput(uint32_t Align) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
172 for (uint32_t I = 0; I < NumEndians; ++I) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
173 Streams[I * 2].Output =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
174 llvm::make_unique<MutableBinaryByteStream>(InputData, Endians[I]);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
175 Streams[I * 2 + 1].Output = llvm::make_unique<BrokenStream>(
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
176 BrokenInputData, Endians[I], Align);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
177 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
178 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
179
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
180 void initializeInputFromOutput(uint32_t Align) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
181 for (uint32_t I = 0; I < NumEndians; ++I) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
182 Streams[I * 2].Input =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
183 llvm::make_unique<BinaryByteStream>(OutputData, Endians[I]);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
184 Streams[I * 2 + 1].Input = llvm::make_unique<BrokenStream>(
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
185 BrokenOutputData, Endians[I], Align);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
186 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
187 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
188
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
189 std::vector<uint8_t> InputData;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
190 std::vector<uint8_t> BrokenInputData;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
191
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
192 std::vector<uint8_t> OutputData;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
193 std::vector<uint8_t> BrokenOutputData;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
194
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
195 std::vector<StreamPair> Streams;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
196 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
197
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
198 // Tests that a we can read from a BinaryByteStream without a StreamReader.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
199 TEST_F(BinaryStreamTest, BinaryByteStreamBounds) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
200 std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
201 initializeInput(InputData, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
202
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
203 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
204 ArrayRef<uint8_t> Buffer;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
205
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
206 // 1. If the read fits it should work.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
207 ASSERT_EQ(InputData.size(), Stream.Input->getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
208 ASSERT_THAT_ERROR(Stream.Input->readBytes(2, 1, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
209 EXPECT_EQ(makeArrayRef(InputData).slice(2, 1), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
210 ASSERT_THAT_ERROR(Stream.Input->readBytes(0, 4, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
211 EXPECT_EQ(makeArrayRef(InputData).slice(0, 4), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
212
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
213 // 2. Reading past the bounds of the input should fail.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
214 EXPECT_THAT_ERROR(Stream.Input->readBytes(4, 2, Buffer), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
215 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
216 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
217
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
218 TEST_F(BinaryStreamTest, StreamRefBounds) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
219 std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
220 initializeInput(InputData, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
221
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
222 for (const auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
223 ArrayRef<uint8_t> Buffer;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
224 BinaryStreamRef Ref(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
225
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
226 // Read 1 byte from offset 2 should work
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
227 ASSERT_EQ(InputData.size(), Ref.getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
228 ASSERT_THAT_ERROR(Ref.readBytes(2, 1, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
229 EXPECT_EQ(makeArrayRef(InputData).slice(2, 1), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
230
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
231 // Reading everything from offset 2 on.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
232 ASSERT_THAT_ERROR(Ref.readLongestContiguousChunk(2, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
233 if (Stream.IsContiguous)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
234 EXPECT_EQ(makeArrayRef(InputData).slice(2), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
235 else
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
236 EXPECT_FALSE(Buffer.empty());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
237
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
238 // Reading 6 bytes from offset 0 is too big.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
239 EXPECT_THAT_ERROR(Ref.readBytes(0, 6, Buffer), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
240 EXPECT_THAT_ERROR(Ref.readLongestContiguousChunk(6, Buffer), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
241
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
242 // Reading 1 byte from offset 2 after dropping 1 byte is the same as reading
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
243 // 1 byte from offset 3.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
244 Ref = Ref.drop_front(1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
245 ASSERT_THAT_ERROR(Ref.readBytes(2, 1, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
246 if (Stream.IsContiguous)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
247 EXPECT_EQ(makeArrayRef(InputData).slice(3, 1), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
248 else
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
249 EXPECT_FALSE(Buffer.empty());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
250
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
251 // Reading everything from offset 2 on after dropping 1 byte.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
252 ASSERT_THAT_ERROR(Ref.readLongestContiguousChunk(2, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
253 if (Stream.IsContiguous)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
254 EXPECT_EQ(makeArrayRef(InputData).slice(3), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
255 else
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
256 EXPECT_FALSE(Buffer.empty());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
257
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
258 // Reading 2 bytes from offset 2 after dropping 2 bytes is the same as
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
259 // reading 2 bytes from offset 4, and should fail.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
260 Ref = Ref.drop_front(1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
261 EXPECT_THAT_ERROR(Ref.readBytes(2, 2, Buffer), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
262
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
263 // But if we read the longest contiguous chunk instead, we should still
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
264 // get the 1 byte at the end.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
265 ASSERT_THAT_ERROR(Ref.readLongestContiguousChunk(2, Buffer), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
266 EXPECT_EQ(makeArrayRef(InputData).take_back(), Buffer);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
267 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
268 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
269
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
270 TEST_F(BinaryStreamTest, DropOperations) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
271 std::vector<uint8_t> InputData = {1, 2, 3, 4, 5, 4, 3, 2, 1};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
272 auto RefData = makeArrayRef(InputData);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
273 initializeInput(InputData, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
274
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
275 ArrayRef<uint8_t> Result;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
276 BinaryStreamRef Original(InputData, support::little);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
277 ASSERT_EQ(InputData.size(), Original.getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
278
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
279 EXPECT_THAT_ERROR(Original.readBytes(0, InputData.size(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
280 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
281 EXPECT_EQ(RefData, Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
282
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
283 auto Dropped = Original.drop_front(2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
284 EXPECT_THAT_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
285 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
286 EXPECT_EQ(RefData.drop_front(2), Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
287
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
288 Dropped = Original.drop_back(2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
289 EXPECT_THAT_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
290 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
291 EXPECT_EQ(RefData.drop_back(2), Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
292
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
293 Dropped = Original.keep_front(2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
294 EXPECT_THAT_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
295 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
296 EXPECT_EQ(RefData.take_front(2), Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
297
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
298 Dropped = Original.keep_back(2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
299 EXPECT_THAT_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
300 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
301 EXPECT_EQ(RefData.take_back(2), Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
302
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
303 Dropped = Original.drop_symmetric(2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
304 EXPECT_THAT_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
305 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
306 EXPECT_EQ(RefData.drop_front(2).drop_back(2), Result);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
307 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
308
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
309 // Test that we can write to a BinaryStream without a StreamWriter.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
310 TEST_F(BinaryStreamTest, MutableBinaryByteStreamBounds) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
311 std::vector<uint8_t> InputData = {'T', 'e', 's', 't', '\0'};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
312 initializeInput(InputData, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
313 initializeOutput(InputData.size(), 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
314
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
315 // For every combination of input stream and output stream.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
316 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
317 ASSERT_EQ(InputData.size(), Stream.Input->getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
318
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
319 // 1. Try two reads that are supposed to work. One from offset 0, and one
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
320 // from the middle.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
321 uint32_t Offsets[] = {0, 3};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
322 for (auto Offset : Offsets) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
323 uint32_t ExpectedSize = Stream.Input->getLength() - Offset;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
324
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
325 // Read everything from Offset until the end of the input data.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
326 ArrayRef<uint8_t> Data;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
327 ASSERT_THAT_ERROR(Stream.Input->readBytes(Offset, ExpectedSize, Data),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
328 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
329 ASSERT_EQ(ExpectedSize, Data.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
330
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
331 // Then write it to the destination.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
332 ASSERT_THAT_ERROR(Stream.Output->writeBytes(0, Data), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
333
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
334 // Then we read back what we wrote, it should match the corresponding
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
335 // slice of the original input data.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
336 ArrayRef<uint8_t> Data2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
337 ASSERT_THAT_ERROR(Stream.Output->readBytes(Offset, ExpectedSize, Data2),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
338 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
339 EXPECT_EQ(makeArrayRef(InputData).drop_front(Offset), Data2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
340 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
341
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
342 std::vector<uint8_t> BigData = {0, 1, 2, 3, 4};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
343 // 2. If the write is too big, it should fail.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
344 EXPECT_THAT_ERROR(Stream.Output->writeBytes(3, BigData), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
345 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
346 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
347
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
348 // Test that FixedStreamArray works correctly.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
349 TEST_F(BinaryStreamTest, FixedStreamArray) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
350 std::vector<uint32_t> Ints = {90823, 12908, 109823, 209823};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
351 ArrayRef<uint8_t> IntBytes(reinterpret_cast<uint8_t *>(Ints.data()),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
352 Ints.size() * sizeof(uint32_t));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
353
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
354 initializeInput(IntBytes, alignof(uint32_t));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
355
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
356 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
357 ASSERT_EQ(InputData.size(), Stream.Input->getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
358
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
359 FixedStreamArray<uint32_t> Array(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
360 auto Iter = Array.begin();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
361 ASSERT_EQ(Ints[0], *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
362 ASSERT_EQ(Ints[1], *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
363 ASSERT_EQ(Ints[2], *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
364 ASSERT_EQ(Ints[3], *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
365 ASSERT_EQ(Array.end(), Iter);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
366 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
367 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
368
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
369 // Ensure FixedStreamArrayIterator::operator-> works.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
370 // Added for coverage of r302257.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
371 TEST_F(BinaryStreamTest, FixedStreamArrayIteratorArrow) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
372 std::vector<std::pair<uint32_t, uint32_t>> Pairs = {{867, 5309}, {555, 1212}};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
373 ArrayRef<uint8_t> PairBytes(reinterpret_cast<uint8_t *>(Pairs.data()),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
374 Pairs.size() * sizeof(Pairs[0]));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
375
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
376 initializeInput(PairBytes, alignof(uint32_t));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
377
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
378 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
379 ASSERT_EQ(InputData.size(), Stream.Input->getLength());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
380
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
381 const FixedStreamArray<std::pair<uint32_t, uint32_t>> Array(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
382 auto Iter = Array.begin();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
383 ASSERT_EQ(Pairs[0].first, Iter->first);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
384 ASSERT_EQ(Pairs[0].second, Iter->second);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
385 ++Iter;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
386 ASSERT_EQ(Pairs[1].first, Iter->first);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
387 ASSERT_EQ(Pairs[1].second, Iter->second);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
388 ++Iter;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
389 ASSERT_EQ(Array.end(), Iter);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
390 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
391 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
392
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
393 // Test that VarStreamArray works correctly.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
394 TEST_F(BinaryStreamTest, VarStreamArray) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
395 StringLiteral Strings("1. Test2. Longer Test3. Really Long Test4. Super "
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
396 "Extra Longest Test Of All");
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
397 ArrayRef<uint8_t> StringBytes(
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
398 reinterpret_cast<const uint8_t *>(Strings.data()), Strings.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
399 initializeInput(StringBytes, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
400
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
401 struct StringExtractor {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
402 public:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
403 Error operator()(BinaryStreamRef Stream, uint32_t &Len, StringRef &Item) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
404 if (Index == 0)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
405 Len = strlen("1. Test");
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
406 else if (Index == 1)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
407 Len = strlen("2. Longer Test");
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
408 else if (Index == 2)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
409 Len = strlen("3. Really Long Test");
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
410 else
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
411 Len = strlen("4. Super Extra Longest Test Of All");
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
412 ArrayRef<uint8_t> Bytes;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
413 if (auto EC = Stream.readBytes(0, Len, Bytes))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
414 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
415 Item =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
416 StringRef(reinterpret_cast<const char *>(Bytes.data()), Bytes.size());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
417 ++Index;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
418 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
419 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
420
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
421 uint32_t Index = 0;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
422 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
423
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
424 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
425 VarStreamArray<StringRef, StringExtractor> Array(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
426 auto Iter = Array.begin();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
427 ASSERT_EQ("1. Test", *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
428 ASSERT_EQ("2. Longer Test", *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
429 ASSERT_EQ("3. Really Long Test", *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
430 ASSERT_EQ("4. Super Extra Longest Test Of All", *Iter++);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
431 ASSERT_EQ(Array.end(), Iter);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
432 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
433 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
434
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
435 TEST_F(BinaryStreamTest, StreamReaderBounds) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
436 std::vector<uint8_t> Bytes;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
437
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
438 initializeInput(Bytes, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
439 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
440 StringRef S;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
441 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
442 EXPECT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
443 EXPECT_THAT_ERROR(Reader.readFixedString(S, 1), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
444 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
445
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
446 Bytes.resize(5);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
447 initializeInput(Bytes, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
448 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
449 StringRef S;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
450 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
451 EXPECT_EQ(Bytes.size(), Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
452 EXPECT_THAT_ERROR(Reader.readFixedString(S, 5), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
453 EXPECT_THAT_ERROR(Reader.readFixedString(S, 6), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
454 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
455 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
456
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
457 TEST_F(BinaryStreamTest, StreamReaderIntegers) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
458 support::ulittle64_t Little{908234};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
459 support::ubig32_t Big{28907823};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
460 short NS = 2897;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
461 int NI = -89723;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
462 unsigned long NUL = 902309023UL;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
463 constexpr uint32_t Size =
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
464 sizeof(Little) + sizeof(Big) + sizeof(NS) + sizeof(NI) + sizeof(NUL);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
465
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
466 initializeOutput(Size, alignof(support::ulittle64_t));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
467 initializeInputFromOutput(alignof(support::ulittle64_t));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
468
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
469 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
470 BinaryStreamWriter Writer(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
471 ASSERT_THAT_ERROR(Writer.writeObject(Little), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
472 ASSERT_THAT_ERROR(Writer.writeObject(Big), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
473 ASSERT_THAT_ERROR(Writer.writeInteger(NS), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
474 ASSERT_THAT_ERROR(Writer.writeInteger(NI), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
475 ASSERT_THAT_ERROR(Writer.writeInteger(NUL), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
476
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
477 const support::ulittle64_t *Little2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
478 const support::ubig32_t *Big2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
479 short NS2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
480 int NI2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
481 unsigned long NUL2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
482
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
483 // 1. Reading fields individually.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
484 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
485 ASSERT_THAT_ERROR(Reader.readObject(Little2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
486 ASSERT_THAT_ERROR(Reader.readObject(Big2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
487 ASSERT_THAT_ERROR(Reader.readInteger(NS2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
488 ASSERT_THAT_ERROR(Reader.readInteger(NI2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
489 ASSERT_THAT_ERROR(Reader.readInteger(NUL2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
490 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
491
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
492 EXPECT_EQ(Little, *Little2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
493 EXPECT_EQ(Big, *Big2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
494 EXPECT_EQ(NS, NS2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
495 EXPECT_EQ(NI, NI2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
496 EXPECT_EQ(NUL, NUL2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
497 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
498 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
499
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
500 TEST_F(BinaryStreamTest, StreamReaderIntegerArray) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
501 // 1. Arrays of integers
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
502 std::vector<int> Ints = {1, 2, 3, 4, 5};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
503 ArrayRef<uint8_t> IntBytes(reinterpret_cast<uint8_t *>(&Ints[0]),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
504 Ints.size() * sizeof(int));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
505
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
506 initializeInput(IntBytes, alignof(int));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
507 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
508 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
509 ArrayRef<int> IntsRef;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
510 ASSERT_THAT_ERROR(Reader.readArray(IntsRef, Ints.size()), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
511 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
512 EXPECT_EQ(makeArrayRef(Ints), IntsRef);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
513
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
514 Reader.setOffset(0);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
515 FixedStreamArray<int> FixedIntsRef;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
516 ASSERT_THAT_ERROR(Reader.readArray(FixedIntsRef, Ints.size()), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
517 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
518 ASSERT_EQ(Ints, std::vector<int>(FixedIntsRef.begin(), FixedIntsRef.end()));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
519 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
520 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
521
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
522 TEST_F(BinaryStreamTest, StreamReaderEnum) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
523 enum class MyEnum : int64_t { Foo = -10, Bar = 0, Baz = 10 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
524
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
525 std::vector<MyEnum> Enums = {MyEnum::Bar, MyEnum::Baz, MyEnum::Foo};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
526
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
527 initializeOutput(Enums.size() * sizeof(MyEnum), alignof(MyEnum));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
528 initializeInputFromOutput(alignof(MyEnum));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
529 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
530 BinaryStreamWriter Writer(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
531 for (auto Value : Enums)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
532 ASSERT_THAT_ERROR(Writer.writeEnum(Value), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
533
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
534 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
535
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
536 FixedStreamArray<MyEnum> FSA;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
537
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
538 for (size_t I = 0; I < Enums.size(); ++I) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
539 MyEnum Value;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
540 ASSERT_THAT_ERROR(Reader.readEnum(Value), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
541 EXPECT_EQ(Enums[I], Value);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
542 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
543 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
544 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
545 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
546
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
547 TEST_F(BinaryStreamTest, StreamReaderObject) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
548 struct Foo {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
549 int X;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
550 double Y;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
551 char Z;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
552
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
553 bool operator==(const Foo &Other) const {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
554 return X == Other.X && Y == Other.Y && Z == Other.Z;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
555 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
556 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
557
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
558 std::vector<Foo> Foos;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
559 Foos.push_back({-42, 42.42, 42});
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
560 Foos.push_back({100, 3.1415, static_cast<char>(-89)});
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
561 Foos.push_back({200, 2.718, static_cast<char>(-12) });
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
562
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
563 const uint8_t *Bytes = reinterpret_cast<const uint8_t *>(&Foos[0]);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
564
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
565 initializeInput(makeArrayRef(Bytes, 3 * sizeof(Foo)), alignof(Foo));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
566
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
567 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
568 // 1. Reading object pointers.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
569 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
570 const Foo *FPtrOut = nullptr;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
571 const Foo *GPtrOut = nullptr;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
572 const Foo *HPtrOut = nullptr;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
573 ASSERT_THAT_ERROR(Reader.readObject(FPtrOut), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
574 ASSERT_THAT_ERROR(Reader.readObject(GPtrOut), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
575 ASSERT_THAT_ERROR(Reader.readObject(HPtrOut), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
576 EXPECT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
577 EXPECT_EQ(Foos[0], *FPtrOut);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
578 EXPECT_EQ(Foos[1], *GPtrOut);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
579 EXPECT_EQ(Foos[2], *HPtrOut);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
580 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
581 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
582
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
583 TEST_F(BinaryStreamTest, StreamReaderStrings) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
584 std::vector<uint8_t> Bytes = {'O', 'n', 'e', '\0', 'T', 'w', 'o',
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
585 '\0', 'T', 'h', 'r', 'e', 'e', '\0',
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
586 'F', 'o', 'u', 'r', '\0'};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
587 initializeInput(Bytes, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
588
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
589 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
590 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
591
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
592 StringRef S1;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
593 StringRef S2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
594 StringRef S3;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
595 StringRef S4;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
596 ASSERT_THAT_ERROR(Reader.readCString(S1), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
597 ASSERT_THAT_ERROR(Reader.readCString(S2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
598 ASSERT_THAT_ERROR(Reader.readCString(S3), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
599 ASSERT_THAT_ERROR(Reader.readCString(S4), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
600 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
601
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
602 EXPECT_EQ("One", S1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
603 EXPECT_EQ("Two", S2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
604 EXPECT_EQ("Three", S3);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
605 EXPECT_EQ("Four", S4);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
606
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
607 S1 = S2 = S3 = S4 = "";
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
608 Reader.setOffset(0);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
609 ASSERT_THAT_ERROR(Reader.readFixedString(S1, 3), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
610 ASSERT_THAT_ERROR(Reader.skip(1), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
611 ASSERT_THAT_ERROR(Reader.readFixedString(S2, 3), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
612 ASSERT_THAT_ERROR(Reader.skip(1), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
613 ASSERT_THAT_ERROR(Reader.readFixedString(S3, 5), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
614 ASSERT_THAT_ERROR(Reader.skip(1), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
615 ASSERT_THAT_ERROR(Reader.readFixedString(S4, 4), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
616 ASSERT_THAT_ERROR(Reader.skip(1), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
617 ASSERT_EQ(0U, Reader.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
618
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
619 EXPECT_EQ("One", S1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
620 EXPECT_EQ("Two", S2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
621 EXPECT_EQ("Three", S3);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
622 EXPECT_EQ("Four", S4);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
623 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
624 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
625
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
626 TEST_F(BinaryStreamTest, StreamWriterBounds) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
627 initializeOutput(5, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
628
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
629 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
630 BinaryStreamWriter Writer(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
631
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
632 // 1. Can write a string that exactly fills the buffer.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
633 EXPECT_EQ(5U, Writer.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
634 EXPECT_THAT_ERROR(Writer.writeFixedString("abcde"), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
635 EXPECT_EQ(0U, Writer.bytesRemaining());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
636
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
637 // 2. Can write an empty string even when you're full
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
638 EXPECT_THAT_ERROR(Writer.writeFixedString(""), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
639 EXPECT_THAT_ERROR(Writer.writeFixedString("a"), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
640
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
641 // 3. Can't write a string that is one character too long.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
642 Writer.setOffset(0);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
643 EXPECT_THAT_ERROR(Writer.writeFixedString("abcdef"), Failed());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
644 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
645 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
646
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
647 TEST_F(BinaryStreamTest, StreamWriterIntegerArrays) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
648 // 3. Arrays of integers
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
649 std::vector<int> SourceInts = {1, 2, 3, 4, 5};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
650 ArrayRef<uint8_t> SourceBytes(reinterpret_cast<uint8_t *>(&SourceInts[0]),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
651 SourceInts.size() * sizeof(int));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
652
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
653 initializeInput(SourceBytes, alignof(int));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
654 initializeOutputFromInput(alignof(int));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
655
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
656 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
657 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
658 BinaryStreamWriter Writer(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
659 ArrayRef<int> Ints;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
660 ArrayRef<int> Ints2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
661 // First read them, then write them, then read them back.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
662 ASSERT_THAT_ERROR(Reader.readArray(Ints, SourceInts.size()), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
663 ASSERT_THAT_ERROR(Writer.writeArray(Ints), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
664
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
665 BinaryStreamReader ReaderBacker(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
666 ASSERT_THAT_ERROR(ReaderBacker.readArray(Ints2, SourceInts.size()),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
667 Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
668
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
669 EXPECT_EQ(makeArrayRef(SourceInts), Ints2);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
670 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
671 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
672
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
673 TEST_F(BinaryStreamTest, StringWriterStrings) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
674 StringRef Strings[] = {"First", "Second", "Third", "Fourth"};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
675
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
676 size_t Length = 0;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
677 for (auto S : Strings)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
678 Length += S.size() + 1;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
679 initializeOutput(Length, 1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
680 initializeInputFromOutput(1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
681
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
682 for (auto &Stream : Streams) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
683 BinaryStreamWriter Writer(*Stream.Output);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
684 for (auto S : Strings)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
685 ASSERT_THAT_ERROR(Writer.writeCString(S), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
686 std::vector<StringRef> InStrings;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
687 BinaryStreamReader Reader(*Stream.Input);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
688 while (!Reader.empty()) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
689 StringRef S;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
690 ASSERT_THAT_ERROR(Reader.readCString(S), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
691 InStrings.push_back(S);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
692 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
693 EXPECT_EQ(makeArrayRef(Strings), makeArrayRef(InStrings));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
694 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
695 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
696 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
697
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
698 namespace {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
699 struct BinaryItemStreamObject {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
700 explicit BinaryItemStreamObject(ArrayRef<uint8_t> Bytes) : Bytes(Bytes) {}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
701
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
702 ArrayRef<uint8_t> Bytes;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
703 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
704 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
705
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
706 namespace llvm {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
707 template <> struct BinaryItemTraits<BinaryItemStreamObject> {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
708 static size_t length(const BinaryItemStreamObject &Item) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
709 return Item.Bytes.size();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
710 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
711
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
712 static ArrayRef<uint8_t> bytes(const BinaryItemStreamObject &Item) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
713 return Item.Bytes;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
714 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
715 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
716 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
717
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
718 namespace {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
719
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
720 TEST_F(BinaryStreamTest, BinaryItemStream) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
721 std::vector<BinaryItemStreamObject> Objects;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
722
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
723 struct Foo {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
724 int X;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
725 double Y;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
726 };
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
727 std::vector<Foo> Foos = {{1, 1.0}, {2, 2.0}, {3, 3.0}};
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
728 BumpPtrAllocator Allocator;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
729 for (const auto &F : Foos) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
730 uint8_t *Ptr = static_cast<uint8_t *>(Allocator.Allocate(sizeof(Foo),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
731 alignof(Foo)));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
732 MutableArrayRef<uint8_t> Buffer(Ptr, sizeof(Foo));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
733 MutableBinaryByteStream Stream(Buffer, llvm::support::big);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
734 BinaryStreamWriter Writer(Stream);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
735 ASSERT_THAT_ERROR(Writer.writeObject(F), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
736 Objects.push_back(BinaryItemStreamObject(Buffer));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
737 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
738
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
739 BinaryItemStream<BinaryItemStreamObject> ItemStream(big);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
740 ItemStream.setItems(Objects);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
741 BinaryStreamReader Reader(ItemStream);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
742
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
743 for (const auto &F : Foos) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
744 const Foo *F2;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
745 ASSERT_THAT_ERROR(Reader.readObject(F2), Succeeded());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
746
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
747 EXPECT_EQ(F.X, F2->X);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
748 EXPECT_DOUBLE_EQ(F.Y, F2->Y);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
749 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
750 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
751
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
752 } // end anonymous namespace