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 uuencode reading and writing. 32248590Smm */ 33248590Smm 34248590SmmDEFINE_TEST(test_write_filter_uuencode) 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; 43248590Smm 44248590Smm buffsize = 2000000; 45248590Smm assert(NULL != (buff = (char *)malloc(buffsize))); 46248590Smm 47248590Smm datasize = 10000; 48248590Smm assert(NULL != (data = (char *)malloc(datasize))); 49248590Smm memset(data, 0, datasize); 50248590Smm 51248590Smm /* 52248590Smm * Write a 100 files and read them all back. 53248590Smm */ 54248590Smm assert((a = archive_write_new()) != NULL); 55248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 56248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 57248590Smm assertEqualIntA(a, ARCHIVE_OK, 58248590Smm archive_write_set_bytes_per_block(a, 10)); 59248590Smm assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 60248590Smm assertEqualString("uuencode", archive_filter_name(a, 0)); 61248590Smm assertEqualIntA(a, ARCHIVE_OK, 62248590Smm archive_write_open_memory(a, buff, buffsize, &used1)); 63248590Smm for (i = 0; i < 99; i++) { 64248590Smm assert((ae = archive_entry_new()) != NULL); 65248590Smm archive_entry_set_filetype(ae, AE_IFREG); 66248590Smm archive_entry_set_size(ae, datasize); 67248590Smm sprintf(path, "file%03d", i); 68248590Smm archive_entry_copy_pathname(ae, path); 69248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 70248590Smm assertA(datasize 71248590Smm == (size_t)archive_write_data(a, data, datasize)); 72248590Smm archive_entry_free(ae); 73248590Smm } 74248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 75248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 76248590Smm 77248590Smm assert((a = archive_read_new()) != NULL); 78248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 79248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 80248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); 81248590Smm for (i = 0; i < 99; i++) { 82248590Smm sprintf(path, "file%03d", i); 83248590Smm if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) 84248590Smm break; 85248590Smm assertEqualString(path, archive_entry_pathname(ae)); 86248590Smm assertEqualInt((int)datasize, archive_entry_size(ae)); 87248590Smm } 88248590Smm assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 89248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 90248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 91248590Smm 92248590Smm /* 93248590Smm * Repeat the cycle again, this time setting name and mode 94248590Smm * options. 95248590Smm */ 96248590Smm assert((a = archive_write_new()) != NULL); 97248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 98248590Smm assertEqualIntA(a, ARCHIVE_OK, 99248590Smm archive_write_set_bytes_per_block(a, 10)); 100248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 101248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 102248590Smm archive_write_set_filter_option(a, NULL, "nonexistent-option", "0")); 103248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 104248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "abc")); 105248590Smm assertEqualIntA(a, ARCHIVE_FAILED, 106248590Smm archive_write_set_filter_option(a, NULL, "compression-level", "99")); 107248590Smm assertEqualIntA(a, ARCHIVE_OK, 108248590Smm archive_write_set_filter_option(a, NULL, "name", "test.tar")); 109248590Smm assertEqualIntA(a, ARCHIVE_OK, 110248590Smm archive_write_set_filter_option(a, NULL, "mode", "0640")); 111248590Smm assertEqualIntA(a, ARCHIVE_OK, 112248590Smm archive_write_open_memory(a, buff, buffsize, &used2)); 113248590Smm for (i = 0; i < 99; i++) { 114248590Smm sprintf(path, "file%03d", i); 115248590Smm assert((ae = archive_entry_new()) != NULL); 116248590Smm archive_entry_copy_pathname(ae, path); 117248590Smm archive_entry_set_size(ae, datasize); 118248590Smm archive_entry_set_filetype(ae, AE_IFREG); 119248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 120248590Smm assertA(datasize == (size_t)archive_write_data(a, data, datasize)); 121248590Smm archive_entry_free(ae); 122248590Smm } 123248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 124248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 125248590Smm 126248590Smm assert((a = archive_read_new()) != NULL); 127248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 128248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 129248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); 130248590Smm for (i = 0; i < 99; i++) { 131248590Smm sprintf(path, "file%03d", i); 132248590Smm if (!assertEqualInt(0, archive_read_next_header(a, &ae))) 133248590Smm break; 134248590Smm assertEqualString(path, archive_entry_pathname(ae)); 135248590Smm assertEqualInt((int)datasize, archive_entry_size(ae)); 136248590Smm } 137248590Smm assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 138248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 139248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 140248590Smm 141248590Smm /* 142248590Smm * Test various premature shutdown scenarios to make sure we 143248590Smm * don't crash or leak memory. 144248590Smm */ 145248590Smm assert((a = archive_write_new()) != NULL); 146248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 147248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 148248590Smm 149248590Smm assert((a = archive_write_new()) != NULL); 150248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 151248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 152248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 153248590Smm 154248590Smm assert((a = archive_write_new()) != NULL); 155248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 156248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 157248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 158248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 159248590Smm 160248590Smm assert((a = archive_write_new()) != NULL); 161248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 162248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 163248590Smm assertEqualIntA(a, ARCHIVE_OK, 164248590Smm archive_write_open_memory(a, buff, buffsize, &used2)); 165248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 166248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 167248590Smm 168248590Smm /* 169248590Smm * Clean up. 170248590Smm */ 171248590Smm free(data); 172248590Smm free(buff); 173248590Smm} 174