1228753Smm/*- 2228753Smm * Copyright (c) 2003-2010 Tim Kientzle 3228753Smm * All rights reserved. 4228753Smm * 5228753Smm * Redistribution and use in source and binary forms, with or without 6228753Smm * modification, are permitted provided that the following conditions 7228753Smm * are met: 8228753Smm * 1. Redistributions of source code must retain the above copyright 9228753Smm * notice, this list of conditions and the following disclaimer. 10228753Smm * 2. Redistributions in binary form must reproduce the above copyright 11228753Smm * notice, this list of conditions and the following disclaimer in the 12228753Smm * documentation and/or other materials provided with the distribution. 13228753Smm * 14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24228753Smm */ 25228753Smm#include "test.h" 26228753Smm__FBSDID("$FreeBSD$"); 27228753Smm 28228753Smm#define MAGIC 123456789 29228753Smmstruct my_data { 30228753Smm int magic; 31228753Smm int read_return; 32228753Smm int read_called; 33228753Smm int write_return; 34228753Smm int write_called; 35228753Smm int open_return; 36228753Smm int open_called; 37228753Smm int close_return; 38228753Smm int close_called; 39228753Smm}; 40228753Smm 41228753Smmstatic ssize_t 42228753Smmmy_read(struct archive *a, void *_private, const void **buff) 43228753Smm{ 44228753Smm struct my_data *private = (struct my_data *)_private; 45232153Smm (void)a; /* UNUSED */ 46232153Smm (void)buff; /* UNUSED */ 47228753Smm assertEqualInt(MAGIC, private->magic); 48228753Smm ++private->read_called; 49228753Smm return (private->read_return); 50228753Smm} 51228753Smm 52228753Smmstatic ssize_t 53228753Smmmy_write(struct archive *a, void *_private, const void *buff, size_t s) 54228753Smm{ 55228753Smm struct my_data *private = (struct my_data *)_private; 56232153Smm (void)a; /* UNUSED */ 57232153Smm (void)buff; /* UNUSED */ 58232153Smm (void)s; /* UNUSED */ 59228753Smm assertEqualInt(MAGIC, private->magic); 60228753Smm ++private->write_called; 61228753Smm return (private->write_return); 62228753Smm} 63228753Smm 64228753Smmstatic int 65228753Smmmy_open(struct archive *a, void *_private) 66228753Smm{ 67228753Smm struct my_data *private = (struct my_data *)_private; 68232153Smm (void)a; /* UNUSED */ 69228753Smm assertEqualInt(MAGIC, private->magic); 70228753Smm ++private->open_called; 71228753Smm return (private->open_return); 72228753Smm} 73228753Smm 74228753Smmstatic int 75228753Smmmy_close(struct archive *a, void *_private) 76228753Smm{ 77228753Smm struct my_data *private = (struct my_data *)_private; 78232153Smm (void)a; /* UNUSED */ 79228753Smm assertEqualInt(MAGIC, private->magic); 80228753Smm ++private->close_called; 81228753Smm return (private->close_return); 82228753Smm} 83228753Smm 84228753Smm 85228753SmmDEFINE_TEST(test_open_failure) 86228753Smm{ 87228753Smm struct archive *a; 88228753Smm struct my_data private; 89228753Smm 90228753Smm memset(&private, 0, sizeof(private)); 91228753Smm private.magic = MAGIC; 92228753Smm private.open_return = ARCHIVE_FATAL; 93228753Smm a = archive_read_new(); 94228753Smm assert(a != NULL); 95228753Smm assertEqualInt(ARCHIVE_FATAL, 96228753Smm archive_read_open(a, &private, my_open, my_read, my_close)); 97228753Smm assertEqualInt(1, private.open_called); 98228753Smm assertEqualInt(0, private.read_called); 99228753Smm assertEqualInt(1, private.close_called); 100248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 101228753Smm assertEqualInt(1, private.open_called); 102228753Smm assertEqualInt(0, private.read_called); 103228753Smm assertEqualInt(1, private.close_called); 104228753Smm 105228753Smm memset(&private, 0, sizeof(private)); 106228753Smm private.magic = MAGIC; 107228753Smm private.open_return = ARCHIVE_FAILED; 108228753Smm a = archive_read_new(); 109228753Smm assert(a != NULL); 110228753Smm assertEqualInt(ARCHIVE_FAILED, 111228753Smm archive_read_open(a, &private, my_open, my_read, my_close)); 112228753Smm assertEqualInt(1, private.open_called); 113228753Smm assertEqualInt(0, private.read_called); 114228753Smm assertEqualInt(1, private.close_called); 115248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 116228753Smm assertEqualInt(1, private.open_called); 117228753Smm assertEqualInt(0, private.read_called); 118228753Smm assertEqualInt(1, private.close_called); 119228753Smm 120228753Smm memset(&private, 0, sizeof(private)); 121228753Smm private.magic = MAGIC; 122228753Smm private.open_return = ARCHIVE_WARN; 123228753Smm a = archive_read_new(); 124228753Smm assert(a != NULL); 125228753Smm assertEqualInt(ARCHIVE_WARN, 126228753Smm archive_read_open(a, &private, my_open, my_read, my_close)); 127228753Smm assertEqualInt(1, private.open_called); 128228753Smm assertEqualInt(0, private.read_called); 129228753Smm assertEqualInt(1, private.close_called); 130248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 131228753Smm assertEqualInt(1, private.open_called); 132228753Smm assertEqualInt(0, private.read_called); 133228753Smm assertEqualInt(1, private.close_called); 134228753Smm 135228753Smm memset(&private, 0, sizeof(private)); 136228753Smm private.magic = MAGIC; 137228753Smm private.open_return = ARCHIVE_OK; 138228753Smm private.read_return = ARCHIVE_FATAL; 139228753Smm a = archive_read_new(); 140228753Smm assert(a != NULL); 141228753Smm assertEqualInt(ARCHIVE_OK, 142232153Smm archive_read_support_filter_compress(a)); 143228753Smm assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a)); 144228753Smm assertEqualInt(ARCHIVE_FATAL, 145228753Smm archive_read_open(a, &private, my_open, my_read, my_close)); 146228753Smm assertEqualInt(1, private.open_called); 147228753Smm assertEqualInt(1, private.read_called); 148228753Smm assertEqualInt(1, private.close_called); 149248616Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 150228753Smm assertEqualInt(1, private.open_called); 151228753Smm assertEqualInt(1, private.read_called); 152228753Smm assertEqualInt(1, private.close_called); 153228753Smm 154228753Smm memset(&private, 0, sizeof(private)); 155228753Smm private.magic = MAGIC; 156228753Smm private.open_return = ARCHIVE_FATAL; 157228753Smm a = archive_write_new(); 158228753Smm assert(a != NULL); 159228753Smm assertEqualInt(ARCHIVE_FATAL, 160228753Smm archive_write_open(a, &private, my_open, my_write, my_close)); 161228753Smm assertEqualInt(1, private.open_called); 162228753Smm assertEqualInt(0, private.write_called); 163232153Smm assertEqualInt(1, private.close_called); 164248616Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 165228753Smm assertEqualInt(1, private.open_called); 166228753Smm assertEqualInt(0, private.write_called); 167228753Smm assertEqualInt(1, private.close_called); 168228753Smm 169228753Smm memset(&private, 0, sizeof(private)); 170228753Smm private.magic = MAGIC; 171228753Smm private.open_return = ARCHIVE_FATAL; 172228753Smm a = archive_write_new(); 173228753Smm assert(a != NULL); 174232153Smm archive_write_add_filter_compress(a); 175232153Smm archive_write_set_format_ustar(a); 176232153Smm assertEqualInt(ARCHIVE_FATAL, 177232153Smm archive_write_open(a, &private, my_open, my_write, my_close)); 178232153Smm assertEqualInt(1, private.open_called); 179232153Smm assertEqualInt(0, private.write_called); 180232153Smm assertEqualInt(1, private.close_called); 181248616Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 182232153Smm assertEqualInt(1, private.open_called); 183232153Smm assertEqualInt(0, private.write_called); 184232153Smm assertEqualInt(1, private.close_called); 185232153Smm 186232153Smm memset(&private, 0, sizeof(private)); 187232153Smm private.magic = MAGIC; 188232153Smm private.open_return = ARCHIVE_FATAL; 189232153Smm a = archive_write_new(); 190232153Smm assert(a != NULL); 191228753Smm archive_write_set_format_zip(a); 192228753Smm assertEqualInt(ARCHIVE_FATAL, 193228753Smm archive_write_open(a, &private, my_open, my_write, my_close)); 194228753Smm assertEqualInt(1, private.open_called); 195228753Smm assertEqualInt(0, private.write_called); 196232153Smm assertEqualInt(1, private.close_called); 197248616Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 198228753Smm assertEqualInt(1, private.open_called); 199228753Smm assertEqualInt(0, private.write_called); 200228753Smm assertEqualInt(1, private.close_called); 201228753Smm 202228753Smm memset(&private, 0, sizeof(private)); 203228753Smm private.magic = MAGIC; 204228753Smm private.open_return = ARCHIVE_FATAL; 205228753Smm a = archive_write_new(); 206228753Smm assert(a != NULL); 207232153Smm archive_write_add_filter_gzip(a); 208228753Smm assertEqualInt(ARCHIVE_FATAL, 209228753Smm archive_write_open(a, &private, my_open, my_write, my_close)); 210228753Smm assertEqualInt(1, private.open_called); 211228753Smm assertEqualInt(0, private.write_called); 212232153Smm assertEqualInt(1, private.close_called); 213248616Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 214228753Smm assertEqualInt(1, private.open_called); 215228753Smm assertEqualInt(0, private.write_called); 216228753Smm assertEqualInt(1, private.close_called); 217228753Smm 218228753Smm} 219