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