1 //===- 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 
15 using namespace llvm;
16 namespace {
17 
18 struct 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 
38 class TarWriterTest : public ::testing::Test {};
39 
40 static 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");
52   Tar.reset();
53 
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 
62 TEST_F(TarWriterTest, Basics) {
63   UstarHeader Hdr = create("base", "file");
64   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));
68 }
69 
70 TEST_F(TarWriterTest, LongFilename) {
71   UstarHeader Hdr1 = create(
72       "012345678", std::string(99, 'x') + "/" + std::string(44, 'x') + "/foo");
73   EXPECT_EQ("foo", StringRef(Hdr1.Name));
74   EXPECT_EQ("012345678/" + std::string(99, 'x') + "/" + std::string(44, 'x'),
75             StringRef(Hdr1.Prefix));
76 
77   UstarHeader Hdr2 = create(
78       "012345678", std::string(99, 'x') + "/" + std::string(45, 'x') + "/foo");
79   EXPECT_EQ("foo", StringRef(Hdr2.Name));
80   EXPECT_EQ("012345678/" + std::string(99, 'x') + "/" + std::string(45, 'x'),
81             StringRef(Hdr2.Prefix));
82 
83   UstarHeader Hdr3 = create(
84       "012345678", std::string(99, 'x') + "/" + std::string(46, 'x') + "/foo");
85   EXPECT_EQ(std::string(46, 'x') + "/foo", StringRef(Hdr3.Name));
86   EXPECT_EQ("012345678/" + std::string(99, 'x'), StringRef(Hdr3.Prefix));
87 }
88 }
89