94 lines · cpp
1//===- ArchiveTest.cpp ----------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Object/Archive.h"10#include "llvm/Testing/Support/Error.h"11#include "gtest/gtest.h"12 13using namespace llvm;14using namespace object;15using namespace testing;16 17static const char ArchiveWithMember[] = "!<arch>\n" // Global header18 "test/ " // Member name19 "0 " // Timestamp20 "0 " // Owner ID21 "0 " // Group ID22 "0 " // File mode23 "9999999999" // Size24 "`\n";25 26static const char ThinArchiveWithMember[] = "!<thin>\n" // Global header27 "test/ " // Member name28 "0 " // Timestamp29 "0 " // Owner ID30 "0 " // Group ID31 "0 " // File mode32 "9999999999" // Size33 "`\n";34 35static const uint64_t MemberSize = 9999999999ull;36 37struct ArchiveTestsFixture : Test {38 Expected<Archive::child_iterator> createChild(StringRef Src) {39 MemoryBufferRef Source(Src, "archive");40 Expected<std::unique_ptr<Archive>> AOrErr = Archive::create(Source);41 if (!AOrErr)42 return AOrErr.takeError();43 A = std::move(*AOrErr);44 45 Error ChildErr = Error::success();46 auto Child = A->child_begin(ChildErr);47 if (ChildErr)48 return std::move(ChildErr);49 return Child;50 }51 52 std::unique_ptr<Archive> A;53};54 55TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeRegularArchive) {56 // This test relies on a StringRef being able to hold the appropriate amount57 // of data.58 if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)59 GTEST_SKIP();60 61 auto Child = createChild(ArchiveWithMember);62 ASSERT_THAT_EXPECTED(Child, Succeeded());63 64 Expected<uint64_t> Size = (*Child)->getSize();65 ASSERT_THAT_EXPECTED(Size, Succeeded());66 EXPECT_EQ(MemberSize, *Size);67}68 69TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeThinArchive) {70 auto Child = createChild(ThinArchiveWithMember);71 ASSERT_THAT_EXPECTED(Child, Succeeded());72 73 Expected<uint64_t> Size = (*Child)->getSize();74 ASSERT_THAT_EXPECTED(Size, Succeeded());75 EXPECT_EQ(MemberSize, *Size);76}77 78TEST_F(ArchiveTestsFixture, ArchiveChildGetBuffer) {79 // This test relies on a StringRef being able to hold the appropriate amount80 // of data.81 if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)82 GTEST_SKIP();83 84 auto Child = createChild(ArchiveWithMember);85 ASSERT_THAT_EXPECTED(Child, Succeeded());86 87 Expected<StringRef> Buffer = (*Child)->getBuffer();88 // Cannot use ASSERT_THAT_EXPECTED, as that will attempt to print the89 // StringRef (which has an invalid size).90 ASSERT_TRUE((bool)Buffer);91 EXPECT_EQ(MemberSize, Buffer->size());92 EXPECT_EQ(ArchiveWithMember + sizeof(ArchiveWithMember) - 1, Buffer->data());93}94