test_patterns.c revision 256281
122514Sdarrenr/*-
253024Sguido * Copyright (c) 2009 Michihiro NAKAJIMA
322514Sdarrenr * Copyright (c) 2003-2007 Tim Kientzle
4145510Sdarrenr * All rights reserved.
522514Sdarrenr *
631183Speter * Redistribution and use in source and binary forms, with or without
731183Speter * modification, are permitted provided that the following conditions
831183Speter * are met:
922514Sdarrenr * 1. Redistributions of source code must retain the above copyright
1022514Sdarrenr *    notice, this list of conditions and the following disclaimer.
1122514Sdarrenr * 2. Redistributions in binary form must reproduce the above copyright
1231183Speter *    notice, this list of conditions and the following disclaimer in the
1322514Sdarrenr *    documentation and/or other materials provided with the distribution.
1422514Sdarrenr *
1522514Sdarrenr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
1622514Sdarrenr * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1731183Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1831183Speter * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
1931183Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2022514Sdarrenr * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2131183Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2231183Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2331183Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2431183Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2531183Speter */
2631183Speter#include "test.h"
2731183Speter__FBSDID("$FreeBSD: stable/10/contrib/libarchive/tar/test/test_patterns.c 232153 2012-02-25 10:58:02Z mm $");
2831183Speter
2931183SpeterDEFINE_TEST(test_patterns)
3031183Speter{
3122514Sdarrenr	FILE *f;
3222514Sdarrenr	int r;
3322514Sdarrenr	const char *reffile2 = "test_patterns_2.tar";
3422514Sdarrenr	const char *reffile3 = "test_patterns_3.tar";
3522514Sdarrenr	const char *reffile4 = "test_patterns_4.tar";
3622514Sdarrenr
3731183Speter	const char *tar2aExpected[] = {
3822514Sdarrenr		"/tmp/foo/bar/",
3922514Sdarrenr		"/tmp/foo/bar/baz",
4022514Sdarrenr		NULL
4131183Speter	};
4231183Speter
4331183Speter	/*
4431183Speter	 * Test basic command-line pattern handling.
4531183Speter	 */
4631183Speter
4731183Speter	/*
4831183Speter	 * Test 1: Files on the command line that don't get matched
4931183Speter	 * didn't produce an error.
5031183Speter	 *
5131183Speter	 * John Baldwin reported this problem in PR bin/121598
5231183Speter	 */
5331183Speter	f = fopen("foo", "w");
5431183Speter	assert(f != NULL);
5531183Speter	fclose(f);
5631183Speter	r = systemf("%s cfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog);
5731183Speter	assertEqualInt(r, 0);
5831183Speter	r = systemf("%s xv --no-same-owner -f tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog);
5931183Speter	failure("tar should return non-zero because a file was given on the command line that's not in the archive");
6022514Sdarrenr	assert(r != 0);
6122514Sdarrenr
6222514Sdarrenr	/*
6326119Sdarrenr	 * Test 2: Check basic matching of full paths that start with /
6426119Sdarrenr	 */
6526119Sdarrenr	extract_reference_file(reffile2);
6622514Sdarrenr
6722514Sdarrenr	r = systemf("%s tf %s /tmp/foo/bar > tar2a.out 2> tar2a.err",
6853024Sguido	    testprog, reffile2);
6922514Sdarrenr	assertEqualInt(r, 0);
7022514Sdarrenr	assertFileContainsLinesAnyOrder("tar2a.out", tar2aExpected);
7122514Sdarrenr	assertEmptyFile("tar2a.err");
7222514Sdarrenr
7322514Sdarrenr	/*
7422514Sdarrenr	 * Test 3 archive has some entries starting with '/' and some not.
7522514Sdarrenr	 */
7653024Sguido	extract_reference_file(reffile3);
7722514Sdarrenr
7822514Sdarrenr	/* Test 3a:  Pattern tmp/foo/bar should not match /tmp/foo/bar */
7922514Sdarrenr	r = systemf("%s x --no-same-owner -f %s tmp/foo/bar > tar3a.out 2> tar3a.err",
8022514Sdarrenr	    testprog, reffile3);
8122514Sdarrenr	assert(r != 0);
8222514Sdarrenr	assertEmptyFile("tar3a.out");
8322514Sdarrenr
8453024Sguido	/* Test 3b:  Pattern /tmp/foo/baz should not match tmp/foo/baz */
8553024Sguido	assertNonEmptyFile("tar3a.err");
8622514Sdarrenr	/* Again, with the '/' */
8722514Sdarrenr	r = systemf("%s x --no-same-owner -f %s /tmp/foo/baz > tar3b.out 2> tar3b.err",
8822514Sdarrenr	    testprog, reffile3);
8922514Sdarrenr	assert(r != 0);
9022514Sdarrenr	assertEmptyFile("tar3b.out");
9122514Sdarrenr	assertNonEmptyFile("tar3b.err");
9222514Sdarrenr
9353024Sguido	/* Test 3c: ./tmp/foo/bar should not match /tmp/foo/bar */
9422514Sdarrenr	r = systemf("%s x --no-same-owner -f %s ./tmp/foo/bar > tar3c.out 2> tar3c.err",
9522514Sdarrenr	    testprog, reffile3);
9622514Sdarrenr	assert(r != 0);
9722514Sdarrenr	assertEmptyFile("tar3c.out");
9822514Sdarrenr	assertNonEmptyFile("tar3c.err");
9922514Sdarrenr
10022514Sdarrenr	/* Test 3d: ./tmp/foo/baz should match tmp/foo/baz */
10153024Sguido	r = systemf("%s x --no-same-owner -f %s ./tmp/foo/baz > tar3d.out 2> tar3d.err",
10222514Sdarrenr	    testprog, reffile3);
10331183Speter	assertEqualInt(r, 0);
10422514Sdarrenr	assertEmptyFile("tar3d.out");
10531183Speter	assertEmptyFile("tar3d.err");
10622514Sdarrenr	assertFileExists("tmp/foo/baz/bar");
10722514Sdarrenr
10831183Speter	/*
10931183Speter	 * Test 4 archive has some entries starting with windows drive letters
11022514Sdarrenr	 * such as 'c:\', '//./c:/' or '//?/c:/'.
11131183Speter	 */
11231183Speter	extract_reference_file(reffile4);
11331183Speter
11431183Speter	r = systemf("%s x --no-same-owner -f %s -C tmp > tar4.out 2> tar4.err",
11522514Sdarrenr	    testprog, reffile4);
11631183Speter	assert(r != 0);
11731183Speter	assertEmptyFile("tar4.out");
11822514Sdarrenr	assertNonEmptyFile("tar4.err");
11931183Speter
12031183Speter	for (r = 1; r <= 54; r++) {
12153024Sguido		char file_a[] = "tmp/fileXX";
12231183Speter		char file_b1[] = "tmp/server/share/fileXX";
12331183Speter		char file_b2[] = "tmp/server\\share\\fileXX";
12431183Speter		char file_c[] = "tmp/../fileXX";
12531183Speter		char file_d[] = "tmp/../../fileXX";
12622514Sdarrenr		char *filex;
12731183Speter		int xsize;
12831183Speter
12953024Sguido		switch (r) {
13031183Speter		case 15: case 18:
13131183Speter			/*
13231183Speter			 * Including server and share names.
13331183Speter			 * //?/UNC/server/share/file15
13431183Speter			 * //?/unc/server/share/file18
135145510Sdarrenr			 */
136145510Sdarrenr			filex = file_b1;
137145510Sdarrenr			xsize = sizeof(file_b1);
138145510Sdarrenr			break;
139145510Sdarrenr		case 35: case 38: case 52:
140145510Sdarrenr			/*
141145510Sdarrenr			 * Including server and share names.
142145510Sdarrenr			 * \\?\UNC\server\share\file35
14331183Speter			 * \\?\unc\server\share\file38
14431183Speter			 * \/?/uNc/server\share\file52
14531183Speter			 */
14622514Sdarrenr			filex = file_b2;
14731183Speter			xsize = sizeof(file_b2);
14822514Sdarrenr			break;
14922514Sdarrenr		default:
15031183Speter			filex = file_a;
15122514Sdarrenr			xsize = sizeof(file_a);
15231183Speter			break;
15331183Speter		}
15431183Speter		filex[xsize-3] = '0' + r / 10;
15531183Speter		filex[xsize-2] = '0' + r % 10;
15631183Speter		switch (r) {
15731183Speter		case 5: case 6: case 17: case 20: case 25:
15831183Speter		case 26: case 37: case 40: case 43: case 54:
15931183Speter			/*
16031183Speter			 * Not extracted patterns.
16131183Speter			 * D:../file05
16231183Speter			 * c:../../file06
16331183Speter			 * //?/UNC/../file17
16431183Speter			 * //?/unc/../file20
16531183Speter			 * z:..\file25
16631183Speter			 * c:..\..\file26
16731183Speter			 * \\?\UNC\..\file37
16831183Speter			 * \\?\unc\..\file40
16931183Speter			 * c:../..\file43
17031183Speter			 * \/?\UnC\../file54
17131183Speter			 */
17231183Speter			assertFileNotExists(filex);
17331183Speter			if (r == 6 || r == 26 || r == 43) {
17431183Speter				filex = file_d;
17531183Speter				xsize = sizeof(file_d);
17622514Sdarrenr			} else {
17722514Sdarrenr				filex = file_c;
17831183Speter				xsize = sizeof(file_c);
17931183Speter			}
18031183Speter			filex[xsize-3] = '0' + r / 10;
18131183Speter			filex[xsize-2] = '0' + r % 10;
18231183Speter			assertFileNotExists(filex);
18331183Speter			break;
184		default:
185			/* Extracted patterns. */
186			assertFileExists(filex);
187			break;
188		}
189	}
190}
191