test_write_format_gnutar.c revision 248616
1254721Semaste/*- 2254721Semaste * Copyright (c) 2010 Tim Kientzle 3353358Sdim * All rights reserved. 4353358Sdim * 5353358Sdim * Redistribution and use in source and binary forms, with or without 6254721Semaste * modification, are permitted provided that the following conditions 7254721Semaste * are met: 8254721Semaste * 1. Redistributions of source code must retain the above copyright 9254721Semaste * notice, this list of conditions and the following disclaimer. 10254721Semaste * 2. Redistributions in binary form must reproduce the above copyright 11254721Semaste * notice, this list of conditions and the following disclaimer in the 12296417Sdim * documentation and/or other materials provided with the distribution. 13309124Sdim * 14254721Semaste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15296417Sdim * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16254721Semaste * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17280031Sdim * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18314564Sdim * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19254721Semaste * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20254721Semaste * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21254721Semaste * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22353358Sdim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23341825Sdim * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24341825Sdim */ 25341825Sdim#include "test.h" 26314564Sdim__FBSDID("$FreeBSD$"); 27341825Sdim 28341825Sdimchar buff2[64]; 29341825Sdim 30341825Sdim/* Some names 1026 characters long */ 31341825Sdimstatic const char *longfilename = "abcdefghijklmnopqrstuvwxyz" 32314564Sdim "12345678901234567890123456789012345678901234567890" 33254721Semaste "12345678901234567890123456789012345678901234567890" 34254721Semaste "12345678901234567890123456789012345678901234567890" 35314564Sdim "12345678901234567890123456789012345678901234567890" 36254721Semaste "12345678901234567890123456789012345678901234567890" 37314564Sdim "12345678901234567890123456789012345678901234567890" 38314564Sdim "12345678901234567890123456789012345678901234567890" 39254721Semaste "12345678901234567890123456789012345678901234567890" 40341825Sdim "12345678901234567890123456789012345678901234567890" 41341825Sdim "12345678901234567890123456789012345678901234567890" 42314564Sdim "12345678901234567890123456789012345678901234567890" 43353358Sdim "12345678901234567890123456789012345678901234567890" 44314564Sdim "12345678901234567890123456789012345678901234567890" 45314564Sdim "12345678901234567890123456789012345678901234567890" 46353358Sdim "12345678901234567890123456789012345678901234567890" 47314564Sdim "12345678901234567890123456789012345678901234567890" 48314564Sdim "12345678901234567890123456789012345678901234567890" 49314564Sdim "12345678901234567890123456789012345678901234567890" 50254721Semaste "12345678901234567890123456789012345678901234567890" 51341825Sdim "12345678901234567890123456789012345678901234567890"; 52341825Sdim 53314564Sdimstatic const char *longlinkname = "Xabcdefghijklmnopqrstuvwxyz" 54353358Sdim "12345678901234567890123456789012345678901234567890" 55314564Sdim "12345678901234567890123456789012345678901234567890" 56314564Sdim "12345678901234567890123456789012345678901234567890" 57353358Sdim "12345678901234567890123456789012345678901234567890" 58314564Sdim "12345678901234567890123456789012345678901234567890" 59314564Sdim "12345678901234567890123456789012345678901234567890" 60314564Sdim "12345678901234567890123456789012345678901234567890" 61254721Semaste "12345678901234567890123456789012345678901234567890" 62341825Sdim "12345678901234567890123456789012345678901234567890" 63341825Sdim "12345678901234567890123456789012345678901234567890" 64314564Sdim "12345678901234567890123456789012345678901234567890" 65353358Sdim "12345678901234567890123456789012345678901234567890" 66314564Sdim "12345678901234567890123456789012345678901234567890" 67314564Sdim "12345678901234567890123456789012345678901234567890" 68353358Sdim "12345678901234567890123456789012345678901234567890" 69314564Sdim "12345678901234567890123456789012345678901234567890" 70314564Sdim "12345678901234567890123456789012345678901234567890" 71254721Semaste "12345678901234567890123456789012345678901234567890" 72341825Sdim "12345678901234567890123456789012345678901234567890" 73341825Sdim "12345678901234567890123456789012345678901234567890"; 74314564Sdim 75353358Sdimstatic const char *longhardlinkname = "Yabcdefghijklmnopqrstuvwxyz" 76314564Sdim "12345678901234567890123456789012345678901234567890" 77314564Sdim "12345678901234567890123456789012345678901234567890" 78360784Sdim "12345678901234567890123456789012345678901234567890" 79314564Sdim "12345678901234567890123456789012345678901234567890" 80314564Sdim "12345678901234567890123456789012345678901234567890" 81314564Sdim "12345678901234567890123456789012345678901234567890" 82353358Sdim "12345678901234567890123456789012345678901234567890" 83314564Sdim "12345678901234567890123456789012345678901234567890" 84314564Sdim "12345678901234567890123456789012345678901234567890" 85314564Sdim "12345678901234567890123456789012345678901234567890" 86254721Semaste "12345678901234567890123456789012345678901234567890" 87341825Sdim "12345678901234567890123456789012345678901234567890" 88314564Sdim "12345678901234567890123456789012345678901234567890" 89353358Sdim "12345678901234567890123456789012345678901234567890" 90314564Sdim "12345678901234567890123456789012345678901234567890" 91314564Sdim "12345678901234567890123456789012345678901234567890" 92353358Sdim "12345678901234567890123456789012345678901234567890" 93314564Sdim "12345678901234567890123456789012345678901234567890" 94314564Sdim "12345678901234567890123456789012345678901234567890" 95314564Sdim "12345678901234567890123456789012345678901234567890"; 96254721Semaste 97341825Sdim 98341825SdimDEFINE_TEST(test_write_format_gnutar) 99314564Sdim{ 100353358Sdim size_t buffsize = 1000000; 101314564Sdim char *buff; 102314564Sdim struct archive_entry *ae; 103353358Sdim struct archive *a; 104314564Sdim size_t used; 105314564Sdim 106314564Sdim buff = malloc(buffsize); /* million bytes of work area */ 107254721Semaste assert(buff != NULL); 108341825Sdim 109341825Sdim /* Create a new archive in memory. */ 110314564Sdim assert((a = archive_write_new()) != NULL); 111254721Semaste assertA(0 == archive_write_set_format_gnutar(a)); 112341825Sdim assertA(0 == archive_write_add_filter_none(a)); 113341825Sdim assertA(0 == archive_write_open_memory(a, buff, buffsize, &used)); 114314564Sdim 115254721Semaste /* 116341825Sdim * "file" has a bunch of attributes and 8 bytes of data. 117341825Sdim */ 118314564Sdim assert((ae = archive_entry_new()) != NULL); 119353358Sdim archive_entry_set_atime(ae, 2, 20); 120314564Sdim archive_entry_set_birthtime(ae, 3, 30); 121314564Sdim archive_entry_set_ctime(ae, 4, 40); 122254721Semaste archive_entry_set_mtime(ae, 5, 50); 123314564Sdim archive_entry_copy_pathname(ae, "file"); 124314564Sdim archive_entry_set_mode(ae, S_IFREG | 0755); 125353358Sdim archive_entry_set_size(ae, 8); 126314564Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 127314564Sdim archive_entry_free(ae); 128254721Semaste assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); 129341825Sdim 130341825Sdim /* 131314564Sdim * A file with a very long name 132353358Sdim */ 133314564Sdim assert((ae = archive_entry_new()) != NULL); 134314564Sdim archive_entry_copy_pathname(ae, longfilename); 135353358Sdim archive_entry_set_mode(ae, S_IFREG | 0755); 136314564Sdim archive_entry_set_size(ae, 8); 137314564Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 138353358Sdim archive_entry_free(ae); 139314564Sdim assertEqualIntA(a, 8, archive_write_data(a, "abcdefgh", 9)); 140314564Sdim 141254721Semaste /* 142314564Sdim * A hardlink to the above file. 143314564Sdim */ 144353358Sdim assert((ae = archive_entry_new()) != NULL); 145314564Sdim archive_entry_copy_pathname(ae, longhardlinkname); 146314564Sdim archive_entry_copy_hardlink(ae, longfilename); 147254721Semaste archive_entry_set_mode(ae, S_IFREG | 0755); 148341825Sdim archive_entry_set_size(ae, 8); 149341825Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 150314564Sdim archive_entry_free(ae); 151353358Sdim 152314564Sdim /* 153314564Sdim * A symlink to the above file. 154353358Sdim */ 155314564Sdim assert((ae = archive_entry_new()) != NULL); 156314564Sdim archive_entry_copy_pathname(ae, longlinkname); 157314564Sdim archive_entry_copy_symlink(ae, longfilename); 158353358Sdim archive_entry_set_mode(ae, AE_IFLNK | 0755); 159314564Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 160254721Semaste archive_entry_free(ae); 161254721Semaste 162314564Sdim /* TODO: support GNU tar sparse format and test it here. */ 163314564Sdim /* See test_write_format_pax for an example of testing sparse files. */ 164341825Sdim 165341825Sdim /* Close out the archive. */ 166341825Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 167314564Sdim assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); 168254721Semaste 169314564Sdim /* 170314564Sdim * Some basic verification of the low-level format. 171254721Semaste */ 172314564Sdim 173254721Semaste /* Verify GNU tar magic/version fields */ 174314564Sdim assertEqualMem(buff + 257, "ustar \0", 8); 175254721Semaste 176314564Sdim assertEqualInt(14336, used); 177314564Sdim 178314564Sdim /* 179296417Sdim * 180314564Sdim * Now, read the data back. 181314564Sdim * 182314564Sdim */ 183314564Sdim assert((a = archive_read_new()) != NULL); 184360784Sdim assertEqualIntA(a, 0, archive_read_support_format_all(a)); 185341825Sdim assertEqualIntA(a, 0, archive_read_support_filter_all(a)); 186314564Sdim assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used)); 187314564Sdim 188314564Sdim /* 189314564Sdim * Read "file" 190314564Sdim */ 191314564Sdim assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); 192314564Sdim assert(!archive_entry_atime_is_set(ae)); 193314564Sdim assert(!archive_entry_birthtime_is_set(ae)); 194314564Sdim assert(!archive_entry_ctime_is_set(ae)); 195314564Sdim assertEqualInt(5, archive_entry_mtime(ae)); 196314564Sdim assertEqualInt(0, archive_entry_mtime_nsec(ae)); 197314564Sdim assertEqualString("file", archive_entry_pathname(ae)); 198314564Sdim assertEqualInt(S_IFREG | 0755, archive_entry_mode(ae)); 199314564Sdim assertEqualInt(8, archive_entry_size(ae)); 200314564Sdim assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); 201314564Sdim assertEqualMem(buff2, "12345678", 8); 202314564Sdim 203280031Sdim /* 204314564Sdim * Read file with very long name. 205314564Sdim */ 206314564Sdim assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); 207296417Sdim assertEqualString(longfilename, archive_entry_pathname(ae)); 208314564Sdim assertEqualInt(S_IFREG | 0755, archive_entry_mode(ae)); 209314564Sdim assertEqualInt(8, archive_entry_size(ae)); 210314564Sdim assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); 211254721Semaste assertEqualMem(buff2, "abcdefgh", 8); 212254721Semaste 213254721Semaste /* 214254721Semaste * Read hardlink. 215296417Sdim */ 216 assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); 217 assertEqualString(longhardlinkname, archive_entry_pathname(ae)); 218 assertEqualString(longfilename, archive_entry_hardlink(ae)); 219 220 /* 221 * Read symlink. 222 */ 223 assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); 224 assertEqualString(longlinkname, archive_entry_pathname(ae)); 225 assertEqualString(longfilename, archive_entry_symlink(ae)); 226 assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae)); 227 228 /* 229 * Verify the end of the archive. 230 */ 231 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 232 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 233 assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 234 235 free(buff); 236} 237