1326bc1daSJames Henderson //===- ArchiveTest.cpp ----------------------------------------------------===//
2326bc1daSJames Henderson //
3326bc1daSJames Henderson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4326bc1daSJames Henderson // See https://llvm.org/LICENSE.txt for license information.
5326bc1daSJames Henderson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326bc1daSJames Henderson //
7326bc1daSJames Henderson //===----------------------------------------------------------------------===//
8326bc1daSJames Henderson
9326bc1daSJames Henderson #include "llvm/Object/Archive.h"
10326bc1daSJames Henderson #include "llvm/Testing/Support/Error.h"
11326bc1daSJames Henderson #include "gtest/gtest.h"
12326bc1daSJames Henderson
13326bc1daSJames Henderson using namespace llvm;
14326bc1daSJames Henderson using namespace object;
15326bc1daSJames Henderson using namespace testing;
16326bc1daSJames Henderson
17326bc1daSJames Henderson static const char ArchiveWithMember[] = "!<arch>\n" // Global header
18326bc1daSJames Henderson "test/ " // Member name
19326bc1daSJames Henderson "0 " // Timestamp
20326bc1daSJames Henderson "0 " // Owner ID
21326bc1daSJames Henderson "0 " // Group ID
22326bc1daSJames Henderson "0 " // File mode
23326bc1daSJames Henderson "9999999999" // Size
24326bc1daSJames Henderson "`\n";
25326bc1daSJames Henderson
26326bc1daSJames Henderson static const char ThinArchiveWithMember[] = "!<thin>\n" // Global header
27326bc1daSJames Henderson "test/ " // Member name
28326bc1daSJames Henderson "0 " // Timestamp
29326bc1daSJames Henderson "0 " // Owner ID
30326bc1daSJames Henderson "0 " // Group ID
31326bc1daSJames Henderson "0 " // File mode
32326bc1daSJames Henderson "9999999999" // Size
33326bc1daSJames Henderson "`\n";
34326bc1daSJames Henderson
352150a6d0SJames Henderson static const uint64_t MemberSize = 9999999999ull;
362150a6d0SJames Henderson
37326bc1daSJames Henderson struct ArchiveTestsFixture : Test {
createChildArchiveTestsFixture38326bc1daSJames Henderson Expected<Archive::child_iterator> createChild(StringRef Src) {
39326bc1daSJames Henderson MemoryBufferRef Source(Src, "archive");
40326bc1daSJames Henderson Expected<std::unique_ptr<Archive>> AOrErr = Archive::create(Source);
41326bc1daSJames Henderson if (!AOrErr)
42326bc1daSJames Henderson return AOrErr.takeError();
43326bc1daSJames Henderson A = std::move(*AOrErr);
44326bc1daSJames Henderson
45326bc1daSJames Henderson Error ChildErr = Error::success();
46326bc1daSJames Henderson auto Child = A->child_begin(ChildErr);
47326bc1daSJames Henderson if (ChildErr)
48326bc1daSJames Henderson return std::move(ChildErr);
49326bc1daSJames Henderson return Child;
50326bc1daSJames Henderson }
51326bc1daSJames Henderson
52326bc1daSJames Henderson std::unique_ptr<Archive> A;
53326bc1daSJames Henderson };
54326bc1daSJames Henderson
TEST_F(ArchiveTestsFixture,ArchiveChildGetSizeRegularArchive)55326bc1daSJames Henderson TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeRegularArchive) {
562150a6d0SJames Henderson // This test relies on a StringRef being able to hold the appropriate amount
572150a6d0SJames Henderson // of data.
582150a6d0SJames Henderson if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)
59*7fc87159SPaul Robinson GTEST_SKIP();
602150a6d0SJames Henderson
61326bc1daSJames Henderson auto Child = createChild(ArchiveWithMember);
62326bc1daSJames Henderson ASSERT_THAT_EXPECTED(Child, Succeeded());
63326bc1daSJames Henderson
64326bc1daSJames Henderson Expected<uint64_t> Size = (*Child)->getSize();
65326bc1daSJames Henderson ASSERT_THAT_EXPECTED(Size, Succeeded());
662150a6d0SJames Henderson EXPECT_EQ(MemberSize, *Size);
67326bc1daSJames Henderson }
68326bc1daSJames Henderson
TEST_F(ArchiveTestsFixture,ArchiveChildGetSizeThinArchive)69326bc1daSJames Henderson TEST_F(ArchiveTestsFixture, ArchiveChildGetSizeThinArchive) {
70326bc1daSJames Henderson auto Child = createChild(ThinArchiveWithMember);
71326bc1daSJames Henderson ASSERT_THAT_EXPECTED(Child, Succeeded());
72326bc1daSJames Henderson
73326bc1daSJames Henderson Expected<uint64_t> Size = (*Child)->getSize();
74326bc1daSJames Henderson ASSERT_THAT_EXPECTED(Size, Succeeded());
752150a6d0SJames Henderson EXPECT_EQ(MemberSize, *Size);
76326bc1daSJames Henderson }
77326bc1daSJames Henderson
TEST_F(ArchiveTestsFixture,ArchiveChildGetBuffer)78326bc1daSJames Henderson TEST_F(ArchiveTestsFixture, ArchiveChildGetBuffer) {
792150a6d0SJames Henderson // This test relies on a StringRef being able to hold the appropriate amount
802150a6d0SJames Henderson // of data.
812150a6d0SJames Henderson if (std::numeric_limits<StringRef::size_type>::max() < MemberSize)
82*7fc87159SPaul Robinson GTEST_SKIP();
832150a6d0SJames Henderson
84326bc1daSJames Henderson auto Child = createChild(ArchiveWithMember);
85326bc1daSJames Henderson ASSERT_THAT_EXPECTED(Child, Succeeded());
86326bc1daSJames Henderson
87326bc1daSJames Henderson Expected<StringRef> Buffer = (*Child)->getBuffer();
88326bc1daSJames Henderson // Cannot use ASSERT_THAT_EXPECTED, as that will attempt to print the
89326bc1daSJames Henderson // StringRef (which has an invalid size).
90326bc1daSJames Henderson ASSERT_TRUE((bool)Buffer);
912150a6d0SJames Henderson EXPECT_EQ(MemberSize, Buffer->size());
92326bc1daSJames Henderson EXPECT_EQ(ArchiveWithMember + sizeof(ArchiveWithMember) - 1, Buffer->data());
93326bc1daSJames Henderson }
94