1228753Smm/*- 2228753Smm * Copyright (c) 2003-2007 Tim Kientzle 3248616Smm * Copyright (c) 2011-2012 Michihiro NAKAJIMA 4228753Smm * All rights reserved. 5228753Smm * 6228753Smm * Redistribution and use in source and binary forms, with or without 7228753Smm * modification, are permitted provided that the following conditions 8228753Smm * are met: 9228753Smm * 1. Redistributions of source code must retain the above copyright 10228753Smm * notice, this list of conditions and the following disclaimer. 11228753Smm * 2. Redistributions in binary form must reproduce the above copyright 12228753Smm * notice, this list of conditions and the following disclaimer in the 13228753Smm * documentation and/or other materials provided with the distribution. 14228753Smm * 15228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25228753Smm */ 26228753Smm#include "test.h" 27228763Smm__FBSDID("$FreeBSD: releng/10.3/contrib/libarchive/libarchive/test/test_read_format_mtree.c 248616 2013-03-22 13:36:03Z mm $"); 28228753Smm 29228753Smmstatic void 30228753Smmtest_read_format_mtree1(void) 31228753Smm{ 32228753Smm const char reffile[] = "test_read_format_mtree.mtree"; 33228753Smm char buff[16]; 34228753Smm struct archive_entry *ae; 35228753Smm struct archive *a; 36228753Smm FILE *f; 37232153Smm /* Compute max 64-bit signed twos-complement value 38232153Smm * without relying on overflow. This assumes that long long 39232153Smm * is at least 64 bits. */ 40232153Smm static const long long max_int64 = ((((long long)1) << 62) - 1) + (((long long)1) << 62); 41248616Smm time_t min_time; 42248616Smm volatile time_t t; 43228753Smm 44228753Smm extract_reference_file(reffile); 45228753Smm 46228753Smm /* 47228753Smm * An access error occurred on some platform when mtree 48228753Smm * format handling open a directory. It is for through 49228753Smm * the routine which open a directory that we create 50228753Smm * "dir" and "dir2" directories. 51228753Smm */ 52228753Smm assertMakeDir("dir", 0775); 53228753Smm assertMakeDir("dir2", 0775); 54228753Smm 55228753Smm assert((a = archive_read_new()) != NULL); 56228753Smm assertEqualIntA(a, ARCHIVE_OK, 57232153Smm archive_read_support_filter_all(a)); 58228753Smm assertEqualIntA(a, ARCHIVE_OK, 59228753Smm archive_read_support_format_all(a)); 60248616Smm assertEqualIntA(a, ARCHIVE_OK, 61248616Smm archive_read_open_filename(a, reffile, 11)); 62228753Smm 63228753Smm /* 64228753Smm * Read "file", whose data is available on disk. 65228753Smm */ 66228753Smm f = fopen("file", "wb"); 67228753Smm assert(f != NULL); 68228753Smm assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 69228753Smm fclose(f); 70228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 71228753Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 72228753Smm assertEqualString(archive_entry_pathname(ae), "file"); 73228753Smm assertEqualInt(archive_entry_uid(ae), 18); 74228753Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 75228753Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 76228753Smm assertEqualInt(archive_entry_size(ae), 3); 77228753Smm assertEqualInt(3, archive_read_data(a, buff, 3)); 78228753Smm assertEqualMem(buff, "hi\n", 3); 79228753Smm 80228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 81228753Smm assertEqualString(archive_entry_pathname(ae), "dir"); 82228753Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 83228753Smm 84228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 85228753Smm assertEqualString(archive_entry_pathname(ae), "dir/file with space"); 86228753Smm 87228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 88228753Smm assertEqualString(archive_entry_pathname(ae), "file with space"); 89228753Smm 90228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 91228753Smm assertEqualString(archive_entry_pathname(ae), "dir2"); 92228753Smm 93228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 94228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); 95228753Smm 96228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 97228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); 98228753Smm 99228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 100228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); 101228753Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 102228753Smm 103228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 104228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); 105228753Smm 106228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 107228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); 108228753Smm 109228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 110228753Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); 111228753Smm 112228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 113228753Smm assertEqualString(archive_entry_pathname(ae), "notindir"); 114228753Smm 115232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 116232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/emptyfile"); 117232153Smm assertEqualInt(archive_entry_size(ae), 0); 118232153Smm 119232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 120232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/smallfile"); 121232153Smm assertEqualInt(archive_entry_size(ae), 1); 122232153Smm 123232153Smm /* TODO: Mtree reader should probably return ARCHIVE_WARN for this. */ 124232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 125232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/toosmallfile"); 126232153Smm assertEqualInt(archive_entry_size(ae), -1); 127232153Smm 128232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 129232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/bigfile"); 130232153Smm assertEqualInt(archive_entry_size(ae), max_int64); 131232153Smm 132232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 133232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/toobigfile"); 134232153Smm /* Size in mtree is max_int64 + 1; should return max_int64. */ 135232153Smm assertEqualInt(archive_entry_size(ae), max_int64); 136232153Smm 137232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 138232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/veryoldfile"); 139232153Smm /* The value in the file is MIN_INT64_T, but time_t may be narrower. */ 140232153Smm /* Verify min_time is the smallest possible time_t. */ 141232153Smm min_time = archive_entry_mtime(ae); 142232153Smm assert(min_time <= 0); 143232153Smm /* Simply asserting min_time - 1 > 0 breaks with some compiler optimizations. */ 144232153Smm t = min_time - 1; 145232153Smm assert(t > 0); 146232153Smm 147232153Smm /* toooldfile is 1 sec older, which should overflow and get returned 148232153Smm * with the same value. */ 149232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 150232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/toooldfile"); 151232153Smm assertEqualInt(archive_entry_mtime(ae), min_time); 152232153Smm 153228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 154232153Smm assertEqualInt(19, archive_file_count(a)); 155228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 156232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 157228753Smm} 158228753Smm 159228753Smmstatic void 160228753Smmtest_read_format_mtree2(void) 161228753Smm{ 162228753Smm static char archive[] = 163228753Smm "#mtree\n" 164228753Smm "d type=dir content=.\n"; 165228753Smm struct archive_entry *ae; 166228753Smm struct archive *a; 167228753Smm 168228753Smm assert((a = archive_read_new()) != NULL); 169228753Smm assertEqualIntA(a, ARCHIVE_OK, 170232153Smm archive_read_support_filter_all(a)); 171228753Smm assertEqualIntA(a, ARCHIVE_OK, 172228753Smm archive_read_support_format_all(a)); 173228753Smm assertEqualIntA(a, ARCHIVE_OK, 174228753Smm archive_read_open_memory(a, archive, sizeof(archive))); 175228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 176228753Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 177228753Smm assertEqualString(archive_entry_pathname(ae), "d"); 178228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFDIR); 179228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 180232153Smm assertEqualInt(1, archive_file_count(a)); 181228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 182232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 183228753Smm} 184228753Smm 185228753Smm/* 186228753Smm * Reported to libarchive.googlecode.com as Issue 121. 187228753Smm */ 188228753Smmstatic void 189228753Smmtest_read_format_mtree3(void) 190228753Smm{ 191228753Smm static char archive[] = 192228753Smm "#mtree\n" 193228753Smm "a type=file contents=file\n" 194228753Smm "b type=link link=a\n" 195228753Smm "c type=file contents=file\n"; 196228753Smm struct archive_entry *ae; 197228753Smm struct archive *a; 198228753Smm 199228753Smm assertMakeDir("mtree3", 0777); 200228753Smm assertChdir("mtree3"); 201228753Smm assertMakeFile("file", 0644, "file contents"); 202228753Smm 203228753Smm assert((a = archive_read_new()) != NULL); 204228753Smm assertEqualIntA(a, ARCHIVE_OK, 205232153Smm archive_read_support_filter_all(a)); 206228753Smm assertEqualIntA(a, ARCHIVE_OK, 207228753Smm archive_read_support_format_all(a)); 208228753Smm assertEqualIntA(a, ARCHIVE_OK, 209228753Smm archive_read_open_memory(a, archive, sizeof(archive))); 210228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 211228753Smm assertEqualString(archive_entry_pathname(ae), "a"); 212228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 213228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 214228753Smm assertEqualString(archive_entry_pathname(ae), "b"); 215228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); 216228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 217228753Smm assertEqualString(archive_entry_pathname(ae), "c"); 218228753Smm assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 219228753Smm 220228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 221232153Smm assertEqualInt(3, archive_file_count(a)); 222228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 223232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 224228753Smm 225228753Smm assertChdir(".."); 226228753Smm} 227228753Smm 228248616SmmDEFINE_TEST(test_read_format_mtree) 229248616Smm{ 230248616Smm test_read_format_mtree1(); 231248616Smm test_read_format_mtree2(); 232248616Smm test_read_format_mtree3(); 233248616Smm} 234228753Smm 235248616SmmDEFINE_TEST(test_read_format_mtree_filenames_only) 236232153Smm{ 237248616Smm static char archive[] = 238248616Smm "/set type=file mode=0644\n" 239248616Smm "./a\n" 240248616Smm "./b\n" 241248616Smm "./c\n" 242248616Smm "./d\n" 243248616Smm "./e\n" 244248616Smm "./f mode=0444\n"; 245248616Smm struct archive_entry *ae; 246248616Smm struct archive *a; 247248616Smm 248248616Smm assertMakeFile("file", 0644, "file contents"); 249248616Smm 250248616Smm assert((a = archive_read_new()) != NULL); 251248616Smm assertEqualIntA(a, ARCHIVE_OK, 252248616Smm archive_read_support_filter_all(a)); 253248616Smm assertEqualIntA(a, ARCHIVE_OK, 254248616Smm archive_read_support_format_all(a)); 255248616Smm assertEqualIntA(a, ARCHIVE_OK, 256248616Smm archive_read_open_memory(a, archive, sizeof(archive))); 257248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 258248616Smm assertEqualString(archive_entry_pathname(ae), "./a"); 259248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 260248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 261248616Smm assertEqualString(archive_entry_pathname(ae), "./b"); 262248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 263248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 264248616Smm assertEqualString(archive_entry_pathname(ae), "./c"); 265248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 266248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 267248616Smm assertEqualString(archive_entry_pathname(ae), "./d"); 268248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 269248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 270248616Smm assertEqualString(archive_entry_pathname(ae), "./e"); 271248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 272248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 273248616Smm assertEqualString(archive_entry_pathname(ae), "./f"); 274248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0444); 275248616Smm 276248616Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 277248616Smm assertEqualInt(6, archive_file_count(a)); 278248616Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 279248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 280248616Smm} 281248616Smm 282248616SmmDEFINE_TEST(test_read_format_mtree_nochange) 283248616Smm{ 284248616Smm static char archive[] = 285248616Smm "#mtree\n" 286248616Smm "./a type=file mode=0644 time=123\n" 287248616Smm "./b type=file mode=0644 time=234\n" 288248616Smm "./c type=file mode=0644 time=345\n"; 289248616Smm static char archive2[] = 290248616Smm "#mtree\n" 291248616Smm "./a type=file mode=0644 time=123 nochange\n" 292248616Smm "./b type=file mode=0644 time=234\n" 293248616Smm "./c type=file mode=0644 time=345 nochange\n"; 294248616Smm struct archive_entry *ae; 295248616Smm struct archive *a; 296248616Smm 297248616Smm assertMakeFile("a", 0640, "12345"); 298248616Smm assertMakeFile("b", 0664, "123456"); 299248616Smm assertMakeFile("c", 0755, "1234567"); 300248616Smm 301248616Smm /* 302248616Smm * Test 1. Read a mtree archive without `nochange' keyword. 303248616Smm */ 304248616Smm assert((a = archive_read_new()) != NULL); 305248616Smm assertEqualIntA(a, ARCHIVE_OK, 306248616Smm archive_read_support_filter_all(a)); 307248616Smm assertEqualIntA(a, ARCHIVE_OK, 308248616Smm archive_read_support_format_all(a)); 309248616Smm assertEqualIntA(a, ARCHIVE_OK, 310248616Smm archive_read_open_memory(a, archive, sizeof(archive))); 311248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 312248616Smm assertEqualString(archive_entry_pathname(ae), "./a"); 313248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 314248616Smm assertEqualInt(archive_entry_mtime(ae), 123); 315248616Smm assertEqualInt(archive_entry_size(ae), 5); 316248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 317248616Smm assertEqualString(archive_entry_pathname(ae), "./b"); 318248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 319248616Smm assertEqualInt(archive_entry_mtime(ae), 234); 320248616Smm assertEqualInt(archive_entry_size(ae), 6); 321248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 322248616Smm assertEqualString(archive_entry_pathname(ae), "./c"); 323248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 324248616Smm assertEqualInt(archive_entry_mtime(ae), 345); 325248616Smm assertEqualInt(archive_entry_size(ae), 7); 326248616Smm 327248616Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 328248616Smm assertEqualInt(3, archive_file_count(a)); 329248616Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 330248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 331248616Smm 332248616Smm /* 333248616Smm * Test 2. Read a mtree archive with `nochange' keyword. 334248616Smm */ 335248616Smm assert((a = archive_read_new()) != NULL); 336248616Smm assertEqualIntA(a, ARCHIVE_OK, 337248616Smm archive_read_support_filter_all(a)); 338248616Smm assertEqualIntA(a, ARCHIVE_OK, 339248616Smm archive_read_support_format_all(a)); 340248616Smm assertEqualIntA(a, ARCHIVE_OK, 341248616Smm archive_read_open_memory(a, archive2, sizeof(archive2))); 342248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 343248616Smm assertEqualString(archive_entry_pathname(ae), "./a"); 344248616Smm#if !defined(_WIN32) || defined(__CYGWIN__) 345248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0640); 346248616Smm#endif 347248616Smm assert(archive_entry_mtime(ae) != 123); 348248616Smm assertEqualInt(archive_entry_size(ae), 5); 349248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 350248616Smm assertEqualString(archive_entry_pathname(ae), "./b"); 351248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 352248616Smm assertEqualInt(archive_entry_mtime(ae), 234); 353248616Smm assertEqualInt(archive_entry_size(ae), 6); 354248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 355248616Smm assertEqualString(archive_entry_pathname(ae), "./c"); 356248616Smm#if !defined(_WIN32) || defined(__CYGWIN__) 357248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0755); 358248616Smm#endif 359248616Smm assert(archive_entry_mtime(ae) != 345); 360248616Smm assertEqualInt(archive_entry_size(ae), 7); 361248616Smm 362248616Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 363248616Smm assertEqualInt(3, archive_file_count(a)); 364248616Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 365248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 366248616Smm} 367248616Smm 368248616SmmDEFINE_TEST(test_read_format_mtree_nomagic_v1_form) 369248616Smm{ 370232153Smm const char reffile[] = "test_read_format_mtree_nomagic.mtree"; 371232153Smm char buff[16]; 372232153Smm struct archive_entry *ae; 373232153Smm struct archive *a; 374232153Smm FILE *f; 375228753Smm 376232153Smm extract_reference_file(reffile); 377232153Smm 378232153Smm assert((a = archive_read_new()) != NULL); 379232153Smm assertEqualIntA(a, ARCHIVE_OK, 380232153Smm archive_read_support_filter_all(a)); 381232153Smm assertEqualIntA(a, ARCHIVE_OK, 382232153Smm archive_read_support_format_all(a)); 383248616Smm assertEqualIntA(a, ARCHIVE_OK, 384248616Smm archive_read_open_filename(a, reffile, 11)); 385232153Smm 386232153Smm /* 387232153Smm * Read "file", whose data is available on disk. 388232153Smm */ 389232153Smm f = fopen("file", "wb"); 390232153Smm assert(f != NULL); 391232153Smm assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 392232153Smm fclose(f); 393232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 394232153Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 395232153Smm assertEqualString(archive_entry_pathname(ae), "file"); 396232153Smm assertEqualInt(archive_entry_uid(ae), 18); 397232153Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 398232153Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 399232153Smm assertEqualInt(archive_entry_size(ae), 3); 400232153Smm assertEqualInt(3, archive_read_data(a, buff, 3)); 401232153Smm assertEqualMem(buff, "hi\n", 3); 402232153Smm 403232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 404232153Smm assertEqualString(archive_entry_pathname(ae), "dir"); 405232153Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 406232153Smm 407232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 408232153Smm assertEqualString(archive_entry_pathname(ae), "dir/file with space"); 409232153Smm 410232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 411232153Smm assertEqualString(archive_entry_pathname(ae), "file with space"); 412232153Smm 413232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 414232153Smm assertEqualString(archive_entry_pathname(ae), "dir2"); 415232153Smm 416232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 417232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); 418232153Smm 419232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 420232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); 421232153Smm 422232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 423232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); 424232153Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 425232153Smm 426232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 427232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); 428232153Smm 429232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 430232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); 431232153Smm 432232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 433232153Smm assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); 434232153Smm 435232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 436232153Smm assertEqualString(archive_entry_pathname(ae), "notindir"); 437232153Smm 438232153Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 439232153Smm assertEqualInt(12, archive_file_count(a)); 440232153Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 441232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 442248616Smm} 443232153Smm 444248616Smm/* 445248616Smm * Test for a format that NetBSD mtree -C generates. 446248616Smm */ 447248616SmmDEFINE_TEST(test_read_format_mtree_nomagic_v2_form) 448248616Smm{ 449248616Smm const char reffile[] = "test_read_format_mtree_nomagic2.mtree"; 450248616Smm char buff[16]; 451248616Smm struct archive_entry *ae; 452248616Smm struct archive *a; 453248616Smm FILE *f; 454248616Smm 455248616Smm extract_reference_file(reffile); 456248616Smm 457248616Smm assert((a = archive_read_new()) != NULL); 458248616Smm assertEqualIntA(a, ARCHIVE_OK, 459248616Smm archive_read_support_filter_all(a)); 460248616Smm assertEqualIntA(a, ARCHIVE_OK, 461248616Smm archive_read_support_format_all(a)); 462248616Smm assertEqualIntA(a, ARCHIVE_OK, 463248616Smm archive_read_open_filename(a, reffile, 11)); 464248616Smm 465248616Smm /* 466248616Smm * Read "file", whose data is available on disk. 467248616Smm */ 468248616Smm f = fopen("file", "wb"); 469248616Smm assert(f != NULL); 470248616Smm assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 471248616Smm fclose(f); 472248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 473248616Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 474248616Smm assertEqualString(archive_entry_pathname(ae), "./file"); 475248616Smm assertEqualInt(archive_entry_uid(ae), 18); 476248616Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 477248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 478248616Smm assertEqualInt(archive_entry_size(ae), 3); 479248616Smm assertEqualInt(3, archive_read_data(a, buff, 3)); 480248616Smm assertEqualMem(buff, "hi\n", 3); 481248616Smm 482248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 483248616Smm assertEqualString(archive_entry_pathname(ae), "./dir"); 484248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 485248616Smm 486248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 487248616Smm assertEqualString(archive_entry_pathname(ae), "./dir/file with space"); 488248616Smm assertEqualInt(archive_entry_uid(ae), 18); 489248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 490248616Smm 491248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 492248616Smm assertEqualString(archive_entry_pathname(ae), "./file with space"); 493248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 494248616Smm 495248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 496248616Smm assertEqualString(archive_entry_pathname(ae), "./dir2"); 497248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 498248616Smm 499248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 500248616Smm assertEqualString(archive_entry_pathname(ae), "./dir2/dir3a"); 501248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 502248616Smm 503248616Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 504248616Smm assertEqualInt(6, archive_file_count(a)); 505248616Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 506248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 507232153Smm} 508232153Smm 509232153Smm/* 510248616Smm * Test for a format that NetBSD mtree -D generates. 511248616Smm */ 512248616SmmDEFINE_TEST(test_read_format_mtree_nomagic_v2_netbsd_form) 513248616Smm{ 514248616Smm const char reffile[] = "test_read_format_mtree_nomagic3.mtree"; 515248616Smm char buff[16]; 516248616Smm struct archive_entry *ae; 517248616Smm struct archive *a; 518248616Smm FILE *f; 519248616Smm 520248616Smm extract_reference_file(reffile); 521248616Smm 522248616Smm assert((a = archive_read_new()) != NULL); 523248616Smm assertEqualIntA(a, ARCHIVE_OK, 524248616Smm archive_read_support_filter_all(a)); 525248616Smm assertEqualIntA(a, ARCHIVE_OK, 526248616Smm archive_read_support_format_all(a)); 527248616Smm assertEqualIntA(a, ARCHIVE_OK, 528248616Smm archive_read_open_filename(a, reffile, 11)); 529248616Smm 530248616Smm /* 531248616Smm * Read "file", whose data is available on disk. 532248616Smm */ 533248616Smm f = fopen("file", "wb"); 534248616Smm assert(f != NULL); 535248616Smm assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 536248616Smm fclose(f); 537248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 538248616Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 539248616Smm assertEqualString(archive_entry_pathname(ae), "./file"); 540248616Smm assertEqualInt(archive_entry_uid(ae), 18); 541248616Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 542248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 543248616Smm assertEqualInt(archive_entry_size(ae), 3); 544248616Smm assertEqualInt(3, archive_read_data(a, buff, 3)); 545248616Smm assertEqualMem(buff, "hi\n", 3); 546248616Smm 547248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 548248616Smm assertEqualString(archive_entry_pathname(ae), "./dir"); 549248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 550248616Smm 551248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 552248616Smm assertEqualString(archive_entry_pathname(ae), "./dir/file with space"); 553248616Smm assertEqualInt(archive_entry_uid(ae), 18); 554248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 555248616Smm 556248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 557248616Smm assertEqualString(archive_entry_pathname(ae), "./file with space"); 558248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 559248616Smm 560248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 561248616Smm assertEqualString(archive_entry_pathname(ae), "./dir2"); 562248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 563248616Smm 564248616Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 565248616Smm assertEqualString(archive_entry_pathname(ae), "./dir2/dir3a"); 566248616Smm assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 567248616Smm 568248616Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 569248616Smm assertEqualInt(6, archive_file_count(a)); 570248616Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 571248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 572248616Smm} 573248616Smm 574248616Smm/* 575232153Smm * We should get a warning if the contents file doesn't exist. 576232153Smm */ 577248616SmmDEFINE_TEST(test_read_format_mtree_nonexistent_contents_file) 578232153Smm{ 579232153Smm static char archive[] = 580232153Smm "#mtree\n" 581232153Smm "a type=file contents=nonexistent_file\n"; 582232153Smm struct archive_entry *ae; 583232153Smm struct archive *a; 584232153Smm 585232153Smm assert((a = archive_read_new()) != NULL); 586232153Smm assertEqualIntA(a, ARCHIVE_OK, 587232153Smm archive_read_support_filter_all(a)); 588232153Smm assertEqualIntA(a, ARCHIVE_OK, 589232153Smm archive_read_support_format_all(a)); 590232153Smm assertEqualIntA(a, ARCHIVE_OK, 591232153Smm archive_read_open_memory(a, archive, sizeof(archive))); 592232153Smm assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 593232153Smm assert(strlen(archive_error_string(a)) > 0); 594232153Smm assertEqualString(archive_entry_pathname(ae), "a"); 595232153Smm assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 596232153Smm 597232153Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 598232153Smm assertEqualInt(1, archive_file_count(a)); 599232153Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 600232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 601232153Smm} 602232153Smm 603