test_write_filter_lzop.c revision 303975
17011SN/A/*- 27011SN/A * Copyright (c) 2012 Michihiro NAKAJIMA 37011SN/A * All rights reserved. 47011SN/A * 57011SN/A * Redistribution and use in source and binary forms, with or without 67011SN/A * modification, are permitted provided that the following conditions 77011SN/A * are met: 87011SN/A * 1. Redistributions of source code must retain the above copyright 97011SN/A * notice, this list of conditions and the following disclaimer 107011SN/A * in this position and unchanged. 117011SN/A * 2. Redistributions in binary form must reproduce the above copyright 127011SN/A * notice, this list of conditions and the following disclaimer in the 137011SN/A * documentation and/or other materials provided with the distribution. 147011SN/A * 157011SN/A * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 167011SN/A * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 177011SN/A * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 187011SN/A * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 197011SN/A * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 207011SN/A * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 217011SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 227011SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 237011SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 247011SN/A * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 257011SN/A */ 267011SN/A 277011SN/A#include "test.h" 287011SN/A__FBSDID("$FreeBSD$"); 297011SN/A 307011SN/A/* 317651SN/A * A basic exercise of lzop reading and writing. 327011SN/A */ 337011SN/A 347011SN/ADEFINE_TEST(test_write_filter_lzop) 359091SN/A{ 367011SN/A struct archive_entry *ae; 377011SN/A struct archive* a; 387011SN/A char *buff, *data; 397011SN/A size_t buffsize, datasize; 407011SN/A char path[16]; 417011SN/A size_t used1, used2; 427011SN/A int i, r, use_prog = 0, filecount; 437011SN/A 447011SN/A assert((a = archive_write_new()) != NULL); 457011SN/A r = archive_write_add_filter_lzop(a); 467011SN/A if (r != ARCHIVE_OK) { 477011SN/A if (canLzop() && r == ARCHIVE_WARN) 487011SN/A use_prog = 1; 497011SN/A else { 507011SN/A skipping("lzop writing not supported on this platform"); 517011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 527011SN/A return; 537011SN/A } 547011SN/A } 557011SN/A 567011SN/A buffsize = 2000000; 577011SN/A assert(NULL != (buff = (char *)malloc(buffsize))); 587011SN/A 597011SN/A datasize = 10000; 607011SN/A assert(NULL != (data = (char *)calloc(1, datasize))); 617011SN/A filecount = 10; 627011SN/A 637011SN/A /* 647011SN/A * Write a filecount files and read them all back. 657011SN/A */ 667011SN/A assert((a = archive_write_new()) != NULL); 677011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 687011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 697011SN/A archive_write_add_filter_lzop(a)); 707011SN/A assertEqualIntA(a, ARCHIVE_OK, 717011SN/A archive_write_set_bytes_per_block(a, 1024)); 727011SN/A assertEqualIntA(a, ARCHIVE_OK, 737011SN/A archive_write_set_bytes_in_last_block(a, 1024)); 747011SN/A assertEqualInt(ARCHIVE_FILTER_LZOP, archive_filter_code(a, 0)); 757011SN/A assertEqualString("lzop", archive_filter_name(a, 0)); 767011SN/A assertEqualIntA(a, ARCHIVE_OK, 777011SN/A archive_write_open_memory(a, buff, buffsize, &used1)); 787011SN/A assert((ae = archive_entry_new()) != NULL); 797011SN/A archive_entry_set_filetype(ae, AE_IFREG); 807011SN/A archive_entry_set_size(ae, datasize); 817011SN/A for (i = 0; i < filecount; i++) { 827011SN/A sprintf(path, "file%03d", i); 837011SN/A archive_entry_copy_pathname(ae, path); 847011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 857011SN/A assertA(datasize 867011SN/A == (size_t)archive_write_data(a, data, datasize)); 877011SN/A } 887011SN/A archive_entry_free(ae); 897011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 907011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 917011SN/A 927011SN/A assert((a = archive_read_new()) != NULL); 937011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 947011SN/A r = archive_read_support_filter_lzop(a); 957011SN/A if (r == ARCHIVE_WARN) { 967011SN/A skipping("Can't verify lzop writing by reading back;" 977011SN/A " lzop reading not fully supported on this platform"); 987011SN/A } else { 997011SN/A assertEqualIntA(a, ARCHIVE_OK, 1007011SN/A archive_read_open_memory(a, buff, used1)); 1017011SN/A for (i = 0; i < filecount; i++) { 1027011SN/A sprintf(path, "file%03d", i); 1037011SN/A if (!assertEqualInt(ARCHIVE_OK, 1047011SN/A archive_read_next_header(a, &ae))) 1057011SN/A break; 1067011SN/A assertEqualString(path, archive_entry_pathname(ae)); 1077011SN/A assertEqualInt((int)datasize, archive_entry_size(ae)); 1087011SN/A } 1097011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 1107011SN/A } 1117011SN/A assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1127011SN/A 1137011SN/A /* 1147011SN/A * Repeat the cycle again, this time setting some compression 1157011SN/A * options. 1167011SN/A */ 1177011SN/A assert((a = archive_write_new()) != NULL); 1187011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 1197011SN/A assertEqualIntA(a, ARCHIVE_OK, 1207011SN/A archive_write_set_bytes_per_block(a, 10)); 1217011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 1227011SN/A archive_write_add_filter_lzop(a)); 1237011SN/A assertEqualIntA(a, ARCHIVE_FAILED, 1247011SN/A archive_write_set_options(a, "lzop:nonexistent-option=0")); 1257011SN/A assertEqualIntA(a, ARCHIVE_OK, 1267011SN/A archive_write_set_options(a, "lzop:compression-level=1")); 1277011SN/A assertEqualIntA(a, ARCHIVE_OK, 1287011SN/A archive_write_set_filter_option(a, NULL, "compression-level", "9")); 1297011SN/A assertEqualIntA(a, ARCHIVE_FAILED, 1307011SN/A archive_write_set_filter_option(a, NULL, "compression-level", "abc")); 1317011SN/A assertEqualIntA(a, ARCHIVE_FAILED, 1327011SN/A archive_write_set_filter_option(a, NULL, "compression-level", "99")); 13312745Smartin assertEqualIntA(a, ARCHIVE_OK, 1347011SN/A archive_write_set_options(a, "lzop:compression-level=9")); 1357011SN/A assertEqualIntA(a, ARCHIVE_OK, 1367011SN/A archive_write_open_memory(a, buff, buffsize, &used2)); 1377011SN/A for (i = 0; i < filecount; i++) { 1387011SN/A sprintf(path, "file%03d", i); 1397011SN/A assert((ae = archive_entry_new()) != NULL); 1407011SN/A archive_entry_copy_pathname(ae, path); 1417011SN/A archive_entry_set_size(ae, datasize); 1427011SN/A archive_entry_set_filetype(ae, AE_IFREG); 1437011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 1447011SN/A assertA(datasize == (size_t)archive_write_data( 1457011SN/A a, data, datasize)); 1467011SN/A archive_entry_free(ae); 1477011SN/A } 1487011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 1497011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 1507011SN/A 1517011SN/A failure("compression-level=9 wrote %d bytes, default wrote %d bytes", 1527011SN/A (int)used2, (int)used1); 1537011SN/A assert(used2 < used1); 1547011SN/A 1557011SN/A assert((a = archive_read_new()) != NULL); 1567011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 1577011SN/A r = archive_read_support_filter_lzop(a); 1587011SN/A if (r != ARCHIVE_OK && !use_prog) { 1597011SN/A skipping("lzop reading not fully supported on this platform"); 1607011SN/A } else { 1617011SN/A assertEqualIntA(a, ARCHIVE_OK, 1627011SN/A archive_read_support_filter_all(a)); 1637011SN/A assertEqualIntA(a, ARCHIVE_OK, 1647011SN/A archive_read_open_memory(a, buff, used2)); 1657011SN/A for (i = 0; i < filecount; i++) { 1667011SN/A sprintf(path, "file%03d", i); 1677011SN/A if (!assertEqualInt(ARCHIVE_OK, 1687011SN/A archive_read_next_header(a, &ae))) 1697011SN/A break; 1707011SN/A assertEqualString(path, archive_entry_pathname(ae)); 1717011SN/A assertEqualInt((int)datasize, archive_entry_size(ae)); 1727011SN/A } 1737011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 1747651SN/A } 1757011SN/A assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1767011SN/A 1777011SN/A /* 1787011SN/A * Repeat again, with much lower compression. 1797011SN/A */ 1807011SN/A assert((a = archive_write_new()) != NULL); 1817011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 1827011SN/A assertEqualIntA(a, ARCHIVE_OK, 1837011SN/A archive_write_set_bytes_per_block(a, 10)); 1847011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 1857011SN/A archive_write_add_filter_lzop(a)); 1867011SN/A assertEqualIntA(a, ARCHIVE_OK, 1877011SN/A archive_write_set_filter_option(a, NULL, "compression-level", "1")); 1887011SN/A assertEqualIntA(a, ARCHIVE_OK, 1897651SN/A archive_write_open_memory(a, buff, buffsize, &used2)); 1907011SN/A for (i = 0; i < filecount; i++) { 1917011SN/A sprintf(path, "file%03d", i); 1927011SN/A assert((ae = archive_entry_new()) != NULL); 1937011SN/A archive_entry_copy_pathname(ae, path); 1947011SN/A archive_entry_set_size(ae, datasize); 1957011SN/A archive_entry_set_filetype(ae, AE_IFREG); 1967011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 1977011SN/A failure("Writing file %s", path); 1987011SN/A assertEqualIntA(a, datasize, 1997011SN/A (size_t)archive_write_data(a, data, datasize)); 2007011SN/A archive_entry_free(ae); 2017011SN/A } 2027011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 2037011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 2047011SN/A 2057011SN/A#if 0 2067011SN/A failure("Compression-level=1 wrote %d bytes; default wrote %d bytes", 2077011SN/A (int)used2, (int)used1); 2087011SN/A assert(used2 > used1); 2097011SN/A#endif 2107651SN/A 2117011SN/A assert((a = archive_read_new()) != NULL); 2127011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 2137011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 2147011SN/A r = archive_read_support_filter_lzop(a); 2157011SN/A if (r == ARCHIVE_WARN) { 2167011SN/A skipping("lzop reading not fully supported on this platform"); 2177011SN/A } else { 2187011SN/A assertEqualIntA(a, ARCHIVE_OK, 2197011SN/A archive_read_open_memory(a, buff, used2)); 2207011SN/A for (i = 0; i < filecount; i++) { 2217011SN/A sprintf(path, "file%03d", i); 2227011SN/A if (!assertEqualInt(ARCHIVE_OK, 2237011SN/A archive_read_next_header(a, &ae))) 2247011SN/A break; 2257011SN/A assertEqualString(path, archive_entry_pathname(ae)); 2267011SN/A assertEqualInt((int)datasize, archive_entry_size(ae)); 2277011SN/A } 2287011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 2297011SN/A } 2307011SN/A assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 2317651SN/A 2327011SN/A /* 2337011SN/A * Test various premature shutdown scenarios to make sure we 2347011SN/A * don't crash or leak memory. 2357011SN/A */ 2367011SN/A assert((a = archive_write_new()) != NULL); 2377011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 2387011SN/A archive_write_add_filter_lzop(a)); 2397011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 2407011SN/A 2417011SN/A assert((a = archive_write_new()) != NULL); 2427011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 2437011SN/A archive_write_add_filter_lzop(a)); 2447011SN/A assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 2457011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 2467011SN/A 2477011SN/A assert((a = archive_write_new()) != NULL); 2487011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 2497011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 2507011SN/A archive_write_add_filter_lzop(a)); 2517011SN/A assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 2527011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 2537817SN/A 2547651SN/A assert((a = archive_write_new()) != NULL); 2557011SN/A assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 2567011SN/A assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 2577011SN/A archive_write_add_filter_lzop(a)); 2587651SN/A assertEqualIntA(a, ARCHIVE_OK, 2597011SN/A archive_write_open_memory(a, buff, buffsize, &used2)); 2607011SN/A assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 2617011SN/A assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 2627011SN/A 2637011SN/A /* 2647651SN/A * Clean up. 2657651SN/A */ 2667011SN/A free(data); 2677651SN/A free(buff); 2687011SN/A} 2697011SN/A