1248590Smm/*- 2248590Smm * Copyright (c) 2003-2007 Tim Kientzle 3248590Smm * Copyright (c) 2012 Michhiro NAKAJIMA 4248590Smm * All rights reserved. 5248590Smm * 6248590Smm * Redistribution and use in source and binary forms, with or without 7248590Smm * modification, are permitted provided that the following conditions 8248590Smm * are met: 9248590Smm * 1. Redistributions of source code must retain the above copyright 10248590Smm * notice, this list of conditions and the following disclaimer. 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#include "test.h" 27248590Smm__FBSDID("$FreeBSD$"); 28248590Smm 29248590Smmstatic unsigned char archive[] = { 30248590Smm31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', 31248590Smm0,210,134,230,166,6,200,'4',28,'(',24,26,24,27,155,24,152,24,154,27,155,')', 32248590Smm24,24,26,152,154,25,'2','(',152,210,193,'m',12,165,197,'%',137,'E','@',167, 33248590Smm148,'d',230,226,'U','G','H',30,234,15,'8','=',10,'F',193,'(',24,5,131,28, 34248590Smm0,0,29,172,5,240,0,6,0,0}; 35248590Smm#define signature archive 36248590Smm#define badsignature (&archive[1]) 37248590Smm#define signature_len 4 38248590Smm 39248590SmmDEFINE_TEST(test_read_filter_program_signature) 40248590Smm{ 41248590Smm int r; 42248590Smm struct archive_entry *ae; 43248590Smm struct archive *a; 44248590Smm 45248590Smm /* 46248590Smm * First, test handling when a non-existent compression 47248590Smm * program is requested. 48248590Smm */ 49248590Smm assert((a = archive_read_new()) != NULL); 50248590Smm r = archive_read_support_filter_program(a, "nonexistent"); 51248590Smm if (r == ARCHIVE_FATAL) { 52248590Smm skipping("archive_read_support_filter_program() " 53248590Smm "unsupported on this platform"); 54248590Smm return; 55248590Smm } 56248590Smm assertEqualIntA(a, ARCHIVE_OK, r); 57248590Smm assertEqualIntA(a, ARCHIVE_OK, 58248590Smm archive_read_support_format_all(a)); 59248590Smm assertEqualIntA(a, ARCHIVE_FATAL, 60248590Smm archive_read_open_memory(a, archive, sizeof(archive))); 61248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 62248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 63248590Smm 64248590Smm /* 65248590Smm * If we have "gzip -d", try using that. 66248590Smm */ 67248590Smm if (!canGzip()) { 68248590Smm skipping("Can't run gzip program on this platform"); 69248590Smm return; 70248590Smm } 71248590Smm assert((a = archive_read_new()) != NULL); 72248590Smm assertEqualIntA(a, ARCHIVE_OK, 73248590Smm archive_read_support_filter_none(a)); 74248590Smm assertEqualIntA(a, ARCHIVE_OK, 75248590Smm archive_read_support_filter_program_signature(a, "gzip -d", 76248590Smm signature, signature_len)); 77248590Smm assertEqualIntA(a, ARCHIVE_OK, 78248590Smm archive_read_support_format_all(a)); 79248590Smm assertEqualIntA(a, ARCHIVE_OK, 80248590Smm archive_read_open_memory(a, archive, sizeof(archive))); 81248590Smm assertEqualIntA(a, ARCHIVE_OK, 82248590Smm archive_read_next_header(a, &ae)); 83248590Smm assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_PROGRAM); 84248590Smm assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); 85248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 86248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 87248590Smm 88248590Smm /* 89248590Smm * Test bad signature. 90248590Smm */ 91248590Smm assert((a = archive_read_new()) != NULL); 92248590Smm assertEqualIntA(a, ARCHIVE_OK, 93248590Smm archive_read_support_filter_none(a)); 94248590Smm assertEqualIntA(a, ARCHIVE_OK, 95248590Smm archive_read_support_filter_program_signature(a, "gunzip", 96248590Smm badsignature, signature_len)); 97248590Smm assertEqualIntA(a, ARCHIVE_OK, 98248590Smm archive_read_support_format_all(a)); 99248590Smm assertEqualIntA(a, ARCHIVE_FATAL, 100248590Smm archive_read_open_memory(a, archive, sizeof(archive))); 101248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 102248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 103248590Smm} 104