forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- ArchiveTest.cpp ----------------------------------------------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "llvm/Object/Archive.h"
 | 
						|
#include "llvm/Testing/Support/Error.h"
 | 
						|
#include "gtest/gtest.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
using namespace object;
 | 
						|
using namespace testing;
 | 
						|
 | 
						|
static const char ArchiveWithMember[] = "!<arch>\n"        // Global header
 | 
						|
                                        "test/           " // Member name
 | 
						|
                                        "0           "     // Timestamp
 | 
						|
                                        "0     "           // Owner ID
 | 
						|
                                        "0     "           // Group ID
 | 
						|
                                        "0       "         // File mode
 | 
						|
                                        "9999999999"       // Size
 | 
						|
                                        "`\n";
 | 
						|
 | 
						|
static const char ThinArchiveWithMember[] = "!<thin>\n"        // Global header
 | 
						|
                                            "test/           " // Member name
 | 
						|
                                            "0           "     // Timestamp
 | 
						|
                                            "0     "           // Owner ID
 | 
						|
                                            "0     "           // Group ID
 | 
						|
                                            "0       "         // File mode
 | 
						|
                                            "9999999999"       // Size
 | 
						|
                                            "`\n";
 | 
						|
 | 
						|
static const uint64_t MemberSize = 9999999999ull;
 | 
						|
 | 
						|
struct ArchiveTestsFixture : Test {
 | 
						|
  Expected<Archive::child_iterator> createChild(StringRef Src) {
 | 
						|
    MemoryBufferRef Source(Src, "archive");
 | 
						|
    Expected<std::unique_ptr<Archive>> AOrErr = Archive::create(Source);
 | 
						|
    if (!AOrErr)
 | 
						|
      return AOrErr.takeError();
 | 
						|
    A = std::move(*AOrErr);
 | 
						|
 | 
						|
    Error ChildErr = Error::success();
 | 
						|
    auto Child = A->child_begin(ChildErr);
 | 
						|
    if (ChildErr)
 | 
						|
      return std::move(ChildErr);
 | 
						|
    return Child;
 | 
						|
  }
 | 
						|
 | 
						|
  std::unique_ptr<Archive> A;
 | 
						|
};
 | 
						|
 | 
						|
TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeRegularArchive) {
 | 
						|
  // This test relies on a StringRef being able to hold the appropriate amount
 | 
						|
  // of data.
 | 
						|
  if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)
 | 
						|
    return;
 | 
						|
 | 
						|
  auto Child = createChild(ArchiveWithMember);
 | 
						|
  ASSERT_THAT_EXPECTED(Child, Succeeded());
 | 
						|
 | 
						|
  Expected<uint64_t> Size = (*Child)->getSize();
 | 
						|
  ASSERT_THAT_EXPECTED(Size, Succeeded());
 | 
						|
  EXPECT_EQ(MemberSize, *Size);
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeThinArchive) {
 | 
						|
  auto Child = createChild(ThinArchiveWithMember);
 | 
						|
  ASSERT_THAT_EXPECTED(Child, Succeeded());
 | 
						|
 | 
						|
  Expected<uint64_t> Size = (*Child)->getSize();
 | 
						|
  ASSERT_THAT_EXPECTED(Size, Succeeded());
 | 
						|
  EXPECT_EQ(MemberSize, *Size);
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(ArchiveTestsFixture, ArchiveChildGetBuffer) {
 | 
						|
  // This test relies on a StringRef being able to hold the appropriate amount
 | 
						|
  // of data.
 | 
						|
  if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)
 | 
						|
    return;
 | 
						|
 | 
						|
  auto Child = createChild(ArchiveWithMember);
 | 
						|
  ASSERT_THAT_EXPECTED(Child, Succeeded());
 | 
						|
 | 
						|
  Expected<StringRef> Buffer = (*Child)->getBuffer();
 | 
						|
  // Cannot use ASSERT_THAT_EXPECTED, as that will attempt to print the
 | 
						|
  // StringRef (which has an invalid size).
 | 
						|
  ASSERT_TRUE((bool)Buffer);
 | 
						|
  EXPECT_EQ(MemberSize, Buffer->size());
 | 
						|
  EXPECT_EQ(ArchiveWithMember + sizeof(ArchiveWithMember) - 1, Buffer->data());
 | 
						|
}
 |