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