blob: b8e1d6c46a05a89bc42818b48c550fa64d12e85f [file] [log] [blame]
Duncan P. N. Exon Smith9ab99ee2016-02-20 20:39:51 +00001//===- unittests/Lex/HeaderMapTest.cpp - HeaderMap tests ----------===//
2//
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 "clang/Lex/HeaderMap.h"
11#include "clang/Lex/HeaderMapTypes.h"
12#include "llvm/Support/SwapByteOrder.h"
13#include "gtest/gtest.h"
14
15using namespace clang;
16using namespace llvm;
17
18namespace {
19
20// Lay out a header file for testing.
21template <unsigned NumBuckets, unsigned NumBytes> struct MapFile {
22 HMapHeader Header;
23 HMapBucket Buckets[NumBuckets];
24 unsigned char Bytes[NumBytes];
25
26 void init() {
27 memset(this, 0, sizeof(MapFile));
28 Header.Magic = HMAP_HeaderMagicNumber;
29 Header.Version = HMAP_HeaderVersion;
30 Header.NumBuckets = NumBuckets;
31 Header.StringsOffset = sizeof(Header) + sizeof(Buckets);
32 }
33
34 void swapBytes() {
35 using llvm::sys::getSwappedBytes;
36 Header.Magic = getSwappedBytes(Header.Magic);
37 Header.Version = getSwappedBytes(Header.Version);
38 Header.NumBuckets = getSwappedBytes(Header.NumBuckets);
39 Header.StringsOffset = getSwappedBytes(Header.StringsOffset);
40 }
41
42 std::unique_ptr<const MemoryBuffer> getBuffer() const {
43 return MemoryBuffer::getMemBuffer(
44 StringRef(reinterpret_cast<const char *>(this), sizeof(MapFile)),
45 "header",
46 /* RequresNullTerminator */ false);
47 }
48};
49
50TEST(HeaderMapTest, checkHeaderEmpty) {
51 bool NeedsSwap;
52 ASSERT_FALSE(HeaderMapImpl::checkHeader(
53 *MemoryBuffer::getMemBufferCopy("", "empty"), NeedsSwap));
54 ASSERT_FALSE(HeaderMapImpl::checkHeader(
55 *MemoryBuffer::getMemBufferCopy("", "empty"), NeedsSwap));
56}
57
58TEST(HeaderMapTest, checkHeaderMagic) {
59 MapFile<1, 1> File;
60 File.init();
61 File.Header.Magic = 0;
62 bool NeedsSwap;
63 ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
64}
65
66TEST(HeaderMapTest, checkHeaderReserved) {
67 MapFile<1, 1> File;
68 File.init();
69 File.Header.Reserved = 1;
70 bool NeedsSwap;
71 ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
72}
73
74TEST(HeaderMapTest, checkHeaderVersion) {
75 MapFile<1, 1> File;
76 File.init();
77 ++File.Header.Version;
78 bool NeedsSwap;
79 ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
80}
81
82TEST(HeaderMapTest, checkHeaderValidButEmpty) {
83 MapFile<1, 1> File;
84 File.init();
85 bool NeedsSwap;
86 ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
87 ASSERT_FALSE(NeedsSwap);
88
89 File.swapBytes();
90 ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
91 ASSERT_TRUE(NeedsSwap);
92}
93
Duncan P. N. Exon Smithdfe85302016-02-20 21:00:58 +000094TEST(HeaderMapTest, checkHeader3Buckets) {
95 MapFile<3, 1> File;
96 ASSERT_EQ(3 * sizeof(HMapBucket), sizeof(File.Buckets));
97
98 File.init();
99 bool NeedsSwap;
100 ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
101}
102
Duncan P. N. Exon Smith9ab99ee2016-02-20 20:39:51 +0000103} // end namespace