blob: 5f2f0c271e976996bd469529ca8fd19d67f05936 [file] [log] [blame]
Zachary Turnera3225b02016-07-29 20:56:36 +00001//===- MSFBuilderTest.cpp Tests manipulation of MSF stream metadata ------===//
Zachary Turnerf52a8992016-07-15 20:43:38 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ErrorChecking.h"
11
Zachary Turnera3225b02016-07-29 20:56:36 +000012#include "llvm/DebugInfo/MSF/MSFBuilder.h"
13#include "llvm/DebugInfo/MSF/MSFCommon.h"
Zachary Turnerf52a8992016-07-15 20:43:38 +000014
15#include "gtest/gtest.h"
16
17using namespace llvm;
Zachary Turnerbac69d32016-07-22 19:56:05 +000018using namespace llvm::msf;
Zachary Turnerf52a8992016-07-15 20:43:38 +000019
20namespace {
Zachary Turnera3225b02016-07-29 20:56:36 +000021class MSFBuilderTest : public testing::Test {
Zachary Turnerf52a8992016-07-15 20:43:38 +000022protected:
23 void initializeSimpleSuperBlock(msf::SuperBlock &SB) {
24 initializeSuperBlock(SB);
25 SB.NumBlocks = 1000;
26 SB.NumDirectoryBytes = 8192;
27 }
28
29 void initializeSuperBlock(msf::SuperBlock &SB) {
30 ::memset(&SB, 0, sizeof(SB));
31
32 ::memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic));
David Majnemer9bca03b2016-12-18 00:41:10 +000033 SB.FreeBlockMapBlock = 1;
Zachary Turnerf52a8992016-07-15 20:43:38 +000034 SB.BlockMapAddr = 1;
35 SB.BlockSize = 4096;
36 SB.NumDirectoryBytes = 0;
37 SB.NumBlocks = 2; // one for the Super Block, one for the directory
38 }
39
40 BumpPtrAllocator Allocator;
41};
42}
43
Zachary Turnera3225b02016-07-29 20:56:36 +000044TEST_F(MSFBuilderTest, ValidateSuperBlockAccept) {
Zachary Turnerf52a8992016-07-15 20:43:38 +000045 // Test that a known good super block passes validation.
46 SuperBlock SB;
47 initializeSuperBlock(SB);
48
49 EXPECT_NO_ERROR(msf::validateSuperBlock(SB));
50}
51
Zachary Turnera3225b02016-07-29 20:56:36 +000052TEST_F(MSFBuilderTest, ValidateSuperBlockReject) {
Zachary Turnerf52a8992016-07-15 20:43:38 +000053 // Test that various known problems cause a super block to be rejected.
54 SuperBlock SB;
55 initializeSimpleSuperBlock(SB);
56
57 // Mismatched magic
58 SB.MagicBytes[0] = 8;
59 EXPECT_ERROR(msf::validateSuperBlock(SB));
60 initializeSimpleSuperBlock(SB);
61
62 // Block 0 is reserved for super block, can't be occupied by the block map
63 SB.BlockMapAddr = 0;
64 EXPECT_ERROR(msf::validateSuperBlock(SB));
65 initializeSimpleSuperBlock(SB);
66
67 // Block sizes have to be powers of 2.
68 SB.BlockSize = 3120;
69 EXPECT_ERROR(msf::validateSuperBlock(SB));
70 initializeSimpleSuperBlock(SB);
71
72 // The directory itself has a maximum size.
73 SB.NumDirectoryBytes = SB.BlockSize * SB.BlockSize / 4;
74 EXPECT_NO_ERROR(msf::validateSuperBlock(SB));
75 SB.NumDirectoryBytes = SB.NumDirectoryBytes + 4;
76 EXPECT_ERROR(msf::validateSuperBlock(SB));
77}
78
Zachary Turnera3225b02016-07-29 20:56:36 +000079TEST_F(MSFBuilderTest, TestUsedBlocksMarkedAsUsed) {
Zachary Turnerf52a8992016-07-15 20:43:38 +000080 // Test that when assigning a stream to a known list of blocks, the blocks
81 // are correctly marked as used after adding, but no other incorrect blocks
82 // are accidentally marked as used.
83
Zachary Turnerb927e022016-07-15 22:17:19 +000084 std::vector<uint32_t> Blocks = {4, 5, 6, 7, 8, 9, 10, 11, 12};
Zachary Turnerf52a8992016-07-15 20:43:38 +000085 // Allocate some extra blocks at the end so we can verify that they're free
86 // after the initialization.
Zachary Turnerb927e022016-07-15 22:17:19 +000087 uint32_t NumBlocks = msf::getMinimumBlockCount() + Blocks.size() + 10;
Zachary Turnera3225b02016-07-29 20:56:36 +000088 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096, NumBlocks);
Zachary Turnerf52a8992016-07-15 20:43:38 +000089 EXPECT_EXPECTED(ExpectedMsf);
90 auto &Msf = *ExpectedMsf;
91
Zachary Turner9f664052016-09-14 23:17:08 +000092 EXPECT_EXPECTED(Msf.addStream(Blocks.size() * 4096, Blocks));
Zachary Turnerf52a8992016-07-15 20:43:38 +000093
94 for (auto B : Blocks) {
95 EXPECT_FALSE(Msf.isBlockFree(B));
96 }
Zachary Turnerb927e022016-07-15 22:17:19 +000097
98 uint32_t FreeBlockStart = Blocks.back() + 1;
99 for (uint32_t I = FreeBlockStart; I < NumBlocks; ++I) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000100 EXPECT_TRUE(Msf.isBlockFree(I));
101 }
102}
103
Zachary Turnera3225b02016-07-29 20:56:36 +0000104TEST_F(MSFBuilderTest, TestAddStreamNoDirectoryBlockIncrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000105 // Test that adding a new stream correctly updates the directory. This only
106 // tests the case where the directory *DOES NOT* grow large enough that it
107 // crosses a Block boundary.
Zachary Turnera3225b02016-07-29 20:56:36 +0000108 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000109 EXPECT_EXPECTED(ExpectedMsf);
110 auto &Msf = *ExpectedMsf;
111
112 auto ExpectedL1 = Msf.build();
113 EXPECT_EXPECTED(ExpectedL1);
Zachary Turnera3225b02016-07-29 20:56:36 +0000114 MSFLayout &L1 = *ExpectedL1;
Zachary Turnerf52a8992016-07-15 20:43:38 +0000115
116 auto OldDirBlocks = L1.DirectoryBlocks;
117 EXPECT_EQ(1U, OldDirBlocks.size());
118
Zachary Turnera3225b02016-07-29 20:56:36 +0000119 auto ExpectedMsf2 = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000120 EXPECT_EXPECTED(ExpectedMsf2);
121 auto &Msf2 = *ExpectedMsf2;
122
Zachary Turner9f664052016-09-14 23:17:08 +0000123 EXPECT_EXPECTED(Msf2.addStream(4000));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000124 EXPECT_EQ(1U, Msf2.getNumStreams());
125 EXPECT_EQ(4000U, Msf2.getStreamSize(0));
126 auto Blocks = Msf2.getStreamBlocks(0);
127 EXPECT_EQ(1U, Blocks.size());
128
129 auto ExpectedL2 = Msf2.build();
130 EXPECT_EXPECTED(ExpectedL2);
Zachary Turnera3225b02016-07-29 20:56:36 +0000131 MSFLayout &L2 = *ExpectedL2;
Zachary Turnerf52a8992016-07-15 20:43:38 +0000132 auto NewDirBlocks = L2.DirectoryBlocks;
133 EXPECT_EQ(1U, NewDirBlocks.size());
134}
135
Zachary Turnera3225b02016-07-29 20:56:36 +0000136TEST_F(MSFBuilderTest, TestAddStreamWithDirectoryBlockIncrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000137 // Test that adding a new stream correctly updates the directory. This only
138 // tests the case where the directory *DOES* grow large enough that it
139 // crosses a Block boundary. This is because the newly added stream occupies
140 // so many Blocks that need to be indexed in the directory that the directory
141 // crosses a Block boundary.
Zachary Turnera3225b02016-07-29 20:56:36 +0000142 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000143 EXPECT_EXPECTED(ExpectedMsf);
144 auto &Msf = *ExpectedMsf;
145
Zachary Turner9f664052016-09-14 23:17:08 +0000146 EXPECT_EXPECTED(Msf.addStream(4096 * 4096 / sizeof(uint32_t)));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000147
148 auto ExpectedL1 = Msf.build();
149 EXPECT_EXPECTED(ExpectedL1);
Zachary Turnera3225b02016-07-29 20:56:36 +0000150 MSFLayout &L1 = *ExpectedL1;
Zachary Turnerf52a8992016-07-15 20:43:38 +0000151 auto DirBlocks = L1.DirectoryBlocks;
152 EXPECT_EQ(2U, DirBlocks.size());
153}
154
Zachary Turnera3225b02016-07-29 20:56:36 +0000155TEST_F(MSFBuilderTest, TestGrowStreamNoBlockIncrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000156 // Test growing an existing stream by a value that does not affect the number
157 // of blocks it occupies.
Zachary Turnera3225b02016-07-29 20:56:36 +0000158 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000159 EXPECT_EXPECTED(ExpectedMsf);
160 auto &Msf = *ExpectedMsf;
161
Zachary Turner9f664052016-09-14 23:17:08 +0000162 EXPECT_EXPECTED(Msf.addStream(1024));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000163 EXPECT_EQ(1024U, Msf.getStreamSize(0));
164 auto OldStreamBlocks = Msf.getStreamBlocks(0);
165 EXPECT_EQ(1U, OldStreamBlocks.size());
166
167 EXPECT_NO_ERROR(Msf.setStreamSize(0, 2048));
168 EXPECT_EQ(2048U, Msf.getStreamSize(0));
169 auto NewStreamBlocks = Msf.getStreamBlocks(0);
170 EXPECT_EQ(1U, NewStreamBlocks.size());
171
172 EXPECT_EQ(OldStreamBlocks, NewStreamBlocks);
173}
174
Zachary Turnera3225b02016-07-29 20:56:36 +0000175TEST_F(MSFBuilderTest, TestGrowStreamWithBlockIncrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000176 // Test that growing an existing stream to a value large enough that it causes
177 // the need to allocate new Blocks to the stream correctly updates the
178 // stream's
179 // block list.
Zachary Turnera3225b02016-07-29 20:56:36 +0000180 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000181 EXPECT_EXPECTED(ExpectedMsf);
182 auto &Msf = *ExpectedMsf;
183
Zachary Turner9f664052016-09-14 23:17:08 +0000184 EXPECT_EXPECTED(Msf.addStream(2048));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000185 EXPECT_EQ(2048U, Msf.getStreamSize(0));
186 std::vector<uint32_t> OldStreamBlocks = Msf.getStreamBlocks(0);
187 EXPECT_EQ(1U, OldStreamBlocks.size());
188
189 EXPECT_NO_ERROR(Msf.setStreamSize(0, 6144));
190 EXPECT_EQ(6144U, Msf.getStreamSize(0));
191 std::vector<uint32_t> NewStreamBlocks = Msf.getStreamBlocks(0);
192 EXPECT_EQ(2U, NewStreamBlocks.size());
193
194 EXPECT_EQ(OldStreamBlocks[0], NewStreamBlocks[0]);
195 EXPECT_NE(NewStreamBlocks[0], NewStreamBlocks[1]);
196}
197
Zachary Turnera3225b02016-07-29 20:56:36 +0000198TEST_F(MSFBuilderTest, TestShrinkStreamNoBlockDecrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000199 // Test that shrinking an existing stream by a value that does not affect the
200 // number of Blocks it occupies makes no changes to stream's block list.
Zachary Turnera3225b02016-07-29 20:56:36 +0000201 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000202 EXPECT_EXPECTED(ExpectedMsf);
203 auto &Msf = *ExpectedMsf;
204
Zachary Turner9f664052016-09-14 23:17:08 +0000205 EXPECT_EXPECTED(Msf.addStream(2048));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000206 EXPECT_EQ(2048U, Msf.getStreamSize(0));
207 std::vector<uint32_t> OldStreamBlocks = Msf.getStreamBlocks(0);
208 EXPECT_EQ(1U, OldStreamBlocks.size());
209
210 EXPECT_NO_ERROR(Msf.setStreamSize(0, 1024));
211 EXPECT_EQ(1024U, Msf.getStreamSize(0));
212 std::vector<uint32_t> NewStreamBlocks = Msf.getStreamBlocks(0);
213 EXPECT_EQ(1U, NewStreamBlocks.size());
214
215 EXPECT_EQ(OldStreamBlocks, NewStreamBlocks);
216}
217
Zachary Turnera3225b02016-07-29 20:56:36 +0000218TEST_F(MSFBuilderTest, TestShrinkStreamWithBlockDecrease) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000219 // Test that shrinking an existing stream to a value large enough that it
220 // causes the need to deallocate new Blocks to the stream correctly updates
221 // the stream's block list.
Zachary Turnera3225b02016-07-29 20:56:36 +0000222 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000223 EXPECT_EXPECTED(ExpectedMsf);
224 auto &Msf = *ExpectedMsf;
225
Zachary Turner9f664052016-09-14 23:17:08 +0000226 EXPECT_EXPECTED(Msf.addStream(6144));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000227 EXPECT_EQ(6144U, Msf.getStreamSize(0));
228 std::vector<uint32_t> OldStreamBlocks = Msf.getStreamBlocks(0);
229 EXPECT_EQ(2U, OldStreamBlocks.size());
230
231 EXPECT_NO_ERROR(Msf.setStreamSize(0, 2048));
232 EXPECT_EQ(2048U, Msf.getStreamSize(0));
233 std::vector<uint32_t> NewStreamBlocks = Msf.getStreamBlocks(0);
234 EXPECT_EQ(1U, NewStreamBlocks.size());
235
236 EXPECT_EQ(OldStreamBlocks[0], NewStreamBlocks[0]);
237}
238
Zachary Turnera3225b02016-07-29 20:56:36 +0000239TEST_F(MSFBuilderTest, TestRejectReusedStreamBlock) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000240 // Test that attempting to add a stream and assigning a block that is already
241 // in use by another stream fails.
Zachary Turnera3225b02016-07-29 20:56:36 +0000242 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000243 EXPECT_EXPECTED(ExpectedMsf);
244 auto &Msf = *ExpectedMsf;
245
Zachary Turner9f664052016-09-14 23:17:08 +0000246 EXPECT_EXPECTED(Msf.addStream(6144));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000247
248 std::vector<uint32_t> Blocks = {2, 3};
Zachary Turner9f664052016-09-14 23:17:08 +0000249 EXPECT_UNEXPECTED(Msf.addStream(6144, Blocks));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000250}
251
Zachary Turnera3225b02016-07-29 20:56:36 +0000252TEST_F(MSFBuilderTest, TestBlockCountsWhenAddingStreams) {
Zachary Turnerf52a8992016-07-15 20:43:38 +0000253 // Test that when adding multiple streams, the number of used and free Blocks
254 // allocated to the MSF file are as expected.
Zachary Turnera3225b02016-07-29 20:56:36 +0000255 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000256 EXPECT_EXPECTED(ExpectedMsf);
257 auto &Msf = *ExpectedMsf;
258
259 // one for the super block, one for the directory block map
260 uint32_t NumUsedBlocks = Msf.getNumUsedBlocks();
Zachary Turnerb927e022016-07-15 22:17:19 +0000261 EXPECT_EQ(msf::getMinimumBlockCount(), NumUsedBlocks);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000262 EXPECT_EQ(0U, Msf.getNumFreeBlocks());
263
264 const uint32_t StreamSizes[] = {4000, 6193, 189723};
265 for (int I = 0; I < 3; ++I) {
Zachary Turner9f664052016-09-14 23:17:08 +0000266 EXPECT_EXPECTED(Msf.addStream(StreamSizes[I]));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000267 NumUsedBlocks += bytesToBlocks(StreamSizes[I], 4096);
268 EXPECT_EQ(NumUsedBlocks, Msf.getNumUsedBlocks());
269 EXPECT_EQ(0U, Msf.getNumFreeBlocks());
270 }
271}
272
Zachary Turnera3225b02016-07-29 20:56:36 +0000273TEST_F(MSFBuilderTest, BuildMsfLayout) {
274 // Test that we can generate an MSFLayout structure from a valid layout
Zachary Turnerf52a8992016-07-15 20:43:38 +0000275 // specification.
Zachary Turnera3225b02016-07-29 20:56:36 +0000276 auto ExpectedMsf = MSFBuilder::create(Allocator, 4096);
Zachary Turnerf52a8992016-07-15 20:43:38 +0000277 EXPECT_EXPECTED(ExpectedMsf);
278 auto &Msf = *ExpectedMsf;
279
280 const uint32_t StreamSizes[] = {4000, 6193, 189723};
Zachary Turnerb927e022016-07-15 22:17:19 +0000281 uint32_t ExpectedNumBlocks = msf::getMinimumBlockCount();
Zachary Turnerf52a8992016-07-15 20:43:38 +0000282 for (int I = 0; I < 3; ++I) {
Zachary Turner9f664052016-09-14 23:17:08 +0000283 EXPECT_EXPECTED(Msf.addStream(StreamSizes[I]));
Zachary Turnerf52a8992016-07-15 20:43:38 +0000284 ExpectedNumBlocks += bytesToBlocks(StreamSizes[I], 4096);
285 }
286 ++ExpectedNumBlocks; // The directory itself should use 1 block
287
288 auto ExpectedLayout = Msf.build();
289 EXPECT_EXPECTED(ExpectedLayout);
Zachary Turnera3225b02016-07-29 20:56:36 +0000290 MSFLayout &L = *ExpectedLayout;
Zachary Turnerf52a8992016-07-15 20:43:38 +0000291 EXPECT_EQ(4096U, L.SB->BlockSize);
292 EXPECT_EQ(ExpectedNumBlocks, L.SB->NumBlocks);
293
294 EXPECT_EQ(1U, L.DirectoryBlocks.size());
295
296 EXPECT_EQ(3U, L.StreamMap.size());
297 EXPECT_EQ(3U, L.StreamSizes.size());
298 for (int I = 0; I < 3; ++I) {
299 EXPECT_EQ(StreamSizes[I], L.StreamSizes[I]);
300 uint32_t ExpectedNumBlocks = bytesToBlocks(StreamSizes[I], 4096);
301 EXPECT_EQ(ExpectedNumBlocks, L.StreamMap[I].size());
302 }
303}
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000304
Zachary Turnera3225b02016-07-29 20:56:36 +0000305TEST_F(MSFBuilderTest, UseDirectoryBlockHint) {
306 Expected<MSFBuilder> ExpectedMsf = MSFBuilder::create(
Zachary Turnerb927e022016-07-15 22:17:19 +0000307 Allocator, 4096, msf::getMinimumBlockCount() + 1, false);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000308 EXPECT_EXPECTED(ExpectedMsf);
309 auto &Msf = *ExpectedMsf;
310
Zachary Turnerb927e022016-07-15 22:17:19 +0000311 uint32_t B = msf::getFirstUnreservedBlock();
312 EXPECT_NO_ERROR(Msf.setDirectoryBlocksHint({B + 1}));
Zachary Turner9f664052016-09-14 23:17:08 +0000313 EXPECT_EXPECTED(Msf.addStream(2048, {B + 2}));
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000314
315 auto ExpectedLayout = Msf.build();
316 EXPECT_EXPECTED(ExpectedLayout);
Zachary Turnera3225b02016-07-29 20:56:36 +0000317 MSFLayout &L = *ExpectedLayout;
Zachary Turnerb927e022016-07-15 22:17:19 +0000318 EXPECT_EQ(msf::getMinimumBlockCount() + 2, L.SB->NumBlocks);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000319 EXPECT_EQ(1U, L.DirectoryBlocks.size());
320 EXPECT_EQ(1U, L.StreamMap[0].size());
321
Zachary Turnerb927e022016-07-15 22:17:19 +0000322 EXPECT_EQ(B + 1, L.DirectoryBlocks[0]);
323 EXPECT_EQ(B + 2, L.StreamMap[0].front());
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000324}
325
Zachary Turnera3225b02016-07-29 20:56:36 +0000326TEST_F(MSFBuilderTest, DirectoryBlockHintInsufficient) {
327 Expected<MSFBuilder> ExpectedMsf =
328 MSFBuilder::create(Allocator, 4096, msf::getMinimumBlockCount() + 2);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000329 EXPECT_EXPECTED(ExpectedMsf);
330 auto &Msf = *ExpectedMsf;
Zachary Turnerb927e022016-07-15 22:17:19 +0000331 uint32_t B = msf::getFirstUnreservedBlock();
332 EXPECT_NO_ERROR(Msf.setDirectoryBlocksHint({B + 1}));
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000333
334 uint32_t Size = 4096 * 4096 / 4;
Zachary Turner9f664052016-09-14 23:17:08 +0000335 EXPECT_EXPECTED(Msf.addStream(Size));
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000336
337 auto ExpectedLayout = Msf.build();
338 EXPECT_EXPECTED(ExpectedLayout);
Zachary Turnera3225b02016-07-29 20:56:36 +0000339 MSFLayout &L = *ExpectedLayout;
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000340 EXPECT_EQ(2U, L.DirectoryBlocks.size());
Zachary Turnerb927e022016-07-15 22:17:19 +0000341 EXPECT_EQ(B + 1, L.DirectoryBlocks[0]);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000342}
343
Zachary Turnera3225b02016-07-29 20:56:36 +0000344TEST_F(MSFBuilderTest, DirectoryBlockHintOverestimated) {
345 Expected<MSFBuilder> ExpectedMsf =
346 MSFBuilder::create(Allocator, 4096, msf::getMinimumBlockCount() + 2);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000347 EXPECT_EXPECTED(ExpectedMsf);
348 auto &Msf = *ExpectedMsf;
349
Zachary Turnerb927e022016-07-15 22:17:19 +0000350 uint32_t B = msf::getFirstUnreservedBlock();
351 EXPECT_NO_ERROR(Msf.setDirectoryBlocksHint({B + 1, B + 2}));
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000352
Zachary Turner9f664052016-09-14 23:17:08 +0000353 EXPECT_EXPECTED(Msf.addStream(2048));
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000354
355 auto ExpectedLayout = Msf.build();
356 EXPECT_EXPECTED(ExpectedLayout);
Zachary Turnera3225b02016-07-29 20:56:36 +0000357 MSFLayout &L = *ExpectedLayout;
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000358 EXPECT_EQ(1U, L.DirectoryBlocks.size());
Zachary Turnerb927e022016-07-15 22:17:19 +0000359 EXPECT_EQ(B + 1, L.DirectoryBlocks[0]);
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000360}