ArchiveTest.cpp
3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//===- 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());
}