From 5f0edceddab88f91bec7fecf5efa606bbe273fb2 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Tue, 30 Jul 2013 10:15:57 +0200 Subject: added test case for FS#1442 --- _test/tests/inc/tar.test.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to '_test/tests/inc/tar.test.php') diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php index 90bc2e49e..28e709cc3 100644 --- a/_test/tests/inc/tar.test.php +++ b/_test/tests/inc/tar.test.php @@ -248,6 +248,28 @@ class Tar_TestCase extends DokuWikiTest { } } + // FS#1442 + public function test_createlongfile() { + $tar = new Tar(); + $tmp = tempnam(sys_get_temp_dir(), 'dwtartest'); + + $path = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.txt'; + + $tar->create($tmp, Tar::COMPRESS_NONE); + $tar->addData($path, 'testcontent1'); + $tar->close(); + + $this->assertTrue(filesize($tmp) > 30); //arbitrary non-zero number + $data = file_get_contents($tmp); + + // We should find the complete path and a longlink entry + $this->assertTrue(strpos($data, 'testcontent1') !== false, 'content in TAR'); + $this->assertTrue(strpos($data, $path) !== false, 'path in TAR'); + $this->assertTrue(strpos($data, '@LongLink') !== false, '@LongLink in TAR'); + + @unlink($tmp); + } + public function test_createlongpathustar() { $tar = new Tar(); $tmp = tempnam(sys_get_temp_dir(), 'dwtartest'); @@ -360,4 +382,4 @@ class Tar_TestCase extends DokuWikiTest { $this->assertEquals(512*4, strlen($file)); // 1 header block + data block + 2 footer blocks } -} \ No newline at end of file +} -- cgit v1.2.3 From 4f93eef69523dad1ba27c5ac5465b037c598ff18 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Thu, 1 Aug 2013 23:19:25 +0200 Subject: fixed tar tests FS#2809 Tars strip the leading slash so the tests where wrong. Not sure why they stilldid work sometimes --- _test/tests/inc/tar.test.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to '_test/tests/inc/tar.test.php') diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php index 28e709cc3..50664cfc3 100644 --- a/_test/tests/inc/tar.test.php +++ b/_test/tests/inc/tar.test.php @@ -11,7 +11,8 @@ class Tar_TestCase extends DokuWikiTest { public function test_createdynamic() { $tar = new Tar(); - $dir = dirname(__FILE__).'/tar'; + $dir = dirname(__FILE__).'/tar'; + $tdir = ltrim($dir,'/'); $tar->create(); $tar->AddFile("$dir/testdata1.txt"); @@ -24,11 +25,11 @@ class Tar_TestCase extends DokuWikiTest { $this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR'); $this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR'); - $this->assertTrue(strpos($data, "$dir/testdata1.txt") !== false, 'Path in TAR'); + $this->assertTrue(strpos($data, "$tdir/testdata1.txt") !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR'); - $this->assertTrue(strpos($data, "$dir/foobar/testdata2.txt") === false, 'Path not in TAR'); + $this->assertTrue(strpos($data, "$tdir/foobar/testdata2.txt") === false, 'Path not in TAR'); $this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR'); } @@ -42,6 +43,7 @@ class Tar_TestCase extends DokuWikiTest { $tar = new Tar(); $dir = dirname(__FILE__).'/tar'; + $tdir = ltrim($dir,'/'); $tmp = tempnam(sys_get_temp_dir(), 'dwtartest'); $tar->create($tmp, Tar::COMPRESS_NONE); @@ -57,11 +59,11 @@ class Tar_TestCase extends DokuWikiTest { $this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR'); $this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR'); - $this->assertTrue(strpos($data, "$dir/testdata1.txt") !== false, 'Path in TAR'); + $this->assertTrue(strpos($data, "$tdir/testdata1.txt") !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR'); - $this->assertTrue(strpos($data, "$dir/foobar/testdata2.txt") === false, 'Path not in TAR'); + $this->assertTrue(strpos($data, "$tdir/foobar/testdata2.txt") === false, 'Path not in TAR'); $this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR'); @unlink($tmp); -- cgit v1.2.3 From 8331f1f44822f6bac623baab10d76fdf6e64b3f7 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Fri, 2 Aug 2013 11:10:31 +0200 Subject: FS#2802 correctly fix tar tests When the DokuWiki install was in a deep namespace, the used path name could land in the >100 char limit and trigger ustar format where the filename and directory name are split. This would fail the test. --- _test/tests/inc/tar.test.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to '_test/tests/inc/tar.test.php') diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php index 50664cfc3..9801ca1e0 100644 --- a/_test/tests/inc/tar.test.php +++ b/_test/tests/inc/tar.test.php @@ -25,11 +25,17 @@ class Tar_TestCase extends DokuWikiTest { $this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR'); $this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR'); - $this->assertTrue(strpos($data, "$tdir/testdata1.txt") !== false, 'Path in TAR'); + // fullpath might be too long to be stored as full path FS#2802 + $this->assertTrue(strpos($data, "$tdir") !== false, 'Path in TAR'); + $this->assertTrue(strpos($data, "testdata1.txt") !== false, 'File in TAR'); + $this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR'); - $this->assertTrue(strpos($data, "$tdir/foobar/testdata2.txt") === false, 'Path not in TAR'); + // fullpath might be too long to be stored as full path FS#2802 + $this->assertTrue(strpos($data, "$tdir/foobar") === false, 'Path not in TAR'); + $this->assertTrue(strpos($data, "foobar.txt") === false, 'File not in TAR'); + $this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR'); } @@ -59,11 +65,17 @@ class Tar_TestCase extends DokuWikiTest { $this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR'); $this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR'); - $this->assertTrue(strpos($data, "$tdir/testdata1.txt") !== false, 'Path in TAR'); + // fullpath might be too long to be stored as full path FS#2802 + $this->assertTrue(strpos($data, "$tdir") !== false, 'Path in TAR'); + $this->assertTrue(strpos($data, "testdata1.txt") !== false, 'File in TAR'); + $this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR'); $this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR'); - $this->assertTrue(strpos($data, "$tdir/foobar/testdata2.txt") === false, 'Path not in TAR'); + // fullpath might be too long to be stored as full path FS#2802 + $this->assertTrue(strpos($data, "$tdir/foobar") === false, 'Path not in TAR'); + $this->assertTrue(strpos($data, "foobar.txt") === false, 'File not in TAR'); + $this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR'); @unlink($tmp); -- cgit v1.2.3 From 0a57f27ea5c1a6d54627f6af15c516f18f44b229 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sat, 3 Aug 2013 17:15:13 +0200 Subject: fixed cleanPath bug in tar library FS#2802 This time the test case was correct and actually showed a bug in the tar library. The error occured only on the first build (directory build/0/) where the zero was stripped from the path name. I added unit tests to the cleanPath function and discovered another bug with handling relative directories. I rewrote the cleanPath() function and now it should finally work. Unit tests FTW! --- _test/tests/inc/tar.test.php | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to '_test/tests/inc/tar.test.php') diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php index 9801ca1e0..417f1a853 100644 --- a/_test/tests/inc/tar.test.php +++ b/_test/tests/inc/tar.test.php @@ -58,6 +58,8 @@ class Tar_TestCase extends DokuWikiTest { $tar->addData('another/testdata3.txt', 'testcontent3'); $tar->close(); +copy ($tmp, '/tmp/test.tar'); + $this->assertTrue(filesize($tmp) > 30); //arbitrary non-zero number $data = file_get_contents($tmp); @@ -66,7 +68,7 @@ class Tar_TestCase extends DokuWikiTest { $this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR'); // fullpath might be too long to be stored as full path FS#2802 - $this->assertTrue(strpos($data, "$tdir") !== false, 'Path in TAR'); + $this->assertTrue(strpos($data, "$tdir") !== false, "Path in TAR '$tdir'"); $this->assertTrue(strpos($data, "testdata1.txt") !== false, 'File in TAR'); $this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR'); @@ -396,4 +398,23 @@ class Tar_TestCase extends DokuWikiTest { $this->assertEquals(512*4, strlen($file)); // 1 header block + data block + 2 footer blocks } + + + public function test_cleanPath(){ + $tar = new Tar(); + $tests = array ( + '/foo/bar' => 'foo/bar', + '/foo/bar/' => 'foo/bar', + 'foo//bar' => 'foo/bar', + 'foo/0/bar' => 'foo/0/bar', + 'foo/../bar' => 'bar', + 'foo/bang/bang/../../bar' => 'foo/bar', + 'foo/../../bar' => 'bar', + 'foo/.././../bar' => 'bar', + ); + + foreach($tests as $in => $out){ + $this->assertEquals($out, $tar->cleanPath($in), "Input: $in"); + } + } } -- cgit v1.2.3