test_compat_mac.c revision 248616
1231200Smm/*- 2231200Smm * Copyright (c) 2003-2010 Tim Kientzle 3231200Smm * All rights reserved. 4231200Smm * 5231200Smm * Redistribution and use in source and binary forms, with or without 6231200Smm * modification, are permitted provided that the following conditions 7231200Smm * are met: 8231200Smm * 1. Redistributions of source code must retain the above copyright 9231200Smm * notice, this list of conditions and the following disclaimer. 10231200Smm * 2. Redistributions in binary form must reproduce the above copyright 11231200Smm * notice, this list of conditions and the following disclaimer in the 12231200Smm * documentation and/or other materials provided with the distribution. 13231200Smm * 14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24231200Smm */ 25231200Smm#include "test.h" 26231200Smm__FBSDID("$FreeBSD$"); 27231200Smm 28231200Smm/* The sample has some files in a directory with a very long name. */ 29231200Smm#define TESTPATH "abcdefghijklmnopqrstuvwxyz/" \ 30231200Smm "abcdefghijklmnopqrstuvwxyz/" \ 31231200Smm "abcdefghijklmnopqrstuvwxyz/" \ 32231200Smm "abcdefghijklmnopqrstuvwxyz/" \ 33231200Smm "abcdefghijklmnopqrstuvwxyz/" \ 34231200Smm "abcdefghijklmnopqrstuvwxyz/" \ 35231200Smm "abcdefghijklmnopqrstuvwxyz/" 36231200Smm 37232153Smmstatic void test_compat_mac_1(void); 38232153Smmstatic void test_compat_mac_2(void); 39232153Smm 40231200Smm/* 41231200Smm * Apple shipped an extended version of GNU tar with Mac OS X 10.5 42231200Smm * and earlier. 43231200Smm */ 44232153Smmstatic void 45232153Smmtest_compat_mac_1(void) 46231200Smm{ 47231200Smm char name[] = "test_compat_mac-1.tar.Z"; 48231200Smm struct archive_entry *ae; 49231200Smm struct archive *a; 50231200Smm const void *attr; 51231200Smm size_t attrSize; 52231200Smm 53231200Smm assert((a = archive_read_new()) != NULL); 54231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 55231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 56231200Smm extract_reference_file(name); 57231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); 58231200Smm 59231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 60231200Smm assertEqualString(TESTPATH, archive_entry_pathname(ae)); 61231200Smm assertEqualInt(1275688109, archive_entry_mtime(ae)); 62231200Smm assertEqualInt(95594, archive_entry_uid(ae)); 63231200Smm assertEqualString("kientzle", archive_entry_uname(ae)); 64231200Smm assertEqualInt(5000, archive_entry_gid(ae)); 65231200Smm assertEqualString("", archive_entry_gname(ae)); 66231200Smm assertEqualInt(040755, archive_entry_mode(ae)); 67231200Smm 68231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 69231200Smm assert(attr == NULL); 70231200Smm assertEqualInt(0, attrSize); 71231200Smm 72231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 73231200Smm assertEqualString(TESTPATH "dir/", archive_entry_pathname(ae)); 74231200Smm assertEqualInt(1275687611, archive_entry_mtime(ae)); 75231200Smm assertEqualInt(95594, archive_entry_uid(ae)); 76231200Smm assertEqualString("kientzle", archive_entry_uname(ae)); 77231200Smm assertEqualInt(5000, archive_entry_gid(ae)); 78231200Smm assertEqualString("", archive_entry_gname(ae)); 79231200Smm assertEqualInt(040755, archive_entry_mode(ae)); 80231200Smm 81231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 82231200Smm assert(attr != NULL); 83231200Smm assertEqualInt(225, attrSize); 84231200Smm 85231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 86231200Smm assertEqualString(TESTPATH "file", archive_entry_pathname(ae)); 87231200Smm assertEqualInt(1275687588, archive_entry_mtime(ae)); 88231200Smm assertEqualInt(95594, archive_entry_uid(ae)); 89231200Smm assertEqualString("kientzle", archive_entry_uname(ae)); 90231200Smm assertEqualInt(5000, archive_entry_gid(ae)); 91231200Smm assertEqualString("", archive_entry_gname(ae)); 92231200Smm assertEqualInt(0100644, archive_entry_mode(ae)); 93231200Smm 94231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 95231200Smm assert(attr != NULL); 96231200Smm assertEqualInt(225, attrSize); 97231200Smm 98231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 99231200Smm assertEqualString("dir/", archive_entry_pathname(ae)); 100231200Smm assertEqualInt(1275688064, archive_entry_mtime(ae)); 101231200Smm assertEqualInt(95594, archive_entry_uid(ae)); 102231200Smm assertEqualString("kientzle", archive_entry_uname(ae)); 103231200Smm assertEqualInt(5000, archive_entry_gid(ae)); 104231200Smm assertEqualString("", archive_entry_gname(ae)); 105231200Smm assertEqualInt(040755, archive_entry_mode(ae)); 106231200Smm 107231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 108231200Smm assert(attr != NULL); 109231200Smm assertEqualInt(225, attrSize); 110231200Smm assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16); 111231200Smm 112231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 113231200Smm assertEqualString("file", archive_entry_pathname(ae)); 114231200Smm assertEqualInt(1275625860, archive_entry_mtime(ae)); 115231200Smm assertEqualInt(95594, archive_entry_uid(ae)); 116231200Smm assertEqualString("kientzle", archive_entry_uname(ae)); 117231200Smm assertEqualInt(5000, archive_entry_gid(ae)); 118231200Smm assertEqualString("", archive_entry_gname(ae)); 119231200Smm assertEqualInt(0100644, archive_entry_mode(ae)); 120231200Smm 121231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 122231200Smm assert(attr != NULL); 123231200Smm assertEqualInt(225, attrSize); 124231200Smm assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16); 125231200Smm 126231200Smm /* Verify the end-of-archive. */ 127231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 128231200Smm 129231200Smm /* Verify that the format detection worked. */ 130248616Smm assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_COMPRESS); 131231200Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR); 132231200Smm 133231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 134231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 135231200Smm} 136231200Smm 137231200Smm/* 138231200Smm * Apple shipped a customized version of bsdtar starting with MacOS 10.6. 139231200Smm */ 140232153Smmstatic void 141232153Smmtest_compat_mac_2(void) 142231200Smm{ 143231200Smm char name[] = "test_compat_mac-2.tar.Z"; 144231200Smm struct archive_entry *ae; 145231200Smm struct archive *a; 146231200Smm const void *attr; 147231200Smm size_t attrSize; 148231200Smm 149231200Smm assert((a = archive_read_new()) != NULL); 150231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 151231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 152231200Smm extract_reference_file(name); 153231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); 154231200Smm 155231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 156231200Smm assertEqualString("./", archive_entry_pathname(ae)); 157231200Smm assertEqualInt(1303628303, archive_entry_mtime(ae)); 158231200Smm assertEqualInt(501, archive_entry_uid(ae)); 159231200Smm assertEqualString("tim", archive_entry_uname(ae)); 160231200Smm assertEqualInt(20, archive_entry_gid(ae)); 161231200Smm assertEqualString("staff", archive_entry_gname(ae)); 162231200Smm assertEqualInt(040755, archive_entry_mode(ae)); 163231200Smm 164231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 165231200Smm assert(attr == NULL); 166231200Smm assertEqualInt(0, attrSize); 167231200Smm 168231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 169231200Smm assertEqualString("./mydir/", archive_entry_pathname(ae)); 170231200Smm assertEqualInt(1303628303, archive_entry_mtime(ae)); 171231200Smm assertEqualInt(501, archive_entry_uid(ae)); 172231200Smm assertEqualString("tim", archive_entry_uname(ae)); 173231200Smm assertEqualInt(20, archive_entry_gid(ae)); 174231200Smm assertEqualString("staff", archive_entry_gname(ae)); 175231200Smm assertEqualInt(040755, archive_entry_mode(ae)); 176231200Smm 177231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 178231200Smm assert(attr != NULL); 179231200Smm assertEqualInt(267, attrSize); 180231200Smm assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16); 181231200Smm 182231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 183231200Smm assertEqualString("./myfile", archive_entry_pathname(ae)); 184231200Smm assertEqualInt(1303628303, archive_entry_mtime(ae)); 185231200Smm assertEqualInt(501, archive_entry_uid(ae)); 186231200Smm assertEqualString("tim", archive_entry_uname(ae)); 187231200Smm assertEqualInt(20, archive_entry_gid(ae)); 188231200Smm assertEqualString("staff", archive_entry_gname(ae)); 189231200Smm assertEqualInt(0100644, archive_entry_mode(ae)); 190231200Smm 191231200Smm attr = archive_entry_mac_metadata(ae, &attrSize); 192231200Smm assert(attr != NULL); 193231200Smm assertEqualInt(267, attrSize); 194231200Smm assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16); 195231200Smm 196231200Smm /* Verify the end-of-archive. */ 197231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 198231200Smm 199231200Smm /* Verify that the format detection worked. */ 200248616Smm assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_COMPRESS); 201231200Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); 202231200Smm 203231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 204231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 205231200Smm} 206231200Smm 207231200SmmDEFINE_TEST(test_compat_mac) 208231200Smm{ 209231200Smm test_compat_mac_1(); 210231200Smm test_compat_mac_2(); 211231200Smm} 212231200Smm 213