1248590Smm/*- 2248590Smm * Copyright (c) 2012 Michihiro NAKAJIMA 3248590Smm * All rights reserved. 4248590Smm * 5248590Smm * Redistribution and use in source and binary forms, with or without 6248590Smm * modification, are permitted provided that the following conditions 7248590Smm * are met: 8248590Smm * 1. Redistributions of source code must retain the above copyright 9248590Smm * notice, this list of conditions and the following disclaimer 10248590Smm * in this position and unchanged. 11248590Smm * 2. Redistributions in binary form must reproduce the above copyright 12248590Smm * notice, this list of conditions and the following disclaimer in the 13248590Smm * documentation and/or other materials provided with the distribution. 14248590Smm * 15248590Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16248590Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17248590Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18248590Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19248590Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20248590Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21248590Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22248590Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23248590Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24248590Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25248590Smm */ 26248590Smm 27248590Smm#include "test.h" 28248590Smm__FBSDID("$FreeBSD$"); 29248590Smm 30248590Smm/* 31248590Smm * A basic exercise of lzop reading and writing. 32248590Smm */ 33248590Smm 34248590SmmDEFINE_TEST(test_write_filter_lzop) 35248590Smm{ 36248590Smm struct archive_entry *ae; 37248590Smm struct archive* a; 38248590Smm char *buff, *data; 39248590Smm size_t buffsize, datasize; 40248590Smm char path[16]; 41248590Smm size_t used1, used2; 42248590Smm int i, r, use_prog = 0; 43248590Smm 44248590Smm assert((a = archive_write_new()) != NULL); 45248590Smm r = archive_write_add_filter_lzop(a); 46248590Smm if (r != ARCHIVE_OK) { 47248590Smm if (canLzop() && r == ARCHIVE_WARN) 48248590Smm use_prog = 1; 49248590Smm else { 50248590Smm skipping("lzop writing not supported on this platform"); 51248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 52248590Smm return; 53248590Smm } 54248590Smm } 55248590Smm 56248590Smm buffsize = 2000000; 57248590Smm assert(NULL != (buff = (char *)malloc(buffsize))); 58248590Smm 59248590Smm datasize = 10000; 60248590Smm assert(NULL != (data = (char *)calloc(1, datasize))); 61248590Smm 62248590Smm /* 63248590Smm * Write a 100 files and read them all back. 64248590Smm */ 65248590Smm assert((a = archive_write_new()) != NULL); 66248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 67248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 68248590Smm archive_write_add_filter_lzop(a)); 69248590Smm assertEqualIntA(a, ARCHIVE_OK, 70248590Smm archive_write_set_bytes_per_block(a, 1024)); 71248590Smm assertEqualIntA(a, ARCHIVE_OK, 72248590Smm archive_write_set_bytes_in_last_block(a, 1024)); 73248590Smm assertEqualInt(ARCHIVE_FILTER_LZOP, archive_filter_code(a, 0)); 74248590Smm assertEqualString("lzop", archive_filter_name(a, 0)); 75248590Smm assertEqualIntA(a, ARCHIVE_OK, 76248590Smm archive_write_open_memory(a, buff, buffsize, &used1)); 77248590Smm assert((ae = archive_entry_new()) != NULL); 78248590Smm archive_entry_set_filetype(ae, AE_IFREG); 79248590Smm archive_entry_set_size(ae, datasize); 80248590Smm for (i = 0; i < 100; i++) { 81248590Smm sprintf(path, "file%03d", i); 82248590Smm archive_entry_copy_pathname(ae, path); 83248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 84248590Smm assertA(datasize 85248590Smm == (size_t)archive_write_data(a, data, datasize)); 86248590Smm } 87248590Smm archive_entry_free(ae); 88248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 89248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 90248590Smm 91248590Smm assert((a = archive_read_new()) != NULL); 92248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 93248590Smm r = archive_read_support_filter_lzop(a); 94248590Smm if (r == ARCHIVE_WARN) { 95248590Smm skipping("Can't verify lzop writing by reading back;" 96248590Smm " lzop reading not fully supported on this platform"); 97248590Smm } else { 98248590Smm assertEqualIntA(a, ARCHIVE_OK, 99248590Smm archive_read_open_memory(a, buff, used1)); 100248590Smm for (i = 0; i < 100; i++) { 101248590Smm sprintf(path, "file%03d", i); 102248590Smm if (!assertEqualInt(ARCHIVE_OK, 103248590Smm archive_read_next_header(a, &ae))) 104248590Smm break; 105248590Smm assertEqualString(path, archive_entry_pathname(ae)); 106248590Smm assertEqualInt((int)datasize, archive_entry_size(ae)); 107248590Smm } 108248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 109248590Smm } 110248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 111248590Smm 112248590Smm /* 113248590Smm * Repeat the cycle again, this time setting some compression 114248590Smm * options. 115248590Smm */ 116248590Smm assert((a = archive_write_new()) != NULL); 117248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 118248590Smm assertEqualIntA(a, ARCHIVE_OK, 119248590Smm archive_write_set_bytes_per_block(a, 10)); 120248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 121248590Smm archive_write_add_filter_lzop(a)); 122248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 123248590Smm archive_write_set_options(a, "lzop:nonexistent-option=0")); 124248590Smm assertEqualIntA(a, ARCHIVE_OK, 125248590Smm archive_write_set_options(a, "lzop:compression-level=1")); 126248590Smm assertEqualIntA(a, ARCHIVE_OK, 127248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "9")); 128248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 129248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "abc")); 130248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 131248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "99")); 132248590Smm assertEqualIntA(a, ARCHIVE_OK, 133248590Smm archive_write_set_options(a, "lzop:compression-level=9")); 134248590Smm assertEqualIntA(a, ARCHIVE_OK, 135248590Smm archive_write_open_memory(a, buff, buffsize, &used2)); 136248590Smm for (i = 0; i < 100; i++) { 137248590Smm sprintf(path, "file%03d", i); 138248590Smm assert((ae = archive_entry_new()) != NULL); 139248590Smm archive_entry_copy_pathname(ae, path); 140248590Smm archive_entry_set_size(ae, datasize); 141248590Smm archive_entry_set_filetype(ae, AE_IFREG); 142248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 143248590Smm assertA(datasize == (size_t)archive_write_data( 144248590Smm a, data, datasize)); 145248590Smm archive_entry_free(ae); 146248590Smm } 147248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 148248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 149248590Smm 150248590Smm failure("compression-level=9 wrote %d bytes, default wrote %d bytes", 151248590Smm (int)used2, (int)used1); 152248590Smm assert(used2 < used1); 153248590Smm 154248590Smm assert((a = archive_read_new()) != NULL); 155248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 156248590Smm r = archive_read_support_filter_lzop(a); 157248590Smm if (r != ARCHIVE_OK && !use_prog) { 158248590Smm skipping("lzop reading not fully supported on this platform"); 159248590Smm } else { 160248590Smm assertEqualIntA(a, ARCHIVE_OK, 161248590Smm archive_read_support_filter_all(a)); 162248590Smm assertEqualIntA(a, ARCHIVE_OK, 163248590Smm archive_read_open_memory(a, buff, used2)); 164248590Smm for (i = 0; i < 100; i++) { 165248590Smm sprintf(path, "file%03d", i); 166248590Smm if (!assertEqualInt(ARCHIVE_OK, 167248590Smm archive_read_next_header(a, &ae))) 168248590Smm break; 169248590Smm assertEqualString(path, archive_entry_pathname(ae)); 170248590Smm assertEqualInt((int)datasize, archive_entry_size(ae)); 171248590Smm } 172248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 173248590Smm } 174248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 175248590Smm 176248590Smm /* 177248590Smm * Repeat again, with much lower compression. 178248590Smm */ 179248590Smm assert((a = archive_write_new()) != NULL); 180248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 181248590Smm assertEqualIntA(a, ARCHIVE_OK, 182248590Smm archive_write_set_bytes_per_block(a, 10)); 183248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 184248590Smm archive_write_add_filter_lzop(a)); 185248590Smm assertEqualIntA(a, ARCHIVE_OK, 186248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "1")); 187248590Smm assertEqualIntA(a, ARCHIVE_OK, 188248590Smm archive_write_open_memory(a, buff, buffsize, &used2)); 189248590Smm for (i = 0; i < 100; i++) { 190248590Smm sprintf(path, "file%03d", i); 191248590Smm assert((ae = archive_entry_new()) != NULL); 192248590Smm archive_entry_copy_pathname(ae, path); 193248590Smm archive_entry_set_size(ae, datasize); 194248590Smm archive_entry_set_filetype(ae, AE_IFREG); 195248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 196248590Smm failure("Writing file %s", path); 197248590Smm assertEqualIntA(a, datasize, 198248590Smm (size_t)archive_write_data(a, data, datasize)); 199248590Smm archive_entry_free(ae); 200248590Smm } 201248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 202248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 203248590Smm 204248590Smm#if 0 205248590Smm failure("Compression-level=1 wrote %d bytes; default wrote %d bytes", 206248590Smm (int)used2, (int)used1); 207248590Smm assert(used2 > used1); 208248590Smm#endif 209248590Smm 210248590Smm assert((a = archive_read_new()) != NULL); 211248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 212248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 213248590Smm r = archive_read_support_filter_lzop(a); 214248590Smm if (r == ARCHIVE_WARN) { 215248590Smm skipping("lzop reading not fully supported on this platform"); 216248590Smm } else { 217248590Smm assertEqualIntA(a, ARCHIVE_OK, 218248590Smm archive_read_open_memory(a, buff, used2)); 219248590Smm for (i = 0; i < 100; i++) { 220248590Smm sprintf(path, "file%03d", i); 221248590Smm if (!assertEqualInt(ARCHIVE_OK, 222248590Smm archive_read_next_header(a, &ae))) 223248590Smm break; 224248590Smm assertEqualString(path, archive_entry_pathname(ae)); 225248590Smm assertEqualInt((int)datasize, archive_entry_size(ae)); 226248590Smm } 227248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 228248590Smm } 229248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 230248590Smm 231248590Smm /* 232248590Smm * Test various premature shutdown scenarios to make sure we 233248590Smm * don't crash or leak memory. 234248590Smm */ 235248590Smm assert((a = archive_write_new()) != NULL); 236248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 237248590Smm archive_write_add_filter_lzop(a)); 238248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 239248590Smm 240248590Smm assert((a = archive_write_new()) != NULL); 241248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 242248590Smm archive_write_add_filter_lzop(a)); 243248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 244248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 245248590Smm 246248590Smm assert((a = archive_write_new()) != NULL); 247248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 248248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 249248590Smm archive_write_add_filter_lzop(a)); 250248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 251248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 252248590Smm 253248590Smm assert((a = archive_write_new()) != NULL); 254248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 255248590Smm assertEqualIntA(a, (use_prog)?ARCHIVE_WARN:ARCHIVE_OK, 256248590Smm archive_write_add_filter_lzop(a)); 257248590Smm assertEqualIntA(a, ARCHIVE_OK, 258248590Smm archive_write_open_memory(a, buff, buffsize, &used2)); 259248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 260248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 261248590Smm 262248590Smm /* 263248590Smm * Clean up. 264248590Smm */ 265248590Smm free(data); 266248590Smm free(buff); 267248590Smm} 268