1162413Ssam/*- 2178354Ssam * Copyright (c) 2003-2007 Tim Kientzle 3162413Ssam * Copyright (c) 2012 Michhiro NAKAJIMA 4162413Ssam * All rights reserved. 5162413Ssam * 6162413Ssam * Redistribution and use in source and binary forms, with or without 7162413Ssam * modification, are permitted provided that the following conditions 8162413Ssam * are met: 9162413Ssam * 1. Redistributions of source code must retain the above copyright 10162413Ssam * notice, this list of conditions and the following disclaimer. 11162413Ssam * 2. Redistributions in binary form must reproduce the above copyright 12162413Ssam * notice, this list of conditions and the following disclaimer in the 13162413Ssam * documentation and/or other materials provided with the distribution. 14162413Ssam * 15162413Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16162413Ssam * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17162413Ssam * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18162413Ssam * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19162413Ssam * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20162413Ssam * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21162413Ssam * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22162413Ssam * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23162413Ssam * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24162413Ssam * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25162413Ssam */ 26162413Ssam#include "test.h" 27162413Ssam__FBSDID("$FreeBSD$"); 28162413Ssam 29162413Ssamstatic unsigned char archive[] = { 30162413Ssam31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', 31162413Ssam0,210,134,230,166,6,200,'4',28,'(',24,26,24,27,155,24,152,24,154,27,155,')', 32162413Ssam24,24,26,152,154,25,'2','(',152,210,193,'m',12,165,197,'%',137,'E','@',167, 33162413Ssam148,'d',230,226,'U','G','H',30,234,15,'8','=',10,'F',193,'(',24,5,131,28, 34162413Ssam0,0,29,172,5,240,0,6,0,0}; 35162413Ssam#define signature archive 36162413Ssam#define badsignature (&archive[1]) 37162413Ssam#define signature_len 4 38162413Ssam 39162413SsamDEFINE_TEST(test_read_filter_program_signature) 40162413Ssam{ 41162413Ssam int r; 42162413Ssam struct archive_entry *ae; 43162413Ssam struct archive *a; 44162413Ssam 45162413Ssam /* 46185522Ssam * First, test handling when a non-existent compression 47162413Ssam * program is requested. 48162413Ssam */ 49162413Ssam assert((a = archive_read_new()) != NULL); 50162413Ssam r = archive_read_support_filter_program(a, "nonexistent"); 51162413Ssam if (r == ARCHIVE_FATAL) { 52162413Ssam skipping("archive_read_support_filter_program() " 53162413Ssam "unsupported on this platform"); 54162413Ssam return; 55162413Ssam } 56162413Ssam assertEqualIntA(a, ARCHIVE_OK, r); 57162413Ssam assertEqualIntA(a, ARCHIVE_OK, 58162413Ssam archive_read_support_format_all(a)); 59185522Ssam assertEqualIntA(a, ARCHIVE_FATAL, 60162413Ssam archive_read_open_memory(a, archive, sizeof(archive))); 61162413Ssam assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 62162413Ssam assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 63162413Ssam 64162413Ssam /* 65162413Ssam * If we have "gzip -d", try using that. 66162413Ssam */ 67162413Ssam if (!canGzip()) { 68162413Ssam skipping("Can't run gzip program on this platform"); 69162413Ssam return; 70162413Ssam } 71162413Ssam assert((a = archive_read_new()) != NULL); 72162413Ssam assertEqualIntA(a, ARCHIVE_OK, 73162413Ssam archive_read_support_filter_none(a)); 74219315Sadrian assertEqualIntA(a, ARCHIVE_OK, 75162413Ssam archive_read_support_filter_program_signature(a, "gzip -d", 76162413Ssam signature, signature_len)); 77162413Ssam assertEqualIntA(a, ARCHIVE_OK, 78162413Ssam archive_read_support_format_all(a)); 79162413Ssam assertEqualIntA(a, ARCHIVE_OK, 80162413Ssam archive_read_open_memory(a, archive, sizeof(archive))); 81162413Ssam assertEqualIntA(a, ARCHIVE_OK, 82219315Sadrian archive_read_next_header(a, &ae)); 83162413Ssam assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_PROGRAM); 84162413Ssam assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); 85162413Ssam assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 86162413Ssam assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 87162413Ssam 88219942Sadrian /* 89219942Sadrian * Test bad signature. 90219948Sadrian */ 91219942Sadrian assert((a = archive_read_new()) != NULL); 92219942Sadrian assertEqualIntA(a, ARCHIVE_OK, 93162413Ssam archive_read_support_filter_none(a)); 94162413Ssam assertEqualIntA(a, ARCHIVE_OK, 95162413Ssam archive_read_support_filter_program_signature(a, "gunzip", 96162413Ssam badsignature, signature_len)); 97162413Ssam assertEqualIntA(a, ARCHIVE_OK, 98162413Ssam archive_read_support_format_all(a)); 99162413Ssam assertEqualIntA(a, ARCHIVE_FATAL, 100162413Ssam archive_read_open_memory(a, archive, sizeof(archive))); 101162413Ssam assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 102162413Ssam assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 103162413Ssam} 104162413Ssam