1228753Smm/*- 2228753Smm * Copyright (c) 2003-2007 Tim Kientzle 3228753Smm * All rights reserved. 4228753Smm * 5228753Smm * Redistribution and use in source and binary forms, with or without 6228753Smm * modification, are permitted provided that the following conditions 7228753Smm * are met: 8228753Smm * 1. Redistributions of source code must retain the above copyright 9228753Smm * notice, this list of conditions and the following disclaimer. 10228753Smm * 2. Redistributions in binary form must reproduce the above copyright 11228753Smm * notice, this list of conditions and the following disclaimer in the 12228753Smm * documentation and/or other materials provided with the distribution. 13228753Smm * 14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24228753Smm */ 25228753Smm#include "test.h" 26229592Smm__FBSDID("$FreeBSD$"); 27228753Smm 28228753Smmstatic void 29228753Smmtest_read_format_mtree1(void) 30228753Smm{ 31228753Smm const char reffile[] = "test_read_format_mtree.mtree"; 32228753Smm char buff[16]; 33228753Smm struct archive_entry *ae; 34228753Smm struct archive *a; 35228753Smm FILE *f; 36228753Smm 37228753Smm extract_reference_file(reffile); 38228753Smm 39228753Smm /* 40228753Smm * An access error occurred on some platform when mtree 41228753Smm * format handling open a directory. It is for through 42228753Smm * the routine which open a directory that we create 43228753Smm * "dir" and "dir2" directories. 44228753Smm */ 45228753Smm assertMakeDir("dir", 0775); 46228753Smm assertMakeDir("dir2", 0775); 47228753Smm 48228753Smm assert((a = archive_read_new()) != NULL); 49228753Smm assertEqualIntA(a, ARCHIVE_OK, 50228753Smm archive_read_support_compression_all(a)); 51228753Smm assertEqualIntA(a, ARCHIVE_OK, 52228753Smm archive_read_support_format_all(a)); 53228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_file(a, reffile, 11)); 54228753Smm 55228753Smm /* 56228753Smm * Read "file", whose data is available on disk. 57228753Smm */ 58228753Smm f = fopen("file", "wb"); 59228753Smm assert(f != NULL); 60228753Smm assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 61228753Smm fclose(f); 62228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 63228753Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 64228753Smm assertEqualString(archive_entry_pathname(ae), "file"); 65228753Smm assertEqualInt(archive_entry_uid(ae), 18); 66228753Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 67228753Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 68228753Smm assertEqualInt(archive_entry_size(ae), 3); 69228753Smm assertEqualInt(3, archive_read_data(a, buff, 3)); 70228753Smm assertEqualMem(buff, "hi\n", 3); 71228753Smm 72228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 73228753Smm assertEqualString(archive_entry_pathname(ae), "dir"); 74228753Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 75228753Smm 76228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 77228753Smm assertEqualString(archive_entry_pathname(ae), "dir/file with space"); 78228753Smm 79228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 80228753Smm assertEqualString(archive_entry_pathname(ae), "file with space"); 81228753Smm 82228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 83228753Smm assertEqualString(archive_entry_pathname(ae), "dir2"); 84228753Smm 85228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 86228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); 87228753Smm 88228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 89228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); 90228753Smm 91228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 92228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); 93228753Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 94228753Smm 95228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 96228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); 97228753Smm 98228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 99228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); 100228753Smm 101228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 102228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); 103228753Smm 104228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 105228753Smm assertEqualString(archive_entry_pathname(ae), "notindir"); 106228753Smm 107228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 108228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 109228753Smm assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); 110228753Smm} 111228753Smm 112228753Smmstatic void 113228753Smmtest_read_format_mtree2(void) 114228753Smm{ 115228753Smm static char archive[] = 116228753Smm "#mtree\n" 117228753Smm "d type=dir content=.\n"; 118228753Smm struct archive_entry *ae; 119228753Smm struct archive *a; 120228753Smm 121228753Smm assert((a = archive_read_new()) != NULL); 122228753Smm assertEqualIntA(a, ARCHIVE_OK, 123228753Smm archive_read_support_compression_all(a)); 124228753Smm assertEqualIntA(a, ARCHIVE_OK, 125228753Smm archive_read_support_format_all(a)); 126228753Smm assertEqualIntA(a, ARCHIVE_OK, 127228753Smm archive_read_open_memory(a, archive, sizeof(archive))); 128228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 129228753Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 130228753Smm assertEqualString(archive_entry_pathname(ae), "d"); 131228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFDIR); 132228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 133228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 134228753Smm assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); 135228753Smm} 136228753Smm 137228753Smm/* 138228753Smm * Reported to libarchive.googlecode.com as Issue 121. 139228753Smm */ 140228753Smmstatic void 141228753Smmtest_read_format_mtree3(void) 142228753Smm{ 143228753Smm static char archive[] = 144228753Smm "#mtree\n" 145228753Smm "a type=file contents=file\n" 146228753Smm "b type=link link=a\n" 147228753Smm "c type=file contents=file\n"; 148228753Smm struct archive_entry *ae; 149228753Smm struct archive *a; 150228753Smm 151228753Smm assertMakeDir("mtree3", 0777); 152228753Smm assertChdir("mtree3"); 153228753Smm assertMakeFile("file", 0644, "file contents"); 154228753Smm 155228753Smm assert((a = archive_read_new()) != NULL); 156228753Smm assertEqualIntA(a, ARCHIVE_OK, 157228753Smm archive_read_support_compression_all(a)); 158228753Smm assertEqualIntA(a, ARCHIVE_OK, 159228753Smm archive_read_support_format_all(a)); 160228753Smm assertEqualIntA(a, ARCHIVE_OK, 161228753Smm archive_read_open_memory(a, archive, sizeof(archive))); 162228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 163228753Smm assertEqualString(archive_entry_pathname(ae), "a"); 164228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 165228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 166228753Smm assertEqualString(archive_entry_pathname(ae), "b"); 167228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); 168228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 169228753Smm assertEqualString(archive_entry_pathname(ae), "c"); 170228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 171228753Smm 172228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 173228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 174228753Smm assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); 175228753Smm 176228753Smm assertChdir(".."); 177228753Smm} 178228753Smm 179228753Smm 180228753Smm 181228753SmmDEFINE_TEST(test_read_format_mtree) 182228753Smm{ 183228753Smm test_read_format_mtree1(); 184228753Smm test_read_format_mtree2(); 185228753Smm test_read_format_mtree3(); 186228753Smm} 187