//===- 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[] = "!\n" // Global header "test/ " // Member name "0 " // Timestamp "0 " // Owner ID "0 " // Group ID "0 " // File mode "9999999999" // Size "`\n"; static const char ThinArchiveWithMember[] = "!\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 createChild(StringRef Src) { MemoryBufferRef Source(Src, "archive"); Expected> 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 A; }; TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeRegularArchive) { // This test relies on a StringRef being able to hold the appropriate amount // of data. if (std::numeric_limits::max() < MemberSize) return; auto Child = createChild(ArchiveWithMember); ASSERT_THAT_EXPECTED(Child, Succeeded()); Expected 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 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::max() < MemberSize) return; auto Child = createChild(ArchiveWithMember); ASSERT_THAT_EXPECTED(Child, Succeeded()); Expected 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()); }