blob: 84005de56c129ee6f1a0e860188717301b5bb5cb [file] [log] [blame]
Rui Ueyamae9d17542017-01-09 22:55:00 +00001//===- llvm/unittest/Support/TarWriterTest.cpp ----------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Support/FileSystem.h"
11#include "llvm/Support/MemoryBuffer.h"
12#include "llvm/Support/TarWriter.h"
13#include "gtest/gtest.h"
14
15using namespace llvm;
16namespace {
17
18struct UstarHeader {
19 char Name[100];
20 char Mode[8];
21 char Uid[8];
22 char Gid[8];
23 char Size[12];
24 char Mtime[12];
25 char Checksum[8];
26 char TypeFlag;
27 char Linkname[100];
28 char Magic[6];
29 char Version[2];
30 char Uname[32];
31 char Gname[32];
32 char DevMajor[8];
33 char DevMinor[8];
34 char Prefix[155];
35 char Pad[12];
36};
37
38class TarWriterTest : public ::testing::Test {};
39
40static UstarHeader create(StringRef Base, StringRef Filename) {
41 // Create a temporary file.
42 SmallString<128> Path;
43 std::error_code EC =
44 sys::fs::createTemporaryFile("TarWriterTest", "tar", Path);
45 EXPECT_FALSE((bool)EC);
46
47 // Create a tar file.
48 Expected<std::unique_ptr<TarWriter>> TarOrErr = TarWriter::create(Path, Base);
49 EXPECT_TRUE((bool)TarOrErr);
50 std::unique_ptr<TarWriter> Tar = std::move(*TarOrErr);
51 Tar->append(Filename, "contents");
Rui Ueyama6a8520f2017-01-10 20:07:58 +000052 Tar.reset();
Rui Ueyamae9d17542017-01-09 22:55:00 +000053
54 // Read the tar file.
55 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(Path);
56 EXPECT_TRUE((bool)MBOrErr);
57 std::unique_ptr<MemoryBuffer> MB = std::move(*MBOrErr);
58 sys::fs::remove(Path);
59 return *reinterpret_cast<const UstarHeader *>(MB->getBufferStart());
60}
61
62TEST_F(TarWriterTest, Basics) {
63 UstarHeader Hdr = create("base", "file");
Rui Ueyamada710362017-01-11 22:02:51 +000064 EXPECT_EQ("ustar", StringRef(Hdr.Magic));
65 EXPECT_EQ("00", StringRef(Hdr.Version, 2));
66 EXPECT_EQ("base/file", StringRef(Hdr.Name));
67 EXPECT_EQ("00000000010", StringRef(Hdr.Size));
Rui Ueyamae9d17542017-01-09 22:55:00 +000068}
69
70TEST_F(TarWriterTest, LongFilename) {
71 UstarHeader Hdr1 = create(
72 "012345678", std::string(99, 'x') + "/" + std::string(44, 'x') + "/foo");
Rui Ueyamada710362017-01-11 22:02:51 +000073 EXPECT_EQ("foo", StringRef(Hdr1.Name));
74 EXPECT_EQ("012345678/" + std::string(99, 'x') + "/" + std::string(44, 'x'),
Rui Ueyamae9d17542017-01-09 22:55:00 +000075 StringRef(Hdr1.Prefix));
76
77 UstarHeader Hdr2 = create(
78 "012345678", std::string(99, 'x') + "/" + std::string(45, 'x') + "/foo");
Rui Ueyamada710362017-01-11 22:02:51 +000079 EXPECT_EQ("foo", StringRef(Hdr2.Name));
80 EXPECT_EQ("012345678/" + std::string(99, 'x') + "/" + std::string(45, 'x'),
Rui Ueyamae9d17542017-01-09 22:55:00 +000081 StringRef(Hdr2.Prefix));
82
83 UstarHeader Hdr3 = create(
84 "012345678", std::string(99, 'x') + "/" + std::string(46, 'x') + "/foo");
Rui Ueyamada710362017-01-11 22:02:51 +000085 EXPECT_EQ(std::string(46, 'x') + "/foo", StringRef(Hdr3.Name));
86 EXPECT_EQ("012345678/" + std::string(99, 'x'), StringRef(Hdr3.Prefix));
Rui Ueyamae9d17542017-01-09 22:55:00 +000087}
88}