blob: bf08ab20923b1245f08ef0ea9f602b2ce4b8fd23 [file] [log] [blame]
Zachary Turnerf04d6e82017-01-20 22:41:15 +00001//===- StringTableBuilderTest.cpp -----------------------------------------===//
Rui Ueyamadcd32932017-01-15 00:36:02 +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
Zachary Turnere204a6c2017-05-02 18:00:13 +000010#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
11#include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
Zachary Turnerd9dc2822017-03-02 20:52:51 +000012#include "llvm/Support/BinaryByteStream.h"
13#include "llvm/Support/BinaryStreamReader.h"
14#include "llvm/Support/BinaryStreamWriter.h"
Zachary Turnercb30e702017-06-14 16:41:50 +000015#include "llvm/Testing/Support/Error.h"
Rui Ueyamadcd32932017-01-15 00:36:02 +000016
17#include "gtest/gtest.h"
18
19using namespace llvm;
20using namespace llvm::pdb;
Zachary Turner695ed562017-02-28 00:04:07 +000021using namespace llvm::support;
Rui Ueyamadcd32932017-01-15 00:36:02 +000022
23namespace {
Zachary Turnerf04d6e82017-01-20 22:41:15 +000024class StringTableBuilderTest : public ::testing::Test {};
Rui Ueyamadcd32932017-01-15 00:36:02 +000025}
26
Zachary Turnerf04d6e82017-01-20 22:41:15 +000027TEST_F(StringTableBuilderTest, Simple) {
Rui Ueyamadcd32932017-01-15 00:36:02 +000028 // Create /names table contents.
Zachary Turnere204a6c2017-05-02 18:00:13 +000029 PDBStringTableBuilder Builder;
Zachary Turnereb629992018-03-21 22:23:59 +000030
31 // This test case is carefully constructed to ensure that at least one
32 // string gets bucketed into slot 0, *and* to ensure that at least one
33 // has a hash collision at the end of the bucket list so it has to
34 // wrap around.
35 uint32_t FooID = Builder.insert("foo");
36 uint32_t BarID = Builder.insert("bar");
37 uint32_t BazID = Builder.insert("baz");
38 uint32_t BuzzID = Builder.insert("buzz");
39 uint32_t BazzID = Builder.insert("bazz");
40 uint32_t BarrID = Builder.insert("barr");
41
42 // Re-inserting the same item should return the same id.
43 EXPECT_EQ(FooID, Builder.insert("foo"));
44 EXPECT_EQ(BarID, Builder.insert("bar"));
45 EXPECT_EQ(BazID, Builder.insert("baz"));
46 EXPECT_EQ(BuzzID, Builder.insert("buzz"));
47 EXPECT_EQ(BazzID, Builder.insert("bazz"));
48 EXPECT_EQ(BarrID, Builder.insert("barr"));
49
50 // Each ID should be distinct.
51 std::set<uint32_t> Distinct{FooID, BarID, BazID, BuzzID, BazzID, BarrID};
52 EXPECT_EQ(6U, Distinct.size());
Rui Ueyamadcd32932017-01-15 00:36:02 +000053
Zachary Turnerc504ae32017-05-03 15:58:37 +000054 std::vector<uint8_t> Buffer(Builder.calculateSerializedSize());
Zachary Turner695ed562017-02-28 00:04:07 +000055 MutableBinaryByteStream OutStream(Buffer, little);
Zachary Turner120faca2017-02-27 22:11:43 +000056 BinaryStreamWriter Writer(OutStream);
Zachary Turnercb30e702017-06-14 16:41:50 +000057 EXPECT_THAT_ERROR(Builder.commit(Writer), Succeeded());
Rui Ueyamadcd32932017-01-15 00:36:02 +000058
59 // Reads the contents back.
Zachary Turner695ed562017-02-28 00:04:07 +000060 BinaryByteStream InStream(Buffer, little);
Zachary Turner120faca2017-02-27 22:11:43 +000061 BinaryStreamReader Reader(InStream);
Zachary Turnere204a6c2017-05-02 18:00:13 +000062 PDBStringTable Table;
Zachary Turnercb30e702017-06-14 16:41:50 +000063 EXPECT_THAT_ERROR(Table.reload(Reader), Succeeded());
Rui Ueyamadcd32932017-01-15 00:36:02 +000064
Zachary Turnereb629992018-03-21 22:23:59 +000065 EXPECT_EQ(6U, Table.getNameCount());
Rui Ueyamadcd32932017-01-15 00:36:02 +000066 EXPECT_EQ(1U, Table.getHashVersion());
Zachary Turner2d5c2cd2017-05-03 17:11:11 +000067
Zachary Turnereb629992018-03-21 22:23:59 +000068 EXPECT_THAT_EXPECTED(Table.getStringForID(FooID), HasValue("foo"));
69 EXPECT_THAT_EXPECTED(Table.getStringForID(BarID), HasValue("bar"));
70 EXPECT_THAT_EXPECTED(Table.getStringForID(BazID), HasValue("baz"));
71 EXPECT_THAT_EXPECTED(Table.getStringForID(BuzzID), HasValue("buzz"));
72 EXPECT_THAT_EXPECTED(Table.getStringForID(BazzID), HasValue("bazz"));
73 EXPECT_THAT_EXPECTED(Table.getStringForID(BarrID), HasValue("barr"));
74
75 EXPECT_THAT_EXPECTED(Table.getIDForString("foo"), HasValue(FooID));
76 EXPECT_THAT_EXPECTED(Table.getIDForString("bar"), HasValue(BarID));
77 EXPECT_THAT_EXPECTED(Table.getIDForString("baz"), HasValue(BazID));
78 EXPECT_THAT_EXPECTED(Table.getIDForString("buzz"), HasValue(BuzzID));
79 EXPECT_THAT_EXPECTED(Table.getIDForString("bazz"), HasValue(BazzID));
80 EXPECT_THAT_EXPECTED(Table.getIDForString("barr"), HasValue(BarrID));
Rui Ueyamadcd32932017-01-15 00:36:02 +000081}