1299425Smm/*- 2299425Smm * Copyright (c) 2003-2008 Tim Kientzle 3299425Smm * Copyright (c) 2008 Anselm Strauss 4299425Smm * All rights reserved. 5299425Smm * 6299425Smm * Redistribution and use in source and binary forms, with or without 7299425Smm * modification, are permitted provided that the following conditions 8299425Smm * are met: 9299425Smm * 1. Redistributions of source code must retain the above copyright 10299425Smm * notice, this list of conditions and the following disclaimer. 11299425Smm * 2. Redistributions in binary form must reproduce the above copyright 12299425Smm * notice, this list of conditions and the following disclaimer in the 13299425Smm * documentation and/or other materials provided with the distribution. 14299425Smm * 15299425Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16299425Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17299425Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18299425Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19299425Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20299425Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21299425Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22299425Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23299425Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24299425Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25299425Smm */ 26299425Smm 27299425Smm/* 28299425Smm * Development supported by Google Summer of Code 2008. 29299425Smm */ 30299425Smm 31299425Smm#include "test.h" 32370535Sgit2svn__FBSDID("$FreeBSD: stable/11/contrib/libarchive/libarchive/test/test_write_read_format_zip.c 370535 2021-09-10 08:34:36Z git2svn $"); 33299425Smm 34299425Smm/* 35299425Smm * These tests verify that our reader can read files 36299425Smm * created by our writer. 37299425Smm */ 38299425Smm 39299425Smm/* 40299425Smm * Write a variety of different file types into the archive. 41299425Smm */ 42299425Smmstatic void 43299425Smmwrite_contents(struct archive *a) 44299425Smm{ 45299425Smm struct archive_entry *ae; 46299425Smm 47299425Smm /* 48299425Smm * First write things with the "default" compression. 49299425Smm * The library will choose "deflate" for most things if it's 50299425Smm * available, else "store". 51299425Smm */ 52299425Smm 53299425Smm /* 54299425Smm * Write a file to it. 55299425Smm */ 56299425Smm assert((ae = archive_entry_new()) != NULL); 57299425Smm archive_entry_set_mtime(ae, 1, 10); 58299425Smm archive_entry_copy_pathname(ae, "file"); 59299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 60299425Smm archive_entry_set_size(ae, 8); 61299425Smm assertEqualInt(0, archive_write_header(a, ae)); 62299425Smm archive_entry_free(ae); 63299425Smm assertEqualInt(8, archive_write_data(a, "12345678", 9)); 64299425Smm assertEqualInt(0, archive_write_data(a, "1", 1)); 65299425Smm 66299425Smm /* 67299425Smm * Write another file to it. 68299425Smm */ 69299425Smm assert((ae = archive_entry_new()) != NULL); 70299425Smm archive_entry_set_mtime(ae, 1, 10); 71299425Smm archive_entry_copy_pathname(ae, "file2"); 72299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 73299425Smm archive_entry_set_size(ae, 4); 74299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 75299425Smm archive_entry_free(ae); 76299425Smm assertEqualInt(4, archive_write_data(a, "1234", 4)); 77299425Smm 78299425Smm /* 79299425Smm * Write a file with an unknown size. 80299425Smm */ 81299425Smm assert((ae = archive_entry_new()) != NULL); 82299425Smm archive_entry_set_mtime(ae, 2, 15); 83299425Smm archive_entry_copy_pathname(ae, "file3"); 84299425Smm archive_entry_set_mode(ae, AE_IFREG | 0621); 85299425Smm archive_entry_unset_size(ae); 86299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 87299425Smm archive_entry_free(ae); 88299425Smm assertEqualInt(5, archive_write_data(a, "mnopq", 5)); 89299425Smm 90299425Smm /* 91299425Smm * Write symbolic link. 92299425Smm */ 93299425Smm assert((ae = archive_entry_new()) != NULL); 94299425Smm archive_entry_set_mtime(ae, 1, 10); 95299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 96299425Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 97299425Smm archive_entry_copy_pathname(ae, "symlink"); 98299425Smm assertEqualString("symlink", archive_entry_pathname(ae)); 99299425Smm archive_entry_copy_symlink(ae, "file1"); 100299425Smm assertEqualString("file1", archive_entry_symlink(ae)); 101299425Smm archive_entry_set_mode(ae, AE_IFLNK | 0755); 102299425Smm assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae)); 103299425Smm archive_entry_set_size(ae, 4); 104299425Smm 105299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 106299425Smm archive_entry_free(ae); 107299425Smm 108299425Smm /* 109299425Smm * Write a directory to it. 110299425Smm */ 111299425Smm assert((ae = archive_entry_new()) != NULL); 112299425Smm archive_entry_set_mtime(ae, 11, 110); 113299425Smm archive_entry_copy_pathname(ae, "dir"); 114299425Smm archive_entry_set_mode(ae, S_IFDIR | 0755); 115299425Smm archive_entry_set_size(ae, 512); 116299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 117299425Smm failure("size should be zero so that applications know not to write"); 118299425Smm assertEqualInt(0, archive_entry_size(ae)); 119299425Smm archive_entry_free(ae); 120299425Smm assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); 121299425Smm 122299425Smm /* 123299425Smm * Force "deflate" compression if the platform supports it. 124299425Smm */ 125299425Smm#ifdef HAVE_ZLIB_H 126299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_deflate(a)); 127299425Smm 128299425Smm /* 129299425Smm * Write a file to it. 130299425Smm */ 131299425Smm assert((ae = archive_entry_new()) != NULL); 132299425Smm archive_entry_set_mtime(ae, 1, 10); 133299425Smm archive_entry_copy_pathname(ae, "file_deflate"); 134299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 135299425Smm archive_entry_set_size(ae, 8); 136299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 137299425Smm archive_entry_free(ae); 138299425Smm assertEqualInt(8, archive_write_data(a, "12345678", 9)); 139299425Smm assertEqualInt(0, archive_write_data(a, "1", 1)); 140299425Smm 141299425Smm /* 142299425Smm * Write another file to it. 143299425Smm */ 144299425Smm assert((ae = archive_entry_new()) != NULL); 145299425Smm archive_entry_set_mtime(ae, 1, 10); 146299425Smm archive_entry_copy_pathname(ae, "file2_deflate"); 147299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 148299425Smm archive_entry_set_size(ae, 4); 149299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 150299425Smm archive_entry_free(ae); 151299425Smm assertEqualInt(4, archive_write_data(a, "1234", 4)); 152299425Smm 153299425Smm /* 154299425Smm * Write a file with an unknown size. 155299425Smm */ 156299425Smm assert((ae = archive_entry_new()) != NULL); 157299425Smm archive_entry_set_mtime(ae, 2, 15); 158299425Smm archive_entry_copy_pathname(ae, "file3_deflate"); 159299425Smm archive_entry_set_mode(ae, AE_IFREG | 0621); 160299425Smm archive_entry_unset_size(ae); 161299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 162299425Smm archive_entry_free(ae); 163299425Smm assertEqualInt(5, archive_write_data(a, "ghijk", 5)); 164299425Smm 165299425Smm /* 166299425Smm * Write symbolic like file to it. 167299425Smm */ 168299425Smm assert((ae = archive_entry_new()) != NULL); 169299425Smm archive_entry_set_mtime(ae, 1, 10); 170299425Smm archive_entry_copy_pathname(ae, "symlink_deflate"); 171299425Smm archive_entry_copy_symlink(ae, "file1"); 172299425Smm archive_entry_set_mode(ae, AE_IFLNK | 0755); 173299425Smm archive_entry_set_size(ae, 4); 174299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 175299425Smm archive_entry_free(ae); 176299425Smm 177299425Smm /* 178299425Smm * Write a directory to it. 179299425Smm */ 180299425Smm assert((ae = archive_entry_new()) != NULL); 181299425Smm archive_entry_set_mtime(ae, 11, 110); 182299425Smm archive_entry_copy_pathname(ae, "dir_deflate"); 183299425Smm archive_entry_set_mode(ae, S_IFDIR | 0755); 184299425Smm archive_entry_set_size(ae, 512); 185299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 186299425Smm failure("size should be zero so that applications know not to write"); 187299425Smm assertEqualInt(0, archive_entry_size(ae)); 188299425Smm archive_entry_free(ae); 189299425Smm assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); 190299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a)); 191299425Smm#endif 192299425Smm 193299425Smm /* 194299425Smm * Now write a bunch of entries with "store" compression. 195299425Smm */ 196299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_store(a)); 197299425Smm 198299425Smm /* 199299425Smm * Write a file to it. 200299425Smm */ 201299425Smm assert((ae = archive_entry_new()) != NULL); 202299425Smm archive_entry_set_mtime(ae, 1, 10); 203299425Smm archive_entry_copy_pathname(ae, "file_stored"); 204299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 205299425Smm archive_entry_set_size(ae, 8); 206299425Smm assertEqualInt(0, archive_write_header(a, ae)); 207299425Smm archive_entry_free(ae); 208299425Smm assertEqualInt(8, archive_write_data(a, "12345678", 9)); 209299425Smm assertEqualInt(0, archive_write_data(a, "1", 1)); 210299425Smm 211299425Smm /* 212299425Smm * Write another file to it. 213299425Smm */ 214299425Smm assert((ae = archive_entry_new()) != NULL); 215299425Smm archive_entry_set_mtime(ae, 1, 10); 216299425Smm archive_entry_copy_pathname(ae, "file2_stored"); 217299425Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 218299425Smm archive_entry_set_size(ae, 4); 219299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 220299425Smm archive_entry_free(ae); 221299425Smm assertEqualInt(4, archive_write_data(a, "ACEG", 4)); 222299425Smm 223299425Smm /* 224299425Smm * Write a file with an unknown size. 225299425Smm */ 226299425Smm assert((ae = archive_entry_new()) != NULL); 227299425Smm archive_entry_set_mtime(ae, 2, 15); 228299425Smm archive_entry_copy_pathname(ae, "file3_stored"); 229299425Smm archive_entry_set_mode(ae, AE_IFREG | 0621); 230299425Smm archive_entry_unset_size(ae); 231299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 232299425Smm archive_entry_free(ae); 233299425Smm assertEqualInt(5, archive_write_data(a, "ijklm", 5)); 234299425Smm 235299425Smm /* 236299425Smm * Write symbolic like file to it. 237299425Smm */ 238299425Smm assert((ae = archive_entry_new()) != NULL); 239299425Smm archive_entry_set_mtime(ae, 1, 10); 240299425Smm archive_entry_copy_pathname(ae, "symlink_stored"); 241299425Smm archive_entry_copy_symlink(ae, "file1"); 242299425Smm archive_entry_set_mode(ae, AE_IFLNK | 0755); 243299425Smm archive_entry_set_size(ae, 4); 244299425Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 245299425Smm archive_entry_free(ae); 246299425Smm 247299425Smm /* 248299425Smm * Write a directory to it. 249299425Smm */ 250299425Smm assert((ae = archive_entry_new()) != NULL); 251299425Smm archive_entry_set_mtime(ae, 11, 110); 252299425Smm archive_entry_copy_pathname(ae, "dir_stored"); 253299425Smm archive_entry_set_mode(ae, S_IFDIR | 0755); 254299425Smm archive_entry_set_size(ae, 512); 255299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 256299425Smm failure("size should be zero so that applications know not to write"); 257299425Smm assertEqualInt(0, archive_entry_size(ae)); 258299425Smm archive_entry_free(ae); 259299425Smm assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); 260299425Smm 261299425Smm 262299425Smm /* Close out the archive. */ 263299425Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 264299425Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 265299425Smm} 266299425Smm 267299425Smm/* 268299425Smm * Read back all of the entries and verify their values. 269299425Smm */ 270299425Smmstatic void 271299425Smmverify_contents(struct archive *a, int seeking, int improved_streaming) 272299425Smm{ 273299425Smm char filedata[64]; 274299425Smm struct archive_entry *ae; 275299425Smm 276299425Smm /* 277299425Smm * Default compression options: 278299425Smm */ 279299425Smm 280299425Smm /* Read and verify first file. */ 281299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 282299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 283299425Smm /* Zip doesn't store high-resolution mtime. */ 284299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 285299425Smm assertEqualInt(0, archive_entry_atime(ae)); 286299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 287299425Smm assertEqualString("file", archive_entry_pathname(ae)); 288299425Smm if (seeking || improved_streaming) { 289299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 290299425Smm } 291299425Smm assertEqualInt(8, archive_entry_size(ae)); 292299425Smm assert(archive_entry_size_is_set(ae)); 293299425Smm assertEqualIntA(a, 8, 294299425Smm archive_read_data(a, filedata, sizeof(filedata))); 295299425Smm assertEqualMem(filedata, "12345678", 8); 296299425Smm 297299425Smm 298299425Smm /* Read the second file back. */ 299299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 300299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 301299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 302299425Smm assertEqualInt(0, archive_entry_atime(ae)); 303299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 304299425Smm assertEqualString("file2", archive_entry_pathname(ae)); 305299425Smm if (seeking || improved_streaming) { 306299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 307299425Smm } 308299425Smm assertEqualInt(4, archive_entry_size(ae)); 309299425Smm assert(archive_entry_size_is_set(ae)); 310299425Smm assertEqualIntA(a, 4, 311299425Smm archive_read_data(a, filedata, sizeof(filedata))); 312299425Smm assertEqualMem(filedata, "1234", 4); 313299425Smm 314299425Smm /* Read the third file back. */ 315299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 316299425Smm assertEqualInt(2, archive_entry_mtime(ae)); 317299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 318299425Smm assertEqualInt(0, archive_entry_atime(ae)); 319299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 320299425Smm assertEqualString("file3", archive_entry_pathname(ae)); 321299425Smm if (seeking || improved_streaming) { 322299425Smm assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); 323299425Smm } 324299425Smm if (seeking) { 325299425Smm assertEqualInt(5, archive_entry_size(ae)); 326299425Smm } else { 327299425Smm assertEqualInt(0, archive_entry_size_is_set(ae)); 328299425Smm } 329299425Smm assertEqualIntA(a, 5, 330299425Smm archive_read_data(a, filedata, sizeof(filedata))); 331299425Smm assertEqualMem(filedata, "mnopq", 5); 332299425Smm 333299425Smm /* Read symlink. */ 334299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 335299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 336299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 337299425Smm assertEqualInt(0, archive_entry_atime(ae)); 338299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 339299425Smm assertEqualString("symlink", archive_entry_pathname(ae)); 340299425Smm if (seeking || improved_streaming) { 341299425Smm assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae)); 342299425Smm assertEqualInt(0, archive_entry_size(ae)); 343299425Smm assertEqualString("file1", archive_entry_symlink(ae)); 344299425Smm } else { 345299425Smm /* Streaming cannot read file type, so 346299425Smm * symlink body shows as regular file contents. */ 347299425Smm assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); 348299425Smm assertEqualInt(5, archive_entry_size(ae)); 349299425Smm assert(archive_entry_size_is_set(ae)); 350299425Smm } 351299425Smm 352299425Smm /* Read the dir entry back. */ 353299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 354299425Smm assertEqualInt(11, archive_entry_mtime(ae)); 355299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 356299425Smm assertEqualInt(0, archive_entry_atime(ae)); 357299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 358299425Smm assertEqualString("dir/", archive_entry_pathname(ae)); 359299425Smm if (seeking || improved_streaming) 360299425Smm assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); 361299425Smm assertEqualInt(0, archive_entry_size(ae)); 362299425Smm assert(archive_entry_size_is_set(ae)); 363299425Smm assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); 364299425Smm 365299425Smm#ifdef HAVE_ZLIB_H 366299425Smm /* 367299425Smm * Deflate compression option: 368299425Smm */ 369299425Smm 370299425Smm /* Read and verify first file. */ 371299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 372299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 373299425Smm /* Zip doesn't store high-resolution mtime. */ 374299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 375299425Smm assertEqualInt(0, archive_entry_atime(ae)); 376299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 377299425Smm assertEqualString("file_deflate", archive_entry_pathname(ae)); 378299425Smm if (seeking || improved_streaming) { 379299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 380299425Smm } 381299425Smm assertEqualInt(8, archive_entry_size(ae)); 382299425Smm assert(archive_entry_size_is_set(ae)); 383299425Smm assertEqualIntA(a, 8, 384299425Smm archive_read_data(a, filedata, sizeof(filedata))); 385299425Smm assertEqualMem(filedata, "12345678", 8); 386299425Smm 387299425Smm 388299425Smm /* Read the second file back. */ 389299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 390299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 391299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 392299425Smm assertEqualInt(0, archive_entry_atime(ae)); 393299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 394299425Smm assertEqualString("file2_deflate", archive_entry_pathname(ae)); 395299425Smm if (seeking || improved_streaming) { 396299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 397299425Smm } 398299425Smm assertEqualInt(4, archive_entry_size(ae)); 399299425Smm assert(archive_entry_size_is_set(ae)); 400299425Smm assertEqualIntA(a, 4, 401299425Smm archive_read_data(a, filedata, sizeof(filedata))); 402299425Smm assertEqualMem(filedata, "1234", 4); 403299425Smm 404299425Smm /* Read the third file back. */ 405299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 406299425Smm assertEqualInt(2, archive_entry_mtime(ae)); 407299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 408299425Smm assertEqualInt(0, archive_entry_atime(ae)); 409299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 410299425Smm assertEqualString("file3_deflate", archive_entry_pathname(ae)); 411299425Smm if (seeking || improved_streaming) { 412299425Smm assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); 413299425Smm } 414299425Smm if (seeking) { 415299425Smm assertEqualInt(5, archive_entry_size(ae)); 416299425Smm } else { 417299425Smm assertEqualInt(0, archive_entry_size_is_set(ae)); 418299425Smm } 419299425Smm assertEqualIntA(a, 5, 420299425Smm archive_read_data(a, filedata, sizeof(filedata))); 421299425Smm assertEqualMem(filedata, "ghijk", 4); 422299425Smm 423299425Smm /* Read symlink. */ 424299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 425299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 426299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 427299425Smm assertEqualInt(0, archive_entry_atime(ae)); 428299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 429299425Smm assertEqualString("symlink_deflate", archive_entry_pathname(ae)); 430299425Smm if (seeking || improved_streaming) { 431299425Smm assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae)); 432299425Smm assertEqualInt(0, archive_entry_size(ae)); 433299425Smm assertEqualString("file1", archive_entry_symlink(ae)); 434299425Smm } else { 435299425Smm assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); 436299425Smm assertEqualInt(5, archive_entry_size(ae)); 437299425Smm assertEqualIntA(a, 5, archive_read_data(a, filedata, 10)); 438299425Smm assertEqualMem(filedata, "file1", 5); 439299425Smm } 440299425Smm 441299425Smm /* Read the dir entry back. */ 442299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 443299425Smm assertEqualInt(11, archive_entry_mtime(ae)); 444299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 445299425Smm assertEqualInt(0, archive_entry_atime(ae)); 446299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 447299425Smm assertEqualString("dir_deflate/", archive_entry_pathname(ae)); 448299425Smm if (seeking) { 449299425Smm assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); 450299425Smm } 451299425Smm assertEqualInt(0, archive_entry_size(ae)); 452299425Smm assert(archive_entry_size_is_set(ae)); 453299425Smm assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); 454299425Smm#endif 455299425Smm 456299425Smm /* 457299425Smm * Store compression option: 458299425Smm */ 459299425Smm 460299425Smm /* Read and verify first file. */ 461299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 462299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 463299425Smm /* Zip doesn't store high-resolution mtime. */ 464299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 465299425Smm assertEqualInt(0, archive_entry_atime(ae)); 466299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 467299425Smm assertEqualString("file_stored", archive_entry_pathname(ae)); 468299425Smm if (seeking || improved_streaming) { 469299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 470299425Smm } 471299425Smm assert(archive_entry_size_is_set(ae)); 472299425Smm assert(archive_entry_size_is_set(ae)); 473299425Smm assertEqualInt(8, archive_entry_size(ae)); 474299425Smm assertEqualIntA(a, 8, 475299425Smm archive_read_data(a, filedata, sizeof(filedata))); 476299425Smm assertEqualMem(filedata, "12345678", 8); 477299425Smm 478299425Smm 479299425Smm /* Read the second file back. */ 480299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 481299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 482299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 483299425Smm assertEqualInt(0, archive_entry_atime(ae)); 484299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 485299425Smm assertEqualString("file2_stored", archive_entry_pathname(ae)); 486299425Smm if (seeking || improved_streaming) { 487299425Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 488299425Smm } 489299425Smm assertEqualInt(4, archive_entry_size(ae)); 490299425Smm assert(archive_entry_size_is_set(ae)); 491299425Smm assertEqualIntA(a, 4, 492299425Smm archive_read_data(a, filedata, sizeof(filedata))); 493299425Smm assertEqualMem(filedata, "ACEG", 4); 494299425Smm 495299425Smm /* Read the third file back. */ 496299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 497299425Smm assertEqualInt(2, archive_entry_mtime(ae)); 498299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 499299425Smm assertEqualInt(0, archive_entry_atime(ae)); 500299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 501299425Smm assertEqualString("file3_stored", archive_entry_pathname(ae)); 502299425Smm if (seeking || improved_streaming) 503299425Smm assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); 504299425Smm if (seeking) { 505299425Smm assertEqualInt(5, archive_entry_size(ae)); 506299425Smm } else { 507299425Smm assertEqualInt(0, archive_entry_size_is_set(ae)); 508299425Smm } 509299425Smm assertEqualIntA(a, 5, 510299425Smm archive_read_data(a, filedata, sizeof(filedata))); 511299425Smm assertEqualMem(filedata, "ijklm", 4); 512299425Smm 513299425Smm /* Read symlink. */ 514299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 515299425Smm assertEqualInt(1, archive_entry_mtime(ae)); 516299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 517299425Smm assertEqualInt(0, archive_entry_atime(ae)); 518299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 519299425Smm assertEqualString("symlink_stored", archive_entry_pathname(ae)); 520299425Smm if (seeking || improved_streaming) { 521299425Smm assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae)); 522299425Smm assertEqualInt(0, archive_entry_size(ae)); 523299425Smm assertEqualString("file1", archive_entry_symlink(ae)); 524299425Smm } else { 525299425Smm assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); 526299425Smm assertEqualInt(5, archive_entry_size(ae)); 527299425Smm assertEqualIntA(a, 5, archive_read_data(a, filedata, 10)); 528299425Smm assertEqualMem(filedata, "file1", 5); 529299425Smm } 530299425Smm 531299425Smm /* Read the dir entry back. */ 532299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 533299425Smm assertEqualInt(11, archive_entry_mtime(ae)); 534299425Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 535299425Smm assertEqualInt(0, archive_entry_atime(ae)); 536299425Smm assertEqualInt(0, archive_entry_ctime(ae)); 537299425Smm assertEqualString("dir_stored/", archive_entry_pathname(ae)); 538299425Smm if (seeking || improved_streaming) 539299425Smm assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); 540299425Smm assertEqualInt(0, archive_entry_size(ae)); 541299425Smm assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); 542299425Smm 543299425Smm /* Verify the end of the archive. */ 544299425Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 545299425Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 546299425Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 547299425Smm} 548299425Smm 549299425Smm/* 550299425Smm * Do a write-then-read roundtrip. 551299425Smm */ 552299425SmmDEFINE_TEST(test_write_read_format_zip) 553299425Smm{ 554299425Smm struct archive *a; 555299425Smm size_t used; 556299425Smm size_t buffsize = 1000000; 557299425Smm char *buff; 558299425Smm 559299425Smm buff = malloc(buffsize); 560299425Smm 561299425Smm /* Create a new archive in memory. */ 562299425Smm assert((a = archive_write_new()) != NULL); 563299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); 564299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 565299425Smm assertEqualIntA(a, ARCHIVE_OK, 566299425Smm archive_write_open_memory(a, buff, buffsize, &used)); 567299425Smm write_contents(a); 568299425Smm dumpfile("constructed.zip", buff, used); 569299425Smm 570299425Smm /* 571299425Smm * Now, read the data back. 572299425Smm */ 573299425Smm /* With the standard memory reader. */ 574299425Smm assert((a = archive_read_new()) != NULL); 575299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 576299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 577299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); 578299425Smm verify_contents(a, 1, 0); 579299425Smm 580299425Smm /* With the test memory reader -- streaming mode. */ 581299425Smm assert((a = archive_read_new()) != NULL); 582299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 583299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 584299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7)); 585299425Smm /* Streaming reader doesn't see mode information from Central Directory. */ 586299425Smm verify_contents(a, 0, 0); 587299425Smm 588299425Smm /* With the test memory reader -- seeking mode. */ 589299425Smm assert((a = archive_read_new()) != NULL); 590299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 591299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 592299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 593299425Smm verify_contents(a, 1, 0); 594299425Smm 595299425Smm free(buff); 596299425Smm} 597299425Smm 598299425Smm/* 599299425Smm * Do a write-then-read roundtrip with 'el' extension enabled. 600299425Smm */ 601299425SmmDEFINE_TEST(test_write_read_format_zip_improved_streaming) 602299425Smm{ 603299425Smm struct archive *a; 604299425Smm size_t used; 605299425Smm size_t buffsize = 1000000; 606299425Smm char *buff; 607299425Smm 608299425Smm buff = malloc(buffsize); 609299425Smm 610299425Smm /* Create a new archive in memory. */ 611299425Smm assert((a = archive_write_new()) != NULL); 612299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); 613299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 614299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental")); 615299425Smm assertEqualIntA(a, ARCHIVE_OK, 616299425Smm archive_write_open_memory(a, buff, buffsize, &used)); 617299425Smm write_contents(a); 618299425Smm dumpfile("constructed.zip", buff, used); 619299425Smm 620299425Smm /* 621299425Smm * Now, read the data back. 622299425Smm */ 623299425Smm /* With the standard memory reader. */ 624299425Smm assert((a = archive_read_new()) != NULL); 625299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 626299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 627299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); 628299425Smm verify_contents(a, 1, 1); 629299425Smm 630299425Smm /* With the test memory reader -- streaming mode. */ 631299425Smm assert((a = archive_read_new()) != NULL); 632299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 633299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 634299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7)); 635299425Smm /* Streaming reader doesn't see mode information from Central Directory. */ 636299425Smm verify_contents(a, 0, 1); 637299425Smm 638299425Smm /* With the test memory reader -- seeking mode. */ 639299425Smm assert((a = archive_read_new()) != NULL); 640299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 641299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 642299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 643299425Smm verify_contents(a, 1, 1); 644299425Smm 645299425Smm free(buff); 646299425Smm} 647299425Smm 648299425Smm/* 649299425Smm * Do a write-then-read roundtrip with Zip64 enabled. 650299425Smm */ 651299425SmmDEFINE_TEST(test_write_read_format_zip64) 652299425Smm{ 653299425Smm struct archive *a; 654299425Smm size_t used; 655299425Smm size_t buffsize = 1000000; 656299425Smm char *buff; 657299425Smm 658299425Smm buff = malloc(buffsize); 659299425Smm 660299425Smm /* Create a new archive in memory. */ 661299425Smm assert((a = archive_write_new()) != NULL); 662299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); 663299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 664299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64")); 665299425Smm#if ZIP_IMPROVED_STREAMING 666299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental")); 667299425Smm#endif 668299425Smm assertEqualIntA(a, ARCHIVE_OK, 669299425Smm archive_write_open_memory(a, buff, buffsize, &used)); 670299425Smm write_contents(a); 671299425Smm dumpfile("constructed64.zip", buff, used); 672299425Smm 673299425Smm /* 674299425Smm * Now, read the data back. 675299425Smm */ 676299425Smm /* With the standard memory reader. */ 677299425Smm assert((a = archive_read_new()) != NULL); 678299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 679299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 680299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); 681299425Smm verify_contents(a, 1, 0); 682299425Smm 683299425Smm /* With the test memory reader -- streaming mode. */ 684299425Smm assert((a = archive_read_new()) != NULL); 685299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 686299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 687299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7)); 688299425Smm /* Streaming reader doesn't see mode information from Central Directory. */ 689299425Smm verify_contents(a, 0, 0); 690299425Smm 691299425Smm /* With the test memory reader -- seeking mode. */ 692299425Smm assert((a = archive_read_new()) != NULL); 693299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 694299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 695299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 696299425Smm verify_contents(a, 1, 0); 697299425Smm 698299425Smm free(buff); 699299425Smm} 700299425Smm 701299425Smm 702299425Smm/* 703299425Smm * Do a write-then-read roundtrip with Zip64 enabled and 'el' extension enabled. 704299425Smm */ 705299425SmmDEFINE_TEST(test_write_read_format_zip64_improved_streaming) 706299425Smm{ 707299425Smm struct archive *a; 708299425Smm size_t used; 709299425Smm size_t buffsize = 1000000; 710299425Smm char *buff; 711299425Smm 712299425Smm buff = malloc(buffsize); 713299425Smm 714299425Smm /* Create a new archive in memory. */ 715299425Smm assert((a = archive_write_new()) != NULL); 716299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); 717299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 718299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64")); 719299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental")); 720299425Smm assertEqualIntA(a, ARCHIVE_OK, 721299425Smm archive_write_open_memory(a, buff, buffsize, &used)); 722299425Smm write_contents(a); 723299425Smm dumpfile("constructed64.zip", buff, used); 724299425Smm 725299425Smm /* 726299425Smm * Now, read the data back. 727299425Smm */ 728299425Smm /* With the standard memory reader. */ 729299425Smm assert((a = archive_read_new()) != NULL); 730299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 731299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 732299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); 733299425Smm verify_contents(a, 1, 1); 734299425Smm 735299425Smm /* With the test memory reader -- streaming mode. */ 736299425Smm assert((a = archive_read_new()) != NULL); 737299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 738299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 739299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7)); 740299425Smm /* Streaming reader doesn't see mode information from Central Directory. */ 741299425Smm verify_contents(a, 0, 1); 742299425Smm 743299425Smm /* With the test memory reader -- seeking mode. */ 744299425Smm assert((a = archive_read_new()) != NULL); 745299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 746299425Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 747299425Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 748299425Smm verify_contents(a, 1, 1); 749299425Smm 750299425Smm free(buff); 751299425Smm} 752