summaryrefslogtreecommitdiff
path: root/_test
diff options
context:
space:
mode:
Diffstat (limited to '_test')
-rw-r--r--_test/README25
-rw-r--r--_test/bootstrap.php10
-rw-r--r--_test/data/meta/mailinglist.changes24
-rw-r--r--_test/data/pages/mailinglist.txt11
-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_loadacl.test.php130
-rw-r--r--_test/tests/inc/auth_nameencode.test.php28
-rw-r--r--_test/tests/inc/auth_random.test.php20
-rw-r--r--_test/tests/inc/changelog_getrevisioninfo.test.php120
-rw-r--r--_test/tests/inc/changelog_getrevisions.test.php200
-rw-r--r--_test/tests/inc/common_ml.test.php37
-rw-r--r--_test/tests/inc/fulltext_backlinks.test.php85
-rw-r--r--_test/tests/inc/fulltext_mediause.test.php84
-rw-r--r--_test/tests/inc/httpclient_http.test.php55
-rw-r--r--_test/tests/inc/httpclient_http_proxy.test.php4
-rw-r--r--_test/tests/inc/indexer_indexing.test.php45
-rw-r--r--_test/tests/inc/mailer.test.php115
-rw-r--r--_test/tests/inc/pageutils_clean_id.test.php3
-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/parser/parser_table.test.php58
-rw-r--r--_test/tests/inc/parserutils_set_metadata_during_rendering.test.php2
-rw-r--r--_test/tests/inc/subscription.test.php2
-rw-r--r--_test/tests/inc/tar.test.php69
-rw-r--r--_test/tests/lib/exe/css_at_import_less.test.php78
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php40
-rw-r--r--_test/tests/lib/exe/css_css_loadfile.test.php42
-rw-r--r--_test/tests/lib/exe/fetch_imagetoken.test.php44
-rw-r--r--_test/tests/lib/exe/fetch_statuscodes_external.test.php107
30 files changed, 1711 insertions, 46 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/bootstrap.php b/_test/bootstrap.php
index 732fef9ed..4f0d5efaa 100644
--- a/_test/bootstrap.php
+++ b/_test/bootstrap.php
@@ -15,7 +15,8 @@ require_once DOKU_UNITTEST.'core/TestUtils.php';
define('SIMPLE_TEST', true);
// basic behaviours
-error_reporting(E_ALL);
+define('DOKU_E_LEVEL',E_ALL ^ E_NOTICE);
+error_reporting(DOKU_E_LEVEL);
set_time_limit(0);
ini_set('memory_limit','2048M');
@@ -68,6 +69,13 @@ $default_server_vars = array(
'REQUEST_TIME' => time(),
);
+// fixup for $_SERVER when run from CLI,
+// some values should be mocked for use by inc/init.php which is called here
+// [ $_SERVER is also mocked in TestRequest::execute() ]
+if (php_sapi_name() == 'cli') {
+ $_SERVER = array_merge($default_server_vars, $_SERVER);
+}
+
// create temp directories
mkdir(TMP_DIR);
diff --git a/_test/data/meta/mailinglist.changes b/_test/data/meta/mailinglist.changes
new file mode 100644
index 000000000..348f8258f
--- /dev/null
+++ b/_test/data/meta/mailinglist.changes
@@ -0,0 +1,24 @@
+1360110636 127.0.0.1 C mailinglist pubcie aangemaakt
+1361901536 127.0.0.1 E mailinglist pubcie
+1362524799 127.0.0.1 E mailinglist pubcie
+1362525145 127.0.0.1 E mailinglist pubcie
+1362525359 127.0.0.1 E mailinglist pubcie [Data entry]
+1362525899 127.0.0.1 E mailinglist pubcie [Data entry]
+1362525926 127.0.0.1 E mailinglist pubcie
+1362526039 127.0.0.1 E mailinglist pubcie [Data entry]
+1362526119 127.0.0.1 E mailinglist pubcie
+1362526167 127.0.0.1 E mailinglist pubcie [Data entry]
+1362526767 127.0.0.1 E mailinglist pubcie [Data entry]
+1362526861 127.0.0.1 E mailinglist pubcie [Data entry]
+1362527046 127.0.0.1 E mailinglist pubcie [Data entry]
+1362527164 127.0.0.1 E mailinglist pubcie [Data entry]
+1363436892 127.0.0.1 E mailinglist pubcie
+1368575634 127.0.0.1 E mailinglist pubcie
+1368609772 127.0.0.1 E mailinglist pubcie
+1368612506 127.0.0.1 E mailinglist pubcie [Data entry]
+1368612599 127.0.0.1 E mailinglist pubcie [Data entry]
+1368622152 127.0.0.1 E mailinglist pubcie [Data entry]
+1368622195 127.0.0.1 E mailinglist pubcie
+1368622240 127.0.0.1 E mailinglist pubcie [Data entry]
+1371579614 127.0.0.1 E mailinglist pubcie
+1374261194 127.0.0.1 E mailinglist pubcie
diff --git a/_test/data/pages/mailinglist.txt b/_test/data/pages/mailinglist.txt
new file mode 100644
index 000000000..3fbe91b67
--- /dev/null
+++ b/_test/data/pages/mailinglist.txt
@@ -0,0 +1,11 @@
+====== Mailing Lists ======
+
+[[DokuWiki]]'s development is coordinated through multiple Mailinglists hosted by [[http://www.freelists.org|freelists.org]].
+
+===== Using the lists =====
+
+First you should subscribe to one or several of the mailing lists presented below. After subscribing you can send emails to the list(s) by using the mailing list address stated in its description. If you rather want to use the mailing list through a news group interface, please read the section [[#News group interface]].
+
+If you are new to mailing lists in general, please read [[rfc>1855|RFC 1855 - Netiquette Guidelines]], especially the sections 3.1.1 and 3.1.2. Before you ask any questions you should also have a look at [[http://www.catb.org/~esr/faqs/smart-questions.html|How To Ask Questions The Smart Way]].
+
+:!: Please note that these documents are linked here solely for the purpose of information. Their respective authors have nothing do to with [[DokuWiki]] and in **no case** should you send email to them, asking for help related to [[DokuWiki]]!
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_loadacl.test.php b/_test/tests/inc/auth_loadacl.test.php
new file mode 100644
index 000000000..e8d9f6696
--- /dev/null
+++ b/_test/tests/inc/auth_loadacl.test.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * auth_loadACL carries out the user & group substitutions
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+
+class auth_loadacl_test extends DokuWikiTest {
+
+ function setUp() {
+ global $USERINFO;
+ parent::setUp();
+ $_SERVER['REMOTE_USER'] = 'testuser';
+ $USERINFO['grps'] = array('foo','bar');
+ }
+
+ function tearDown() {
+ parent::tearDown();
+ }
+
+ function auth_loadACL_testwrapper($acls) {
+ global $config_cascade;
+ $acl_file = $config_cascade['acl']['default'];
+
+ $config_cascade['acl']['default'] .= '.test';
+ file_put_contents($config_cascade['acl']['default'],$acls);
+
+ $result = auth_loadACL();
+
+ unlink($config_cascade['acl']['default']);
+ $config_cascade['acl']['default'] = $acl_file;
+
+ return $result;
+ }
+
+ function test_simple() {
+ $acls = <<<ACL
+* @ALL 2
+ACL;
+ $expect = array("*\t@ALL 2");
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_user_substitution() {
+ $acls = <<<ACL
+%USER% %USER% 2
+ACL;
+ $expect = array(
+ "testuser\ttestuser 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_group_substitution() {
+ $acls = <<<ACL
+%GROUP% %GROUP% 2
+ACL;
+ $expect = array(
+ "foo\t@foo 2",
+ "bar\t@bar 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_both_substitution() {
+ $acls = <<<ACL
+%GROUP%:%USER% %USER% 2
+%GROUP%:%USER% %GROUP% 2
+ACL;
+ $expect = array(
+ "foo:testuser\ttestuser 2",
+ "bar:testuser\ttestuser 2",
+ "foo:testuser\t@foo 2",
+ "bar:testuser\t@bar 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ // put it all together - read the standard acl provided with the test suite
+ function test_standardtestacls(){
+ $expect = array(
+ "*\t@ALL 8",
+ "private:*\t@ALL 0",
+ "users:*\t@ALL 1",
+ "users:testuser:*\ttestuser 16",
+ "groups:*\t@ALL 1",
+ "groups:foo:*\t@foo 16",
+ "groups:bar:*\t@bar 16",
+ );
+ $this->assertEquals($expect, auth_loadACL());
+ }
+
+ // FS#2867, '\s' in php regular expressions may match non-space characters utf8 strings
+ // this is due to locale setting on the server, which may match bytes '\xA0' and '\x85'
+ // these two bytes are present in valid multi-byte UTF-8 characters.
+ // this test will use one, 'ठ' (DEVANAGARI LETTER TTHA, e0 a4 a0). There are many others.
+ function test_FS2867() {
+ global $USERINFO;
+
+ $old_locale = setlocale(LC_ALL, '0');
+ setlocale(LC_ALL, "English_United States.1252"); // should only succeed on windows systems
+ setlocale(LC_ALL, "en_US.UTF-8"); // should succeed on other systems
+
+ // no point continuing with this test if \s doesn't match A0
+ if (!preg_match('/\s/',"\xa0")) {
+ setlocale(LC_ALL, $old_locale);
+ $this->markTestSkipped('Unable to change locale.');
+ }
+
+ $_SERVER['REMOTE_USER'] = 'utfठ8';
+ $USERINFO['grps'] = array('utfठ16','utfठa');
+
+ $acls = <<<ACL
+%GROUP%:%USER% %USER% 2
+%GROUP%:* %GROUP% 4
+devangariठttha @ALL 2
+ACL;
+ $expect = array(
+ "utfठ16:utfठ8\tutfठ8 2",
+ "utfठa:utfठ8\tutfठ8 2",
+ "utfठ16:*\t@utfठ16 4",
+ "utfठa:*\t@utfठa 4",
+ "devangariठttha\t@ALL 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ setlocale(LC_ALL, $old_locale);
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_nameencode.test.php b/_test/tests/inc/auth_nameencode.test.php
index da9f31f90..86db843d6 100644
--- a/_test/tests/inc/auth_nameencode.test.php
+++ b/_test/tests/inc/auth_nameencode.test.php
@@ -19,6 +19,18 @@ class auth_nameencode_test extends DokuWikiTest {
$this->assertEquals(auth_nameencode($in),$out);
}
+ function test_apostrophe(){
+ $in = 'hey\'you';
+ $out = 'hey%27you';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_backslash(){
+ $in = 'hey\\you';
+ $out = 'hey%5cyou';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
function test_complex(){
$in = 'hey $ you !$%! foo ';
$out = 'hey%20%24%20you%20%21%24%25%21%20foo%20';
@@ -42,6 +54,22 @@ class auth_nameencode_test extends DokuWikiTest {
$out = '%40hey%24you';
$this->assertEquals(auth_nameencode($in),$out);
}
+
+ // include a two byte utf8 character which shouldn't be encoded
+ function test_hebrew(){
+ $in = 'nun-נ8';
+ $expect = 'nun%2dנ8';
+
+ $this->assertEquals($expect, auth_nameencode($in));
+ }
+
+ // include a three byte utf8 character which shouldn't be encoded
+ function test_devanagiri(){
+ $in = 'ut-fठ8';
+ $expect = 'ut%2dfठ8';
+
+ $this->assertEquals($expect, auth_nameencode($in));
+ }
}
//Setup VIM: ex: et ts=4 :
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/changelog_getrevisioninfo.test.php b/_test/tests/inc/changelog_getrevisioninfo.test.php
new file mode 100644
index 000000000..9637d21c8
--- /dev/null
+++ b/_test/tests/inc/changelog_getrevisioninfo.test.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
+ *
+ * This class uses the files:
+ * - data/pages/mailinglist.txt
+ * - data/meta/mailinglist.changes
+ */
+class changelog_getrevisionsinfo_test extends DokuWikiTest {
+
+ private $logline = "1362525899 127.0.0.1 E mailinglist pubcie [Data entry] \n";
+ private $firstlogline = "1374261194 127.0.0.1 E mailinglist pubcie \n";
+ private $pageid = 'mailinglist';
+
+ function setup() {
+ parent::setup();
+ global $cache_revinfo;
+ $cache =& $cache_revinfo;
+ if(isset($cache['nonexist'])) {
+ unset($cache['nonexist']);
+ }
+ if(isset($cache['mailinglist'])) {
+ unset($cache['nonexist']);
+ }
+ }
+
+ /**
+ * no nonexist.changes meta file available
+ */
+ function test_changemetadatanotexists() {
+ $rev = 1362525899;
+ $id = 'nonexist';
+ $revsexpected = false;
+
+ $revs = getRevisionInfo($id, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * request existing rev
+ */
+ function test_requestrev() {
+ $rev = 1362525899;
+ $infoexpected = parseChangelogLine($this->logline);
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ //returns cached value
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ }
+
+ /**
+ * request existing rev with chucked reading
+ */
+ function test_requestrev_chuncked() {
+ $rev = 1362525899;
+ $infoexpected = parseChangelogLine($this->logline);
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 512, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ }
+
+ /**
+ * request current version
+ */
+ function test_requestrecentestlogline() {
+ $rev = 1374261194;
+ $infoexpected = parseChangelogLine($this->firstlogline);
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ //returns cached value
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ }
+
+ /**
+ * request current version, with chuncked reading
+ */
+ function test_requestrecentestlogline_chuncked() {
+ $rev = 1374261194;
+ $infoexpected = parseChangelogLine($this->firstlogline);
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 512, $media = false);
+ $this->assertEquals($infoexpected, $info);
+ }
+
+ /**
+ * request negative revision
+ */
+ function test_negativerev() {
+ $rev = -10;
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals(false, $info);
+ }
+
+ /**
+ * request non existing revision somewhere between existing revisions
+ */
+ function test_notexistingrev() {
+ $rev = 1362525890;
+
+ $info = getRevisionInfo($this->pageid, $rev, $chunk_size = 8192, $media = false);
+ $this->assertEquals(false, $info);
+ }
+
+ /**
+ * sometimes chuncksize is set to true
+ */
+ function test_chuncksizetrue() {
+ $rev = 1362525899;
+ $infoexpected = parseChangelogLine($this->logline);
+
+ $info = getRevisionInfo($this->pageid, $rev, true);
+ $this->assertEquals($infoexpected, $info);
+ }
+} \ No newline at end of file
diff --git a/_test/tests/inc/changelog_getrevisions.test.php b/_test/tests/inc/changelog_getrevisions.test.php
new file mode 100644
index 000000000..a9be26dae
--- /dev/null
+++ b/_test/tests/inc/changelog_getrevisions.test.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Tests for requesting revisions of a page with getRevisions()
+ *
+ * This class uses the files:
+ * - data/pages/mailinglist.txt
+ * - data/meta/mailinglist.changes
+ */
+class changelog_getrevisions_test extends DokuWikiTest {
+
+ /**
+ * $first counts inclusive zero, after the current page
+ */
+ private $revsexpected = array(
+ 1374261194, //current page
+ 1371579614, 1368622240, // revisions, corresponds to respectively $first = 0 and 1
+ 1368622195, 1368622152,
+ 1368612599, 1368612506,
+ 1368609772, 1368575634,
+ 1363436892, 1362527164,
+ 1362527046, 1362526861, //10 and 11
+ 1362526767, 1362526167,
+ 1362526119, 1362526039,
+ 1362525926, 1362525899,
+ 1362525359, 1362525145,
+ 1362524799, 1361901536, //20 and 21
+ 1360110636
+ );
+ private $pageid = 'mailinglist';
+
+ function setup() {
+ parent::setup();
+ global $cache_revinfo;
+ $cache =& $cache_revinfo;
+ if(isset($cache['nonexist'])) {
+ unset($cache['nonexist']);
+ }
+ if(isset($cache['mailinglist'])) {
+ unset($cache['nonexist']);
+ }
+ }
+
+ /**
+ * no nonexist.changes meta file available
+ */
+ function test_changemetadatanotexists() {
+ $first = 0;
+ $num = 1;
+ $id = 'nonexist';
+
+ $revs = getRevisions($id, $first, $num, $chunk_size = 8192, $media = false);
+ $revsexpected = array();
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * request first recentest revision
+ * (so skips first line which belongs to the current existing page)
+ */
+ function test_requestlastrev() {
+ $first = 0;
+ $num = 1;
+ $revsexpected = array($this->revsexpected[1]);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * request first recentest revision
+ * (so skips first line which belongs to the current existing page)
+ */
+ function test_requestonebutlastrev() {
+ $first = 1;
+ $num = 1;
+ $revsexpected = array($this->revsexpected[2]);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * request first recentest revision
+ * (so skips first line of current existing page)
+ */
+ function test_requestrevswithoffset() {
+ $first = 10;
+ $num = 5;
+ $revsexpected = array_slice($this->revsexpected, $first + 1, $num);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * first = -1 requests recentest logline, without skipping
+ */
+ function test_requestrecentestlogline() {
+ $first = -1;
+ $num = 1;
+ $revsexpected = array($this->revsexpected[0]);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * chunck size = 0 skips chuncked loading
+ */
+ function test_wholefile() {
+ $first = 0;
+ $num = 1000;
+ $revsexpected = array_slice($this->revsexpected, 1);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 0, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * Negative range returns no result
+ */
+ function test_negativenum() {
+ $first = 0;
+ $num = -10;
+ $revsexpected = array();
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * Negative range returns no result
+ */
+ function test_negativennumoffset() {
+ $first = 2;
+ $num = -10;
+ $revsexpected = array();
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * zero range returns no result
+ */
+ function test_zeronum() {
+ $first = 5;
+ $num = 0;
+ $revsexpected = array();
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 512, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * get oldest revisions
+ */
+ function test_requestlargeoffset() {
+ $first = 22;
+ $num = 50;
+ $revsexpected = array_slice($this->revsexpected, $first + 1);
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+ /**
+ * request with too large offset and range
+ */
+ function test_requesttoolargenumberrevs() {
+ $first = 50;
+ $num = 50;
+ $revsexpected = array();
+
+ $revs = getRevisions($this->pageid, $first, $num, $chunk_size = 8192, $media = false);
+ $this->assertEquals($revsexpected, $revs);
+ }
+
+} \ No newline at end of file
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..b20a16ee1
--- /dev/null
+++ b/_test/tests/inc/fulltext_backlinks.test.php
@@ -0,0 +1,85 @@
+<?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 fulltext_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'));
+ }
+
+ function test_parameters() {
+ saveWikiText('test:links', '[[wiki:syntax?do=export_raw]] [[:web:scripts:add_vhost.sh?do=export_raw]]', 'Init tests');
+ idx_addPage('test:links');
+
+ $this->assertEquals(array('test:links'), ft_backlinks('wiki:syntax'));
+ $this->assertEquals(array('test:links'), ft_backlinks('web:scripts:add_vhost.sh'));
+ }
+}
diff --git a/_test/tests/inc/fulltext_mediause.test.php b/_test/tests/inc/fulltext_mediause.test.php
new file mode 100644
index 000000000..503b8bc84
--- /dev/null
+++ b/_test/tests/inc/fulltext_mediause.test.php
@@ -0,0 +1,84 @@
+<?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_local_links() {
+ saveWikiText('test:locallinks', '[[#test|{{wiki:logolocal.png}}]]', 'Test init');
+ idx_addPage('test:locallinks');
+
+ $this->assertEquals(array('test:locallinks'), ft_mediause('wiki:logolocal.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/httpclient_http_proxy.test.php b/_test/tests/inc/httpclient_http_proxy.test.php
index faa7a4280..4aa039fcc 100644
--- a/_test/tests/inc/httpclient_http_proxy.test.php
+++ b/_test/tests/inc/httpclient_http_proxy.test.php
@@ -1,7 +1,7 @@
<?php
class httpclient_http_proxy_test extends DokuWikiTest {
- protected $url = 'http://www.dokuwiki.org/README';
+ protected $url = 'http://test.dokuwiki.org/README';
/**
* @group internet
@@ -13,7 +13,7 @@ class httpclient_http_proxy_test extends DokuWikiTest {
$http->proxy_port = 8080;
$data = $http->get($this->url);
- $this->assertFalse($data === false, 'HTTP response');
+ $this->assertFalse($data === false, 'HTTP response '.$http->error);
$this->assertTrue(strpos($data,'DokuWiki') !== false, 'response content');
}
diff --git a/_test/tests/inc/indexer_indexing.test.php b/_test/tests/inc/indexer_indexing.test.php
new file mode 100644
index 000000000..628e82e00
--- /dev/null
+++ b/_test/tests/inc/indexer_indexing.test.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Tests the indexing functionality of the indexer
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+class indexer_indexing_test extends DokuWikiTest {
+ public function setUp() {
+ parent::setUp();
+ saveWikiText('testpage', 'Foo bar baz.', 'Test initialization');
+ saveWikiText('notfound', 'Foon barn bazn.', 'Test initialization');
+ idx_addPage('testpage');
+ idx_addPage('notfound');
+ }
+
+ public function test_words() {
+ $indexer = idx_get_indexer();
+ $query = array('baz', 'foo');
+ $this->assertEquals(array('baz' => array('testpage' => 1), 'foo' => array('testpage' => 1)), $indexer->lookup($query));
+ }
+
+ public function test_numerically_identical_words() {
+ $indexer = idx_get_indexer();
+ $indexer->addPageWords('testpage', '0x1 002');
+ $indexer->addPageWords('notfound', '0x2');
+ $query = array('001', '002');
+ $this->assertEquals(array('001' => array(), '002' => array('testpage' => 1)), $indexer->lookup($query));
+ }
+
+ public function test_meta() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('testpage', 'testkey', 'testvalue');
+ $indexer->addMetaKeys('notfound', 'testkey', 'notvalue');
+ $query = 'testvalue';
+ $this->assertEquals(array('testpage'), $indexer->lookupKey('testkey', $query));
+ }
+
+ public function test_numerically_identical_meta_values() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('testpage', 'numkey', array('0001', '01'));
+ $indexer->addMetaKeys('notfound', 'numkey', array('00001', '000001'));
+ $query = array('001', '01');
+ $this->assertEquals(array('001' => array(), '01' => array('testpage')), $indexer->lookupKey('numkey', $query));
+ }
+} \ No newline at end of file
diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index 053e216b8..bac0c39ba 100644
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -15,6 +15,11 @@ class TestMailer extends Mailer {
public function prepareHeaders() {
return parent::prepareHeaders();
}
+
+ public function cleanHeaders() {
+ parent::cleanHeaders();
+ }
+
}
class mailer_test extends DokuWikiTest {
@@ -45,8 +50,8 @@ class mailer_test extends DokuWikiTest {
// set a bunch of test headers
$mail->setHeader('test-header','bla');
$mail->setHeader('to','A valid ASCII name <test@example.com>');
- $mail->setHeader('from',"Thös ne\needs\x00serious cleaning$§%.");
- $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning$§%.",false);
+ $mail->setHeader('from',"Thös ne\needs\x00serious cleaning\$§%.");
+ $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning\$§%.",false);
$mail->setHeader("weird\n*+\x00foo.-_@bar?",'now clean');
// are they set?
@@ -58,7 +63,7 @@ class mailer_test extends DokuWikiTest {
$this->assertArrayHasKey('From',$headers);
$this->assertEquals('Ths neeedsserious cleaning.',$headers['From']);
$this->assertArrayHasKey('Bad',$headers);
- $this->assertEquals("Thös ne\needs\x00serious cleaning$§%.",$headers['Bad']);
+ $this->assertEquals("Thös ne\needs\x00serious cleaning\$§%.",$headers['Bad']);
$this->assertArrayHasKey('Weird+foo.-_@bar',$headers);
// unset a header again
@@ -67,6 +72,47 @@ class mailer_test extends DokuWikiTest {
$this->assertArrayNotHasKey('Test-Header',$headers);
}
+ function test_addresses(){
+ $mail = new TestMailer();
+
+ $mail->to('andi@splitbrain.org');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org', $headers['To']);
+
+ $mail->to('<andi@splitbrain.org>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org', $headers['To']);
+
+ $mail->to('Andreas Gohr <andi@splitbrain.org>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('Andreas Gohr <andi@splitbrain.org>', $headers['To']);
+
+ $mail->to('Andreas Gohr <andi@splitbrain.org> , foo <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('Andreas Gohr <andi@splitbrain.org>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to('Möp <moep@example.com> , foo <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to(array('Möp <moep@example.com> ',' foo <foo@example.com>'));
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to(array('Beet, L van <lvb@example.com>',' foo <foo@example.com>'));
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?QmVldCwgTCB2YW4=?= <lvb@example.com>, foo <foo@example.com>', $headers['To']);
+
+
+ }
+
function test_simplemail(){
global $conf;
$conf['htmlmail'] = 0;
@@ -110,5 +156,68 @@ class mailer_test extends DokuWikiTest {
$this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
$this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Bcc found in headers.');
}
+
+ /**
+ * @group internet
+ */
+ function test_lint(){
+ // prepare a simple multipart message
+ $mail = new TestMailer();
+ $mail->to(array('Möp <moep@example.com> ',' foo <foo@example.com>'));
+ $mail->from('Me <test@example.com>');
+ $mail->subject('This is a töst');
+ $mail->setBody('Hello Wörld,
+
+ please don\'t burn, okay?
+ ');
+ $mail->attachContent('some test data', 'text/plain', 'a text.txt');
+ $msg = $mail->dump();
+ $msglines = explode("\n", $msg);
+
+ //echo $msg;
+
+ // ask message lint if it is okay
+ $html = new HTTPClient();
+ $results = $html->post('http://tools.ietf.org/tools/msglint/msglint', array('msg'=>$msg));
+ $this->assertTrue($results !== false);
+
+ // parse the result lines
+ $lines = explode("\n", $results);
+ $rows = count($lines);
+ $i=0;
+ while(trim($lines[$i]) != '-----------' && $i<$rows) $i++; //skip preamble
+ for($i=$i+1; $i<$rows; $i++){
+ $line = trim($lines[$i]);
+ if($line == '-----------') break; //skip appendix
+
+ // get possible continuation of the line
+ while($lines[$i+1][0] == ' '){
+ $line .= ' '.trim($lines[$i+1]);
+ $i++;
+ }
+
+ // check the line for errors
+ if(substr($line,0,5) == 'ERROR' || substr($line,0,7) == 'WARNING'){
+ // ignore some errors
+ if(strpos($line, "missing mandatory header 'return-path'")) continue; #set by MDA
+ if(strpos($line, "bare newline in text body decoded")) continue; #seems to be false positive
+
+ // get the context in which the error occured
+ $errorin = '';
+ if(preg_match('/line (\d+)$/', $line, $m)){
+ $errorin .= "\n".$msglines[$m[1] - 1];
+ }
+ if(preg_match('/lines (\d+)-(\d+)$/', $line, $m)){
+ for($x=$m[1]-1; $x<$m[2]; $x++){
+ $errorin .= "\n".$msglines[$x];
+ }
+ }
+
+ // raise the error
+ throw new Exception($line.$errorin);
+ }
+ }
+
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_clean_id.test.php b/_test/tests/inc/pageutils_clean_id.test.php
index 478fd2bc4..f67109ba3 100644
--- a/_test/tests/inc/pageutils_clean_id.test.php
+++ b/_test/tests/inc/pageutils_clean_id.test.php
@@ -43,6 +43,9 @@ class init_clean_id_test extends DokuWikiTest {
$tests[] = array('ns._#!ns:page','false','ns._ns:page');
$tests[] = array('ns_:page',false,'ns:page');
$tests[] = array('page...page','false','page...page');
+ $tests[] = array('page---page','false','page---page');
+ $tests[] = array('page___page','false','page_page');
+ $tests[] = array('page_-.page','false','page_-.page');
$tests[] = array(':page',false,'page');
$tests[] = array(':ns:page',false,'ns:page');
$tests[] = array('page:',false,'page');
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/parser/parser_table.test.php b/_test/tests/inc/parser/parser_table.test.php
index 96789c38c..542a307b8 100644
--- a/_test/tests/inc/parser/parser_table.test.php
+++ b/_test/tests/inc/parser/parser_table.test.php
@@ -270,6 +270,64 @@ def');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
+
+ function testCellRowSpanFirstRow() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+|::: ^ d:::^:::| ::: |
+| b ^ e | | ::: |
+|c ^ ::: | |:::|
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(4, 3, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'right',1)),
+ array('cdata',array(' d:::')),
+ array('tableheader_close',array()),
+ array('tableheader_open',array(1,NULL,1)),
+ array('cdata',array('')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,3)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' b ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'left',2)),
+ array('cdata',array(' e ')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array('c ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+
+ array('table_close',array(69)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
function testCellAlignmentFormatting() {
$this->P->addMode('table',new Doku_Parser_Mode_Table());
diff --git a/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
index f08785ca2..18660553d 100644
--- a/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
+++ b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
@@ -80,7 +80,7 @@ class parserutils_set_metadata_during_rendering_test extends DokuWikiTest {
}
// wrapper function for the fake plugin controller, return $this for the fake syntax of this test
- function &load($type,$name,$new=false,$disabled=false){
+ function load($type,$name,$new=false,$disabled=false){
if ($name == 'parserutils_test') {
return $this;
} else {
diff --git a/_test/tests/inc/subscription.test.php b/_test/tests/inc/subscription.test.php
index 333400576..34a7b9e4b 100644
--- a/_test/tests/inc/subscription.test.php
+++ b/_test/tests/inc/subscription.test.php
@@ -237,7 +237,7 @@ class MockupSubscription extends Subscription {
return parent::buildregex($user, $style, $data);
}
- protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null) {
+ protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null, $headers = array()) {
$this->mails[] = $subscriber_mail;
return true;
}
diff --git a/_test/tests/inc/tar.test.php b/_test/tests/inc/tar.test.php
index 90bc2e49e..417f1a853 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);
@@ -50,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);
@@ -57,11 +67,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 '$tdir'");
+ $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 +264,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 +398,23 @@ 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
+
+
+ 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");
+ }
+ }
+}
diff --git a/_test/tests/lib/exe/css_at_import_less.test.php b/_test/tests/lib/exe/css_at_import_less.test.php
new file mode 100644
index 000000000..4a6efcf44
--- /dev/null
+++ b/_test/tests/lib/exe/css_at_import_less.test.php
@@ -0,0 +1,78 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/css.php';
+
+class css_at_import_less_test extends DokuWikiTest {
+
+ protected $file = '';
+ protected $import = '';
+
+ public function setUpFiles($subdir = '') {
+
+ $dir = TMP_DIR . $subdir;
+ if (!is_dir($dir)) {
+ mkdir($dir, 0777, true);
+ }
+ if (!is_dir($dir)) {
+ $this->markTestSkipped('Could not create directory.');
+ }
+
+ $this->file = tempnam($dir, 'css');
+
+ $import = '';
+ do {
+ if ($import) unlink($import);
+ $import = tempnam($dir, 'less');
+ $ok = rename($import, $import.'.less');
+ } while (!$ok);
+
+ $this->import = $import.'.less';
+ }
+
+ private function csstest($input, $expected_css, $expected_less) {
+ $location = "http://test.com/";
+ io_saveFile($this->file, $input);
+ $css = css_loadfile($this->file, $location);
+ $less = css_parseless($css);
+ $this->assertEquals($expected_css, $css);
+ $this->assertEquals($expected_less, $less);
+ }
+
+ public function test_basic() {
+ $this->setUpFiles();
+
+ $import = preg_replace('#(^.*[/])#','',$this->import);
+ $in_css = '@import "'.$import.'";';
+ $in_less = '@foo: "bar";
+content: @foo;';
+
+ $expected_css = '@import "/'.$import.'";';
+ $expected_less = 'content: "bar";';
+
+ io_saveFile($this->import, $in_less);
+ $this->csstest($in_css, $expected_css, $expected_less);
+ }
+
+ public function test_subdirectory() {
+ $this->setUpFiles('/foo/bar');
+
+ $import = preg_replace('#(^.*[/])#','',$this->import);
+ $in_css = '@import "'.$import.'";';
+ $in_less = '@foo: "bar";
+content: @foo;';
+
+ $expected_css = '@import "/foo/bar/'.$import.'";';
+ $expected_less = 'content: "bar";';
+
+ io_saveFile($this->import, $in_less);
+ $this->csstest($in_css, $expected_css, $expected_less);
+ }
+
+ public function tearDown() {
+ unlink($this->file);
+ unlink($this->import);
+ unset($this->file, $this->import);
+ }
+}
+
+//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/_test/tests/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
index a7c87b6a7..a614ea2fd 100644
--- a/_test/tests/lib/exe/css_css_compress.test.php
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -62,6 +62,46 @@ class css_css_compress_test extends DokuWikiTest {
$this->assertEquals(css_compress($text), 'a{left:20px;top:20px}');
}
+ function test_shortening() {
+ $input = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF {',
+ 'margin: 1px 1px 1px 1px;',
+ 'padding: 1px 2px 1px 2px;',
+ 'margin: 1px 2px 3px 1px;',
+ 'padding: 1px 2px 3px 4px;',
+ 'margin: 00.00em 0em 01.00px 0em;',
+ 'padding: 0010em 0010.00em 00.00em 00.00100em;',
+ 'padding: 0010% 0010.00% 00.00% 00.00100xxx;',
+ 'padding: 0.0em .0em 0.em 00.00em;',
+ 'padding: 01.0em;',
+ 'color: #FFFFFF;',
+ 'color: #777777;',
+ 'color: #123456;',
+ 'border: 01.0em solid #ffffff;',
+ );
+
+ $expected = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF{',
+ 'margin:1px;',
+ 'padding:1px 2px;',
+ 'margin:1px 2px 3px 1px;',
+ 'padding:1px 2px 3px 4px;',
+ 'margin:0 0 1px 0;',
+ 'padding:10em 10em 0 .001em;',
+ 'padding:10% 10% 0 00.00100xxx;',
+ 'padding:0;',
+ 'padding:1em;',
+ 'color:#FFF;',
+ 'color:#777;',
+ 'color:#123456;',
+ 'border:1em solid #fff;',
+ );
+
+ $input = array_map('css_compress', $input);
+
+ $this->assertEquals($expected, $input);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/lib/exe/css_css_loadfile.test.php b/_test/tests/lib/exe/css_css_loadfile.test.php
index c89b69b2c..624becd29 100644
--- a/_test/tests/lib/exe/css_css_loadfile.test.php
+++ b/_test/tests/lib/exe/css_css_loadfile.test.php
@@ -3,13 +3,16 @@
require_once DOKU_INC.'lib/exe/css.php';
class css_css_loadfile_test extends DokuWikiTest {
+
+ protected $file = '';
+
public function setUp() {
- $this->file = tempnam('/tmp', 'css');
+ $this->file = tempnam(TMP_DIR, 'css');
}
private function csstest($input, $output = null, $location = 'http://www.example.com/') {
io_saveFile($this->file, $input);
- $this->assertEquals(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
+ $this->assertEquals((is_null($output) ? $input : $output), css_loadfile($this->file, $location));
}
public function test_url_relative() {
@@ -32,11 +35,15 @@ class css_css_loadfile_test extends DokuWikiTest {
public function test_import_relative() {
$this->csstest('@import "test/test.png";', '@import "http://www.example.com/test/test.png";');
$this->csstest('@import \'test/test.png\';', '@import \'http://www.example.com/test/test.png\';');
+ $this->csstest('@import url(test/test.png);', '@import url(http://www.example.com/test/test.png);');
+ $this->csstest('@import url("test/test.png");', '@import url("http://www.example.com/test/test.png");');
}
public function test_import_absolute() {
$this->csstest('@import "/test/test.png";');
$this->csstest('@import \'/test/test.png\';');
+ $this->csstest('@import url(/test/test.png);');
+ $this->csstest('@import url("/test/test.png");');
}
public function test_import_with_protocol() {
@@ -44,6 +51,37 @@ class css_css_loadfile_test extends DokuWikiTest {
$this->csstest('@import "https://www.test.com/test/test.png";');
$this->csstest('@import \'http://www.test.com/test/test.png\';');
$this->csstest('@import \'https://www.test.com/test/test.png\';');
+ $this->csstest('@import url(http://www.test.com/test/test.png);');
+ $this->csstest('@import url("http://www.test.com/test/test.png");');
+ }
+
+ public function test_less_basic() {
+ $this->csstest('@import "test.less"', '@import "/test.less"');
+ $this->csstest('@import "/test.less"', '@import "/test.less"');
+ $this->csstest('@import "foo/test.less"', '@import "/foo/test.less"');
+ $this->csstest('@import url(http://test.less)');
+ }
+
+ // more expected use, where less @import(ed) from e.g. lib/plugins/plugin_name
+ public function test_less_subdirectories() {
+
+ unlink($this->file);
+
+ $dir = TMP_DIR.'/foo/bar';
+ if (!is_dir($dir)) {
+ mkdir($dir, 0777, true);
+ }
+ if (!is_dir($dir)) {
+ $this->markTestSkipped('Could not create directory.');
+ }
+
+ $this->file = tempnam($dir, 'css');
+
+ $this->csstest('@import "test.less"', '@import "/foo/bar/test.less"');
+ $this->csstest('@import \'test.less\'', '@import \'/foo/bar/test.less\'');
+ $this->csstest('@import url(test.less)', '@import url(/foo/bar/test.less)');
+
+ $this->csstest('@import "abc/test.less"', '@import "/foo/bar/abc/test.less"');
}
public function tearDown() {
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 :