summaryrefslogtreecommitdiff
path: root/_test
diff options
context:
space:
mode:
authorKlap-in <klapinklapin@gmail.com>2013-08-03 10:44:54 +0200
committerKlap-in <klapinklapin@gmail.com>2013-08-03 10:44:54 +0200
commit6acfab8732e1784b953c8cc2ae7408f84fda7ce8 (patch)
tree01e6ac38df46c9ad18f058c8d597617702eb67f3 /_test
parent51bd6f039e782dca456022514893aa80bd7c52b9 (diff)
parentcab505616ec9b8ef3cd671e7337c91d065745932 (diff)
downloadrpg-6acfab8732e1784b953c8cc2ae7408f84fda7ce8.tar.gz
rpg-6acfab8732e1784b953c8cc2ae7408f84fda7ce8.tar.bz2
Merge remote-tracking branch 'origin/master' into changelogtestsonly
Diffstat (limited to '_test')
-rw-r--r--_test/README25
-rw-r--r--_test/tests/inc/auth_deleteprofile.test.php179
-rw-r--r--_test/tests/inc/auth_encryption.test.php12
-rw-r--r--_test/tests/inc/auth_random.test.php20
-rw-r--r--_test/tests/inc/common_ml.test.php37
-rw-r--r--_test/tests/inc/fulltext_backlinks.test.php77
-rw-r--r--_test/tests/inc/fulltext_mediause.test.php77
-rw-r--r--_test/tests/inc/httpclient_http.test.php55
-rw-r--r--_test/tests/inc/parser/parser_code.test.php72
-rw-r--r--_test/tests/inc/parser/parser_file.test.php56
-rw-r--r--_test/tests/inc/tar.test.php48
-rw-r--r--_test/tests/lib/exe/fetch_imagetoken.test.php44
-rw-r--r--_test/tests/lib/exe/fetch_statuscodes_external.test.php107
13 files changed, 773 insertions, 36 deletions
diff --git a/_test/README b/_test/README
index a4206f489..5220248b2 100644
--- a/_test/README
+++ b/_test/README
@@ -1,6 +1,6 @@
====== DokuWiki Test Suite ======
-This is the test suit to automatically test various parts of DokuWiki.
+This is the test suite to automatically test various parts of DokuWiki.
===== Requirements =====
@@ -9,22 +9,33 @@ This is the test suit to automatically test various parts of DokuWiki.
===== PHPUnit Installation ======
-via PEAR:
+==== via PEAR installer ====
pear config-set auto_discover 1
- pear upgrade
pear install pear.phpunit.de/PHPUnit
-on Windows:
+==== via Composer ====
- FIXME
+Include a composer.json file in your project, which can be as minimal as:
+
+<code>
+{
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*"
+ }
+}
+</code>
+
+==== via PHP archive (PHAR) ====
+
+Download http://pear.phpunit.de/get/phpunit.phar and make it executable on your system.
-===== Running all Tests =====
+===== Running all tests =====
Just change to the ''_test'' directory and run phpunit:
- cd _testing/
+ cd _test/
phpunit
PHPUnit will fail on some systems with a //headers already sent// error.
diff --git a/_test/tests/inc/auth_deleteprofile.test.php b/_test/tests/inc/auth_deleteprofile.test.php
new file mode 100644
index 000000000..dc38fcd16
--- /dev/null
+++ b/_test/tests/inc/auth_deleteprofile.test.php
@@ -0,0 +1,179 @@
+<?php
+
+class Mock_Auth_Plugin extends DokuWiki_Auth_Plugin {
+
+ public $loggedOff = false;
+
+ public function __construct($canDeleteUser = true) {
+ $this->cando['delUser'] = $canDeleteUser;
+ }
+
+ public function checkPass($user, $pass) {
+ return $pass == 'password';
+ }
+
+ public function deleteUsers($users) {
+ return in_array($_SERVER['REMOTE_USER'], $users);
+ }
+
+ public function logoff() {
+ $this->loggedOff = true;
+ }
+
+}
+
+class auth_deleteprofile_test extends DokuWikiTest {
+
+ /*
+ * Tests:
+ *
+ * 1. It works and the user is logged off
+ * 2. Password matches when config requires it
+ * 3,4. Auth plugin can prevent & wiki config can prevent
+ * 5. Any of invalid security token, missing/not set 'delete' flag, missing/unchecked 'confirm_delete'
+ *
+ */
+
+ function test_success() {
+
+ global $ACT, $INPUT, $conf, $auth;
+
+ $ACT = 'profile_delete';
+ $conf['profileconfirm'] = false;
+ $_SERVER['REMOTE_USER'] = 'testuser';
+
+ $input = array(
+ 'do' => $ACT,
+ 'sectok' => getSecurityToken(),
+ 'delete' => '1',
+ 'confirm_delete' => '1',
+ );
+
+ $_POST = $input;
+ $_REQUEST = $input;
+ $INPUT = new Input();
+
+ $auth = new Mock_Auth_Plugin();
+
+ $this->assertTrue(auth_deleteprofile());
+ $this->assertTrue($auth->loggedOff);
+ }
+
+ function test_confirmation_required() {
+
+ global $ACT, $INPUT, $conf, $auth;
+
+ $ACT = 'profile_delete';
+ $conf['profileconfirm'] = true;
+ $_SERVER['REMOTE_USER'] = 'testuser';
+
+ $input = array(
+ 'do' => $ACT,
+ 'sectok' => getSecurityToken(),
+ 'delete' => '1',
+ 'confirm_delete' => '1',
+ 'oldpass' => 'wrong',
+ );
+
+ $_POST = $input;
+ $_REQUEST = $input;
+ $INPUT = new Input();
+
+ $auth = new Mock_Auth_Plugin();
+
+ // password check required - it fails, so don't delete profile
+ $this->assertFalse(auth_deleteprofile());
+
+ // now it passes, we're good to go
+ $INPUT->set('oldpass','password');
+ $INPUT->post->set('oldpass','password');
+ $this->assertTrue(auth_deleteprofile());
+ }
+
+ function test_authconfig_prevents() {
+
+ global $ACT, $INPUT, $conf, $auth;
+
+ $ACT = 'profile_delete';
+ $conf['profileconfirm'] = false;
+ $_SERVER['REMOTE_USER'] = 'testuser';
+
+ $input = array(
+ 'do' => $ACT,
+ 'sectok' => getSecurityToken(),
+ 'delete' => '1',
+ 'confirm_delete' => '1',
+ );
+
+ $_POST = $input;
+ $_REQUEST = $input;
+ $INPUT = new Input();
+
+ $auth = new Mock_Auth_Plugin(false);
+ $conf['disableactions'] = '';
+ $this->assertFalse(auth_deleteprofile());
+ }
+
+ function test_wikiconfig_prevents() {
+
+ global $ACT, $INPUT, $conf, $auth;
+
+ $ACT = 'profile_delete';
+ $conf['profileconfirm'] = false;
+ $_SERVER['REMOTE_USER'] = 'testuser';
+
+ $input = array(
+ 'do' => $ACT,
+ 'sectok' => getSecurityToken(),
+ 'delete' => '1',
+ 'confirm_delete' => '1',
+ );
+
+ $_POST = $input;
+ $_REQUEST = $input;
+ $INPUT = new Input();
+
+ $auth = new Mock_Auth_Plugin();
+ $conf['disableactions'] = 'profile_delete';
+
+ $this->assertFalse(actionOK('profile_delete'));
+ $this->assertTrue($auth->canDo('delUser'));
+
+ $this->assertFalse(auth_deleteprofile());
+ }
+
+ function test_basic_parameters() {
+
+ global $ACT, $INPUT, $conf, $auth;
+
+ $ACT = 'profile_delete';
+ $conf['profileconfirm'] = true;
+ $_SERVER['REMOTE_USER'] = 'testuser';
+
+ $input = array(
+ 'do' => $ACT,
+ 'sectok' => getSecurityToken(),
+ 'delete' => '1',
+ 'confirm_delete' => '1',
+ 'oldpass' => 'password',
+ );
+
+ $_POST = $input;
+ $_REQUEST = $input;
+ $input_foundation = new Input();
+
+ $auth = new Mock_Auth_Plugin();
+
+ $INPUT = clone $input_foundation;
+ $INPUT->remove('delete');
+ $this->assertFalse(auth_deleteprofile());
+
+ $INPUT = clone $input_foundation;
+ $INPUT->set('sectok','wrong');
+ $this->assertFalse(auth_deleteprofile());
+
+ $INPUT = clone $input_foundation;
+ $INPUT->remove('confirm_delete');
+ $this->assertFalse(auth_deleteprofile());
+ }
+} \ No newline at end of file
diff --git a/_test/tests/inc/auth_encryption.test.php b/_test/tests/inc/auth_encryption.test.php
new file mode 100644
index 000000000..041eba00e
--- /dev/null
+++ b/_test/tests/inc/auth_encryption.test.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Tests the auth_decrypt and auth_encrypt-functions
+ */
+class auth_encryption_test extends DokuWikiTest {
+ function testDeEncrypt() {
+ $data = "OnA28asdfäakgß*+!\"+*";
+ $secret = "oeaf1öasdöflk§";
+ $this->assertEquals($data, auth_decrypt(auth_encrypt($data, $secret), $secret));
+ }
+}
diff --git a/_test/tests/inc/auth_random.test.php b/_test/tests/inc/auth_random.test.php
new file mode 100644
index 000000000..f380eba53
--- /dev/null
+++ b/_test/tests/inc/auth_random.test.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * Tests the random generator functions
+ */
+class auth_random_test extends DokuWikiTest {
+ function testRandomRange() {
+ $rand = auth_random(300, 2000);
+ $this->assertTrue($rand <= 2000, 'The generated number was above the limit');
+ $this->assertTrue($rand >= 300, 'The generate number was too low');
+ }
+
+ function testLargeRandoms() {
+ $min = (1 << 30);
+ $max = $min + (1 << 33) + 17;
+ $rand = auth_random($min, $max);
+ $this->assertTrue($rand >= $min, 'The generated number was too low');
+ $this->assertTrue($rand <= $max, 'The generated number was too high');
+ }
+}
diff --git a/_test/tests/inc/common_ml.test.php b/_test/tests/inc/common_ml.test.php
index 6f3b71db4..415c0a88d 100644
--- a/_test/tests/inc/common_ml.test.php
+++ b/_test/tests/inc/common_ml.test.php
@@ -90,6 +90,25 @@ class common_ml_test extends DokuWikiTest {
$this->assertEquals($expect, ml($id, $args));
}
+ function test_ml_img_external() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $ids = array(
+ 'https://example.com/lib/tpl/dokuwiki/images/logo.png',
+ 'http://example.com/lib/tpl/dokuwiki/images/logo.png',
+ 'ftp://example.com/lib/tpl/dokuwiki/images/logo.png'
+ );
+
+ foreach($ids as $id) {
+ $tok = media_get_token($id, 0, 0);
+
+ $expect = DOKU_BASE.$this->script.'?tok='.$tok.'&amp;media='.rawurlencode($id);
+ $this->assertEquals($expect, ml($id));
+ }
+ }
+
function test_ml_imgresize_array_external() {
global $conf;
$conf['useslash'] = 0;
@@ -107,8 +126,24 @@ class common_ml_test extends DokuWikiTest {
$tok = media_get_token($id, $w, 0);
$hash = substr(PassHash::hmac('md5', $id, auth_cookiesalt()), 0, 6);
- $expect = DOKU_BASE.$this->script.'?hash='.$hash.'&amp;w='.$w.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
+ $expect = DOKU_BASE.$this->script.'?w='.$w.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
$this->assertEquals($expect, ml($id, $args));
}
+
+ $h = 50;
+ $args = array('h' => $h);
+ $tok = media_get_token($id, $h, 0);
+
+ $expect = DOKU_BASE.$this->script.'?h='.$h.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
+ $this->assertEquals($expect, ml($id, $args));
+
+ $w = 80;
+ $h = 50;
+ $args = array('w' => $w, 'h' => $h);
+ $tok = media_get_token($id, $w, $h);
+
+ $expect = DOKU_BASE.$this->script.'?w='.$w.'&amp;h='.$h.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
+ $this->assertEquals($expect, ml($id, $args));
+
}
}
diff --git a/_test/tests/inc/fulltext_backlinks.test.php b/_test/tests/inc/fulltext_backlinks.test.php
new file mode 100644
index 000000000..058e13498
--- /dev/null
+++ b/_test/tests/inc/fulltext_backlinks.test.php
@@ -0,0 +1,77 @@
+<?php
+
+// must be run within Dokuwiki
+if (!defined('DOKU_INC')) die();
+
+/**
+ * Test cases for the link index
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+class fultext_backlinks_test extends DokuWikiTest {
+
+ public function test_internallink() {
+ saveWikiText('test:internallinks', '[[internälLink]] [[..:internal link]]', 'Test initialization');
+ idx_addPage('test:internallinks');
+
+ $this->assertEquals(array('test:internallinks'), ft_backlinks('internal_link'));
+ $this->assertEquals(array('test:internallinks'), ft_backlinks('test:internaellink'));
+ }
+
+ public function test_links_in_footnotes() {
+ saveWikiText('test:link_footnotes', '(([[footnote]] [[:foÖtnotel]]))', 'Test initialization');
+ idx_addPage('test:link_footnotes');
+
+ $this->assertEquals(array('test:link_footnotes'), ft_backlinks('test:footnote'));
+ $this->assertEquals(array('test:link_footnotes'), ft_backlinks('fooetnotel'));
+ }
+
+ public function test_links_in_hidden_pages() {
+ global $conf;
+ $conf['hidepages'] = 'hidden:.*';
+ saveWikiText('hidden:links', '[[wiki:hiddenlink|linktitle]]', 'Test initialization');
+ idx_addPage('hidden:links');
+ saveWikiText('visible:links', '[[wiki:hiddenlink]]', 'Test initialization');
+ idx_addPage('visible:links');
+
+ $this->assertEquals(array('visible:links'), ft_backlinks('wiki:hiddenlink'));
+ $this->assertEquals(array('visible:links'), ft_backlinks('wiki:hiddenlink', false));
+ $this->assertEquals(array('hidden:links', 'visible:links'), ft_backlinks('wiki:hiddenlink', true));
+ }
+
+ public function test_links_in_protected_pages() {
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'alice';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 8',
+ 'secret:* @ALL 0',
+ );
+
+ $_SERVER['REMOTE_USER'] = 'eve';
+
+ saveWikiText('secret:links', '[[wiki:secretlink]]', 'Test initialization');
+ idx_addPage('secret:links');
+ saveWikiText('public:links', '[[wiki:secretlink]]', 'Test initialization');
+ idx_addPage('public:links');
+
+ $this->assertEquals(array('public:links'), ft_backlinks('wiki:secretlink'));
+ $this->assertEquals(array('public:links'), ft_backlinks('wiki:secretlink', false));
+ $this->assertEquals(array('public:links', 'secret:links'), ft_backlinks('wiki:secretlink', true));
+ }
+
+ public function test_links_in_deleted_pages() {
+ saveWikiText('test:internallinks', '[[internallink]] [[..:internal link]]', 'Test initialization');
+ idx_addPage('test:internallinks');
+
+ $this->assertEquals(array('test:internallinks'), ft_backlinks('test:internallink'));
+ $this->assertEquals(array('test:internallinks'), ft_backlinks('internal_link'));
+
+ saveWikiText('test:internallinks', '', 'Deleted');
+
+ $this->assertEquals(array(), ft_backlinks('test:internallink'));
+ $this->assertEquals(array(), ft_backlinks('internal_link'));
+ }
+}
diff --git a/_test/tests/inc/fulltext_mediause.test.php b/_test/tests/inc/fulltext_mediause.test.php
new file mode 100644
index 000000000..9d5b2dc84
--- /dev/null
+++ b/_test/tests/inc/fulltext_mediause.test.php
@@ -0,0 +1,77 @@
+<?php
+
+// must be run within Dokuwiki
+if (!defined('DOKU_INC')) die();
+
+/**
+ * Test cases for the media usage index
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+class fultext_mediause_test extends DokuWikiTest {
+
+ public function test_internalmedia() {
+ saveWikiText('test:internalmedia_usage', '{{internalmedia.png}} {{..:internal media.png}}', 'Test initialization');
+ idx_addPage('test:internalmedia_usage');
+
+ $this->assertEquals(array('test:internalmedia_usage'), ft_mediause('internal_media.png'));
+ $this->assertEquals(array('test:internalmedia_usage'), ft_mediause('test:internalmedia.png'));
+ }
+
+ public function test_media_in_links() {
+ saveWikiText('test:medialinks', '[[doku>wiki:dokuwiki|{{wiki:logo.png}}]] [[http://www.example.com|{{example.png?200x800}}]]', 'Test init');
+ idx_addPage('test:medialinks');
+
+ $this->assertEquals(array('test:medialinks'), ft_mediause('wiki:logo.png'));
+ $this->assertEquals(array('test:medialinks'), ft_mediause('test:example.png'));
+ }
+
+ public function test_media_in_footnotes() {
+ saveWikiText('test:media_footnotes', '(({{footnote.png?20x50}} [[foonote|{{:footlink.png}}]]))', 'Test initialization');
+ idx_addPage('test:media_footnotes');
+
+ $this->assertEquals(array('test:media_footnotes'), ft_mediause('test:footnote.png'));
+ $this->assertEquals(array('test:media_footnotes'), ft_mediause('footlink.png'));
+ }
+
+ public function test_media_in_hidden_pages() {
+ global $conf;
+ $conf['hidepages'] = 'hidden:.*';
+ saveWikiText('hidden:medias', '[[doku>wiki:dokuwiki|{{wiki:hiddenlogo.png}}]]', 'Test initialization');
+ idx_addPage('hidden:medias');
+
+ $this->assertEquals(array(), ft_mediause('wiki:hiddenlogo.png'));
+ $this->assertEquals(array(), ft_mediause('wiki:hiddenlogo.png', false));
+ $this->assertEquals(array('hidden:medias'), ft_mediause('wiki:hiddenlogo.png', true));
+ }
+
+ public function test_media_in_protected_pages() {
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'alice';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 8',
+ 'secret:* @ALL 0',
+ );
+
+ $_SERVER['REMOTE_USER'] = 'eve';
+
+ saveWikiText('secret:medias', '[[doku>wiki:dokuwiki|{{wiki:secretlogo.png}}]]', 'Test initialization');
+ idx_addPage('secret:medias');
+
+ $this->assertEquals(array(), ft_mediause('wiki:secretlogo.png'));
+ $this->assertEquals(array(), ft_mediause('wiki:secretlogo.png', false));
+ $this->assertEquals(array('secret:medias'), ft_mediause('wiki:secretlogo.png', true));
+ }
+
+ public function test_media_in_deleted_pages() {
+ saveWikiText('test:internalmedia_usage', '{{internalmedia.png}} {{..:internal media.png}}', 'Test initialization');
+ idx_addPage('test:internalmedia_usage');
+ saveWikiText('test:internalmedia_usage', '', 'Deleted');
+
+ $this->assertEquals(array(), ft_mediause('internal_media.png'));
+ $this->assertEquals(array(), ft_mediause('test:internalmedia.png'));
+ }
+}
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
index 387eb53aa..43dd4478f 100644
--- a/_test/tests/inc/httpclient_http.test.php
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -122,9 +122,14 @@ class httpclient_http_test extends DokuWikiTest {
function test_maxbody(){
$http = new HTTPClient();
$http->max_bodysize = 250;
+
+ // this should abort completely
$data = $http->get($this->server.'/stream/30');
$this->assertTrue($data === false, 'HTTP response');
+
+ // this should read just the needed bytes
$http->max_bodysize_abort = false;
+ $http->keep_alive = false;
$data = $http->get($this->server.'/stream/30');
$this->assertFalse($data === false, 'HTTP response');
/* should read no more than max_bodysize+1 */
@@ -215,5 +220,55 @@ class httpclient_http_test extends DokuWikiTest {
$data = $http->get('http://www.wikimatrix.org/cfeed/dokuwiki/-/-');
$this->assertTrue($data !== false, $http->error);
}
+
+ function test_postencode(){
+ $http = new HTTPClient();
+
+
+ // check simple data
+ $data = array(
+ 'öä?' => 'öä?',
+ 'foo' => 'bang'
+ );
+ $this->assertEquals(
+ '%C3%B6%C3%A4%3F=%C3%B6%C3%A4%3F&foo=bang',
+ $http->_postEncode($data),
+ 'simple'
+ );
+
+ // check first level numeric array
+ $data = array(
+ 'foo' => 'bang',
+ 'ärr' => array('ö', 'b', 'c')
+ );
+ $this->assertEquals(
+ 'foo=bang&%C3%A4rr%5B0%5D=%C3%B6&%C3%A4rr%5B1%5D=b&%C3%A4rr%5B2%5D=c',
+ $http->_postEncode($data),
+ 'onelevelnum'
+ );
+
+ // check first level associative array
+ $data = array(
+ 'foo' => 'bang',
+ 'ärr' => array('ö'=>'ä', 'b' => 'c')
+ );
+ $this->assertEquals(
+ 'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5Bb%5D=c',
+ $http->_postEncode($data),
+ 'onelevelassoc'
+ );
+
+
+ // check first level associative array
+ $data = array(
+ 'foo' => 'bang',
+ 'ärr' => array('ö'=>'ä', 'ä' => array('ö'=>'ä'))
+ );
+ $this->assertEquals(
+ 'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5B%C3%A4%5D%5B%C3%B6%5D=%C3%A4',
+ $http->_postEncode($data),
+ 'twolevelassoc'
+ );
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/parser/parser_code.test.php b/_test/tests/inc/parser/parser_code.test.php
new file mode 100644
index 000000000..c50d2d328
--- /dev/null
+++ b/_test/tests/inc/parser/parser_code.test.php
@@ -0,0 +1,72 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
+
+ function setUp() {
+ parent::setUp();
+ $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ }
+
+ function testCode() {
+ $this->P->parse('Foo <code>Test</code> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('Test',null,null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCodeBash() {
+ $this->P->parse('Foo <code bash>Test</code> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('Test','bash',null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCodeDownload() {
+ $this->P->parse('Foo <code bash script.sh>Test</code> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('Test','bash','script.sh')),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCodeToken() {
+ $this->P->parse('Foo <code2>Bar</code2><code>Test</code>');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo <code2>Bar</code2>')),
+ array('p_close',array()),
+ array('code',array('Test',null,null)),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_file.test.php b/_test/tests/inc/parser/parser_file.test.php
new file mode 100644
index 000000000..39bda8a58
--- /dev/null
+++ b/_test/tests/inc/parser/parser_file.test.php
@@ -0,0 +1,56 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_File extends TestOfDoku_Parser {
+
+ function setUp() {
+ parent::setUp();
+ $this->P->addMode('file',new Doku_Parser_Mode_File());
+ }
+
+ function testFile() {
+ $this->P->parse('Foo <file>Test</file> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('file',array('Test',null,null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFileHighlightDownload() {
+ $this->P->parse('Foo <file txt test.txt>Test</file> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('file',array('Test','txt','test.txt')),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFileToken() {
+ $this->P->parse('Foo <file2>Test</file2> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo <file2>Test</file2> Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php
index 90bc2e49e..9801ca1e0 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,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, "$dir/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, "$dir/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');
}
@@ -42,6 +49,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 +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, "$dir/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, "$dir/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);
@@ -248,6 +262,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 +396,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
+}
diff --git a/_test/tests/lib/exe/fetch_imagetoken.test.php b/_test/tests/lib/exe/fetch_imagetoken.test.php
index 9e5b6e4a2..99e642557 100644
--- a/_test/tests/lib/exe/fetch_imagetoken.test.php
+++ b/_test/tests/lib/exe/fetch_imagetoken.test.php
@@ -23,10 +23,10 @@ class fetch_imagetoken_test extends DokuWikiTest {
parent::setUp();
global $conf;
- $conf['sendfile'] = 0;
+ $conf['xsendfile'] = 0;
global $MIME, $EXT, $CACHE, $INPUT; // variables fetch creates in global scope -- should this be in fetch?
- }
+ }
function getUri() {
$w = $this->width ? 'w='.$this->width.'&' : '';
@@ -39,14 +39,14 @@ class fetch_imagetoken_test extends DokuWikiTest {
$request = new TestRequest();
return $request->get(array(),str_replace('{%token%}',$token,$this->getUri()));
}
-
- /**
+
+ /**
* modified image request with valid token
* expect: header with mime-type
* expect: content
* expect: no error response
- */
- function test_valid_token(){
+ */
+ function test_valid_token(){
$valid_token = 'tok='.media_get_token($this->media, $this->width, $this->height).'&';
$response = $this->fetchResponse($valid_token);
$this->assertTrue((bool)$response->getHeader('Content-Type'));
@@ -54,24 +54,24 @@ class fetch_imagetoken_test extends DokuWikiTest {
$status_code = $response->getStatusCode();
$this->assertTrue(is_null($status_code) || (200 == $status_code));
- }
-
- /**
+ }
+
+ /**
* modified image request with invalid token
- * expect: 412 status code
- */
- function test_invalid_token(){
- $invalid_token = 'tok='.media_get_token('junk',200,100).'&';
- $this->assertEquals(412,$this->fetchResponse($invalid_token)->getStatusCode());
- }
-
- /**
- * modified image request with no token
* expect: 412 status code
- */
- function test_missing_token(){
- $no_token = '';
- $this->assertEquals(412,$this->fetchResponse($notoken)->getStatusCode());
+ */
+ function test_invalid_token(){
+ $invalid_token = 'tok='.media_get_token('junk',200,100).'&';
+ $this->assertEquals(412,$this->fetchResponse($invalid_token)->getStatusCode());
+ }
+
+ /**
+ * modified image request with no token
+ * expect: 412 status code
+ */
+ function test_missing_token(){
+ $no_token = '';
+ $this->assertEquals(412,$this->fetchResponse($no_token)->getStatusCode());
}
/**
diff --git a/_test/tests/lib/exe/fetch_statuscodes_external.test.php b/_test/tests/lib/exe/fetch_statuscodes_external.test.php
new file mode 100644
index 000000000..79a45ec93
--- /dev/null
+++ b/_test/tests/lib/exe/fetch_statuscodes_external.test.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @group internet
+ */
+class fetch_statuscodes_external_test extends DokuWikiTest {
+
+ private $media = 'http://www.google.com/images/srpr/logo3w.png'; //used in media_get_from_url test too
+ private $width = 200;
+ private $height = 0;
+
+ function setUp() {
+
+ header('X-Test: check headers working');
+ $header_check = function_exists('xdebug_get_headers') ? xdebug_get_headers() : headers_list();
+ if(empty($header_check)) {
+ $this->markTestSkipped('headers not returned, perhaps your sapi does not return headers, try xdebug');
+ } else {
+ header_remove('X-Test');
+ }
+
+ parent::setUp();
+
+ global $conf;
+ $conf['fetchsize'] = 500 * 1024; //500kb
+ $conf['xsendfile'] = 0;
+
+ global $MIME, $EXT, $CACHE, $INPUT; // variables fetch creates in global scope -- should this be in fetch?
+ }
+
+ function getUri() {
+ $w = $this->width ? 'w='.$this->width.'&' : '';
+ $h = $this->height ? 'h='.$this->height.'&' : '';
+ return '/lib/exe/fetch.php?'.$w.$h.'{%token%}media='.rawurlencode($this->media);
+ }
+
+ function fetchResponse($token) {
+ $request = new TestRequest();
+ return $request->get(array(), str_replace('{%token%}', $token, $this->getUri()));
+ }
+
+ /**
+ * modified image request with valid token
+ * and not-modified image request with valid token
+ *
+ * expect: header with mime-type
+ * expect: content
+ * expect: no error response
+ */
+ function test_valid_token() {
+ $valid_token_resize = 'tok='.media_get_token($this->media, $this->width, $this->height).'&';
+
+ $this->handlevalidresponse($valid_token_resize);
+
+ //original size
+ $this->width = $this->height = 0;
+ $valid_token_original = 'tok='.media_get_token($this->media, $this->width, $this->height).'&';
+
+ $this->handlevalidresponse($valid_token_original);
+
+ }
+
+ /**
+ * Performs asserts for valid request
+ *
+ * @param $valid_token
+ */
+ private function handlevalidresponse($valid_token){
+ $response = $this->fetchResponse($valid_token);
+ $this->assertTrue((bool) $response->getHeader('Content-Type'));
+ $this->assertTrue((bool) ($response->getContent()));
+
+ $status_code = $response->getStatusCode();
+ $this->assertTrue(is_null($status_code) || (200 == $status_code));
+ }
+
+ /**
+ * modified image request with invalid token
+ * expect: 412 status code
+ */
+ function test_invalid_token() {
+ $invalid_tokens = array(
+ 'invalid_token_wrongid' => media_get_token('junk', 200, 100),
+ 'invalid_token_wrongh' => media_get_token($this->media, 200, 10),
+ 'invalid_token_wrongw' => media_get_token($this->media, 20, 100),
+ 'invalid_token_wrongwh' => media_get_token($this->media, 20, 10)
+ );
+ foreach($invalid_tokens as $invalid_token)
+ $this->assertEquals(412, $this->fetchResponse('tok='.$invalid_token.'&')->getStatusCode());
+
+ }
+
+ /**
+ * modified image request with no token
+ * and not modified image with no token
+ * expect: 412 status code
+ */
+ function test_missing_token() {
+ $no_token = '';
+
+ $this->assertEquals(412, $this->fetchResponse($no_token)->getStatusCode());
+
+ $this->width = $this->height = 0;
+ $this->assertEquals(412, $this->fetchResponse($no_token)->getStatusCode());
+ }
+}
+//Setup VIM: ex: et ts=4 :