xref: /llvm-project/clang/unittests/Lex/HeaderMapTest.cpp (revision 8d6a31c023a3eaf0817cf83526f87bd53997ffc0)
1 //===- 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 
15 using namespace clang;
16 using namespace llvm;
17 
18 namespace {
19 
20 // Lay out a header file for testing.
21 template <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 
50 TEST(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 
58 TEST(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 
66 TEST(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 
74 TEST(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 
82 TEST(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 
94 TEST(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 
103 TEST(HeaderMapTest, checkHeaderNotEnoughBuckets) {
104   MapFile<1, 1> File;
105   File.init();
106   File.Header.NumBuckets = 8;
107   bool NeedsSwap;
108   ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
109 }
110 
111 } // end namespace
112