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