19ab99eecSDuncan P. N. Exon Smith //===- unittests/Lex/HeaderMapTest.cpp - HeaderMap tests ----------===// 29ab99eecSDuncan P. N. Exon Smith // 39ab99eecSDuncan P. N. Exon Smith // The LLVM Compiler Infrastructure 49ab99eecSDuncan P. N. Exon Smith // 59ab99eecSDuncan P. N. Exon Smith // This file is distributed under the University of Illinois Open Source 69ab99eecSDuncan P. N. Exon Smith // License. See LICENSE.TXT for details. 79ab99eecSDuncan P. N. Exon Smith // 89ab99eecSDuncan P. N. Exon Smith //===--------------------------------------------------------------===// 99ab99eecSDuncan P. N. Exon Smith 109ab99eecSDuncan P. N. Exon Smith #include "clang/Lex/HeaderMap.h" 119ab99eecSDuncan P. N. Exon Smith #include "clang/Lex/HeaderMapTypes.h" 129ab99eecSDuncan P. N. Exon Smith #include "llvm/Support/SwapByteOrder.h" 139ab99eecSDuncan P. N. Exon Smith #include "gtest/gtest.h" 149ab99eecSDuncan P. N. Exon Smith 159ab99eecSDuncan P. N. Exon Smith using namespace clang; 169ab99eecSDuncan P. N. Exon Smith using namespace llvm; 179ab99eecSDuncan P. N. Exon Smith 189ab99eecSDuncan P. N. Exon Smith namespace { 199ab99eecSDuncan P. N. Exon Smith 209ab99eecSDuncan P. N. Exon Smith // Lay out a header file for testing. 219ab99eecSDuncan P. N. Exon Smith template <unsigned NumBuckets, unsigned NumBytes> struct MapFile { 229ab99eecSDuncan P. N. Exon Smith HMapHeader Header; 239ab99eecSDuncan P. N. Exon Smith HMapBucket Buckets[NumBuckets]; 249ab99eecSDuncan P. N. Exon Smith unsigned char Bytes[NumBytes]; 259ab99eecSDuncan P. N. Exon Smith 269ab99eecSDuncan P. N. Exon Smith void init() { 279ab99eecSDuncan P. N. Exon Smith memset(this, 0, sizeof(MapFile)); 289ab99eecSDuncan P. N. Exon Smith Header.Magic = HMAP_HeaderMagicNumber; 299ab99eecSDuncan P. N. Exon Smith Header.Version = HMAP_HeaderVersion; 309ab99eecSDuncan P. N. Exon Smith Header.NumBuckets = NumBuckets; 319ab99eecSDuncan P. N. Exon Smith Header.StringsOffset = sizeof(Header) + sizeof(Buckets); 329ab99eecSDuncan P. N. Exon Smith } 339ab99eecSDuncan P. N. Exon Smith 349ab99eecSDuncan P. N. Exon Smith void swapBytes() { 359ab99eecSDuncan P. N. Exon Smith using llvm::sys::getSwappedBytes; 369ab99eecSDuncan P. N. Exon Smith Header.Magic = getSwappedBytes(Header.Magic); 379ab99eecSDuncan P. N. Exon Smith Header.Version = getSwappedBytes(Header.Version); 389ab99eecSDuncan P. N. Exon Smith Header.NumBuckets = getSwappedBytes(Header.NumBuckets); 399ab99eecSDuncan P. N. Exon Smith Header.StringsOffset = getSwappedBytes(Header.StringsOffset); 409ab99eecSDuncan P. N. Exon Smith } 419ab99eecSDuncan P. N. Exon Smith 429ab99eecSDuncan P. N. Exon Smith std::unique_ptr<const MemoryBuffer> getBuffer() const { 439ab99eecSDuncan P. N. Exon Smith return MemoryBuffer::getMemBuffer( 449ab99eecSDuncan P. N. Exon Smith StringRef(reinterpret_cast<const char *>(this), sizeof(MapFile)), 459ab99eecSDuncan P. N. Exon Smith "header", 469ab99eecSDuncan P. N. Exon Smith /* RequresNullTerminator */ false); 479ab99eecSDuncan P. N. Exon Smith } 489ab99eecSDuncan P. N. Exon Smith }; 499ab99eecSDuncan P. N. Exon Smith 509ab99eecSDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeaderEmpty) { 519ab99eecSDuncan P. N. Exon Smith bool NeedsSwap; 529ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader( 539ab99eecSDuncan P. N. Exon Smith *MemoryBuffer::getMemBufferCopy("", "empty"), NeedsSwap)); 549ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader( 559ab99eecSDuncan P. N. Exon Smith *MemoryBuffer::getMemBufferCopy("", "empty"), NeedsSwap)); 569ab99eecSDuncan P. N. Exon Smith } 579ab99eecSDuncan P. N. Exon Smith 589ab99eecSDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeaderMagic) { 599ab99eecSDuncan P. N. Exon Smith MapFile<1, 1> File; 609ab99eecSDuncan P. N. Exon Smith File.init(); 619ab99eecSDuncan P. N. Exon Smith File.Header.Magic = 0; 629ab99eecSDuncan P. N. Exon Smith bool NeedsSwap; 639ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 649ab99eecSDuncan P. N. Exon Smith } 659ab99eecSDuncan P. N. Exon Smith 669ab99eecSDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeaderReserved) { 679ab99eecSDuncan P. N. Exon Smith MapFile<1, 1> File; 689ab99eecSDuncan P. N. Exon Smith File.init(); 699ab99eecSDuncan P. N. Exon Smith File.Header.Reserved = 1; 709ab99eecSDuncan P. N. Exon Smith bool NeedsSwap; 719ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 729ab99eecSDuncan P. N. Exon Smith } 739ab99eecSDuncan P. N. Exon Smith 749ab99eecSDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeaderVersion) { 759ab99eecSDuncan P. N. Exon Smith MapFile<1, 1> File; 769ab99eecSDuncan P. N. Exon Smith File.init(); 779ab99eecSDuncan P. N. Exon Smith ++File.Header.Version; 789ab99eecSDuncan P. N. Exon Smith bool NeedsSwap; 799ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 809ab99eecSDuncan P. N. Exon Smith } 819ab99eecSDuncan P. N. Exon Smith 829ab99eecSDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeaderValidButEmpty) { 839ab99eecSDuncan P. N. Exon Smith MapFile<1, 1> File; 849ab99eecSDuncan P. N. Exon Smith File.init(); 859ab99eecSDuncan P. N. Exon Smith bool NeedsSwap; 869ab99eecSDuncan P. N. Exon Smith ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 879ab99eecSDuncan P. N. Exon Smith ASSERT_FALSE(NeedsSwap); 889ab99eecSDuncan P. N. Exon Smith 899ab99eecSDuncan P. N. Exon Smith File.swapBytes(); 909ab99eecSDuncan P. N. Exon Smith ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 919ab99eecSDuncan P. N. Exon Smith ASSERT_TRUE(NeedsSwap); 929ab99eecSDuncan P. N. Exon Smith } 939ab99eecSDuncan P. N. Exon Smith 94*dfe85305SDuncan P. N. Exon Smith TEST(HeaderMapTest, checkHeader3Buckets) { 95*dfe85305SDuncan P. N. Exon Smith MapFile<3, 1> File; 96*dfe85305SDuncan P. N. Exon Smith ASSERT_EQ(3 * sizeof(HMapBucket), sizeof(File.Buckets)); 97*dfe85305SDuncan P. N. Exon Smith 98*dfe85305SDuncan P. N. Exon Smith File.init(); 99*dfe85305SDuncan P. N. Exon Smith bool NeedsSwap; 100*dfe85305SDuncan P. N. Exon Smith ASSERT_FALSE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap)); 101*dfe85305SDuncan P. N. Exon Smith } 102*dfe85305SDuncan P. N. Exon Smith 1039ab99eecSDuncan P. N. Exon Smith } // end namespace 104